#include <palacios/vmm_direct_paging.h>
+
+#ifdef CONFIG_SHADOW_PAGING_TELEMETRY
+#include <palacios/vmm_telemetry.h>
+#endif
+
#ifdef CONFIG_SYMBIOTIC_SWAP
#include <palacios/vmm_sym_swap.h>
#endif
+#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);
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;
}
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);
}
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...?
}