#endif
+static const char default_strategy[] = "VTLB";
+
static struct hashtable * master_shdw_pg_table = NULL;
return 0;
}
+int V3_deinit_shdw_paging() {
+ v3_free_htable(master_shdw_pg_table, 0, 0);
+ return 0;
+}
+
/***
}
+int v3_deinit_shdw_pg_state(struct guest_info * core) {
+ struct v3_shdw_pg_impl * impl = core->vm_info->shdw_impl.current_impl;
+
+ if (impl->local_deinit(core) == -1) {
+ PrintError("Error deinitializing shadow paging state\n");
+ return -1;
+ }
+
+#ifdef CONFIG_SHADOW_PAGING_TELEMETRY
+ v3_remove_telemetry_cb(core->vm_info, telemetry_cb, NULL);
+#endif
+
+ return 0;
+}
+
+
int v3_init_shdw_impl(struct v3_vm_info * vm) {
struct v3_shdw_impl_state * impl_state = &(vm->shdw_impl);
v3_cfg_tree_t * pg_cfg = v3_cfg_subtree(vm->cfg_data->cfg, "paging");
- char * impl_name = v3_cfg_val(pg_cfg, "mode");
+ char * pg_mode = v3_cfg_val(pg_cfg, "mode");
+ char * pg_strat = v3_cfg_val(pg_cfg, "strategy");
struct v3_shdw_pg_impl * impl = NULL;
+ PrintDebug("Checking if shadow paging requested.\n");
+ if ((pg_mode != NULL) && (strcasecmp(pg_mode, "nested") == 0)) {
+ PrintDebug("Nested paging specified - not initializing shadow paging.\n");
+ return 0;
+ }
+
+ if (pg_strat == NULL) {
+ pg_strat = (char *)default_strategy;
+ }
+
V3_Print("Initialization of Shadow Paging implementation\n");
- impl = (struct v3_shdw_pg_impl *)v3_htable_search(master_shdw_pg_table, (addr_t)impl_name);
+ impl = (struct v3_shdw_pg_impl *)v3_htable_search(master_shdw_pg_table, (addr_t)pg_strat);
if (impl == NULL) {
- PrintError("Could not find shadow paging impl (%s)\n", impl_name);
+ PrintError("Could not find shadow paging impl (%s)\n", pg_strat);
return -1;
}
return -1;
}
-
+ return 0;
+}
+
+int v3_deinit_shdw_impl(struct v3_vm_info * vm) {
+ struct v3_shdw_pg_impl * impl = vm->shdw_impl.current_impl;
+ if (impl->deinit(vm) == -1) {
+ PrintError("Error deinitializing shadow paging implementation\n");
+ return -1;
+ }
return 0;
}
}
if (v3_get_vm_mem_mode(core) == PHYSICAL_MEM) {
- ret = read_guest_pa_memory(core, get_addr_linear(core, core->rip, &(core->segments.cs)), 15, instr);
+ ret = v3_read_gpa_memory(core, get_addr_linear(core, core->rip, &(core->segments.cs)), 15, instr);
} else {
- ret = read_guest_va_memory(core, get_addr_linear(core, core->rip, &(core->segments.cs)), 15, instr);
+ ret = v3_read_gva_memory(core, get_addr_linear(core, core->rip, &(core->segments.cs)), 15, instr);
}
if (ret == -1) {