1 #include <xtf/asm_macros.h>
5 #define PAGETABLE_START(sym) \
8 #define PAGETABLE_END(sym) \
9 .type sym, STT_OBJECT; \
12 #define _PAGE_LEAF (_PAGE_AD + _PAGE_RW + _PAGE_PRESENT)
13 #define _PAGE_SUPER (_PAGE_PSE + _PAGE_LEAF)
14 #define _PAGE_NONLEAF (_PAGE_USER + _PAGE_LEAF)
16 #define PAE_IDX(sym) ((. - (sym)) / PAE_PTE_SIZE)
17 #define PSE_IDX(sym) ((. - (sym)) / PSE_PTE_SIZE)
19 .section ".data.page_aligned", "aw"
22 /* PAE mappings of first 2M of memory in 4k pages. Uses 1x 4k page. */
23 PAGETABLE_START(pae_l1_identmap)
24 .long 0, 0 /* Unmap page at 0 to catch errors with NULL pointers. */
25 .rept PAE_L1_PT_ENTRIES - 1
26 .long (PAE_IDX(pae_l1_identmap) << PAE_L1_PT_SHIFT) + _PAGE_LEAF
29 PAGETABLE_END(pae_l1_identmap)
31 /* PAE mappings up to 4G, mostly in 2M superpages. Uses 4x 4k pages. */
32 PAGETABLE_START(pae_l2_identmap)
33 .long pae_l1_identmap + _PAGE_NONLEAF
35 .rept (4 * PAE_L2_PT_ENTRIES) - 1
36 .long (PAE_IDX(pae_l2_identmap) << PAE_L2_PT_SHIFT) + _PAGE_SUPER
39 PAGETABLE_END(pae_l2_identmap)
40 .Lpae_l2_identmap_end:
42 /* PAE l3 pagetable. Maps 4x l2 tables. */
43 PAGETABLE_START(pae_l3_identmap)
45 .long pae_l2_identmap + (PAE_IDX(pae_l3_identmap) << PAGE_SHIFT) + _PAGE_NONLEAF
48 .fill PAE_L3_PT_ENTRIES - 4, 8, 0
49 PAGETABLE_END(pae_l3_identmap)
51 /* PAE l4 pagetable. Maps 1x l3 table. */
52 PAGETABLE_START(pae_l4_identmap)
53 .long pae_l3_identmap + _PAGE_NONLEAF
55 .fill PAE_L4_PT_ENTRIES - 1, 8, 0
56 PAGETABLE_END(pae_l4_identmap)
58 /* PSE mappings of the first 4M of memory in 4k pages. Uses 1x 4k page. */
59 PAGETABLE_START(pse_l1_identmap)
60 .long 0 /* Unmap page at 0 to catch errors with NULL pointers. */
61 .rept PSE_L1_PT_ENTRIES - 1
62 .long (PSE_IDX(pse_l1_identmap) << PSE_L1_PT_SHIFT) + _PAGE_LEAF
64 PAGETABLE_END(pse_l1_identmap)
66 /* PSE mappings up to 4G, mostly in 4M superpages. Uses 1x 4k page. */
67 PAGETABLE_START(pse_l2_identmap)
68 .long pse_l1_identmap + _PAGE_NONLEAF
69 .rept PSE_L2_PT_ENTRIES - 1
70 .long (PSE_IDX(pse_l2_identmap) << PSE_L2_PT_SHIFT) + _PAGE_SUPER
72 PAGETABLE_END(pse_l2_identmap)
73 .Lpse_l2_identmap_end:
77 /* PAE l3 32bit quad. Contains 4 64bit entries. */
78 PAGETABLE_START(pae32_l3_identmap)
79 .rept PAE32_L3_ENTRIES
80 .long pae_l2_identmap + (PAE_IDX(pae32_l3_identmap) << PAGE_SHIFT) + _PAGE_PRESENT
83 PAGETABLE_END(pae32_l3_identmap)
86 /* Aliases of the live tables (PAE or PSE as appropriate). */
87 #if CONFIG_PAGING_LEVELS >= 3
88 .set l1_identmap, pae_l1_identmap
89 .set l2_identmap, pae_l2_identmap
90 .set l2_identmap_end, .Lpae_l2_identmap_end
92 .set l1_identmap, pse_l1_identmap
93 .set l2_identmap, pse_l2_identmap
94 .set l2_identmap_end, .Lpse_l2_identmap_end
98 .global l2_identmap_end
100 /* Alias of the pagetable %cr3 points at. */
101 #if CONFIG_PAGING_LEVELS > 0
103 #if CONFIG_PAGING_LEVELS == 2
104 .set cr3_target, pse_l2_identmap
105 #elif CONFIG_PAGING_LEVELS == 3
106 .set cr3_target, pae32_l3_identmap
107 #elif CONFIG_PAGING_LEVELS == 4
108 .set cr3_target, pae_l4_identmap
110 # error Bad paging mode
121 * indent-tabs-mode: nil