Index: /trunk/include/VBox/vmm/pdmdev.h
===================================================================
--- /trunk/include/VBox/vmm/pdmdev.h	(revision 40955)
+++ /trunk/include/VBox/vmm/pdmdev.h	(revision 40956)
@@ -1299,4 +1299,13 @@
 
     /**
+     * Calculates an IRQ tag for a timer, IPI or similar event.
+     *  
+     * @returns The IRQ tag. 
+     * @param   pDevIns         Device instance of the APIC. 
+     * @param   u8Level         PDM_IRQ_LEVEL_HIGH or PDM_IRQ_LEVEL_FLIP_FLOP. 
+     */
+    DECLRCCALLBACKMEMBER(uint32_t, pfnCalcIrqTag,(PPDMDEVINS pDevIns, uint8_t u8Level));
+
+    /**
      * Modifies APIC-related bits in the CPUID feature mask.
      *
@@ -1339,5 +1348,5 @@
 
 /** Current PDMAPICHLPRC version number. */
-#define PDM_APICHLPRC_VERSION                   PDM_VERSION_MAKE(0xfff5, 1, 0)
+#define PDM_APICHLPRC_VERSION                   PDM_VERSION_MAKE(0xfff5, 2, 0)
 
 
@@ -1367,4 +1376,13 @@
      */
     DECLR0CALLBACKMEMBER(void, pfnClearInterruptFF,(PPDMDEVINS pDevIns, PDMAPICIRQ enmType, VMCPUID idCpu));
+
+    /**
+     * Calculates an IRQ tag for a timer, IPI or similar event.
+     *  
+     * @returns The IRQ tag. 
+     * @param   pDevIns         Device instance of the APIC. 
+     * @param   u8Level         PDM_IRQ_LEVEL_HIGH or PDM_IRQ_LEVEL_FLIP_FLOP. 
+     */
+    DECLR0CALLBACKMEMBER(uint32_t, pfnCalcIrqTag,(PPDMDEVINS pDevIns, uint8_t u8Level));
 
     /**
@@ -1409,5 +1427,5 @@
 
 /** Current PDMAPICHLPR0 version number. */
-#define PDM_APICHLPR0_VERSION                   PDM_VERSION_MAKE(0xfff4, 1, 0)
+#define PDM_APICHLPR0_VERSION                   PDM_VERSION_MAKE(0xfff4, 2, 0)
 
 /**
@@ -1438,10 +1456,11 @@
 
     /**
-     * Calculates an IRQ tag for a timer event.
+     * Calculates an IRQ tag for a timer, IPI or similar event.
      *  
      * @returns The IRQ tag. 
-     * @param   pDevIns         Device instance of the APIC.
-     */
-    DECLR3CALLBACKMEMBER(uint32_t, pfnCalcIrqTag,(PPDMDEVINS pDevIns));
+     * @param   pDevIns         Device instance of the APIC. 
+     * @param   u8Level         PDM_IRQ_LEVEL_HIGH or PDM_IRQ_LEVEL_FLIP_FLOP. 
+     */
+    DECLR3CALLBACKMEMBER(uint32_t, pfnCalcIrqTag,(PPDMDEVINS pDevIns, uint8_t u8Level));
 
     /**
Index: /trunk/src/VBox/Devices/PC/DevAPIC.cpp
===================================================================
--- /trunk/src/VBox/Devices/PC/DevAPIC.cpp	(revision 40955)
+++ /trunk/src/VBox/Devices/PC/DevAPIC.cpp	(revision 40956)
@@ -836,5 +836,5 @@
                                       0 /* Polarity - conform to the bus */,
                                       0 /* Trigger mode - edge */,
-                                      0 /*uTagSrc*/);
+                                      pDev->CTX_SUFF(pApicHlp)->pfnCalcIrqTag(pDev->CTX_SUFF(pDevIns), PDM_IRQ_LEVEL_HIGH));
                 APIC_UNLOCK(pDev);
                 break;
@@ -1433,5 +1433,6 @@
 
     return apic_bus_deliver(pDev, &DstSet, delivery_mode, vector_num,
-                            polarity, trigger_mode, 0 /* uTagSrc*/);
+                            polarity, trigger_mode, 
+                            pDev->CTX_SUFF(pApicHlp)->pfnCalcIrqTag(pDev->CTX_SUFF(pDevIns), PDM_IRQ_LEVEL_HIGH));
 }
 
