From: Jack Lange Date: Mon, 16 Mar 2009 20:55:22 +0000 (-0500) Subject: added irq acking X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=ec6d459b0aac3e9eea431e854904be7a58f2ffa8 added irq acking --- diff --git a/palacios/include/palacios/vmm.h b/palacios/include/palacios/vmm.h index 5982a3a..9e9f812 100644 --- a/palacios/include/palacios/vmm.h +++ b/palacios/include/palacios/vmm.h @@ -178,6 +178,16 @@ ret; \ }) \ + +#define V3_ACK_IRQ(irq) \ + do { \ + extern struct v3_os_hooks * os_hooks; \ + if ((os_hooks) && (os_hooks)->ack_irq) { \ + (os_hooks)->ack_irq(irq); \ + } \ + } while (0) + + #define V3_Yield(addr) \ do { \ extern struct v3_os_hooks * os_hooks; \ diff --git a/palacios/src/palacios/vmm_intr.c b/palacios/src/palacios/vmm_intr.c index ac6b6ce..6ff14cd 100644 --- a/palacios/src/palacios/vmm_intr.c +++ b/palacios/src/palacios/vmm_intr.c @@ -100,18 +100,19 @@ int v3_hook_irq(struct guest_info * info, -static int passthrough_irq_handler(struct guest_info * info, struct v3_interrupt * intr, void * priv_data) -{ +static int passthrough_irq_handler(struct guest_info * info, struct v3_interrupt * intr, void * priv_data) { + + if (intr->should_ack == 1) { + V3_ACK_IRQ(intr->irq); + } PrintDebug("[passthrough_irq_handler] raise_irq=%d (guest=0x%p)\n", intr->irq, (void *)info); - return v3_raise_irq(info, intr->irq); + return v3_raise_irq(info, intr->irq); } -int v3_hook_passthrough_irq(struct guest_info * info, uint_t irq) -{ - +int v3_hook_passthrough_irq(struct guest_info * info, uint_t irq) { int rc = v3_hook_irq(info, irq, passthrough_irq_handler, NULL); if (rc) {