X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=geekos%2Fsrc%2Fgeekos%2Fvmm_stubs.c;h=e6b26102d7f4ffc460a4788b33b49a681e096992;hb=d0dd50e04b4847a2b170d11c849f477b7ca84168;hp=ed24cee6b5c4314a2d1bc53ca53f2e3a0876a0df;hpb=d38e1d6edeee83bfb1e3e3c6e2367faa5055bdfe;p=palacios.git diff --git a/geekos/src/geekos/vmm_stubs.c b/geekos/src/geekos/vmm_stubs.c index ed24cee..e6b2610 100644 --- a/geekos/src/geekos/vmm_stubs.c +++ b/geekos/src/geekos/vmm_stubs.c @@ -19,8 +19,21 @@ #include #include -#include #include +#include +#include + + +struct guest_info * g_vm_guest = NULL; + + +// This is the function the interface code should call to deliver +// the interrupt to the vmm for handling +//extern int v3_deliver_interrupt(struct guest_info * vm, struct v3_interrupt *intr); + + +struct guest_info * irq_to_guest_map[256]; + @@ -51,6 +64,12 @@ static inline uchar_t VM_In_Byte(ushort_t port) +void Init_Stubs(struct guest_info * info) { + memset(irq_to_guest_map, 0, sizeof(struct guest_info *) * 256); + g_vm_guest = info; +} + + void * Identity(void *addr) { return addr; }; @@ -94,106 +113,70 @@ 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; -}; +void send_key_to_vmm(unsigned char status, unsigned char scancode) { + struct v3_keyboard_event evt; -// 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); + evt.status = status; + evt.scan_code = scancode; + if (g_vm_guest) { + v3_deliver_keyboard_event(g_vm_guest, &evt); + } +} -struct guest_info * irq_map[256]; - -void *my_opaque[256]; +void send_mouse_to_vmm(unsigned char packet[3]) { + struct v3_mouse_event evt; -static void translate_intr_handler(struct Interrupt_State *state) -{ + memcpy(evt.data, packet, 3); + if (g_vm_guest) { + v3_deliver_mouse_event(g_vm_guest, &evt); + } +} - struct vmm_intr_state mystate; +void send_tick_to_vmm(unsigned int period_us) { + struct v3_timer_event evt; - mystate.irq=state->intNum-32; - mystate.error=state->errorCode; - mystate.should_ack=0; - mystate.opaque=my_opaque[mystate.irq]; + evt.period_us = period_us; - // PrintBoth("translate_intr_handler: opaque=0x%x\n",mystate.opaque); + if (g_vm_guest) { + v3_deliver_timer_event(g_vm_guest, &evt); + } +} - deliver_interrupt_to_vmm(&mystate); - End_IRQ(state); +void translate_intr_handler(struct Interrupt_State *state) { + struct v3_interrupt intr; -} + intr.irq = state->intNum - 32; + intr.error = state->errorCode; + intr.should_ack = 0; + // PrintBoth("translate_intr_handler: opaque=0x%x\n",mystate.opaque); -/* -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); + v3_deliver_irq(irq_to_guest_map[intr.irq], &intr); - 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); - // 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; } @@ -205,9 +188,6 @@ int ack_irq(int irq) { } -void Init_Stubs() { - memset(irq_map, 0, sizeof(struct guest_info *) * 256); -} unsigned int get_cpu_khz() { @@ -220,3 +200,4 @@ unsigned int get_cpu_khz() { return cpu_khz_freq; } +