X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_direct_paging.c;h=f3ef0092a34b4480b0134c4d8b76420a76f5f6eb;hb=888c2dd8a3914f9a08e2b0e006ff96c5cc5cd792;hp=2e86dbe2dcce0987c44ea59ead044565eb6342fd;hpb=c163873b7b96544683030cafba0e73a7ed988171;p=palacios.git diff --git a/palacios/src/palacios/vmm_direct_paging.c b/palacios/src/palacios/vmm_direct_paging.c index 2e86dbe..f3ef009 100644 --- a/palacios/src/palacios/vmm_direct_paging.c +++ b/palacios/src/palacios/vmm_direct_paging.c @@ -25,7 +25,7 @@ #include -#ifndef DEBUG_NESTED_PAGING +#ifndef CONFIG_DEBUG_NESTED_PAGING #undef PrintDebug #define PrintDebug(fmt, args...) #endif @@ -50,7 +50,7 @@ int v3_init_passthrough_pts(struct guest_info * info) { } int v3_reset_passthrough_pts(struct guest_info * info) { - v3_vm_cpu_mode_t mode = v3_get_cpu_mode(info); + v3_cpu_mode_t mode = v3_get_vm_cpu_mode(info); // Delete the old direct map page tables switch(mode) { @@ -88,7 +88,7 @@ int v3_activate_passthrough_pt(struct guest_info * info) { int v3_handle_passthrough_pagefault(struct guest_info * info, addr_t fault_addr, pf_error_t error_code) { - v3_vm_cpu_mode_t mode = v3_get_cpu_mode(info); + v3_cpu_mode_t mode = v3_get_vm_cpu_mode(info); switch(mode) { case REAL: @@ -111,11 +111,10 @@ int v3_handle_passthrough_pagefault(struct guest_info * info, addr_t fault_addr, int v3_handle_nested_pagefault(struct guest_info * info, addr_t fault_addr, pf_error_t error_code) { - // THIS IS VERY BAD - v3_vm_cpu_mode_t mode = LONG; + v3_cpu_mode_t mode = v3_get_host_cpu_mode(); - PrintDebug("Nested PageFault: fault_addr=%p, error_code=%u\n",(void*)fault_addr, *(uint_t *)&error_code); + PrintDebug("Nested PageFault: fault_addr=%p, error_code=%u\n", (void *)fault_addr, *(uint_t *)&error_code); switch(mode) { case REAL: @@ -137,6 +136,46 @@ int v3_handle_nested_pagefault(struct guest_info * info, addr_t fault_addr, pf_e } int v3_invalidate_passthrough_addr(struct guest_info * info, addr_t inv_addr) { + v3_cpu_mode_t mode = v3_get_vm_cpu_mode(info); + + switch(mode) { + case REAL: + case PROTECTED: + return invalidate_addr_32(info, inv_addr); + + case PROTECTED_PAE: + case LONG: + case LONG_32_COMPAT: + // Long mode will only use 32PAE page tables... + return invalidate_addr_32pae(info, inv_addr); + + default: + PrintError("Unknown CPU Mode\n"); + break; + } + return -1; +} + + +int v3_invalidate_nested_addr(struct guest_info * info, addr_t inv_addr) { + v3_cpu_mode_t mode = LONG; + + switch(mode) { + case REAL: + case PROTECTED: + return invalidate_addr_32(info, inv_addr); + + case PROTECTED_PAE: + return invalidate_addr_32pae(info, inv_addr); + + case LONG: + case LONG_32_COMPAT: + return invalidate_addr_64(info, inv_addr); + + default: + PrintError("Unknown CPU Mode\n"); + break; + } return -1; }