Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Merge branch 'devel'
[palacios.git] / kitten / include / arch-x86_64 / page.h
1 #ifndef _X86_64_PAGE_H
2 #define _X86_64_PAGE_H
3
4 #include <lwk/const.h>
5
6 /**
7  * Define the base page size, 4096K on x86_64.
8  * PAGE_SHIFT defines the base page size.
9  */
10 #define PAGE_SHIFT              12
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)
14
15 /**
16  * The kernel is mapped into the virtual address space of every task:
17  *
18  *     [PAGE_OFFSET, TOP_OF_MEMORY)  Kernel-space virtual memory region
19  *     [0, PAGE_OFFSET]              User-space virtual memory region
20  */
21 #define PAGE_OFFSET             _AC(0xffff810000000000, UL)
22
23 /**
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.
26  */
27 #define __PHYSICAL_START        CONFIG_PHYSICAL_START
28 #define __KERNEL_ALIGN          0x200000
29
30 /**
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.
33  */
34 #if (CONFIG_PHYSICAL_START % __KERNEL_ALIGN) != 0
35 #error "CONFIG_PHYSICAL_START must be a multiple of 2MB"
36 #endif
37
38 /**
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
41  * __START_KERNEL.
42  */
43 #define __START_KERNEL_map      _AC(0xffffffff80000000, UL)
44 #define __START_KERNEL          (__START_KERNEL_map + __PHYSICAL_START)
45
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)
51
52 #define TASK_ORDER 1 
53 #define TASK_SIZE  (PAGE_SIZE << TASK_ORDER)
54 #define CURRENT_MASK (~(TASK_SIZE-1))
55
56 #define EXCEPTION_STACK_ORDER 0
57 #define EXCEPTION_STKSZ (PAGE_SIZE << EXCEPTION_STACK_ORDER)
58
59 #define DEBUG_STACK_ORDER EXCEPTION_STACK_ORDER
60 #define DEBUG_STKSZ (PAGE_SIZE << DEBUG_STACK_ORDER)
61
62 #define IRQSTACK_ORDER 2
63 #define IRQSTACKSIZE (PAGE_SIZE << IRQSTACK_ORDER)
64
65 #define STACKFAULT_STACK        1
66 #define DOUBLEFAULT_STACK       2
67 #define NMI_STACK               3
68 #define DEBUG_STACK             4
69 #define MCE_STACK               5
70 #define N_EXCEPTION_STACKS      5       /* hw limit is 7 */
71
72 /**
73  * Macros for converting between physical address and kernel virtual address.
74  * NOTE: These only work for kernel virtual addresses in the identity map.
75  */
76 #ifndef __ASSEMBLY__
77 extern unsigned long __phys_addr(unsigned long virt_addr);
78 #endif
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)
84
85 #ifndef __ASSEMBLY__
86 /*
87  * These are used to make use of C type-checking..
88  */
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
94
95
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[];
102
103 typedef struct { unsigned long pgprot; } pgprot_t;
104
105 extern unsigned long end_pfn;
106
107 #endif
108
109 #define PTRS_PER_PGD    512
110 #define KERNEL_TEXT_SIZE (40*1024*1024)
111
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)
117
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) } )
123
124 #define LARGE_PAGE_MASK (~(LARGE_PAGE_SIZE-1))
125 #define LARGE_PAGE_SIZE (_AC(1,UL) << PMD_SHIFT)
126
127 #endif