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; \
-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) {