x86: unify pgtable*.h
PATCH 2/3 x86: unify pgtable*.h
All x86 modes and architectures have very similar pagetable
structures: the page flags, the accessors for testing/setting them, and the combinations of page flags used for kernel and usermode mappings are all the same. The main difference is between 32 and 64-bit pagetable entries, with the latter supporting the NX bit.
The most significant difference between the modes/architectures is the number of levels in the pagetable (4 for 64-bit, 3 for 32-bit/PAE, 2 for non-PAE 32-bit). This accounts for the remaining code in the various mode-specific headers.
I've tried to avoid changing formatting as much as possible, so that the code motion is more obvious. A subsequent patch will clean things up in place.
--- arch/x86/kernel/setup_32.c | 6 include/asm-x86/pgtable-2level.h | 23 -- include/asm-x86/pgtable-3level.h | 40 ---- include/asm-x86/pgtable.h | 347 ++++++++++++++++++++++++++++++++++++++ include/asm-x86/pgtable_32.h | 228 ------------------------ include/asm-x86/pgtable_64.h | 284 ++++++------------------------- 6 files changed, 417 insertions(+), 511 deletions(-)
===================================================================
arch/x86/kernel/setup_32.c +3 -3
@@ -334,7 +334,7 @@ unsigned long __init find_max_low_pfn(voif (highmem_pages +MAXMEM_PFN < max_pfn) max_pfn =MAXMEM_PFN + highmem_pages;if (highmem_pages +MAXMEM_PFN > max_pfn) { -printk ("only %luMB highmem pages available, ignoring highmem size of %uMB.\n" ,pages_to_mb (max_pfn -MAXMEM_PFN ),pages_to_mb (highmem_pages)); +printk ("only %luMB highmem pages available, ignoring highmem size of %luMB.\n" ,pages_to_mb (max_pfn -MAXMEM_PFN ),pages_to_mb (highmem_pages)); highmem_pages =0 ; } max_low_pfn =MAXMEM_PFN ;
@@ -361,12 +361,12 @@ unsigned long __init find_max_low_pfn(vo highmem_pages =0 ;#ifdef CONFIG_HIGHMEM if (highmem_pages >= max_pfn) { -printk (KERN_ERR "highmem size specified (%uMB) is bigger than pages available (%luMB)!.\n" ,pages_to_mb (highmem_pages),pages_to_mb (max_pfn)); +printk (KERN_ERR "highmem size specified (%luMB) is bigger than pages available (%luMB)!.\n" ,pages_to_mb (highmem_pages),pages_to_mb (max_pfn)); highmem_pages =0 ; }if (highmem_pages) {if (max_low_pfn-highmem_pages <64 *1024 *1024 /PAGE_SIZE ){ -printk (KERN_ERR "highmem size %uMB results in smaller than 64MB lowmem, ignoring it.\n" ,pages_to_mb (highmem_pages)); +printk (KERN_ERR "highmem size %luMB results in smaller than 64MB lowmem, ignoring it.\n" ,pages_to_mb (highmem_pages)); highmem_pages =0 ; } max_low_pfn -= highmem_pages;
===================================================================
include/asm-x86/pgtable-2level.h +6 -17
@@ -15,25 +15,24 @@ static inline void native_set_pte(pte_t { *ptep = pte; } +static inline void native_set_pte_at (struct mm_struct *mm,unsigned long addr,pte_t *ptep ,pte_t pte) {native_set_pte (ptep, pte); } +static inline void native_set_pmd (pmd_t *pmdp,pmd_t pmd) { *pmdp = pmd; } -#ifndef CONFIG_PARAVIRT -#define set_pte (pteptr, pteval) native_set_pte(pteptr, pteval) -#define set_pte_at (mm,addr,ptep,pteval) native_set_pte_at(mm, addr, ptep, pteval) -#define set_pmd (pmdptr, pmdval) native_set_pmd(pmdptr, pmdval) -#endif +#undef set_pte_atomic#define set_pte_atomic (pteptr, pteval) set_pte(pteptr,pteval)#define set_pte_present (mm,addr,ptep,pteval) set_pte_at(mm,addr,ptep,pteval)#define pte_clear (mm,addr,xp) do { set_pte_at(mm, addr, xp, __pte(0)); } while (0) +#undef pmd_clear#define pmd_clear (xp) do { set_pmd(xp, __pmd(0)); } while (0)static inline void native_pte_clear (struct mm_struct *mm,unsigned long addr,pte_t *xp)
@@ -50,12 +49,6 @@ static inline pte_t native_ptep_get_and_#define native_ptep_get_and_clear (xp) native_local_ptep_get_and_clear(xp)#endif -#define pte_page (x) pfn_to_page(pte_pfn(x)) -#define pte_none (x) (!(x).pte_low) -#define pte_pfn (x) (pte_val(x) >> PAGE_SHIFT) -#define pfn_pte (pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) -#define pfn_pmd (pfn, prot) __pmd(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) -/* * All present pages are kernel-executable: */
@@ -64,17 +57,13 @@ static inline int pte_exec_kernel(pte_treturn 1 ; } +#define __supported_pte_mask (~0ul) +/* * Bits 0, 6 and 7 are taken, split up the 29 bits of offset * into this range: */ #define PTE_FILE_MAX_BITS 29 - -#define pte_to_pgoff (pte) \ - ((((pte).pte_low >> 1) & 0x1f ) + (((pte).pte_low >> 8) << 5 )) - -#define pgoff_to_pte (off) \ - ((pte_t) { (((off) & 0x1f) << 1) + (((off) >> 5) << 8) + _PAGE_FILE })/* Encode and de-code a swap entry */ #define __swp_type (x) (((x).val >> 1) & 0x1f)
===================================================================
include/asm-x86/pgtable-3level.h +0 -40
@@ -94,17 +94,6 @@ static inline void native_pmd_clear(pmd_ *(tmp +1 ) =0 ; } -#ifndef CONFIG_PARAVIRT -#define set_pte (ptep, pte) native_set_pte(ptep, pte) -#define set_pte_at (mm, addr, ptep, pte) native_set_pte_at(mm, addr, ptep, pte) -#define set_pte_present (mm, addr, ptep, pte) native_set_pte_present(mm, addr, ptep, pte) -#define set_pte_atomic (ptep, pte) native_set_pte_atomic(ptep, pte) -#define set_pmd (pmdp, pmd) native_set_pmd(pmdp, pmd) -#define set_pud (pudp, pud) native_set_pud(pudp, pud) -#define pte_clear (mm, addr, ptep) native_pte_clear(mm, addr, ptep) -#define pmd_clear (pmd) native_pmd_clear(pmd) -#endif -/* * Pentium-II erratum A13: in PAE mode we explicitly have to flush * the TLB via cr3 if the top-level pgd is changed...
@@ -119,10 +108,6 @@ static inline void pud_clear (pud_t * pu#define pud_page_vaddr (pud) \ ((unsigned long) __va(pud_val(pud) & PAGE_MASK)) - -/* Find an entry in the second-level page table.. */ -#define pmd_offset (pud, address) ((pmd_t *) pud_page(*(pud)) + \ - pmd_index(address))#ifdef CONFIG_SMP static inline pte_t native_ptep_get_and_clear (pte_t *ptep)
@@ -146,38 +131,13 @@ static inline int pte_same(pte_t a, pte_return a.pte_low == b.pte_low && a.pte_high == b.pte_high; } -#define pte_page (x) pfn_to_page(pte_pfn(x)) - -static inline int pte_none (pte_t pte) -{ -return !pte.pte_low && !pte.pte_high; -} - -static inline unsigned long pte_pfn (pte_t pte) -{ -return pte_val (pte) >>PAGE_SHIFT ; -} -extern unsigned long long __supported_pte_mask; -static inline pte_t pfn_pte (unsigned long page_nr,pgprot_t pgprot) -{ -return __pte ((((unsigned long long )page_nr <<PAGE_SHIFT ) | -pgprot_val (pgprot)) & __supported_pte_mask); -} - -static inline pmd_t pfn_pmd (unsigned long page_nr,pgprot_t pgprot) -{ -return __pmd ((((unsigned long long )page_nr <<PAGE_SHIFT ) | -pgprot_val (pgprot)) & __supported_pte_mask); -}/* * Bits 0, 6 and 7 are taken in the low part of the pte, * put the 32 bits of offset into the high part. */ -#define pte_to_pgoff (pte) ((pte).pte_high) -#define pgoff_to_pte (off) ((pte_t) { _PAGE_FILE, (off) })#define PTE_FILE_MAX_BITS 32/* Encode and de-code a swap entry */
===================================================================
include/asm-x86/pgtable.h +347 -0
352 lines not on this page · raw message
===================================================================
include/asm-x86/pgtable_32.h +1 -227
284 lines not on this page · raw message
===================================================================
include/asm-x86/pgtable_64.h +60 -224
358 lines not on this page · raw message