X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_direct_paging.c;h=65dc470565f7dea88f562b364f09d48720fdc19c;hb=b3b88c98e70d7413fcf5220af2018766190997ac;hp=3bbbbf9239ce92e4ff39a349047b8de1a156b9a7;hpb=266af4b5b19da7bee8e7445288c7c1cb3ee194c7;p=palacios.git diff --git a/palacios/src/palacios/vmm_direct_paging.c b/palacios/src/palacios/vmm_direct_paging.c index 3bbbbf9..65dc470 100644 --- a/palacios/src/palacios/vmm_direct_paging.c +++ b/palacios/src/palacios/vmm_direct_paging.c @@ -35,6 +35,7 @@ static addr_t create_generic_pt_page() { // Inline handler functions for each cpu mode #include "vmm_direct_paging_32.h" #include "vmm_direct_paging_32pae.h" +#include "vmm_direct_paging_64.h" addr_t v3_create_direct_passthrough_pts(struct guest_info * info) { @@ -43,20 +44,50 @@ addr_t v3_create_direct_passthrough_pts(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); - + switch(mode) { case REAL: case PROTECTED: return handle_passthrough_pagefault_32(info, fault_addr, error_code); + case PROTECTED_PAE: - return handle_passthrough_pagefault_32pae(info, fault_addr, error_code); case LONG: - break; case LONG_32_COMPAT: + // Long mode will only use 32PAE page tables... + return handle_passthrough_pagefault_32pae(info, fault_addr, error_code); + + default: + PrintError("Unknown CPU Mode\n"); break; + } + return -1; +} + + + +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; + + + PrintDebug("Nested PageFault: fault_addr=%p, error_code=%u\n",(void*)fault_addr, *(uint_t *)&error_code); + + switch(mode) { + case REAL: + case PROTECTED: + return handle_passthrough_pagefault_32(info, fault_addr, error_code); + + case PROTECTED_PAE: + return handle_passthrough_pagefault_32pae(info, fault_addr, error_code); + + case LONG: + case LONG_32_COMPAT: + return handle_passthrough_pagefault_64(info, fault_addr, error_code); + default: PrintError("Unknown CPU Mode\n"); break; } return -1; } +