X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=geekos%2Fsrc%2Fgeekos%2Fvmm_stubs.c;h=e40c8dddadbcfed2ba4fe5ed3a461dc67c438d9c;hp=ed24cee6b5c4314a2d1bc53ca53f2e3a0876a0df;hb=b84c13ec0315404c6b6de8c1d3a7a65ac766a782;hpb=86ad850e874113d7f5aeb862b64cb222d40e903b diff --git a/geekos/src/geekos/vmm_stubs.c b/geekos/src/geekos/vmm_stubs.c index ed24cee..e40c8dd 100644 --- a/geekos/src/geekos/vmm_stubs.c +++ b/geekos/src/geekos/vmm_stubs.c @@ -19,8 +19,8 @@ #include #include -#include #include +#include @@ -94,106 +94,45 @@ void VMM_Free(void * addr) { Free(addr); } -// -// -// This is the interrupt state that the VMM's interrupt handlers need to see -// -struct vmm_intr_state { - uint_t irq; - uint_t error; - - uint_t should_ack; // Should the vmm ack this interrupt, or will - // the host OS do it? - - // This is the value given when the interrupt is hooked. - // This will never be NULL - void *opaque; -}; // This is the function the interface code should call to deliver // the interrupt to the vmm for handling -extern void deliver_interrupt_to_vmm(struct vmm_intr_state *state); - +//extern int v3_deliver_interrupt(struct guest_info * vm, struct v3_interrupt *intr); -struct guest_info * irq_map[256]; -void *my_opaque[256]; +struct guest_info * irq_to_guest_map[256]; -static void translate_intr_handler(struct Interrupt_State *state) -{ - - struct vmm_intr_state mystate; +void translate_intr_handler(struct Interrupt_State *state) { + struct v3_interrupt intr; - mystate.irq=state->intNum-32; - mystate.error=state->errorCode; - mystate.should_ack=0; - mystate.opaque=my_opaque[mystate.irq]; + intr.irq = state->intNum - 32; + intr.error = state->errorCode; + intr.should_ack = 0; // PrintBoth("translate_intr_handler: opaque=0x%x\n",mystate.opaque); - deliver_interrupt_to_vmm(&mystate); + v3_deliver_irq(irq_to_guest_map[intr.irq], &intr); End_IRQ(state); } -/* -static void pic_intr_handler(struct Interrupt_State * state) { - Begin_IRQ(state); - struct guest_info * info = irq_map[state->intNum - 32]; - SerialPrint("Interrupt %d (IRQ=%d)\n", state->intNum, state->intNum - 32); - - if (info) { - info->vm_ops.raise_irq(info, state->intNum - 32); - } else { - SerialPrint("Interrupt handler error: NULL pointer found, no action taken\n"); - End_IRQ(state); - return; - } - - // End_IRQ(state); -} -*/ -// -// -// I really don't know what the heck this is doing... PAD -// -/* -int hook_irq_stub(struct guest_info * info, int irq) { - if (irq_map[irq]) { - return -1; - } - - SerialPrint("Hooking IRQ: %d (vm=0x%x)\n", irq, info); - irq_map[irq] = info; - volatile void *foo = pic_intr_handler; - - // This is disabled for the time being - foo = 0; - - - Disable_IRQ(irq); - Install_IRQ(irq, pic_intr_handler); - Enable_IRQ(irq); - return 0; -} -*/ -int geekos_hook_interrupt_new(uint_t irq, void * opaque) +int geekos_hook_interrupt(struct guest_info * vm, unsigned int irq) { - if (my_opaque[irq]) { + if (irq_to_guest_map[irq]) { PrintBoth("Attempt to hook interrupt that is already hooked\n"); return -1; } else { - PrintBoth("Hooked interrupt 0x%x with opaque 0x%x\n",irq,opaque); - my_opaque[irq]=opaque; + PrintBoth("Hooked interrupt 0x%x with opaque 0x%x\n", irq, vm); + irq_to_guest_map[irq] = vm; } Disable_IRQ(irq); - Install_IRQ(irq,translate_intr_handler); + Install_IRQ(irq, translate_intr_handler); Enable_IRQ(irq); return 0; } @@ -206,7 +145,7 @@ int ack_irq(int irq) { void Init_Stubs() { - memset(irq_map, 0, sizeof(struct guest_info *) * 256); + memset(irq_to_guest_map, 0, sizeof(struct guest_info *) * 256); }