#include <palacios/vmm_direct_paging.h>
-#ifndef DEBUG_SHADOW_PAGING
+
+#ifdef CONFIG_SHADOW_PAGING_TELEMETRY
+#include <palacios/vmm_telemetry.h>
+#endif
+
+#ifdef CONFIG_SYMBIOTIC_SWAP
+#include <palacios/vmm_sym_swap.h>
+#endif
+
+#ifndef CONFIG_DEBUG_SHADOW_PAGING
#undef PrintDebug
#define PrintDebug(fmt, args...)
#endif
+#ifdef CONFIG_SHADOW_PAGING_TELEMETRY
+static void telemetry_cb(struct guest_info * info, void * private_data, char * hdr) {
+ V3_Print("%s Guest Page faults: %d\n", hdr, info->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
+ if (info->enable_telemetry) {
+ v3_add_telemetry_cb(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) {
- if (info->enable_profiler) {
- info->profiler.guest_pf_cnt++;
- }
-
info->ctrl_regs.cr2 = fault_addr;
+
+#ifdef CONFIG_SHADOW_PAGING_TELEMETRY
+ info->shdw_pg_state.guest_faults++;
+#endif
+
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...?
}