@@ -1700,5 +1701,5 @@
         LogFlow(("apic_timer: trigger irq\n"));
         apic_set_irq(pDev, pApic, pApic->lvt[APIC_LVT_TIMER] & 0xff, APIC_TRIGGER_EDGE, 
-                     pDev->CTX_SUFF(pApicHlp)->pfnCalcIrqTag(pDevIns));
+                     pDev->CTX_SUFF(pApicHlp)->pfnCalcIrqTag(pDevIns, PDM_IRQ_LEVEL_HIGH));
 
         if (   (pApic->lvt[APIC_LVT_TIMER] & APIC_LVT_TIMER_PERIODIC)
Index: /trunk/src/VBox/Devices/PC/DevApic.h
===================================================================
--- /trunk/src/VBox/Devices/PC/DevApic.h	(revision 40955)
+++ /trunk/src/VBox/Devices/PC/DevApic.h	(revision 40956)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2012 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
Index: /trunk/src/VBox/Devices/PC/DevIoApic.cpp
===================================================================
--- /trunk/src/VBox/Devices/PC/DevIoApic.cpp	(revision 40955)
+++ /trunk/src/VBox/Devices/PC/DevIoApic.cpp	(revision 40956)
@@ -149,6 +149,10 @@
                 delivery_mode = (entry >> 8) & 7;
                 polarity = (entry >> 13) & 1;
+                uint32_t uTagSrc = pThis->auTagSrc[i];
                 if (trig_mode == APIC_TRIGGER_EDGE)
+                {
+                    pThis->auTagSrc[i] = 0;
                     pThis->irr &= ~mask;
+                }
                 if (delivery_mode == APIC_DM_EXTINT)
                     /* malc: i'm still not so sure about ExtINT delivery */
@@ -159,6 +163,4 @@
                 else
                     vector = entry & 0xff;
-                uint32_t uTagSrc = pThis->auTagSrc[i];
-                pThis->auTagSrc[i] = 0;
 
                 int rc = pThis->CTX_SUFF(pIoApicHlp)->pfnApicBusDeliver(pThis->CTX_SUFF(pDevIns),
@@ -202,8 +204,14 @@
 
                 if ((level & PDM_IRQ_LEVEL_FLIP_FLOP) == PDM_IRQ_LEVEL_FLIP_FLOP)
+                {
                     pThis->irr &= ~mask;
+                    pThis->auTagSrc[vector] = 0;
+                }
             }
             else
+            {
                 pThis->irr &= ~mask;
+                pThis->auTagSrc[vector] = 0;
+            }
         }
         else
@@ -526,5 +534,8 @@
     pThis->irr      = 0;
     for (unsigned i = 0; i < IOAPIC_NUM_PINS; i++)
+    {
         pThis->ioredtbl[i] = 1 << 16; /* mask LVT */
+        pThis->auTagSrc[i] = 0;
+    }
 
     IOAPIC_UNLOCK(pThis);
