#endif
+struct v3_swintr_hook {
+ int (*handler)(struct guest_info * core, uint8_t vector, void * priv_data);
+ void * priv_data;
+};
+
+
+static struct v3_swintr_hook * swintr_hooks[MAX_SWINTR_HOOKS];
+
+
static int init_swintr_intercept (struct v3_vm_info * vm, v3_cfg_tree_t * cfg, void ** priv_data) {
return 0;
}
+static int deinit_swintr_intercept (struct v3_vm_info * vm, void * priv_data) {
+ int i = 0;
+
+ for (; i < MAX_SWINTR_HOOKS; i++) {
+ if (swintr_hooks[i])
+ V3_Free(swintr_hooks[i]);
+ }
+
+ return 0;
+}
+
+
static int init_swintr_core_svm (struct guest_info * core, void * priv_data) {
vmcb_t * vmcb = (vmcb_t*)core->vmm_data;
vmcb_ctrl_t * ctrl_area = GET_VMCB_CTRL_AREA(vmcb);
static int init_swintr_core_vmx (struct guest_info * core, void * priv_data) {
- PrintError("Not implemented!\n");
+ PrintError(core->vm_info, core, "Not implemented!\n");
return -1;
}
-static int init_swintr_intercept_core (struct guest_info * core, void * priv_data) {
+static int init_swintr_intercept_core (struct guest_info * core, void * priv_data, void ** core_data) {
v3_cpu_arch_t cpu_type = v3_get_cpu_type(V3_Get_CPU());
switch (cpu_type) {
case V3_SVM_CPU:
case V3_SVM_REV3_CPU: {
if (init_swintr_core_svm(core, priv_data) == -1) {
- PrintError("Problem initializing svm software interrupt intercept\n");
+ PrintError(core->vm_info, core, "Problem initializing svm software interrupt intercept\n");
return -1;
}
break;
case V3_VMX_EPT_CPU:
case V3_VMX_EPT_UG_CPU: {
if (init_swintr_core_vmx(core, priv_data) == -1) {
- PrintError("Problem initializing vmx software interrupt intercept\n");
+ PrintError(core->vm_info, core, "Problem initializing vmx software interrupt intercept\n");
return -1;
}
break;
}
default:
- PrintError("software interrupt interception not supported on this architecture\n");
+ PrintError(core->vm_info, core, "software interrupt interception not supported on this architecture\n");
return -1;
}
return 0;
}
-struct v3_swintr_hook {
- int (*handler)(struct guest_info * core, uint8_t vector, void * priv_data);
- void * priv_data;
-};
-
-
-static struct v3_swintr_hook * swintr_hooks[256];
-
static inline struct v3_swintr_hook * get_swintr_hook (struct guest_info * core, uint8_t vector) {
return swintr_hooks[vector];
}
static struct v3_extension_impl swintr_impl = {
.name = "swintr_intercept",
- .init = init_swintr_intercept,
- .deinit = NULL,
+ .vm_init = init_swintr_intercept,
+ .vm_deinit = deinit_swintr_intercept,
.core_init = init_swintr_intercept_core,
.core_deinit = NULL,
.on_entry = NULL,
}
if (ret == -1) {
- PrintError("V3 SWintr Handler: Could not translate Instruction Address (%p)\n", (void *)core->rip);
+ PrintError(core->vm_info, core, "V3 SWintr Handler: Could not translate Instruction Address (%p)\n", (void *)core->rip);
return -1;
}
if (v3_decode(core, (addr_t)instr_ptr, &instr) == -1) {
- PrintError("V3 SWintr Handler: Decoding Error\n");
+ PrintError(core->vm_info, core, "V3 SWintr Handler: Decoding Error\n");
return -1;
}
if (hook == NULL) {
#ifdef V3_CONFIG_EXT_SWINTR_PASSTHROUGH
if (v3_hook_passthrough_swintr(core, vector) == -1) {
- PrintDebug("V3 SWintr Handler: Error hooking passthrough swintr\n");
+ PrintDebug(core->vm_info, core, "V3 SWintr Handler: Error hooking passthrough swintr\n");
return -1;
}
hook = swintr_hooks[vector];
ret = hook->handler(core, vector, NULL);
if (ret == -1) {
- PrintDebug("V3 SWintr Handler: Error in swintr hook\n");
+ PrintDebug(core->vm_info, core, "V3 SWintr Handler: Error in swintr hook\n");
return -1;
}
struct v3_swintr_hook * hook = (struct v3_swintr_hook*)V3_Malloc(sizeof(struct v3_swintr_hook));
if (hook == NULL) {
+ PrintError(core->vm_info, core, "Cannot allocate for swintr hook\n");
return -1;
}
if (get_swintr_hook(core, vector) != NULL) {
- PrintError("swint %d already hooked\n", vector);
+ PrintError(core->vm_info, core, "swint %d already hooked\n", vector);
return -1;
}
swintr_hooks[vector] = hook;
- PrintDebug("Hooked Swintr #%d\n", vector);
+ PrintDebug(core->vm_info, core, "Hooked Swintr #%d\n", vector);
return 0;
}
static int passthrough_swintr_handler (struct guest_info * core, uint8_t vector, void * priv_data) {
- PrintDebug("[passthrough_swint_handler] INT vector=%d (guest=0x%p)\n",
+ PrintDebug(core->vm_info, core, "[passthrough_swint_handler] INT vector=%d (guest=0x%p)\n",
vector, (void*)core);
return 0;
}
int rc = v3_hook_swintr(core, vector, passthrough_swintr_handler, NULL);
if (rc) {
- PrintError("guest_swintr_injection: failed to hook swint 0x%x (guest=0x%p)\n", vector, (void*)core);
+ PrintError(core->vm_info, core, "guest_swintr_injection: failed to hook swint 0x%x (guest=0x%p)\n", vector, (void*)core);
return -1;
} else {
- PrintDebug("guest_swintr_injection: hooked swint 0x%x (guest=0x%p)\n", vector, (void*)core);
+ PrintDebug(core->vm_info, core, "guest_swintr_injection: hooked swint 0x%x (guest=0x%p)\n", vector, (void*)core);
return 0;
}