static inline int activate_shadow_pt_64(struct guest_info * info) {
- // struct cr3_64 * shadow_cr3 = (struct cr3_64 *)&(info->ctrl_regs.cr3);
-
- return -1;
+ struct cr3_64 * shadow_cr3 = (struct cr3_64 *)&(info->ctrl_regs.cr3);
+ struct cr3_64 * guest_cr3 = (struct cr3_64 *)&(info->shdw_pg_state.guest_cr3);
+ addr_t shadow_pt = 0;
+
+ shadow_pt = create_new_shadow_pt(info);
+
+ shadow_cr3->pml4t_base_addr = (addr_t)V3_PAddr((void *)(addr_t)PAGE_BASE_ADDR_4KB(shadow_pt));
+ PrintDebug("Creating new 64 bit shadow page table %p\n", (void *)BASE_TO_PAGE_ADDR(shadow_cr3->pml4t_base_addr))
+
+
+ shadow_cr3->pwt = guest_cr3->pwt;
+ shadow_cr3->pcd = guest_cr3->pcd;
+
+ return 0;
}
* *
* *
*/
+/*
+static int handle_2MB_shadow_pagefault(struct guest_info * info, addr_t fault_addr, pf_error_t error_code,
+ pte64_t * shadow_pt, pde64_2MB_t * large_guest_pde);
-static inline int handle_shadow_pagefault_64(struct guest_info * info, addr_t fault_addr, pf_error_t error_code) {
- pt_access_status_t guest_access;
- pt_access_status_t shadow_access;
- int ret;
- PrintDebug("64 bit shadow page fault\n");
-
- ret = v3_check_guest_pt_32(info, info->shdw_pg_state.guest_cr3, fault_addr, error_code, &guest_access);
+static int handle_pte_shadow_pagefault(struct guest_info * info, addr_t fault_addr, pf_error_t error_code,
+ pte64_t * shadow_pt, pte64_t * guest_pt);
- PrintDebug("Guest Access Check: %d (access=%d)\n", ret, guest_access);
+static int handle_pde_shadow_pagefault(struct guest_info * info, addr_t fault_addr, pf_error_t error_code,
+ pde64_t * shadow_pd, pde64_t * guest_pd);
- ret = v3_check_host_pt_32(info->ctrl_regs.cr3, fault_addr, error_code, &shadow_access);
+static int handle_pdpe_shadow_pagefault(struct guest_info * info, addr_t fault_addr, pf_error_t error_code,
+ pdpe64_t * shadow_pdp, pdpe64_t * guest_pdp);
+*/
- PrintDebug("Shadow Access Check: %d (access=%d)\n", ret, shadow_access);
+static inline int handle_shadow_pagefault_64(struct guest_info * info, addr_t fault_addr, pf_error_t error_code) {
+ /* pml4e64_t * guest_pml = NULL;
+ pml4e64_t * shadow_pml = CR3_TO_PML4E64_VA(info->ctrl_regs.cr3);
+ addr_t guest_cr3 = CR3_TO_PML4E64_PA(info->shdw_pg_state.guest_cr3);
+ pt_access_status_t guest_pml_access;
+ pt_access_status_t shadow_pml_access;
+ pml4e64_t * guest_pmle = NULL;
+ // pml4e64_t * shadow_pmle = ;
+ */
+
PrintError("64 bit shadow paging not implemented\n");