-#define MAX_PTE32_ENTRIES 1024
#define MAX_PDE32_ENTRIES 1024
+#define MAX_PTE32_ENTRIES 1024
-#define MAX_PTE32PAE_ENTRIES 512
-#define MAX_PDE32PAE_ENTRIES 512
#define MAX_PDPE32PAE_ENTRIES 4
+#define MAX_PDE32PAE_ENTRIES 512
+#define MAX_PTE32PAE_ENTRIES 512
-#define MAX_PTE64_ENTRIES 512
-#define MAX_PDE64_ENTRIES 512
-#define MAX_PDPE64_ENTRIES 512
#define MAX_PML4E64_ENTRIES 512
+#define MAX_PDPE64_ENTRIES 512
+#define MAX_PDE64_ENTRIES 512
+#define MAX_PTE64_ENTRIES 512
+
+
+typedef enum {PAGE_4KB, PAGE_2MB, PAGE_4MB, PAGE_1GB,
+ PAGE_NOT_PRESENT,
+ PAGE_PT32, PAGE_PD32,
+ PAGE_PDP32PAE, PAGE_PD32PAE, PAGE_PT32PAE,
+ PAGE_PML464, PAGE_PDP64, PAGE_PD64, PAGE_PT64} page_type_t;
/* Converts an address into a page table index */
/* Gets the base address needed for a Page Table entry */
-/* Deprecate these :*/
-/*
- #define PD32_BASE_ADDR(x) (((uint_t)x) >> 12)
- #define PT32_BASE_ADDR(x) (((uint_t)x) >> 12)
- #define PD32_4MB_BASE_ADDR(x) (((uint_t)x) >> 22)
-
- #define PML4E64_BASE_ADDR(x) (((ullong_t)x) >> 12)
- #define PDPE64_BASE_ADDR(x) (((ullong_t)x) >> 12)
- #define PDE64_BASE_ADDR(x) (((ullong_t)x) >> 12)
- #define PTE64_BASE_ADDR(x) (((ullong_t)x) >> 12)
-
- // Accessor functions for the page table structures
- #define PDE32_T_ADDR(x) (((x).pt_base_addr) << 12)
- #define PTE32_T_ADDR(x) (((x).page_base_addr) << 12)
- #define PDE32_4MB_T_ADDR(x) (((x).page_base_addr) << 22)
-*/
-/* Replace The above with these... */
#define PAGE_BASE_ADDR(x) ((x) >> 12)
+#define PAGE_BASE_ADDR_4KB(x) ((x) >> 12)
#define PAGE_BASE_ADDR_2MB(x) ((x) >> 21)
#define PAGE_BASE_ADDR_4MB(x) ((x) >> 22)
+#define PAGE_BASE_ADDR_1GB(x) ((x) >> 30)
#define BASE_TO_PAGE_ADDR(x) (((addr_t)x) << 12)
+#define BASE_TO_PAGE_ADDR_4KB(x) (((addr_t)x) << 12)
#define BASE_TO_PAGE_ADDR_2MB(x) (((addr_t)x) << 21)
#define BASE_TO_PAGE_ADDR_4MB(x) (((addr_t)x) << 22)
+#define BASE_TO_PAGE_ADDR_1GB(x) (((addr_t)x) << 30)
/* *** */
-/* Deprecated */
-/*
- #define PT32_PAGE_OFFSET(x) (((uint_t)x) & 0xfff)
- #define PD32_4MB_PAGE_OFFSET(x) (((uint_t)x) & 0x003fffff)
-
- #define PT32_PAGE_ADDR(x) (((uint_t)x) & 0xfffff000)
- #define PD32_4MB_PAGE_ADDR(x) (((uint_t)x) & 0xffc00000)
-
- #define PT32_PAGE_POWER 12
- #define PAGE_ALIGNED_ADDR(x) (((uint_t) (x)) >> 12)
- //#define PAGE_ADDR(x) (PAGE_ALIGNED_ADDR(x) << 12)
- #define PAGE_POWER 12
- #define PAGE_SIZE 4096
-*/
-/* use these instead */
+
#define PAGE_OFFSET(x) ((x) & 0xfff)
+#define PAGE_OFFSET_4KB(x) ((x) & 0xfff)
#define PAGE_OFFSET_2MB(x) ((x) & 0x1fffff)
#define PAGE_OFFSET_4MB(x) ((x) & 0x3fffff)
+#define PAGE_OFFSET_1GB(x) ((x) & 0x3fffffff)
#define PAGE_POWER 12
-#define PAGE_POWER_2MB 22
-#define PAGE_POWER_4MB 21
+#define PAGE_POWER_4KB 12
+#define PAGE_POWER_2MB 21
+#define PAGE_POWER_4MB 22
+#define PAGE_POWER_1GB 30
// We shift instead of mask because we don't know the address size
#define PAGE_ADDR(x) (((x) >> PAGE_POWER) << PAGE_POWER)
+#define PAGE_ADDR_4KB(x) (((x) >> PAGE_POWER_4KB) << PAGE_POWER_4KB)
#define PAGE_ADDR_2MB(x) (((x) >> PAGE_POWER_2MB) << PAGE_POWER_2MB)
#define PAGE_ADDR_4MB(x) (((x) >> PAGE_POWER_4MB) << PAGE_POWER_4MB)
+#define PAGE_ADDR_1GB(x) (((x) >> PAGE_POWER_1GB) << PAGE_POWER_1GB)
#define PAGE_SIZE 4096
+#define PAGE_SIZE_4KB 4096
#define PAGE_SIZE_2MB (4096 * 512)
#define PAGE_SIZE_4MB (4096 * 1024)
-
+#define PAGE_SIZE_1GB 0x40000000
/* *** */
typedef enum {PT_ENTRY_NOT_PRESENT, PT_ENTRY_LARGE_PAGE, PT_ENTRY_PAGE} pt_entry_type_t;
typedef enum {PT_ACCESS_OK, PT_ACCESS_NOT_PRESENT, PT_ACCESS_WRITE_ERROR, PT_ACCESS_USER_ERROR} pt_access_status_t;
+
+typedef struct gen_pt {
+ uint_t present : 1;
+ uint_t writable : 1;
+ uint_t user_page : 1;
+} __attribute__((packed)) gen_pt_t;
+
typedef struct pde32 {
uint_t present : 1;
uint_t writable : 1;
-void delete_page_tables_32(pde32_t * pde);
-void delete_page_tables_32PAE(pdpe32pae_t * pdpe);
-void delete_page_tables_64(pml4e64_t * pml4);
struct guest_info;
-int v3_translate_guest_pt_32(struct guest_info * info, addr_t guest_cr3, addr_t vaddr, addr_t * paddr);
-int v3_translate_guest_pt_32pae(struct guest_info * info, addr_t guest_cr3, addr_t vaddr, addr_t * paddr);
-int v3_translate_guest_pt_64(struct guest_info * info, addr_t guest_cr3, addr_t vaddr, addr_t * paddr);
-
-int v3_translate_host_pt_32(addr_t host_cr3, addr_t vaddr, addr_t * paddr);
-int v3_translate_host_pt_32pae(addr_t host_cr3, addr_t vaddr, addr_t * paddr);
-int v3_translate_host_pt_64(addr_t host_cr3, addr_t vaddr, addr_t * paddr);
-
-
-/* Should these be static? */
-pt_entry_type_t pde32_lookup(pde32_t * pd, addr_t addr, addr_t * entry);
-pt_entry_type_t pte32_lookup(pte32_t * pt, addr_t addr, addr_t * entry);
-
-pt_entry_type_t pdpe32pae_lookup(pdpe32pae_t * pdp, addr_t addr, addr_t * entry);
-pt_entry_type_t pde32pae_lookup(pde32pae_t * pd, addr_t addr, addr_t * entry);
-pt_entry_type_t pte32pae_lookup(pte32pae_t * pt, addr_t addr, addr_t * entry);
-
-pt_entry_type_t pml4e64_lookup(pml4e64_t * pml, addr_t addr, addr_t * entry);
-pt_entry_type_t pdpe64_lookup(pdpe64_t * pdp, addr_t addr, addr_t * entry);
-pt_entry_type_t pde64_lookup(pde64_t * pd, addr_t addr, addr_t * entry);
-pt_entry_type_t pte64_lookup(pte64_t * pt, addr_t addr, addr_t * entry);
-
-
-
-
-
-
-pt_access_status_t can_access_pde32(pde32_t * pde, addr_t addr, pf_error_t access_type);
-pt_access_status_t can_access_pte32(pte32_t * pte, addr_t addr, pf_error_t access_type);
-
-
-
-
-
-struct guest_info;
+int v3_translate_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr, addr_t * paddr);
+int v3_translate_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr, addr_t * paddr);
+int v3_translate_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr, addr_t * paddr);
+
+int v3_translate_host_pt_32(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr, addr_t * paddr);
+int v3_translate_host_pt_32pae(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr, addr_t * paddr);
+int v3_translate_host_pt_64(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr, addr_t * paddr);
+
+
+int v3_find_host_pt_32_page(struct guest_info * info, v3_reg_t host_cr3, page_type_t type, addr_t vaddr,
+ addr_t * page_ptr, addr_t * page_pa);
+int v3_find_host_pt_32pae_page(struct guest_info * info, v3_reg_t host_cr3, page_type_t type, addr_t vaddr,
+ addr_t * page_ptr, addr_t * page_pa);
+int v3_find_host_pt_64_page(struct guest_info * info, v3_reg_t host_cr3, page_type_t type, addr_t vaddr,
+ addr_t * page_ptr, addr_t * page_pa);
+int v3_find_guest_pt_32_page(struct guest_info * info, v3_reg_t guest_cr3,
+ page_type_t type, addr_t vaddr,
+ addr_t * page_ptr, addr_t * page_pa);
+int v3_find_guest_pt_32pae_page(struct guest_info * info, v3_reg_t guest_cr3,
+ page_type_t type, addr_t vaddr,
+ addr_t * page_ptr, addr_t * page_pa);
+int v3_find_guest_pt_64_page(struct guest_info * info, v3_reg_t guest_cr3,
+ page_type_t type, addr_t vaddr,
+ addr_t * page_ptr, addr_t * page_pa);
+
+pt_access_status_t inline v3_can_access_pde32(pde32_t * pde, addr_t addr, pf_error_t access_type);
+pt_access_status_t inline v3_can_access_pte32(pte32_t * pte, addr_t addr, pf_error_t access_type);
+
+pt_access_status_t inline v3_can_access_pdpe32pae(pdpe32pae_t * pdpe, addr_t addr, pf_error_t access_type);
+pt_access_status_t inline v3_can_access_pde32pae(pde32pae_t * pde, addr_t addr, pf_error_t access_type);
+pt_access_status_t inline v3_can_access_pte32pae(pte32pae_t * pte, addr_t addr, pf_error_t access_type);
+
+pt_access_status_t inline v3_can_access_pml4e64(pml4e64_t * pmle, addr_t addr, pf_error_t access_type);
+pt_access_status_t inline v3_can_access_pdpe64(pdpe64_t * pdpe, addr_t addr, pf_error_t access_type);
+pt_access_status_t inline v3_can_access_pde64(pde64_t * pde, addr_t addr, pf_error_t access_type);
+pt_access_status_t inline v3_can_access_pte64(pte64_t * pte, addr_t addr, pf_error_t access_type);
+
+
+int v3_check_host_pt_32(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr,
+ pf_error_t access_type, pt_access_status_t * access_status);
+int v3_check_host_pt_32pae(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr,
+ pf_error_t access_type, pt_access_status_t * access_status);
+int v3_check_host_pt_64(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr,
+ pf_error_t access_type, pt_access_status_t * access_status);
+int v3_check_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr,
+ pf_error_t access_type, pt_access_status_t * access_status);
+int v3_check_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr,
+ pf_error_t access_type, pt_access_status_t * access_status);
+int v3_check_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr,
+ pf_error_t access_type, pt_access_status_t * access_status);
+
+
+
+
+int v3_drill_host_pt_32(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr,
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+ void * private_data);
+int v3_drill_host_pt_32pae(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr,
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+ void * private_data);
+int v3_drill_host_pt_64(struct guest_info * info, v3_reg_t host_cr3, addr_t vaddr,
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+ void * private_data);
+
+int v3_drill_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr,
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+ void * private_data);
+int v3_drill_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr,
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+ void * private_data);
+int v3_drill_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t vaddr,
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+ void * private_data);
+
+
+
+int v3_walk_host_pt_32(struct guest_info * info, v3_reg_t host_cr3,
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_va, addr_t page_pa, void * private_data),
+ void * private_data);
+
+int v3_walk_host_pt_32pae(struct guest_info * info, v3_reg_t host_cr3,
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_va, addr_t page_pa, void * private_data),
+ void * private_data);
+
+int v3_walk_host_pt_64(struct guest_info * info, v3_reg_t host_cr3,
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_va, addr_t page_pa, void * private_data),
+ void * private_data);
+
+int v3_walk_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3,
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_va, addr_t page_pa, void * private_data),
+ void * private_data);
+
+int v3_walk_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3,
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_va, addr_t page_pa, void * private_data),
+ void * private_data);
+
+int v3_walk_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3,
+ int (*callback)(struct guest_info * info, page_type_t type, addr_t vaddr, addr_t page_va, addr_t page_pa, void * private_data),
+ void * private_data);
+
pde32_t * create_passthrough_pts_32(struct guest_info * guest_info);
pdpe32pae_t * create_passthrough_pts_32PAE(struct guest_info * guest_info);
pml4e64_t * create_passthrough_pts_64(struct guest_info * info);
+void delete_page_tables_32(pde32_t * pde);
+void delete_page_tables_32PAE(pdpe32pae_t * pdpe);
+void delete_page_tables_64(pml4e64_t * pml4);
-//#include <palacios/vm_guest.h>
-void PrintDebugPageTables(pde32_t * pde);
+const uchar_t * v3_page_type_to_str(page_type_t type);
-void PrintPageTree(v3_vm_cpu_mode_t cpu_mode, addr_t virtual_addr, addr_t cr3);
-void PrintPageTree_64(addr_t virtual_addr, pml4e64_t * pml);
+void PrintPTEntry(struct guest_info * info, page_type_t type, addr_t vaddr, void * entry);
+void PrintHostPageTables(struct guest_info * info, addr_t cr3);
+void PrintGuestPageTables(struct guest_info * info, addr_t cr3);
+void PrintHostPageTree(struct guest_info * info, addr_t virtual_addr, addr_t cr3);
+void PrintGuestPageTree(struct guest_info * info, addr_t virtual_addr, addr_t cr3);
-void PrintPT32(addr_t starting_address, pte32_t * pte);
-void PrintPD32(pde32_t * pde);
-void PrintPTE32(addr_t virtual_address, pte32_t * pte);
-void PrintPDE32(addr_t virtual_address, pde32_t * pde);
-
-void PrintDebugPageTables32PAE(pdpe32pae_t * pde);
-void PrintPTE32PAE(addr_t virtual_address, pte32pae_t * pte);
-void PrintPDE32PAE(addr_t virtual_address, pde32pae_t * pde);
-void PrintPTE64(addr_t virtual_address, pte64_t * pte);
#endif // !__V3VEE__