/* ** */
+#define V3_ASSERT(x) \
+ do { \
+ if (!(x)) { \
+ PrintDebug("Failed assertion in %s: %s at %s, line %d, RA=%lx\n", \
+ __func__, #x, __FILE__, __LINE__, \
+ (ulong_t) __builtin_return_address(0)); \
+ while(1); \
+ } \
+ } while(0) \
+
#define VMM_INVALID_CPU 0
#define VMM_VMX_CPU 1
irq = 9;
}
+ PrintDebug("Raising irq %d in the PIC\n", irq);
+
if (irq <= 7) {
state->master_irr |= 0x01 << irq;
} else if ((irq > 7) && (irq < 16)) {
state->slave_irr |= 0x01 << (irq - 7);
} else {
+ PrintDebug("Invalid IRQ raised (%d)\n", irq);
return -1;
}
PrintDebugDevMgr(&(vm_info.dev_mgr));
}
-
hook_irq(&vm_info, 6);
vm_info.rip = 0xfff0;
-
struct guest_info * irq_map[256];
-
static void pic_intr_handler(struct Interrupt_State * state) {
Begin_IRQ(state);
struct guest_info * info = irq_map[state->intNum - 32];
+ SerialPrint("Interrupt %d\n", state->intNum);
if (info) {
- info->vm_ops.raise_irq(irq_map[state->intNum], state->intNum, state->errorCode);
+ SerialPrint("Calling handler(info=%x)->%x\n", info, info->vm_ops.raise_irq);
+ info->vm_ops.raise_irq(info, state->intNum - 32, state->errorCode);
} else {
SerialPrint("Interrupt handler error: NULL pointer found, no action taken\n");
End_IRQ(state);
void Init_Stubs() {
memset(irq_map, 0, sizeof(struct guest_info *) * 256);
-
}
//PrintDebug("Launching to RIP: %x\n", info->rip);
safe_svm_launch((vmcb_t*)(info->vmm_data), &(info->vm_regs));
//launch_svm((vmcb_t*)(info->vmm_data));
- // PrintDebug("SVM Returned\n");
+ //PrintDebug("SVM Returned\n");
STGI();
int raise_irq(struct guest_info * info, int irq, int error_code) {
// Look up PIC and resend
- info->intr_state.controller->raise_intr(info->intr_state.controller_state, irq, error_code);
-
+ V3_ASSERT(info);
+ V3_ASSERT(info->intr_state.controller);
+ V3_ASSERT(info->intr_state.controller->raise_intr);
+
+ // if ((info->intr_state.controller) &&
+ // (info->intr_state.controller->raise_intr)) {
+ info->intr_state.controller->raise_intr(info->intr_state.controller_state, irq, error_code);
+ //} else {
+ // PrintDebug("There is no registered Interrupt Controller... (NULL POINTER)\n");
+ // return -1;
+ //}
return 0;
}