Index: /trunk/src/VBox/VMM/VMMR0/PDMR0Device.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR0/PDMR0Device.cpp	(revision 40955)
+++ /trunk/src/VBox/VMM/VMMR0/PDMR0Device.cpp	(revision 40956)
@@ -527,4 +527,26 @@
 
 
+/** @interface_method_impl{PDMAPICHLPR0,pfnCalcIrqTag} */
+static DECLCALLBACK(uint32_t) pdmR0ApicHlp_CalcIrqTag(PPDMDEVINS pDevIns, uint8_t u8Level)
+{
+    PDMDEV_ASSERT_DEVINS(pDevIns);
+    PVM pVM = pDevIns->Internal.s.pVMR0;
+
+    pdmLock(pVM);
+
+    uint32_t uTagSrc = pdmCalcIrqTag(pVM, pDevIns->idTracing);
+    if (u8Level == PDM_IRQ_LEVEL_HIGH)
+        VBOXVMM_PDM_IRQ_HIGH(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
+    else
+        VBOXVMM_PDM_IRQ_HILO(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
+
+
+    pdmUnlock(pVM);
+    LogFlow(("pdmR0ApicHlp_CalcIrqTag: caller=%p/%d: returns %#x (u8Level=%d)\n", 
+             pDevIns, pDevIns->iInstance, uTagSrc, u8Level));
+    return uTagSrc;
+}
+
+
 /** @interface_method_impl{PDMAPICHLPR0,pfnChangeFeature} */
 static DECLCALLBACK(void) pdmR0ApicHlp_ChangeFeature(PPDMDEVINS pDevIns, PDMAPICVERSION enmVersion)
@@ -584,4 +606,5 @@
     pdmR0ApicHlp_SetInterruptFF,
     pdmR0ApicHlp_ClearInterruptFF,
+    pdmR0ApicHlp_CalcIrqTag,
     pdmR0ApicHlp_ChangeFeature,
     pdmR0ApicHlp_Lock,
Index: /trunk/src/VBox/VMM/VMMR3/PDMDevMiscHlp.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/PDMDevMiscHlp.cpp	(revision 40955)
+++ /trunk/src/VBox/VMM/VMMR3/PDMDevMiscHlp.cpp	(revision 40956)
@@ -240,14 +240,22 @@
 
 /** @interface_method_impl{PDMAPICHLPR3,pfnCalcIrqTag} */
-static DECLCALLBACK(uint32_t) pdmR3ApicHlp_CalcIrqTag(PPDMDEVINS pDevIns)
-{
-    PDMDEV_ASSERT_DEVINS(pDevIns);
-    PVM pVM = pDevIns->Internal.s.pVMR3;
+static DECLCALLBACK(uint32_t) pdmR3ApicHlp_CalcIrqTag(PPDMDEVINS pDevIns, uint8_t u8Level)
+{
+    PDMDEV_ASSERT_DEVINS(pDevIns);
+    PVM pVM = pDevIns->Internal.s.pVMR3;
+    Assert(u8Level == PDM_IRQ_LEVEL_HIGH || u8Level == PDM_IRQ_LEVEL_FLIP_FLOP);
 
     pdmLock(pVM);
+
     uint32_t uTagSrc = pdmCalcIrqTag(pVM, pDevIns->idTracing);
+    if (u8Level == PDM_IRQ_LEVEL_HIGH)
+        VBOXVMM_PDM_IRQ_HIGH(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
+    else
+        VBOXVMM_PDM_IRQ_HILO(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
+
+
     pdmUnlock(pVM);
-
-    LogFlow(("pdmR3ApicHlp_CalcIrqTag: caller='%s'/%d: returns %#x\n", pDevIns->pReg->szName, pDevIns->iInstance, uTagSrc));
+    LogFlow(("pdmR3ApicHlp_CalcIrqTag: caller='%s'/%d: returns %#x (u8Level=%d)\n", 
+             pDevIns->pReg->szName, pDevIns->iInstance, uTagSrc, u8Level));
     return uTagSrc;
 }
Index: /trunk/src/VBox/VMM/VMMRC/PDMRCDevice.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMRC/PDMRCDevice.cpp	(revision 40955)
+++ /trunk/src/VBox/VMM/VMMRC/PDMRCDevice.cpp	(revision 40956)
@@ -492,4 +492,26 @@
 
 
+/** @interface_method_impl{PDMAPICHLPRC,pfnCalcIrqTag} */
+static DECLCALLBACK(uint32_t) pdmRCApicHlp_CalcIrqTag(PPDMDEVINS pDevIns, uint8_t u8Level)
+{
+    PDMDEV_ASSERT_DEVINS(pDevIns);
+    PVM pVM = pDevIns->Internal.s.pVMRC;
+
+    pdmLock(pVM);
+
+    uint32_t uTagSrc = pdmCalcIrqTag(pVM, pDevIns->idTracing);
+    if (u8Level == PDM_IRQ_LEVEL_HIGH)
+        VBOXVMM_PDM_IRQ_HIGH(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
+    else
+        VBOXVMM_PDM_IRQ_HILO(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
+
+
+    pdmUnlock(pVM);
+    LogFlow(("pdmRCApicHlp_CalcIrqTag: caller=%p/%d: returns %#x (u8Level=%d)\n", 
+             pDevIns, pDevIns->iInstance, uTagSrc, u8Level));
+    return uTagSrc;
+}
+
+
 /** @interface_method_impl{PDMAPICHLPRC,pfnChangeFeature} */
 static DECLCALLBACK(void) pdmRCApicHlp_ChangeFeature(PPDMDEVINS pDevIns, PDMAPICVERSION enmVersion)
@@ -549,4 +571,5 @@
     pdmRCApicHlp_SetInterruptFF,
     pdmRCApicHlp_ClearInterruptFF,
+    pdmRCApicHlp_CalcIrqTag,
     pdmRCApicHlp_ChangeFeature,
     pdmRCApicHlp_Lock,
