Unify common definitions in page*.h. To simplify other code, I added typedefs for the value of pte/pmd/pud/pgd values, so they can be used symbolically elsewhere without needing to have lots of 32/64/PAE tests. Also, add PAGETABLE_LEVELS define so that other definitions can test for it directly rather than using indirect 32/64/PAE tests. Signed-off-by: Jeremy Fitzhardinge --- include/asm-x86/page.h | 49 ++++++++++++++++++++++------ include/asm-x86/page_32.h | 77 +++++++++++++++++++++++++-------------------- include/asm-x86/page_64.h | 37 +++++++-------------- 3 files changed, 95 insertions(+), 68 deletions(-) =================================================================== --- a/include/asm-x86/page.h +++ b/include/asm-x86/page.h @@ -1,13 +1,42 @@ +#ifndef _ASM_X86_PAGE_H +#define _ASM_X86_PAGE_H + +#include + +/* PAGE_SHIFT determines the page size */ +#define PAGE_SHIFT 12 +#define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) +#define PAGE_MASK (~(PAGE_SIZE-1)) +#define PHYSICAL_PAGE_MASK (~(PAGE_SIZE-1) & __PHYSICAL_MASK) + +#define LARGE_PAGE_MASK (~(LARGE_PAGE_SIZE-1)) +#define LARGE_PAGE_SIZE (_AC(1,UL) << PMD_SHIFT) + #ifdef __KERNEL__ -# ifdef CONFIG_X86_32 -# include "page_32.h" -# else -# include "page_64.h" -# endif + +#ifdef CONFIG_X86_32 +# include "page_32.h" #else -# ifdef __i386__ -# include "page_32.h" -# else -# include "page_64.h" -# endif +# include "page_64.h" #endif + +#ifndef CONFIG_PARAVIRT +#define pgd_val(x) native_pgd_val(x) +#define __pgd(x) native_make_pgd(x) + +#ifndef __PAGETABLE_PUD_FOLDED +#define pud_val(x) native_pud_val(x) +#define __pud(x) native_make_pud(x) +#endif + +#ifndef __PAGETABLE_PMD_FOLDED +#define pmd_val(x) native_pmd_val(x) +#define __pmd(x) native_make_pmd(x) +#endif + +#define pte_val(x) native_pte_val(x) +#define __pte(x) native_make_pte(x) +#endif /* CONFIG_PARAVIRT */ + +#endif /* __KERNEL__ */ +#endif /* _ASM_X86_PAGE_H */ =================================================================== --- a/include/asm-x86/page_32.h +++ b/include/asm-x86/page_32.h @@ -1,16 +1,13 @@ #ifndef _I386_PAGE_H #define _I386_PAGE_H -/* PAGE_SHIFT determines the page size */ -#define PAGE_SHIFT 12 -#define PAGE_SIZE (1UL << PAGE_SHIFT) -#define PAGE_MASK (~(PAGE_SIZE-1)) +#ifndef _ASM_X86_PAGE_H +#error Include asm/page.h +#endif -#define LARGE_PAGE_MASK (~(LARGE_PAGE_SIZE-1)) -#define LARGE_PAGE_SIZE (1UL << PMD_SHIFT) +#ifndef __ASSEMBLY__ -#ifdef __KERNEL__ -#ifndef __ASSEMBLY__ +#include #ifdef CONFIG_X86_USE_3DNOW @@ -43,71 +40,86 @@ */ extern int nx_enabled; +/* macro to avoid #include hell */ +#define native_pud_val(pud) native_pgd_val((pud).pgd) + #ifdef CONFIG_X86_PAE +#define PAGETABLE_LEVELS 3 + +typedef u64 pteval_t; +typedef u64 pmdval_t; +typedef u64 pudval_t; +typedef u64 pgdval_t; + typedef struct { unsigned long pte_low, pte_high; } pte_t; -typedef struct { unsigned long long pmd; } pmd_t; -typedef struct { unsigned long long pgd; } pgd_t; +typedef struct { pmdval_t pmd; } pmd_t; +typedef struct { pgdval_t pgd; } pgd_t; typedef struct { unsigned long long pgprot; } pgprot_t; -static inline unsigned long long native_pgd_val(pgd_t pgd) +static inline pgdval_t native_pgd_val(pgd_t pgd) { return pgd.pgd; } -static inline unsigned long long native_pmd_val(pmd_t pmd) +static inline pmdval_t native_pmd_val(pmd_t pmd) { return pmd.pmd; } -static inline unsigned long long native_pte_val(pte_t pte) +static inline pteval_t native_pte_val(pte_t pte) { return pte.pte_low | ((unsigned long long)pte.pte_high << 32); } -static inline pgd_t native_make_pgd(unsigned long long val) +static inline pgd_t native_make_pgd(pgdval_t val) { return (pgd_t) { val }; } -static inline pmd_t native_make_pmd(unsigned long long val) +static inline pmd_t native_make_pmd(pmdval_t val) { return (pmd_t) { val }; } -static inline pte_t native_make_pte(unsigned long long val) +static inline pte_t native_make_pte(pteval_t val) { return (pte_t) { .pte_low = val, .pte_high = (val >> 32) } ; } -#ifndef CONFIG_PARAVIRT -#define pmd_val(x) native_pmd_val(x) -#define __pmd(x) native_make_pmd(x) -#endif - #define HPAGE_SHIFT 21 #include #else /* !CONFIG_X86_PAE */ + +#define PAGETABLE_LEVELS 2 + +typedef u32 pteval_t; +typedef u32 pmdval_t; +typedef u32 pgdval_t; + typedef struct { unsigned long pte_low; } pte_t; typedef struct { unsigned long pgd; } pgd_t; typedef struct { unsigned long pgprot; } pgprot_t; #define boot_pte_t pte_t /* or would you rather have a typedef */ -static inline unsigned long native_pgd_val(pgd_t pgd) +static inline pgdval_t native_pgd_val(pgd_t pgd) { return pgd.pgd; } -static inline unsigned long native_pte_val(pte_t pte) +static inline pteval_t native_pte_val(pte_t pte) { return pte.pte_low; } -static inline pgd_t native_make_pgd(unsigned long val) +/* macro to avoid #include hell */ +#define native_pmd_val(pmd) native_pud_val((pmd).pud) + +static inline pgd_t native_make_pgd(pgdval_t val) { return (pgd_t) { val }; } -static inline pte_t native_make_pte(unsigned long val) +static inline pte_t native_make_pte(pteval_t val) { return (pte_t) { .pte_low = val }; } @@ -127,13 +139,6 @@ static inline pte_t native_make_pte(unsi #define pgprot_val(x) ((x).pgprot) #define __pgprot(x) ((pgprot_t) { (x) } ) - -#ifndef CONFIG_PARAVIRT -#define pgd_val(x) native_pgd_val(x) -#define __pgd(x) native_make_pgd(x) -#define pte_val(x) native_pte_val(x) -#define __pte(x) native_make_pte(x) -#endif #endif /* !__ASSEMBLY__ */ @@ -175,6 +180,13 @@ extern int page_is_ram(unsigned long pag #define __PAGE_OFFSET ((unsigned long)CONFIG_PAGE_OFFSET) #endif +#ifdef CONFIG_X86_PAE +#define __PHYSICAL_MASK_SHIFT 36 +#else +#define __PHYSICAL_MASK_SHIFT 32 +#endif + +#define __PHYSICAL_MASK ((_AC(1,ULL) << __PHYSICAL_MASK_SHIFT) - 1) #define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET) #define VMALLOC_RESERVE ((unsigned long)__VMALLOC_RESERVE) @@ -201,6 +213,5 @@ extern int page_is_ram(unsigned long pag #include #define __HAVE_ARCH_GATE_AREA 1 -#endif /* __KERNEL__ */ #endif /* _I386_PAGE_H */ =================================================================== --- a/include/asm-x86/page_64.h +++ b/include/asm-x86/page_64.h @@ -1,13 +1,13 @@ #ifndef _X86_64_PAGE_H #define _X86_64_PAGE_H +#ifndef _ASM_X86_PAGE_H +#error Include asm/page.h +#endif + #include -/* PAGE_SHIFT determines the page size */ -#define PAGE_SHIFT 12 -#define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) -#define PAGE_MASK (~(PAGE_SIZE-1)) -#define PHYSICAL_PAGE_MASK (~(PAGE_SIZE-1) & __PHYSICAL_MASK) +#define PAGETABLE_LEVELS 4 #define THREAD_ORDER 1 #define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER) @@ -29,16 +29,14 @@ #define MCE_STACK 5 #define N_EXCEPTION_STACKS 5 /* hw limit: 7 */ -#define LARGE_PAGE_MASK (~(LARGE_PAGE_SIZE-1)) -#define LARGE_PAGE_SIZE (_AC(1,UL) << PMD_SHIFT) - #define HPAGE_SHIFT PMD_SHIFT #define HPAGE_SIZE (_AC(1,UL) << HPAGE_SHIFT) #define HPAGE_MASK (~(HPAGE_SIZE - 1)) #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) -#ifdef __KERNEL__ #ifndef __ASSEMBLY__ + +#include extern unsigned long end_pfn; @@ -59,6 +57,11 @@ typedef struct { unsigned long pud; } pu typedef struct { unsigned long pud; } pud_t; typedef struct { unsigned long pgd; } pgd_t; #define PTE_MASK PHYSICAL_PAGE_MASK + +typedef u64 pteval_t; +typedef u64 pmdval_t; +typedef u64 pudval_t; +typedef u64 pgdval_t; typedef struct { unsigned long pgprot; } pgprot_t; @@ -104,20 +107,6 @@ static inline pgd_t native_make_pgd(unsi { return (pgd_t){ pgd }; } - -#ifdef CONFIG_PARAVIRT -#include -#else -#define pte_val(x) native_pte_val(x) -#define pmd_val(x) native_pmd_val(x) -#define pud_val(x) native_pud_val(x) -#define pgd_val(x) native_pgd_val(x) - -#define __pte(x) ((pte_t) { (x) } ) -#define __pmd(x) ((pmd_t) { (x) } ) -#define __pud(x) ((pud_t) { (x) } ) -#define __pgd(x) ((pgd_t) { (x) } ) -#endif /* CONFIG_PARAVIRT */ #define pgprot_val(x) ((x).pgprot) #define __pgprot(x) ((pgprot_t) { (x) } ) @@ -185,6 +174,4 @@ extern unsigned long __phys_addr(unsigne #include #include -#endif /* __KERNEL__ */ - #endif /* _X86_64_PAGE_H */ -- - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/