diff --git a/arch/x86/kernel/include/arch-memory.h b/arch/x86/kernel/include/arch-memory.h index 051635a9..bdb70dfc 100644 --- a/arch/x86/kernel/include/arch-memory.h +++ b/arch/x86/kernel/include/arch-memory.h @@ -67,6 +67,8 @@ #define PF_PRESENT ((pte_t)0x01) /* entry is valid */ #define PF_WRITABLE ((pte_t)0x02) +#define PFLX_PWT ((pte_t)0x08) +#define PFLX_PCD ((pte_t)0x10) #define PF_SIZE ((pte_t)0x80) /* entry points large page */ #define PFL4_PRESENT ((pte_t)0x01) @@ -76,8 +78,8 @@ #define PFL3_PRESENT ((pte_t)0x01) #define PFL3_WRITABLE ((pte_t)0x02) #define PFL3_USER ((pte_t)0x04) -#define PFL3_PWT ((pte_t)0x08) -#define PFL3_PCD ((pte_t)0x10) +#define PFL3_PWT PFLX_PWT +#define PFL3_PCD PFLX_PCD #define PFL3_ACCESSED ((pte_t)0x20) #define PFL3_DIRTY ((pte_t)0x40) #define PFL3_SIZE ((pte_t)0x80) /* Used in 1G page */ @@ -88,8 +90,8 @@ #define PFL2_PRESENT ((pte_t)0x01) #define PFL2_WRITABLE ((pte_t)0x02) #define PFL2_USER ((pte_t)0x04) -#define PFL2_PWT ((pte_t)0x08) -#define PFL2_PCD ((pte_t)0x10) +#define PFL2_PWT PFLX_PWT +#define PFL2_PCD PFLX_PCD #define PFL2_ACCESSED ((pte_t)0x20) #define PFL2_DIRTY ((pte_t)0x40) #define PFL2_SIZE ((pte_t)0x80) /* Used in 2M page */ @@ -100,8 +102,8 @@ #define PFL1_PRESENT ((pte_t)0x01) #define PFL1_WRITABLE ((pte_t)0x02) #define PFL1_USER ((pte_t)0x04) -#define PFL1_PWT ((pte_t)0x08) -#define PFL1_PCD ((pte_t)0x10) +#define PFL1_PWT PFLX_PWT +#define PFL1_PCD PFLX_PCD #define PFL1_ACCESSED ((pte_t)0x20) #define PFL1_DIRTY ((pte_t)0x40) #define PFL1_IGNORED_11 ((pte_t)1 << 11) @@ -154,6 +156,8 @@ enum ihk_mc_pt_attribute { PTATTR_WRITE_COMBINED = 0x40000, }; +enum ihk_mc_pt_attribute attr_mask; + static inline int pte_is_null(pte_t *ptep) { return (*ptep == PTE_NULL); @@ -209,6 +213,27 @@ static inline off_t pte_get_off(pte_t *ptep, size_t pgsize) return (off_t)(*ptep & PAGE_MASK); } +static inline enum ihk_mc_pt_attribute pte_get_attr(pte_t *ptep, size_t pgsize) +{ + enum ihk_mc_pt_attribute attr; + + attr = *ptep & attr_mask; + if (*ptep & PFLX_PWT) { + if (*ptep & PFLX_PCD) { + attr |= PTATTR_UNCACHABLE; + } + else { + attr |= PTATTR_WRITE_COMBINED; + } + } + if (((pgsize == PTL2_SIZE) && (*ptep & PFL2_SIZE)) + || ((pgsize == PTL3_SIZE) && (*ptep & PFL3_SIZE))) { + attr |= PTATTR_LARGEPAGE; + } + + return attr; +} /* pte_get_attr() */ + static inline void pte_make_null(pte_t *ptep, size_t pgsize) { *ptep = PTE_NULL; diff --git a/arch/x86/kernel/memory.c b/arch/x86/kernel/memory.c index 1448f224..f7300cc5 100644 --- a/arch/x86/kernel/memory.c +++ b/arch/x86/kernel/memory.c @@ -223,7 +223,7 @@ static struct page_table *__alloc_new_pt(enum ihk_mc_ap_flag ap_flag) * but L2 and L1 do not! */ -static enum ihk_mc_pt_attribute attr_mask +enum ihk_mc_pt_attribute attr_mask = 0 | PTATTR_FILEOFF | PTATTR_WRITABLE