Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86/asm: Add pud/pmd mask interfaces to handle large PAT bit

The PAT bit gets relocated to bit 12 when PUD and PMD mappings are
used. This bit 12, however, is not covered by PTE_FLAGS_MASK, which
is used for masking pfn and flags for all levels.

Add pud/pmd mask interfaces to handle pfn and flags properly by using
P?D_PAGE_MASK when PUD/PMD mappings are used, i.e. PSE bit is set.

Suggested-by: Juergen Gross <jgross@suse.com>
Signed-off-by: Toshi Kani <toshi.kani@hpe.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Juergen Gross <jgross@suse.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Konrad Wilk <konrad.wilk@oracle.com>
Cc: Robert Elliot <elliott@hpe.com>
Cc: linux-mm@kvack.org
Link: http://lkml.kernel.org/r/1442514264-12475-4-git-send-email-toshi.kani@hpe.com
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

authored by

Toshi Kani and committed by
Thomas Gleixner
4be4c1fb 83210267

+34 -2
+34 -2
arch/x86/include/asm/pgtable_types.h
··· 209 209 210 210 #include <linux/types.h> 211 211 212 - /* PTE_PFN_MASK extracts the PFN from a (pte|pmd|pud|pgd)val_t */ 212 + /* Extracts the PFN from a (pte|pmd|pud|pgd)val_t of a 4KB page */ 213 213 #define PTE_PFN_MASK ((pteval_t)PHYSICAL_PAGE_MASK) 214 214 215 - /* PTE_FLAGS_MASK extracts the flags from a (pte|pmd|pud|pgd)val_t */ 215 + /* Extracts the flags from a (pte|pmd|pud|pgd)val_t of a 4KB page */ 216 216 #define PTE_FLAGS_MASK (~PTE_PFN_MASK) 217 217 218 218 typedef struct pgprot { pgprotval_t pgprot; } pgprot_t; ··· 276 276 } 277 277 #endif 278 278 279 + static inline pudval_t pud_pfn_mask(pud_t pud) 280 + { 281 + if (native_pud_val(pud) & _PAGE_PSE) 282 + return PUD_PAGE_MASK & PHYSICAL_PAGE_MASK; 283 + else 284 + return PTE_PFN_MASK; 285 + } 286 + 287 + static inline pudval_t pud_flags_mask(pud_t pud) 288 + { 289 + if (native_pud_val(pud) & _PAGE_PSE) 290 + return ~(PUD_PAGE_MASK & (pudval_t)PHYSICAL_PAGE_MASK); 291 + else 292 + return ~PTE_PFN_MASK; 293 + } 294 + 279 295 static inline pudval_t pud_flags(pud_t pud) 280 296 { 281 297 return native_pud_val(pud) & PTE_FLAGS_MASK; 298 + } 299 + 300 + static inline pmdval_t pmd_pfn_mask(pmd_t pmd) 301 + { 302 + if (native_pmd_val(pmd) & _PAGE_PSE) 303 + return PMD_PAGE_MASK & PHYSICAL_PAGE_MASK; 304 + else 305 + return PTE_PFN_MASK; 306 + } 307 + 308 + static inline pmdval_t pmd_flags_mask(pmd_t pmd) 309 + { 310 + if (native_pmd_val(pmd) & _PAGE_PSE) 311 + return ~(PMD_PAGE_MASK & (pmdval_t)PHYSICAL_PAGE_MASK); 312 + else 313 + return ~PTE_PFN_MASK; 282 314 } 283 315 284 316 static inline pmdval_t pmd_flags(pmd_t pmd)