/* This will contain function pointers that provide OS services */
struct v3_os_hooks {
- void (*print_info)(const char * format, ...)
- __attribute__ ((format (printf, 1, 2)));
- void (*print_debug)(const char * format, ...)
- __attribute__ ((format (printf, 1, 2)));
- void (*print_trace)(const char * format, ...)
- __attribute__ ((format (printf, 1, 2)));
+ void (*print_info)(const char * format, ...);
+ // __attribute__ ((format (printf, 1, 2)));
+ void (*print_debug)(const char * format, ...);
+ // __attribute__ ((format (printf, 1, 2)));
+ void (*print_trace)(const char * format, ...);
+ // __attribute__ ((format (printf, 1, 2)));
void *(*allocate_pages)(int numPages);
void (*free_page)(void * page);
PrintDebug("Creating initial shadow page table\n");
vm_info->direct_map_pt = (addr_t)V3_PAddr(create_passthrough_pde32_pts(vm_info));
- vm_info->shdw_pg_state.shadow_cr3 |= (vm_info->direct_map_pt & ~0xfff);
+ //vm_info->shdw_pg_state.shadow_cr3 |= (vm_info->direct_map_pt & ~0xfff);
+ vm_info->shdw_pg_state.shadow_cr3 = 0;
vm_info->shdw_pg_state.guest_cr0 = 0x0000000000000010LL;
PrintDebug("Created\n");
- guest_state->cr3 = vm_info->shdw_pg_state.shadow_cr3;
+ //guest_state->cr3 = vm_info->shdw_pg_state.shadow_cr3;
+
+ guest_state->cr3 = vm_info->direct_map_pt;
+
//PrintDebugPageTables((pde32_t*)(vm_info->shdw_pg_state.shadow_cr3.e_reg.low));
if (info->mem_mode == PHYSICAL_MEM) {
- if (guest_pa_to_host_pa(info, guest_state->rip, &host_addr) == -1) {
+ if (guest_pa_to_host_va(info, guest_state->rip, &host_addr) == -1) {
PrintError("Could not translate guest_state->rip to host address\n");
return -1;
}
} else if (info->mem_mode == VIRTUAL_MEM) {
- if (guest_va_to_host_pa(info, guest_state->rip, &host_addr) == -1) {
+ if (guest_va_to_host_va(info, guest_state->rip, &host_addr) == -1) {
PrintError("Could not translate guest_state->rip to host address\n");
return -1;
}
addr_t guest_pde = 0;
if (guest_info->shdw_pg_mode == SHADOW_PAGING) {
- guest_pde = (addr_t)CR3_TO_PDE32((void *)(guest_info->shdw_pg_state.guest_cr3));
+ guest_pde = (addr_t)V3_PAddr((void *)(addr_t)CR3_TO_PDE32((void *)(guest_info->shdw_pg_state.guest_cr3)));
} else if (guest_info->shdw_pg_mode == NESTED_PAGING) {
- guest_pde = (addr_t)CR3_TO_PDE32((void *)(guest_info->ctrl_regs.cr3));
+ guest_pde = (addr_t)V3_PAddr((void *)(addr_t)CR3_TO_PDE32((void *)(guest_info->ctrl_regs.cr3)));
}
if (guest_pa_to_host_va(guest_info, guest_pde, (addr_t *)&pde) == -1) {
if (v3_get_mem_mode(info) == VIRTUAL_MEM) {
struct cr3_32 * shadow_cr3 = (struct cr3_32 *)&(info->shdw_pg_state.shadow_cr3);
-
+ PrintDebug("Setting up Shadow Page Table\n");
info->ctrl_regs.cr3 = *(addr_t*)shadow_cr3;
} else {
info->ctrl_regs.cr3 = *(addr_t*)&(info->direct_map_pt);
*(uint_t*)shadow_cr3, *(uint_t*)guest_cr3);
- cached = v3_cache_page_tables32(info, (addr_t)V3_PAddr((void *)(addr_t)CR3_TO_PDE32((void *)*(addr_t *)new_cr3)));
+ cached = v3_cache_page_tables32(info, (addr_t)V3_PAddr((void *)(addr_t)CR3_TO_PDE32((void *)*(addr_t *)new_cr3)));
+
if (cached == -1) {
PrintError("CR3 Cache failed\n");
return -1;
PrintDebug("Reusing cached shadow Page table\n");
}
+
shadow_cr3->pwt = new_cr3->pwt;
shadow_cr3->pcd = new_cr3->pcd;
{
struct shadow_region * reg = get_shadow_region_by_addr(&(info->mem_map), fault_gpa);
+ PrintDebug("Handling Special Page Fault\n");
+
switch (reg->host_type) {
case HOST_REGION_HOOK:
return mem_hook_dispatch(info, fault_gva, fault_gpa, access_info, (struct vmm_mem_hook *)(reg->host_addr));