X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_direct_paging.c;h=9884620f5dbbd9be98e77032209bc640968854a9;hb=ff30ed5923877636b2b51bed0349f9b440625137;hp=783f6965aa8e3f2add8b09b6ca43cca5f374e3b2;hpb=c255ba778677e2006f1d7ebad69a8f7005747907;p=palacios.git diff --git a/palacios/src/palacios/vmm_direct_paging.c b/palacios/src/palacios/vmm_direct_paging.c index 783f696..9884620 100644 --- a/palacios/src/palacios/vmm_direct_paging.c +++ b/palacios/src/palacios/vmm_direct_paging.c @@ -24,6 +24,13 @@ #include #include + +#ifndef DEBUG_NESTED_PAGING +#undef PrintDebug +#define PrintDebug(fmt, args...) +#endif + + static addr_t create_generic_pt_page() { void * page = 0; page = V3_VAddr(V3_AllocPages(1)); @@ -44,7 +51,7 @@ 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: @@ -62,3 +69,32 @@ int v3_handle_passthrough_pagefault(struct guest_info * info, addr_t fault_addr, } 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; +} +