X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_shadow_paging.c;h=a6817f9077711fb958fe31da462a46d5e1375a5d;hb=b8e77690b473b3ac50c5fef0a32d1710a2e8a1d9;hp=e43a9698c70eb0f493302ec7ac20336c006f9168;hpb=2304917404cd287c4741d9f85ff8a280e248c7d0;p=palacios.git diff --git a/palacios/src/palacios/vmm_shadow_paging.c b/palacios/src/palacios/vmm_shadow_paging.c index e43a969..a6817f9 100644 --- a/palacios/src/palacios/vmm_shadow_paging.c +++ b/palacios/src/palacios/vmm_shadow_paging.c @@ -30,6 +30,11 @@ #include + +#ifdef CONFIG_SHADOW_PAGING_TELEMETRY +#include +#endif + #ifdef CONFIG_SYMBIOTIC_SWAP #include #endif @@ -65,6 +70,19 @@ static int is_guest_pf(pt_access_status_t guest_access, pt_access_status_t shado +#ifdef CONFIG_SHADOW_PAGING_TELEMETRY +static void telemetry_cb(struct v3_vm_info * vm, void * private_data, char * hdr) { + int i = 0; + for (i = 0; i < vm->num_cores; i++) { + struct guest_info * core = &(vm->cores[i]); + + V3_Print("%s Guest Page faults: %d\n", hdr, core->shdw_pg_state.guest_faults); + } +} +#endif + + + int v3_init_shadow_page_state(struct guest_info * info) { struct shadow_page_state * state = &(info->shdw_pg_state); @@ -73,6 +91,10 @@ int v3_init_shadow_page_state(struct guest_info * info) { state->guest_efer.value = 0x0LL; INIT_LIST_HEAD(&(state->page_list)); + +#ifdef CONFIG_SHADOW_PAGING_TELEMETRY + v3_add_telemetry_cb(info->vm_info, telemetry_cb, NULL); +#endif return 0; } @@ -241,15 +263,12 @@ static struct shadow_page_data * create_new_shadow_pt(struct guest_info * info) static int inject_guest_pf(struct guest_info * info, addr_t fault_addr, pf_error_t error_code) { + info->ctrl_regs.cr2 = fault_addr; -#ifdef CONFIG_PROFILE_VMM - if (info->enable_profiler) { - info->profiler.guest_pf_cnt++; - } +#ifdef CONFIG_SHADOW_PAGING_TELEMETRY + info->shdw_pg_state.guest_faults++; #endif - info->ctrl_regs.cr2 = fault_addr; - return v3_raise_exception_with_error(info, PF_EXCEPTION, *(uint_t *)&error_code); } @@ -273,12 +292,19 @@ static int is_guest_pf(pt_access_status_t guest_access, pt_access_status_t shado return 1; } - if ((shadow_access == PT_ACCESS_NOT_PRESENT) && - (guest_access == PT_ACCESS_NOT_PRESENT)) { + /* + if ((shadow_access == PT_ACCESS_NOT_PRESENT) && + (guest_access == PT_ACCESS_NOT_PRESENT)) { + // Page tables completely blank, handle guest first + return 1; + } + */ + + if (guest_access == PT_ACCESS_NOT_PRESENT) { // Page tables completely blank, handle guest first return 1; } - + // Otherwise we'll handle the guest fault later...? }