From: Peter Dinda Date: Mon, 21 Jul 2008 15:30:30 +0000 (+0000) Subject: new interrupt hooking mechanism X-Git-Tag: boots-puppy-iso-to-command-prompt~3 X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=06535b05abbca1ada6c3fd3c32db475b97539070 new interrupt hooking mechanism ability to do interrupt injection into guest --- diff --git a/palacios/include/palacios/vmm.h b/palacios/include/palacios/vmm.h index 3072626..b9e3fea 100644 --- a/palacios/include/palacios/vmm.h +++ b/palacios/include/palacios/vmm.h @@ -124,6 +124,25 @@ #endif //!__V3VEE__ +// +// +// 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 deliver_interrupt_to_vmm(struct vmm_intr_state *state); + + /* This will contain function pointers that provide OS services */ struct vmm_os_hooks { void (*print_info)(const char * format, ...); @@ -139,7 +158,12 @@ struct vmm_os_hooks { void *(*paddr_to_vaddr)(void *addr); void *(*vaddr_to_paddr)(void *addr); - int (*hook_interrupt)(struct guest_info * info, int irq); + // int (*hook_interrupt)(int irq, vmm_intr_handler handler, uint_t opaque); + + int (*hook_interrupt)(struct guest_info *s, int irq); + + int (*hook_interrupt_new)(uint_t irq, void *opaque); + int (*ack_irq)(int irq); diff --git a/palacios/include/palacios/vmm_intr.h b/palacios/include/palacios/vmm_intr.h index fb3f667..919576a 100644 --- a/palacios/include/palacios/vmm_intr.h +++ b/palacios/include/palacios/vmm_intr.h @@ -31,6 +31,7 @@ struct guest_info; + /* We need a way to allow the APIC/PIC to decide when they are supposed to receive interrupts... * Maybe a notification call when they have been turned on, to deliver irqs to them... * We can rehook the guest raise_irq op, to the appropriate controller @@ -53,9 +54,20 @@ struct vm_intr { }; + int v3_raise_irq(struct guest_info * info, int irq); int hook_irq(struct guest_info * info, int irq); + +struct vmm_intr_state; + +int hook_irq_new(uint_t irq, + void (*handler)(struct vmm_intr_state *state), + void *opaque); + +int hook_irq_for_guest_injection(struct guest_info *info, int irq); + + struct intr_ctrl_ops { int (*intr_pending)(void * private_data); int (*get_intr_number)(void * private_data);