x86: unify asm-x86/page*.h
PATCH 3/4 x86: unify asm-x86/page*.h
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.
--- include/asm-x86/page.h | 333 +++++++++++++++++++++++++++++++++++++++++++-- include/asm-x86/page_32.h | 206 --------------------------- include/asm-x86/page_64.h | 147 ------------------- 3 files changed, 323 insertions(+), 363 deletions(-)
===================================================================
include/asm-x86/page.h +323 -10
@@ -1,13 +1,326 @@ +#ifndef _ASM_X86_PAGE_H +#define _ASM_X86_PAGE_H + +#include <linux/const.h> +#include <linux/compiler.h> + +/* 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) + +#define HPAGE_SIZE (_AC(1,UL) << HPAGE_SHIFT) +#define HPAGE_MASK (~(HPAGE_SIZE - 1)) +#define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) +#ifdef __KERNEL__ -# ifdef CONFIG_X86_32 -# include "page_32.h" -# else -# include "page_64.h" -# endif + +#ifdef CONFIG_X86_32 +#ifdef CONFIG_X86_USE_3DNOW + +#include <asm/mmx.h> + +#define clear_page (page) mmx_clear_page((void *)(page)) +#define copy_page (to,from) mmx_copy_page(to,from) + +#else /* !CONFIG_X86_USE_3DNOW */ + +/* +* On older X86 processors it's not a win to use MMX here it seems. +* Maybe the K6-III ? +*/ + +#define clear_page (page) memset((void *)(page), 0, PAGE_SIZE) +#define copy_page (to,from) memcpy((void *)(to), (void *)(from), PAGE_SIZE) + +#endif /* CONFIG_X86_USE_3DNOW */ + +#define __phys_addr (x) ((unsigned long)(x)-PAGE_OFFSET) + +#define __PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET,ull) + +#define VMALLOC_RESERVE ((unsigned long)__VMALLOC_RESERVE) +#define MAXMEM (-__PAGE_OFFSET-__VMALLOC_RESERVE) + +#ifndef __ASSEMBLY__ +extern unsigned int __VMALLOC_RESERVE; +extern int nx_enabled; + +#include <linux/types.h> +#endif + +#ifdef CONFIG_HUGETLB_PAGE +#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA +#endif + +#ifndef CONFIG_X86_PAE +/* +* 32 bit mode. 2 level pagetable, 32 bit physical, 32 bit virtual +*/ +#define PAGETABLE_LEVELS 2 +#define __PHYSICAL_MASK_SHIFT 32 +#define __VIRTUAL_MASK_SHIFT 32 +#define HPAGE_SHIFT PGDIR_SHIFT + +#ifndef __ASSEMBLY__ +typedef u32 pteval_t ; +typedef u32 pmdval_t ; +typedef u32 pudval_t ; +typedef u32 pgdval_t ; +typedef u32 pgprotval_t ; + +typedef struct {unsigned long pte_low; }pte_t ; + +static inline pteval_t native_pte_val (pte_t pte) +{ +return pte.pte_low; +} + +static inline pte_t native_make_pte (pteval_t val) +{ +return (pte_t ) { val }; +} +#endif /* __ASSEMBLY__ */ + +#else /* CONFIG_X86_PAE */ +/* +* 32 bit PAE mode. 3 level pagetable, 36 bit physical, 32 bit virtual +*/ +#define PAGETABLE_LEVELS 3 +#define __PHYSICAL_MASK_SHIFT 36 +#define __VIRTUAL_MASK_SHIFT 32 +#define HPAGE_SHIFT PMD_SHIFT + +#ifndef __ASSEMBLY__ +typedef u64 pteval_t ; +typedef u64 pmdval_t ; +typedef u64 pudval_t ; +typedef u64 pgdval_t ; +typedef u64 pgprotval_t ; + +typedef struct {unsigned long pte_low, pte_high; }pte_t ; + +static inline pteval_t native_pte_val (pte_t pte) +{ +return pte.pte_low | ((unsigned long long )pte.pte_high <<32 ); +} + +static inline pte_t native_make_pte (pteval_t val) +{ +return (pte_t ) { .pte_low = val, .pte_high = (val >>32 ) } ; +} +#endif /* __ASSEMBLY__ */ + +#endif /* CONFIG_X86_PAE */ + +#else /* !CONFIG_X86_32 */ +/* +* 64 bit mode. 4 level pagetable, 46 bit physical, 48 bit virtual +*/ +#define PAGETABLE_LEVELS 4 +#define __PHYSICAL_MASK_SHIFT 46 +#define __VIRTUAL_MASK_SHIFT 48 +#define HPAGE_SHIFT PMD_SHIFT + +#ifndef __ASSEMBLY__ +typedef u64 pteval_t ; +typedef u64 pmdval_t ; +typedef u64 pudval_t ; +typedef u64 pgdval_t ; +typedef u64 pgprotval_t ; + +typedef struct {pteval_t pte; }pte_t ; + +static inline pteval_t native_pte_val (pte_t pte) +{ +return pte.pte; +} + +static inline pte_t native_make_pte (pteval_t pte) +{ +return (pte_t ){ pte }; +} + +extern unsigned long phys_base; +extern unsigned long end_pfn; +extern unsigned long end_pfn_map; + +void clear_page (void *); +void copy_page (void *,void *); +unsigned long __phys_addr (unsigned long ); +#endif /* __ASSEMBLY__ */ + +#define clear_user_page (page, vaddr, pg) clear_page(page) +#define copy_user_page (to, from, vaddr, pg) copy_page(to, from) + +#define __alloc_zeroed_user_highpage (movableflags, vma, vaddr) \ + alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO | movableflags, vma, vaddr) +#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE + +#ifdef CONFIG_THREAD_ORDER +# define THREAD_ORDER CONFIG_THREAD_ORDER#else -# ifdef __i386__ -# include "page_32.h" -# else -# include "page_64.h" -# endif +# define THREAD_ORDER 1#endif +#define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER) +#define CURRENT_MASK (~(THREAD_SIZE-1)) + +#define EXCEPTION_STACK_ORDER 0 +#define EXCEPTION_STKSZ (PAGE_SIZE << EXCEPTION_STACK_ORDER) + +#define DEBUG_STACK_ORDER (EXCEPTION_STACK_ORDER + 1) +#define DEBUG_STKSZ (PAGE_SIZE << DEBUG_STACK_ORDER) + +#define IRQSTACK_ORDER 2 +#define IRQSTACKSIZE (PAGE_SIZE << IRQSTACK_ORDER) + +#define STACKFAULT_STACK 1 +#define DOUBLEFAULT_STACK 2 +#define NMI_STACK 3 +#define DEBUG_STACK 4 +#define MCE_STACK 5 +#define N_EXCEPTION_STACKS 5/* hw limit: 7 */ + +#define __PHYSICAL_START CONFIG_PHYSICAL_START +#define __KERNEL_ALIGN 0x200000 + +#define KERNEL_TEXT_SIZE (40*1024*1024) +#define KERNEL_TEXT_START _AC(0xffffffff80000000, UL) + +/* +* Make sure kernel is aligned to 2MB address. Catching it at compile +* time is better. Change your config file and compile the kernel +* for a 2MB aligned address (CONFIG_PHYSICAL_START) +*/ +#if (CONFIG_PHYSICAL_START % __KERNEL_ALIGN) !=0 +#error "CONFIG_PHYSICAL_START must be a multiple of 2MB" +#endif + +#define __START_KERNEL (__START_KERNEL_map + __PHYSICAL_START) +#define __START_KERNEL_map _AC(0xffffffff80000000, UL) +#define __PAGE_OFFSET _AC(0xffff810000000000, UL) + +#define vmemmap ((struct page *)VMEMMAP_START) + +#endif /* CONFIG_X86_32 */ + +#ifndef __ASSEMBLY__ +typedef struct {pgprotval_t pgprot; }pgprot_t ; +typedef struct {pgdval_t pgd; }pgd_t ; + +/* Macro so it can be used as lvalue */ +#define pgprot_val (prot) ((prot).pgprot) + +/* Must be macro so it can be used in initializers */ +#define __pgprot (x) ((pgprot_t) { (x) }) + +static inline pgdval_t native_pgd_val (pgd_t pgd) +{ +return pgd.pgd; +} + +static inline pgd_t native_make_pgd (pgdval_t val) +{ +return (pgd_t ) { val }; +} + +#if PAGETABLE_LEVELS >=3 + +typedef struct {pmdval_t pmd; }pmd_t ; + +static inline pmdval_t native_pmd_val (pmd_t pmd) +{ +return pmd.pmd; +} + +static inline pmd_t native_make_pmd (unsigned long long pmd) +{ +return (pmd_t ){ pmd }; +} + +#if PAGETABLE_LEVELS ==4 + +typedef struct {pudval_t pud; }pud_t ; + +static inline pud_t native_make_pud (unsigned long long pud) +{ +return (pud_t ){ pud }; +} + +static inline pudval_t native_pud_val (pud_t pud) +{ +return pud.pud; +} +#else /* PAGETABLE_LEVELS == 3 */ +#include <asm-generic/pgtable-nopud.h> +#endif /* PAGETABLE_LEVELS == 4 */ +#else /* PAGETABLE_LEVELS == 2 */ +#include <asm-generic/pgtable-nopmd.h> +#endif /* PAGETABLE_LEVELS >= 3 */ +#endif /* __ASSEMBLY__ */ + +#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) +#else +# define pud_val (x) native_pgd_val((x).pgd) +#endif + +#ifndef __PAGETABLE_PMD_FOLDED +# define pmd_val (x) native_pmd_val(x) +# define __pmd (x) native_make_pmd(x) +#else +# define pmd_val (x) native_pgd_val((x).pud.pgd) +#endif + +#define pte_val (x) native_pte_val(x) +#define __pte (x) native_make_pte(x) +#endif /* CONFIG_PARAVIRT */ + +#define PTE_MASK PHYSICAL_PAGE_MASK + +#define __PHYSICAL_MASK ((_AC(1,ULL) << __PHYSICAL_MASK_SHIFT) - 1) +#define __VIRTUAL_MASK ((_AC(1,ULL) << __VIRTUAL_MASK_SHIFT) - 1) + +#define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET) + +/* to align the pointer to the (next) page boundary */ +#define PAGE_ALIGN (addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK) + +#define __pa (x) __phys_addr((unsigned long)(x)) +#define __pa_symbol (x) __phys_addr(RELOC_HIDE((unsigned long)(x), 0)) +#define __va (x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) + +#ifdef CONFIG_FLATMEM +#define pfn_valid (pfn) ((pfn) < max_mapnr) +#endif /* CONFIG_FLATMEM */ +#define virt_to_page (kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) +#define virt_addr_valid (kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) +#define pfn_to_kaddr (pfn) __va((pfn) << PAGE_SHIFT) + +#define VM_DATA_DEFAULT_FLAGS \ + (((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0 ) | \ + VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) + +#define clear_user_page (page, vaddr, pg) clear_page(page) +#define copy_user_page (to, from, vaddr, pg) copy_page(to, from) + +#define __alloc_zeroed_user_highpage (movableflags, vma, vaddr) \ + alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO | movableflags, vma, vaddr) +#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE + +#define __HAVE_ARCH_GATE_AREA 1 + +#include <asm-generic/memory_model.h> +#include <asm-generic/page.h> + +#endif /* __KERNEL__ */ +#endif /* _ASM_X86_PAGE_H */
===================================================================
include/asm-x86/page_32.h deleted +0 -206
206 lines not on this page · raw message
===================================================================
include/asm-x86/page_64.h deleted +0 -147
147 lines not on this page · raw message
Quoted 4 lines · Jeremy Fitzhardinge
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.
thanks, i have picked up the other 4 patches. This one did not apply due to 4 other changes in x86.git#mm:
Subject: x86: move page related declaration
Subject: x86: make stack size configurable
Subject: x86: make sparsemem vmemmap the only memory model
Subject: x64/page.h: convert some macros to inlines
Ingo
Quoted 8 lines · On Tue, 11 Dec 2007 09:26:27 +0100 Ingo Molnar wrote:
Quoted 4 lines · Jeremy Fitzhardinge
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.
Quoted 7 lines
thanks, i have picked up the other 4 patches. This one did not apply due to 4 other changes in x86.git#mm:
Subject: x86: move page related declaration
Subject: x86: make stack size configurable
Subject: x86: make sparsemem vmemmap the only memory model
Subject:x64/page.h: convert some macros to inlines
If it will help, I'll remake that last one after Jeremy's patches are applied.
---
~Randy
Features and documentation: http://lwn.net/Articles/260136/