4 #include <geekos/ktypes.h>
8 #include <geekos/vmm_mem.h>
9 #include <geekos/vmm_util.h>
11 #define MAX_PAGE_TABLE_ENTRIES 1024
12 #define MAX_PAGE_DIR_ENTRIES 1024
14 #define MAX_PAGE_TABLE_ENTRIES_64 512
15 #define MAX_PAGE_DIR_ENTRIES_64 512
16 #define MAX_PAGE_DIR_PTR_ENTRIES_64 512
17 #define MAX_PAGE_MAP_ENTRIES_64 512
19 #define PAGE_DIRECTORY_INDEX(x) ((((uint_t)x) >> 22) & 0x3ff)
20 #define PAGE_TABLE_INDEX(x) ((((uint_t)x) >> 12) & 0x3ff)
21 #define PAGE_OFFSET(x) ((((uint_t)x) & 0xfff))
23 #define PAGE_ALLIGNED_ADDR(x) (((uint_t) (x)) >> 12)
24 #define PAGE_ADDR(x) (PAGE_ALLIGNED_ADDR(x) << 12)
35 #define GUEST_PAGE 0x0
36 #define SHARED_PAGE 0x1
43 uint_t large_pages : 1;
44 uint_t global_page : 1;
46 uint_t pt_base_addr : 20;
55 uint_t global_page : 1;
57 uint_t page_base_addr : 20;
62 typedef struct pte64 {
68 uint_t global_page : 1;
70 uint_t page_base_addr_lo : 20;
71 uint_t page_base_addr_hi : 20;
72 uint_t available : 11;
73 uint_t no_execute : 1;
76 typedef struct pde64 {
81 uint_t large_pages : 1;
84 uint_t pt_base_addr_lo : 20;
85 uint_t pt_base_addr_hi : 20;
86 uint_t available : 11;
87 uint_t no_execute : 1;
90 typedef struct pdpe64 {
98 uint_t large_pages : 1;
101 uint_t pd_base_addr_lo : 20;
102 uint_t pd_base_addr_hi : 20;
103 uint_t available : 11;
104 uint_t no_execute : 1;
108 typedef struct pml4e {
118 uint_t pdp_base_addr_lo : 20;
119 uint_t pdp_base_addr_hi : 20;
120 uint_t available : 11;
121 uint_t no_execute : 1;
125 vmm_pde_t * generate_guest_page_tables(vmm_mem_layout_t * layout, vmm_mem_list_t * list);
126 pml4e64_t * generate_guest_page_tables_64(vmm_mem_layout_t * layout, vmm_mem_list_t * list);
128 void free_guest_page_tables(vmm_pde_t * pde);
130 void PrintDebugPageTables(vmm_pde_t * pde);