7 * Define the base page size, 4096K on x86_64.
8 * PAGE_SHIFT defines the base page size.
11 #define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT)
12 #define PAGE_MASK (~(PAGE_SIZE-1))
13 #define PHYSICAL_PAGE_MASK (~(PAGE_SIZE-1) & __PHYSICAL_MASK)
16 * The kernel is mapped into the virtual address space of every task:
18 * [PAGE_OFFSET, TOP_OF_MEMORY) Kernel-space virtual memory region
19 * [0, PAGE_OFFSET] User-space virtual memory region
21 #define PAGE_OFFSET _AC(0xffff810000000000, UL)
24 * The bootloader loads the LWK at address __PHYSICAL_START in physical memory.
25 * This must be aligned on a 2 MB page boundary... or else.
27 #define __PHYSICAL_START CONFIG_PHYSICAL_START
28 #define __KERNEL_ALIGN 0x200000
31 * If you hit this error when compiling the LWK, change your config file so that
32 * CONFIG_PHYSICAL_START is aligned to a 2 MB boundary.
34 #if (CONFIG_PHYSICAL_START % __KERNEL_ALIGN) != 0
35 #error "CONFIG_PHYSICAL_START must be a multiple of 2MB"
39 * The kernel page tables map the kernel image text and data starting at
40 * virtual address __START_KERNEL_map. The kernel text starts at
43 #define __START_KERNEL_map _AC(0xffffffff80000000, UL)
44 #define __START_KERNEL (__START_KERNEL_map + __PHYSICAL_START)
46 /* See Documentation/x86_64/mm.txt for a description of the memory map. */
47 #define __PHYSICAL_MASK_SHIFT 46
48 #define __PHYSICAL_MASK ((_AC(1,UL) << __PHYSICAL_MASK_SHIFT) - 1)
49 #define __VIRTUAL_MASK_SHIFT 48
50 #define __VIRTUAL_MASK ((_AC(1,UL) << __VIRTUAL_MASK_SHIFT) - 1)
53 #define TASK_SIZE (PAGE_SIZE << TASK_ORDER)
54 #define CURRENT_MASK (~(TASK_SIZE-1))
56 #define EXCEPTION_STACK_ORDER 0
57 #define EXCEPTION_STKSZ (PAGE_SIZE << EXCEPTION_STACK_ORDER)
59 #define DEBUG_STACK_ORDER EXCEPTION_STACK_ORDER
60 #define DEBUG_STKSZ (PAGE_SIZE << DEBUG_STACK_ORDER)
62 #define IRQSTACK_ORDER 2
63 #define IRQSTACKSIZE (PAGE_SIZE << IRQSTACK_ORDER)
65 #define STACKFAULT_STACK 1
66 #define DOUBLEFAULT_STACK 2
70 #define N_EXCEPTION_STACKS 5 /* hw limit is 7 */
73 * Macros for converting between physical address and kernel virtual address.
74 * NOTE: These only work for kernel virtual addresses in the identity map.
77 extern unsigned long __phys_addr(unsigned long virt_addr);
79 #define __pa(x) __phys_addr((unsigned long)(x))
80 #define __pa_symbol(x) __phys_addr((unsigned long)(x))
81 #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))
82 #define __boot_va(x) __va(x)
83 #define __boot_pa(x) __pa(x)
87 * These are used to make use of C type-checking..
89 typedef struct { unsigned long pte; } pte_t;
90 typedef struct { unsigned long pmd; } pmd_t;
91 typedef struct { unsigned long pud; } pud_t;
92 typedef struct { unsigned long pgd; } pgd_t;
93 #define PTE_MASK PHYSICAL_PAGE_MASK
96 extern pud_t level3_kernel_pgt[512];
97 extern pud_t level3_physmem_pgt[512];
98 extern pud_t level3_ident_pgt[512];
99 extern pmd_t level2_kernel_pgt[512];
100 extern pgd_t init_level4_pgt[];
101 extern pgd_t boot_level4_pgt[];
103 typedef struct { unsigned long pgprot; } pgprot_t;
105 extern unsigned long end_pfn;
109 #define PTRS_PER_PGD 512
110 #define KERNEL_TEXT_SIZE (40*1024*1024)
112 #define pte_val(x) ((x).pte)
113 #define pmd_val(x) ((x).pmd)
114 #define pud_val(x) ((x).pud)
115 #define pgd_val(x) ((x).pgd)
116 #define pgprot_val(x) ((x).pgprot)
118 #define __pte(x) ((pte_t) { (x) } )
119 #define __pmd(x) ((pmd_t) { (x) } )
120 #define __pud(x) ((pud_t) { (x) } )
121 #define __pgd(x) ((pgd_t) { (x) } )
122 #define __pgprot(x) ((pgprot_t) { (x) } )
124 #define LARGE_PAGE_MASK (~(LARGE_PAGE_SIZE-1))
125 #define LARGE_PAGE_SIZE (_AC(1,UL) << PMD_SHIFT)