Skip to content

Commit 4be4c1f

Browse files
toshikaniKAGA-KOKO
authored andcommitted
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>
1 parent 8321026 commit 4be4c1f

File tree

1 file changed

+34
-2
lines changed

1 file changed

+34
-2
lines changed

arch/x86/include/asm/pgtable_types.h

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,10 +209,10 @@ enum page_cache_mode {
209209

210210
#include <linux/types.h>
211211

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 */
213213
#define PTE_PFN_MASK ((pteval_t)PHYSICAL_PAGE_MASK)
214214

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 */
216216
#define PTE_FLAGS_MASK (~PTE_PFN_MASK)
217217

218218
typedef struct pgprot { pgprotval_t pgprot; } pgprot_t;
@@ -276,11 +276,43 @@ static inline pmdval_t native_pmd_val(pmd_t pmd)
276276
}
277277
#endif
278278

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+
279295
static inline pudval_t pud_flags(pud_t pud)
280296
{
281297
return native_pud_val(pud) & PTE_FLAGS_MASK;
282298
}
283299

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;
314+
}
315+
284316
static inline pmdval_t pmd_flags(pmd_t pmd)
285317
{
286318
return native_pmd_val(pmd) & PTE_FLAGS_MASK;

0 commit comments

Comments
 (0)