VirtualBox

Changeset 40907 in vbox for trunk


Ignore:
Timestamp:
Apr 13, 2012 8:50:14 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
77458
Message:

Working on tracking IRQs for tracing and logging purposes.

Location:
trunk
Files:
23 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/pdmapi.h

    r40405 r40907  
    4141 */
    4242
    43 VMMDECL(int)    PDMGetInterrupt(PVMCPU pVCpu, uint8_t *pu8Interrupt);
    44 VMMDECL(int)    PDMIsaSetIrq(PVM pVM, uint8_t u8Irq, uint8_t u8Level);
    45 VMMDECL(int)    PDMIoApicSetIrq(PVM pVM, uint8_t u8Irq, uint8_t u8Level);
    46 VMMDECL(int)    PDMIoApicSendMsi(PVM pVM, RTGCPHYS GCAddr, uint32_t uValue);
    47 VMMDECL(bool)   PDMHasIoApic(PVM pVM);
    48 VMMDECL(int)    PDMApicHasPendingIrq(PVM pVM, bool *pfPending);
    49 VMMDECL(int)    PDMApicSetBase(PVM pVM, uint64_t u64Base);
    50 VMMDECL(int)    PDMApicGetBase(PVM pVM, uint64_t *pu64Base);
    51 VMMDECL(int)    PDMApicSetTPR(PVMCPU pVCpu, uint8_t u8TPR);
    52 VMMDECL(int)    PDMApicGetTPR(PVMCPU pVCpu, uint8_t *pu8TPR, bool *pfPending);
    53 VMMDECL(int)    PDMApicWriteMSR(PVM pVM, VMCPUID iCpu, uint32_t u32Reg, uint64_t u64Value);
    54 VMMDECL(int)    PDMApicReadMSR(PVM pVM, VMCPUID iCpu, uint32_t u32Reg, uint64_t *pu64Value);
    55 VMMDECL(int)    PDMVMMDevHeapR3ToGCPhys(PVM pVM, RTR3PTR pv, RTGCPHYS *pGCPhys);
    56 VMMDECL(bool)   PDMVMMDevHeapIsEnabled(PVM pVM);
     43VMMDECL(int)        PDMGetInterrupt(PVMCPU pVCpu, uint8_t *pu8Interrupt);
     44VMMDECL(int)        PDMIsaSetIrq(PVM pVM, uint8_t u8Irq, uint8_t u8Level, uint32_t uTagSrc);
     45VMM_INT_DECL(int)   PDMIoApicSetIrq(PVM pVM, uint8_t u8Irq, uint8_t u8Level, uint32_t uTagSrc);
     46VMM_INT_DECL(int)   PDMIoApicSendMsi(PVM pVM, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc);
     47VMMDECL(bool)       PDMHasIoApic(PVM pVM);
     48VMMDECL(int)        PDMApicHasPendingIrq(PVM pVM, bool *pfPending);
     49VMMDECL(int)        PDMApicSetBase(PVM pVM, uint64_t u64Base);
     50VMMDECL(int)        PDMApicGetBase(PVM pVM, uint64_t *pu64Base);
     51VMMDECL(int)        PDMApicSetTPR(PVMCPU pVCpu, uint8_t u8TPR);
     52VMMDECL(int)        PDMApicGetTPR(PVMCPU pVCpu, uint8_t *pu8TPR, bool *pfPending);
     53VMMDECL(int)        PDMApicWriteMSR(PVM pVM, VMCPUID iCpu, uint32_t u32Reg, uint64_t u64Value);
     54VMMDECL(int)        PDMApicReadMSR(PVM pVM, VMCPUID iCpu, uint32_t u32Reg, uint64_t *pu64Value);
     55VMMDECL(int)        PDMVMMDevHeapR3ToGCPhys(PVM pVM, RTR3PTR pv, RTGCPHYS *pGCPhys);
     56VMMDECL(bool)       PDMVMMDevHeapIsEnabled(PVM pVM);
    5757
    5858
  • trunk/include/VBox/vmm/pdmdev.h

    r40416 r40907  
    552552     * @param   iIrq            IRQ number to set.
    553553     * @param   iLevel          IRQ level. See the PDM_IRQ_LEVEL_* \#defines.
    554      */
    555     DECLR3CALLBACKMEMBER(void, pfnSetIrqR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel));
     554     * @param   uTagSrc         The IRQ tag and source (for tracing).
     555     */
     556    DECLR3CALLBACKMEMBER(void, pfnSetIrqR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTagSrc));
    556557
    557558    /**
     
    596597
    597598/** Current PDMPCIBUSREG version number. */
    598 #define PDM_PCIBUSREG_VERSION                   PDM_VERSION_MAKE(0xfffe, 2, 0)
     599#define PDM_PCIBUSREG_VERSION                   PDM_VERSION_MAKE(0xfffe, 3, 0)
    599600
    600601/**
     
    612613     * @param   iIrq            IRQ number to set.
    613614     * @param   iLevel          IRQ level. See the PDM_IRQ_LEVEL_* \#defines.
     615     * @param   uTagSrc         The IRQ tag and source (for tracing).
    614616     * @thread  EMT only.
    615617     */
    616     DECLRCCALLBACKMEMBER(void,  pfnIsaSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel));
     618    DECLRCCALLBACKMEMBER(void,  pfnIsaSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
    617619
    618620    /**
     
    622624     * @param   iIrq            IRQ number to set.
    623625     * @param   iLevel          IRQ level. See the PDM_IRQ_LEVEL_* \#defines.
     626     * @param   uTagSrc         The IRQ tag and source (for tracing).
    624627     * @thread  EMT only.
    625628     */
    626     DECLRCCALLBACKMEMBER(void,  pfnIoApicSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel));
     629    DECLRCCALLBACKMEMBER(void,  pfnIoApicSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
    627630
    628631    /**
     
    630633     *
    631634     * @param   pDevIns         PCI device instance.
    632      * @param   GCAddr          Physical address MSI request was written.
     635     * @param   GCPhys          Physical address MSI request was written.
    633636     * @param   uValue          Value written.
     637     * @param   uTagSrc         The IRQ tag and source (for tracing).
    634638     * @thread  EMT only.
    635639     */
    636     DECLRCCALLBACKMEMBER(void,  pfnIoApicSendMsi,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue));
     640    DECLRCCALLBACKMEMBER(void,  pfnIoApicSendMsi,(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, uint32_t uValue, uint32_t uTagSrc));
    637641
    638642
     
    663667
    664668/** Current PDMPCIHLPRC version number. */
    665 #define PDM_PCIHLPRC_VERSION                    PDM_VERSION_MAKE(0xfffd, 2, 0)
     669#define PDM_PCIHLPRC_VERSION                    PDM_VERSION_MAKE(0xfffd, 3, 0)
    666670
    667671
     
    680684     * @param   iIrq            IRQ number to set.
    681685     * @param   iLevel          IRQ level. See the PDM_IRQ_LEVEL_* \#defines.
     686     * @param   uTagSrc         The IRQ tag and source (for tracing).
    682687     * @thread  EMT only.
    683688     */
    684     DECLR0CALLBACKMEMBER(void,  pfnIsaSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel));
     689    DECLR0CALLBACKMEMBER(void,  pfnIsaSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
    685690
    686691    /**
     
    690695     * @param   iIrq            IRQ number to set.
    691696     * @param   iLevel          IRQ level. See the PDM_IRQ_LEVEL_* \#defines.
     697     * @param   uTagSrc         The IRQ tag and source (for tracing).
    692698     * @thread  EMT only.
    693699     */
    694     DECLR0CALLBACKMEMBER(void,  pfnIoApicSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel));
     700    DECLR0CALLBACKMEMBER(void,  pfnIoApicSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
    695701
    696702    /**
     
    698704     *
    699705     * @param   pDevIns         PCI device instance.
    700      * @param   GCAddr          Physical address MSI request was written.
     706     * @param   GCPhys          Physical address MSI request was written.
    701707     * @param   uValue          Value written.
     708     * @param   uTagSrc         The IRQ tag and source (for tracing).
    702709     * @thread  EMT only.
    703710     */
    704     DECLR0CALLBACKMEMBER(void,  pfnIoApicSendMsi,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue));
     711    DECLR0CALLBACKMEMBER(void,  pfnIoApicSendMsi,(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, uint32_t uValue, uint32_t uTagSrc));
    705712
    706713
     
    731738
    732739/** Current PDMPCIHLPR0 version number. */
    733 #define PDM_PCIHLPR0_VERSION                    PDM_VERSION_MAKE(0xfffc, 2, 0)
     740#define PDM_PCIHLPR0_VERSION                    PDM_VERSION_MAKE(0xfffc, 3, 0)
    734741
    735742/**
     
    747754     * @param   iIrq            IRQ number to set.
    748755     * @param   iLevel          IRQ level. See the PDM_IRQ_LEVEL_* \#defines.
    749      * @thread  EMT only.
    750      */
    751     DECLR3CALLBACKMEMBER(void,  pfnIsaSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel));
     756     * @param   uTagSrc         The IRQ tag and source (for tracing).
     757     */
     758    DECLR3CALLBACKMEMBER(void,  pfnIsaSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
    752759
    753760    /**
     
    757764     * @param   iIrq            IRQ number to set.
    758765     * @param   iLevel          IRQ level. See the PDM_IRQ_LEVEL_* \#defines.
    759      * @thread  EMT only.
    760      */
    761     DECLR3CALLBACKMEMBER(void,  pfnIoApicSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel));
     766     * @param   uTagSrc         The IRQ tag and source (for tracing).
     767     */
     768    DECLR3CALLBACKMEMBER(void,  pfnIoApicSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
    762769
    763770    /**
     
    765772     *
    766773     * @param   pDevIns         PCI device instance.
    767      * @param   GCAddr          Physical address MSI request was written.
     774     * @param   GCPhys          Physical address MSI request was written.
    768775     * @param   uValue          Value written.
    769      * @thread  EMT only.
    770      */
    771     DECLR3CALLBACKMEMBER(void,  pfnIoApicSendMsi,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue));
     776     * @param   uTagSrc         The IRQ tag and source (for tracing).
     777     */
     778    DECLR3CALLBACKMEMBER(void,  pfnIoApicSendMsi,(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, uint32_t uValue, uint32_t uTagSrc));
    772779
    773780    /**
     
    831838
    832839/** Current PDMPCIHLPR3 version number. */
    833 #define PDM_PCIHLPR3_VERSION                    PDM_VERSION_MAKE(0xfffb, 2, 0)
     840#define PDM_PCIHLPR3_VERSION                    PDM_VERSION_MAKE(0xfffb, 3, 0)
    834841
    835842
     
    848855     * @param   iIrq            IRQ number to set.
    849856     * @param   iLevel          IRQ level. See the PDM_IRQ_LEVEL_* \#defines.
    850      */
    851     DECLR3CALLBACKMEMBER(void, pfnSetIrqR3,(PPDMDEVINS pDevIns, int iIrq, int iLevel));
     857     * @param   uTagSrc         The IRQ tag and source (for tracing).
     858     */
     859    DECLR3CALLBACKMEMBER(void, pfnSetIrqR3,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
    852860
    853861    /**
     
    856864     * @returns Pending interrupt number.
    857865     * @param   pDevIns         Device instance of the PIC.
    858      */
    859     DECLR3CALLBACKMEMBER(int, pfnGetInterruptR3,(PPDMDEVINS pDevIns));
     866     * @param   puTagSrc        Where to return the IRQ tag and source.
     867     */
     868    DECLR3CALLBACKMEMBER(int, pfnGetInterruptR3,(PPDMDEVINS pDevIns, uint32_t *puTagSrc));
    860869
    861870    /** The name of the RC SetIrq entry point. */
     
    873882
    874883/** Current PDMPICREG version number. */
    875 #define PDM_PICREG_VERSION                      PDM_VERSION_MAKE(0xfffa, 1, 0)
     884#define PDM_PICREG_VERSION                      PDM_VERSION_MAKE(0xfffa, 2, 0)
    876885
    877886/**
     
    924933
    925934/** Current PDMPICHLPRC version number. */
    926 #define PDM_PICHLPRC_VERSION                    PDM_VERSION_MAKE(0xfff9, 1, 0)
     935#define PDM_PICHLPRC_VERSION                    PDM_VERSION_MAKE(0xfff9, 2, 0)
    927936
    928937
     
    10661075     * @returns Pending interrupt number.
    10671076     * @param   pDevIns         Device instance of the APIC.
    1068      */
    1069     DECLR3CALLBACKMEMBER(int, pfnGetInterruptR3,(PPDMDEVINS pDevIns));
     1077     * @param   puTagSrc        Where to return the tag source.
     1078     */
     1079    DECLR3CALLBACKMEMBER(int, pfnGetInterruptR3,(PPDMDEVINS pDevIns, uint32_t *puTagSrc));
    10701080
    10711081    /**
     
    11561166     * @param   u8Polarity      See APIC implementation.
    11571167     * @param   u8TriggerMode   See APIC implementation.
     1168     * @param   uTagSrc         The IRQ tag and source (for tracing).
    11581169     */
    11591170    DECLR3CALLBACKMEMBER(int,  pfnBusDeliverR3,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode,
    1160                                                 uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode));
    1161 
    1162     /**
    1163      * Deliver a signal to CPU's local interrupt pins (LINT0/LINT1). Used for
    1164      * virtual wire mode when interrupts from the PIC are passed through LAPIC.
     1171                                                uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc));
     1172
     1173    /**
     1174     * Deliver a signal to CPU's local interrupt pins (LINT0/LINT1).
     1175     *
     1176     * Used for virtual wire mode when interrupts from the PIC are passed through
     1177     * LAPIC.
    11651178     *
    11661179     * @returns status code.
    11671180     * @param   pDevIns         Device instance of the APIC.
    11681181     * @param   u8Pin           Local pin number (0 or 1 for current CPUs).
     1182     * @param   u8Level         The level.
     1183     * @param   uTagSrc         The IRQ tag and source (for tracing).
    11691184     */
    11701185    DECLR3CALLBACKMEMBER(int,  pfnLocalInterruptR3,(PPDMDEVINS pDevIns, uint8_t u8Pin, uint8_t u8Level));
     
    12171232
    12181233/** Current PDMAPICREG version number. */
    1219 #define PDM_APICREG_VERSION                     PDM_VERSION_MAKE(0xfff6, 1, 0)
     1234#define PDM_APICREG_VERSION                     PDM_VERSION_MAKE(0xfff6, 2, 0)
    12201235
    12211236
     
    15271542     * @param   iIrq            IRQ number to set.
    15281543     * @param   iLevel          IRQ level. See the PDM_IRQ_LEVEL_* \#defines.
    1529      */
    1530     DECLR3CALLBACKMEMBER(void, pfnSetIrqR3,(PPDMDEVINS pDevIns, int iIrq, int iLevel));
    1531 
    1532     /** The name of the GC SetIrq entry point. */
     1544     * @param   uTagSrc         The IRQ tag and source (for tracing).
     1545     */
     1546    DECLR3CALLBACKMEMBER(void, pfnSetIrqR3,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
     1547
     1548    /** The name of the RC SetIrq entry point. */
    15331549    const char         *pszSetIrqRC;
    15341550
     
    15421558     * @param   GCPhys          Request address.
    15431559     * @param   uValue          Request value.
    1544      */
    1545     DECLR3CALLBACKMEMBER(void, pfnSendMsiR3,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue));
    1546 
    1547     /** The name of the GC SendMsi entry point. */
     1560     * @param   uTagSrc         The IRQ tag and source (for tracing).
     1561     */
     1562    DECLR3CALLBACKMEMBER(void, pfnSendMsiR3,(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, uint32_t uValue, uint32_t uTagSrc));
     1563
     1564    /** The name of the RC SendMsi entry point. */
    15481565    const char         *pszSendMsiRC;
    15491566
     
    15551572
    15561573/** Current PDMAPICREG version number. */
    1557 #define PDM_IOAPICREG_VERSION                   PDM_VERSION_MAKE(0xfff2, 2, 0)
     1574#define PDM_IOAPICREG_VERSION                   PDM_VERSION_MAKE(0xfff2, 3, 0)
    15581575
    15591576
     
    15791596     * @param   u8Polarity      See APIC implementation.
    15801597     * @param   u8TriggerMode   See APIC implementation.
     1598     * @param   uTagSrc         The IRQ tag and source (for tracing).
    15811599     */
    15821600    DECLRCCALLBACKMEMBER(int, pfnApicBusDeliver,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode,
    1583                                                   uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode));
     1601                                                  uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc));
    15841602
    15851603    /**
     
    16091627
    16101628/** Current PDMIOAPICHLPRC version number. */
    1611 #define PDM_IOAPICHLPRC_VERSION                 PDM_VERSION_MAKE(0xfff1, 1, 0)
     1629#define PDM_IOAPICHLPRC_VERSION                 PDM_VERSION_MAKE(0xfff1, 2, 0)
    16121630
    16131631
     
    16331651     * @param   u8Polarity      See APIC implementation.
    16341652     * @param   u8TriggerMode   See APIC implementation.
     1653     * @param   uTagSrc         The IRQ tag and source (for tracing).
    16351654     */
    16361655    DECLR0CALLBACKMEMBER(int, pfnApicBusDeliver,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode,
    1637                                                   uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode));
     1656                                                  uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc));
    16381657
    16391658    /**
     
    16631682
    16641683/** Current PDMIOAPICHLPR0 version number. */
    1665 #define PDM_IOAPICHLPR0_VERSION                 PDM_VERSION_MAKE(0xfff0, 1, 0)
     1684#define PDM_IOAPICHLPR0_VERSION                 PDM_VERSION_MAKE(0xfff0, 2, 0)
    16661685
    16671686/**
     
    16861705     * @param   u8Polarity      See APIC implementation.
    16871706     * @param   u8TriggerMode   See APIC implementation.
     1707     * @param   uTagSrc         The IRQ tag and source (for tracing).
    16881708     */
    16891709    DECLR3CALLBACKMEMBER(int, pfnApicBusDeliver,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode,
    1690                                                   uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode));
     1710                                                  uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc));
    16911711
    16921712    /**
     
    17381758
    17391759/** Current PDMIOAPICHLPR3 version number. */
    1740 #define PDM_IOAPICHLPR3_VERSION                 PDM_VERSION_MAKE(0xffef, 1, 0)
     1760#define PDM_IOAPICHLPR3_VERSION                 PDM_VERSION_MAKE(0xffef, 2, 0)
    17411761
    17421762
     
    39253945    /** Tracing indicator. */
    39263946    uint32_t                    fTracing;
    3927 #if HC_ARCH_BITS == 64
     3947    /** The tracing ID of this device.  */
     3948    uint32_t                    idTracing;
     3949#if HC_ARCH_BITS == 32
    39283950    /** Align the internal data more naturally. */
    3929     uint32_t                    u32Padding;
     3951    uint32_t                    au32Padding[HC_ARCH_BITS == 32 ? 13 : 0];
    39303952#endif
    39313953
     
    39363958        PDMDEVINSINT            s;
    39373959#endif
    3938         uint8_t                 padding[HC_ARCH_BITS == 32 ? 64 + 0 : 112 + 0x28];
     3960        uint8_t                 padding[HC_ARCH_BITS == 32 ? 72 : 112 + 0x28];
    39393961    } Internal;
    39403962
     
    39453967
    39463968/** Current PDMDEVINS version number. */
    3947 #define PDM_DEVINS_VERSION                      PDM_VERSION_MAKE(0xffe4, 2, 0)
     3969#define PDM_DEVINS_VERSION                      PDM_VERSION_MAKE(0xffe4, 3, 0)
    39483970
    39493971/** Converts a pointer to the PDMDEVINS::IBase to a pointer to PDMDEVINS. */
  • trunk/include/VBox/vmm/pdmdrv.h

    r40652 r40907  
    389389    /** Tracing indicator. */
    390390    uint32_t                    fTracing;
    391 #if HC_ARCH_BITS == 64
     391    /** The tracing ID of this device.  */
     392    uint32_t                    idTracing;
     393#if HC_ARCH_BITS == 32
    392394    /** Align the internal data more naturally. */
    393     uint32_t                    u32Padding;
     395    uint32_t                    au32Padding[HC_ARCH_BITS == 32 ? 7 : 0];
    394396#endif
    395397
     
    409411
    410412/** Current DRVREG version number. */
    411 #define PDM_DRVINS_VERSION                      PDM_VERSION_MAKE(0xf0fe, 1, 0)
     413#define PDM_DRVINS_VERSION                      PDM_VERSION_MAKE(0xf0fe, 2, 0)
    412414
    413415/** Converts a pointer to the PDMDRVINS::IBase to a pointer to PDMDRVINS. */
  • trunk/include/VBox/vmm/pdmusb.h

    r40416 r40907  
    694694    uint32_t                    u32Version;
    695695    /** USB device instance number. */
    696     RTUINT                      iInstance;
     696    uint32_t                    iInstance;
    697697    /** The base interface of the device.
    698698     * The device constructor initializes this if it has any device level
     
    731731    /** Tracing indicator. */
    732732    uint32_t                    fTracing;
     733    /** The tracing ID of this device.  */
     734    uint32_t                    idTracing;
     735
    733736    /** Padding to make achInstanceData aligned at 32 byte boundary. */
    734     uint32_t                    au32Padding[HC_ARCH_BITS == 32 ? 4 : 1];
     737    uint32_t                    au32Padding[HC_ARCH_BITS == 32 ? 3 : 4];
     738
    735739    /** Device instance data. The size of this area is defined
    736740     * in the PDMUSBREG::cbInstanceData field. */
     
    739743
    740744/** Current USBINS version number. */
    741 #define PDM_USBINS_VERSION                      PDM_VERSION_MAKE(0xeefd, 1, 0)
     745#define PDM_USBINS_VERSION                      PDM_VERSION_MAKE(0xeefd, 2, 0)
    742746
    743747/**
  • trunk/src/VBox/Devices/Bus/DevPCI.cpp

    r40282 r40907  
    214214RT_C_DECLS_BEGIN
    215215
    216 PDMBOTHCBDECL(void) pciSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel);
    217 PDMBOTHCBDECL(void) pcibridgeSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel);
     216PDMBOTHCBDECL(void) pciSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTag);
     217PDMBOTHCBDECL(void) pcibridgeSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTag);
    218218PDMBOTHCBDECL(int)  pciIOPortAddressWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t u32, unsigned cb);
    219219PDMBOTHCBDECL(int)  pciIOPortAddressRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t *pu32, unsigned cb);
     
    601601}
    602602
    603 static void apic_set_irq(PPCIBUS pBus, uint8_t uDevFn, PCIDevice *pPciDev, int irq_num1, int iLevel, int acpi_irq)
     603static void apic_set_irq(PPCIBUS pBus, uint8_t uDevFn, PCIDevice *pPciDev, int irq_num1, int iLevel, int acpi_irq, uint32_t uTagSrc)
    604604{
    605605    /* This is only allowed to be called with a pointer to the host bus. */
     
    620620        Log3(("apic_set_irq: %s: irq_num1=%d level=%d apic_irq=%d apic_level=%d irq_num1=%d\n",
    621621              R3STRING(pPciDev->name), irq_num1, iLevel, apic_irq, apic_level, irq_num));
    622         pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), apic_irq, apic_level);
     622        pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), apic_irq, apic_level, uTagSrc);
    623623
    624624        if ((iLevel & PDM_IRQ_LEVEL_FLIP_FLOP) == PDM_IRQ_LEVEL_FLIP_FLOP) {
     
    628628            Log3(("apic_set_irq: %s: irq_num1=%d level=%d apic_irq=%d apic_level=%d irq_num1=%d (flop)\n",
    629629                  R3STRING(pPciDev->name), irq_num1, iLevel, apic_irq, apic_level, irq_num));
    630             pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), apic_irq, apic_level);
     630            pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), apic_irq, apic_level, uTagSrc);
    631631        }
    632632    } else {
    633633        Log3(("apic_set_irq: %s: irq_num1=%d level=%d acpi_irq=%d\n",
    634634              R3STRING(pPciDev->name), irq_num1, iLevel, acpi_irq));
    635         pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), acpi_irq, iLevel);
     635        pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), acpi_irq, iLevel, uTagSrc);
    636636    }
    637637}
     
    650650 * @param   iIrq            IRQ number to set.
    651651 * @param   iLevel          IRQ level.
     652 * @param   uTagSrc         The IRQ tag and source ID (for tracing).
    652653 * @remark  uDevFn and pPciDev->devfn are not the same if the device is behind a bridge.
    653654 *          In that case uDevFn will be the slot of the bridge which is needed to calculate the
    654655 *          PIRQ value.
    655656 */
    656 static void pciSetIrqInternal(PPCIGLOBALS pGlobals, uint8_t uDevFn, PPCIDEVICE pPciDev, int iIrq, int iLevel)
     657static void pciSetIrqInternal(PPCIGLOBALS pGlobals, uint8_t uDevFn, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTagSrc)
    657658{
    658659    PPCIBUS     pBus =     &pGlobals->PciBus;
     
    682683                 * PCI device configuration space).
    683684                 */
    684                 apic_set_irq(pBus, uDevFn, pPciDev, -1, iLevel, pPciDev->config[PCI_INTERRUPT_LINE]);
     685                apic_set_irq(pBus, uDevFn, pPciDev, -1, iLevel, pPciDev->config[PCI_INTERRUPT_LINE], uTagSrc);
    685686            else
    686                 apic_set_irq(pBus, uDevFn, pPciDev, iIrq, iLevel, -1);
     687                apic_set_irq(pBus, uDevFn, pPciDev, iIrq, iLevel, -1, uTagSrc);
    687688            return;
    688689        }
     
    732733            pic_level |= pGlobals->acpi_irq_level;
    733734
    734         Log3(("pciSetIrq: %s: iLevel=%d iIrq=%d pic_irq=%d pic_level=%d\n",
    735               R3STRING(pPciDev->name), iLevel, iIrq, pic_irq, pic_level));
    736         pBus->CTX_SUFF(pPciHlp)->pfnIsaSetIrq(pBus->CTX_SUFF(pDevIns), pic_irq, pic_level);
     735        Log3(("pciSetIrq: %s: iLevel=%d iIrq=%d pic_irq=%d pic_level=%d uTagSrc=%#x\n",
     736              R3STRING(pPciDev->name), iLevel, iIrq, pic_irq, pic_level, uTagSrc));
     737        pBus->CTX_SUFF(pPciHlp)->pfnIsaSetIrq(pBus->CTX_SUFF(pDevIns), pic_irq, pic_level, uTagSrc);
    737738
    738739        /** @todo optimize pci irq flip-flop some rainy day. */
    739740        if ((iLevel & PDM_IRQ_LEVEL_FLIP_FLOP) == PDM_IRQ_LEVEL_FLIP_FLOP)
    740             pciSetIrqInternal(pGlobals, uDevFn, pPciDev, iIrq, PDM_IRQ_LEVEL_LOW);
     741            pciSetIrqInternal(pGlobals, uDevFn, pPciDev, iIrq, PDM_IRQ_LEVEL_LOW, uTagSrc);
    741742    }
    742743}
     
    749750 * @param   iIrq            IRQ number to set.
    750751 * @param   iLevel          IRQ level.
    751  */
    752 PDMBOTHCBDECL(void) pciSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel)
    753 {
    754     pciSetIrqInternal(PDMINS_2_DATA(pDevIns, PPCIGLOBALS), pPciDev->devfn, pPciDev, iIrq, iLevel);
     752 * @param   uTagSrc         The IRQ tag and source ID (for tracing).
     753 */
     754PDMBOTHCBDECL(void) pciSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTagSrc)
     755{
     756    pciSetIrqInternal(PDMINS_2_DATA(pDevIns, PPCIGLOBALS), pPciDev->devfn, pPciDev, iIrq, iLevel, uTagSrc);
    755757}
    756758
     
    22462248 * @param   iIrq            IRQ number to set.
    22472249 * @param   iLevel          IRQ level.
    2248  */
    2249 PDMBOTHCBDECL(void) pcibridgeSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel)
     2250 * @param   uTagSrc         The IRQ tag and source ID (for tracing).
     2251 */
     2252PDMBOTHCBDECL(void) pcibridgeSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTagSrc)
    22502253{
    22512254    /*
     
    22732276
    22742277    AssertMsg(pBus->iBus == 0, ("This is not the host pci bus iBus=%d\n", pBus->iBus));
    2275     pciSetIrqInternal(PCIBUS_2_PCIGLOBALS(pBus), uDevFnBridge, pPciDev, iIrqPinBridge, iLevel);
     2278    pciSetIrqInternal(PCIBUS_2_PCIGLOBALS(pBus), uDevFnBridge, pPciDev, iIrqPinBridge, iLevel, uTagSrc);
    22762279}
    22772280
  • trunk/src/VBox/Devices/Bus/DevPciIch9.cpp

    r40282 r40907  
    165165
    166166/* Prototypes */
    167 static void ich9pciSetIrqInternal(PICH9PCIGLOBALS pGlobals, uint8_t uDevFn, PPCIDEVICE pPciDev, int iIrq, int iLevel);
     167static void ich9pciSetIrqInternal(PICH9PCIGLOBALS pGlobals, uint8_t uDevFn, PPCIDEVICE pPciDev,
     168                                  int iIrq, int iLevel, uint32_t uTagSrc);
    168169#ifdef IN_RING3
    169170static void ich9pcibridgeReset(PPDMDEVINS pDevIns);
     
    192193}
    193194
    194 PDMBOTHCBDECL(void) ich9pciSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel)
    195 {
    196     ich9pciSetIrqInternal(PDMINS_2_DATA(pDevIns, PICH9PCIGLOBALS), pPciDev->devfn, pPciDev, iIrq, iLevel);
    197 }
    198 
    199 PDMBOTHCBDECL(void) ich9pcibridgeSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel)
     195PDMBOTHCBDECL(void) ich9pciSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTagSrc)
     196{
     197    ich9pciSetIrqInternal(PDMINS_2_DATA(pDevIns, PICH9PCIGLOBALS), pPciDev->devfn, pPciDev, iIrq, iLevel, uTagSrc);
     198}
     199
     200PDMBOTHCBDECL(void) ich9pcibridgeSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTagSrc)
    200201{
    201202    /*
     
    223224
    224225    AssertMsgReturnVoid(pBus->iBus == 0, ("This is not the host pci bus iBus=%d\n", pBus->iBus));
    225     ich9pciSetIrqInternal(PCIROOTBUS_2_PCIGLOBALS(pBus), uDevFnBridge, pPciDev, iIrqPinBridge, iLevel);
     226    ich9pciSetIrqInternal(PCIROOTBUS_2_PCIGLOBALS(pBus), uDevFnBridge, pPciDev, iIrqPinBridge, iLevel, uTagSrc);
    226227}
    227228
     
    504505}
    505506
    506 static void ich9pciApicSetIrq(PICH9PCIBUS pBus, uint8_t uDevFn, PCIDevice *pPciDev, int irq_num1, int iLevel, int iForcedIrq)
     507static void ich9pciApicSetIrq(PICH9PCIBUS pBus, uint8_t uDevFn, PCIDevice *pPciDev, int irq_num1, int iLevel,
     508                              uint32_t uTagSrc, int iForcedIrq)
    507509{
    508510    /* This is only allowed to be called with a pointer to the root bus. */
     
    522524        apic_irq = irq_num + 0x10;
    523525        apic_level = pGlobals->uaPciApicIrqLevels[irq_num] != 0;
    524         Log3(("ich9pciApicSetIrq: %s: irq_num1=%d level=%d apic_irq=%d apic_level=%d irq_num1=%d\n",
    525               R3STRING(pPciDev->name), irq_num1, iLevel, apic_irq, apic_level, irq_num));
    526         pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), apic_irq, apic_level);
     526        Log3(("ich9pciApicSetIrq: %s: irq_num1=%d level=%d apic_irq=%d apic_level=%d irq_num1=%d uTagSrc=%#x\n",
     527              R3STRING(pPciDev->name), irq_num1, iLevel, apic_irq, apic_level, irq_num, uTagSrc));
     528        pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), apic_irq, apic_level, uTagSrc);
    527529
    528530        if ((iLevel & PDM_IRQ_LEVEL_FLIP_FLOP) == PDM_IRQ_LEVEL_FLIP_FLOP)
     
    535537            pPciDev->Int.s.uIrqPinState = PDM_IRQ_LEVEL_LOW;
    536538            apic_level = pGlobals->uaPciApicIrqLevels[irq_num] != 0;
    537             Log3(("ich9pciApicSetIrq: %s: irq_num1=%d level=%d apic_irq=%d apic_level=%d irq_num1=%d (flop)\n",
    538                   R3STRING(pPciDev->name), irq_num1, iLevel, apic_irq, apic_level, irq_num));
    539             pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), apic_irq, apic_level);
     539            Log3(("ich9pciApicSetIrq: %s: irq_num1=%d level=%d apic_irq=%d apic_level=%d irq_num1=%d uTagSrc=%#x (flop)\n",
     540                  R3STRING(pPciDev->name), irq_num1, iLevel, apic_irq, apic_level, irq_num, uTagSrc));
     541            pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), apic_irq, apic_level, uTagSrc);
    540542        }
    541543    } else {
    542         Log3(("ich9pciApicSetIrq: (forced) %s: irq_num1=%d level=%d acpi_irq=%d\n",
    543               R3STRING(pPciDev->name), irq_num1, iLevel, iForcedIrq));
    544         pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), iForcedIrq, iLevel);
    545     }
    546 }
    547 
    548 static void ich9pciSetIrqInternal(PICH9PCIGLOBALS pGlobals, uint8_t uDevFn, PPCIDEVICE pPciDev, int iIrq, int iLevel)
     544        Log3(("ich9pciApicSetIrq: (forced) %s: irq_num1=%d level=%d acpi_irq=%d uTagSrc=%#x\n",
     545              R3STRING(pPciDev->name), irq_num1, iLevel, iForcedIrq, uTagSrc));
     546        pBus->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pBus->CTX_SUFF(pDevIns), iForcedIrq, iLevel, uTagSrc);
     547    }
     548}
     549
     550static void ich9pciSetIrqInternal(PICH9PCIGLOBALS pGlobals, uint8_t uDevFn, PPCIDEVICE pPciDev,
     551                                  int iIrq, int iLevel, uint32_t uTagSrc)
    549552{
    550553
     
    554557        {
    555558            PPDMDEVINS pDevIns = pGlobals->aPciBus.CTX_SUFF(pDevIns);
    556             MsiNotify(pDevIns, pGlobals->aPciBus.CTX_SUFF(pPciHlp), pPciDev, iIrq, iLevel);
     559            MsiNotify(pDevIns, pGlobals->aPciBus.CTX_SUFF(pPciHlp), pPciDev, iIrq, iLevel, uTagSrc);
    557560        }
    558561
     
    560563        {
    561564            PPDMDEVINS pDevIns = pGlobals->aPciBus.CTX_SUFF(pDevIns);
    562             MsixNotify(pDevIns, pGlobals->aPciBus.CTX_SUFF(pPciHlp), pPciDev, iIrq, iLevel);
     565            MsixNotify(pDevIns, pGlobals->aPciBus.CTX_SUFF(pPciHlp), pPciDev, iIrq, iLevel, uTagSrc);
    563566        }
    564567        return;
     
    582585             * PCI device configuration space).
    583586             */
    584             ich9pciApicSetIrq(pBus, uDevFn, pPciDev, -1, iLevel, PCIDevGetInterruptLine(pPciDev));
     587            ich9pciApicSetIrq(pBus, uDevFn, pPciDev, -1, iLevel, uTagSrc, PCIDevGetInterruptLine(pPciDev));
    585588        else
    586             ich9pciApicSetIrq(pBus, uDevFn, pPciDev, iIrq, iLevel, -1);
     589            ich9pciApicSetIrq(pBus, uDevFn, pPciDev, iIrq, iLevel, uTagSrc, -1);
    587590    }
    588591}
  • trunk/src/VBox/Devices/Bus/MsiCommon.cpp

    r36663 r40907  
    103103
    104104#ifdef IN_RING3
    105 void     MsiPciConfigWrite(PPDMDEVINS pDevIns, PCPDMPCIHLP pPciHlp, PPCIDEVICE pDev, uint32_t u32Address, uint32_t val, unsigned len)
     105void     MsiPciConfigWrite(PPDMDEVINS pDevIns, PCPDMPCIHLP pPciHlp, PPCIDEVICE pDev,
     106                           uint32_t u32Address, uint32_t val, unsigned len)
    106107{
    107108    int32_t iOff = u32Address - pDev->Int.s.u8MsiCapOffset;
     
    169170                                {
    170171                                    Log(("msi: notify earlier masked pending vector: %d\n", uVector));
    171                                     MsiNotify(pDevIns, pPciHlp, pDev, uVector, PDM_IRQ_LEVEL_HIGH);
     172                                    MsiNotify(pDevIns, pPciHlp, pDev, uVector, PDM_IRQ_LEVEL_HIGH, 0 /*uTagSrc*/);
    172173                                }
    173174                            }
     
    271272}
    272273
    273 void MsiNotify(PPDMDEVINS pDevIns, PCPDMPCIHLP pPciHlp, PPCIDEVICE pDev, int iVector, int iLevel)
     274void MsiNotify(PPDMDEVINS pDevIns, PCPDMPCIHLP pPciHlp, PPCIDEVICE pDev, int iVector, int iLevel, uint32_t uTagSrc)
    274275{
    275276    AssertMsg(msiIsEnabled(pDev), ("Must be enabled to use that"));
     
    304305
    305306    Assert(pPciHlp->pfnIoApicSendMsi != NULL);
    306     pPciHlp->pfnIoApicSendMsi(pDevIns, GCAddr, u32Value);
    307 }
     307    pPciHlp->pfnIoApicSendMsi(pDevIns, GCAddr, u32Value, uTagSrc);
     308}
  • trunk/src/VBox/Devices/Bus/MsiCommon.h

    r36663 r40907  
    3737
    3838/* Device notification (aka interrupt). */
    39 void     MsiNotify(PPDMDEVINS pDevIns, PCPDMPCIHLP pPciHlp, PPCIDEVICE pDev, int iVector, int iLevel);
     39void     MsiNotify(PPDMDEVINS pDevIns, PCPDMPCIHLP pPciHlp, PPCIDEVICE pDev, int iVector, int iLevel, uint32_t uTagSrc);
    4040
    4141#ifdef IN_RING3
     
    5454
    5555/* Device notification (aka interrupt). */
    56 void     MsixNotify(PPDMDEVINS pDevIns, PCPDMPCIHLP pPciHlp, PPCIDEVICE pDev, int iVector, int iLevel);
     56void     MsixNotify(PPDMDEVINS pDevIns, PCPDMPCIHLP pPciHlp, PPCIDEVICE pDev, int iVector, int iLevel, uint32_t uTagSrc);
    5757
    5858#ifdef IN_RING3
  • trunk/src/VBox/Devices/Bus/MsixCommon.cpp

    r39135 r40907  
    109109{
    110110    if (msixIsPending(pDev, iVector) && !msixIsVectorMasked(pDev, iVector))
    111         MsixNotify(pDevIns, pPciHlp, pDev, iVector, 1 /* iLevel */);
     111        MsixNotify(pDevIns, pPciHlp, pDev, iVector, 1 /* iLevel */, 0 /*uTagSrc*/);
    112112}
    113113
     
    239239}
    240240
    241 void MsixNotify(PPDMDEVINS pDevIns, PCPDMPCIHLP pPciHlp, PPCIDEVICE pDev, int iVector, int iLevel)
     241void MsixNotify(PPDMDEVINS pDevIns, PCPDMPCIHLP pPciHlp, PPCIDEVICE pDev, int iVector, int iLevel, uint32_t uTagSrc)
    242242{
    243243    AssertMsg(msixIsEnabled(pDev), ("Must be enabled to use that"));
     
    265265    uint32_t   u32Value = msixGetMsiData(pDev, iVector);
    266266
    267     pPciHlp->pfnIoApicSendMsi(pDevIns, GCAddr, u32Value);
     267    pPciHlp->pfnIoApicSendMsi(pDevIns, GCAddr, u32Value, uTagSrc);
    268268}
    269269
  • trunk/src/VBox/Devices/PC/DevAPIC.cpp

    r40280 r40907  
    5555#include "VBoxDD2.h"
    5656#include "DevApic.h"
     57
    5758
    5859/*******************************************************************************
     
    338339    /** Timer description timer. */
    339340    R3PTRTYPE(char *)       pszDesc;
     341
     342    /** The IRQ tags and source IDs for each (tracing purposes). */
     343    uint32_t                auTags[256];
     344
    340345# ifdef VBOX_WITH_STATISTICS
    341346#  if HC_ARCH_BITS == 32
     
    436441
    437442static void apic_init_ipi(APICDeviceInfo* pDev, APICState *s);
    438 static void apic_set_irq(APICDeviceInfo* pDev, APICState *s, int vector_num, int trigger_mode);
     443static void apic_set_irq(APICDeviceInfo* pDev, APICState *s, int vector_num, int trigger_mode, uint32_t uTagSrc);
    439444static bool apic_update_irq(APICDeviceInfo* pDev, APICState *s);
    440445
     
    530535                            PCVMCPUSET pDstSet, uint8_t delivery_mode,
    531536                            uint8_t vector_num, uint8_t polarity,
    532                             uint8_t trigger_mode)
    533 {
    534     LogFlow(("apic_bus_deliver mask=%R[vmcpuset] mode=%x vector=%x polarity=%x trigger_mode=%x\n",
    535              pDstSet, delivery_mode, vector_num, polarity, trigger_mode));
     537                            uint8_t trigger_mode, uint32_t uTagSrc)
     538{
     539    LogFlow(("apic_bus_deliver mask=%R[vmcpuset] mode=%x vector=%x polarity=%x trigger_mode=%x uTagSrc=%#x\n",
     540             pDstSet, delivery_mode, vector_num, polarity, trigger_mode, uTagSrc));
    536541
    537542    switch (delivery_mode)
     
    543548            {
    544549                APICState *pApic = getLapicById(pDev, idDstCpu);
    545                 apic_set_irq(pDev, pApic, vector_num, trigger_mode);
     550                apic_set_irq(pDev, pApic, vector_num, trigger_mode, uTagSrc);
    546551            }
    547552            return VINF_SUCCESS;
     
    585590
    586591    APIC_FOREACH_IN_SET_BEGIN(pDev, pDstSet);
    587         apic_set_irq(pDev, pCurApic, vector_num, trigger_mode);
     592        apic_set_irq(pDev, pCurApic, vector_num, trigger_mode, uTagSrc);
    588593    APIC_FOREACH_END();
    589594    return VINF_SUCCESS;
     
    830835                                      vector,
    831836                                      0 /* Polarity - conform to the bus */,
    832                                       0 /* Trigger mode - edge */);
     837                                      0 /* Trigger mode - edge */,
     838                                      0 /*uTagSrc*/);
    833839                APIC_UNLOCK(pDev);
    834840                break;
     
    10771083PDMBOTHCBDECL(int) apicBusDeliverCallback(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode,
    10781084                                          uint8_t u8DeliveryMode, uint8_t iVector, uint8_t u8Polarity,
    1079                                           uint8_t u8TriggerMode)
     1085                                          uint8_t u8TriggerMode, uint32_t uTagSrc)
    10801086{
    10811087    APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
    10821088    Assert(PDMCritSectIsOwner(pDev->CTX_SUFF(pCritSect)));
    1083     LogFlow(("apicBusDeliverCallback: pDevIns=%p u8Dest=%#x u8DestMode=%#x u8DeliveryMode=%#x iVector=%#x u8Polarity=%#x u8TriggerMode=%#x\n",
    1084              pDevIns, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode));
     1089    LogFlow(("apicBusDeliverCallback: pDevIns=%p u8Dest=%#x u8DestMode=%#x u8DeliveryMode=%#x iVector=%#x u8Polarity=%#x u8TriggerMode=%#x uTagSrc=%#x\n",
     1090             pDevIns, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode, uTagSrc));
    10851091    VMCPUSET DstSet;
    10861092    return apic_bus_deliver(pDev, apic_get_delivery_bitmask(pDev, u8Dest, u8DestMode, &DstSet),
    1087                             u8DeliveryMode, iVector, u8Polarity, u8TriggerMode);
     1093                            u8DeliveryMode, iVector, u8Polarity, u8TriggerMode, uTagSrc);
    10881094}
    10891095
     
    12691275}
    12701276
    1271 static void apic_set_irq(APICDeviceInfo *pDev,  APICState* s, int vector_num, int trigger_mode)
    1272 {
    1273     LogFlow(("CPU%d: apic_set_irq vector=%x, trigger_mode=%x\n", s->phys_id, vector_num, trigger_mode));
     1277static void apic_set_irq(APICDeviceInfo *pDev,  APICState* s, int vector_num, int trigger_mode, uint32_t uTagSrc)
     1278{
     1279    LogFlow(("CPU%d: apic_set_irq vector=%x trigger_mode=%x uTagSrc=%#x\n", s->phys_id, vector_num, trigger_mode, uTagSrc));
     1280
    12741281    Apic256BitReg_SetBit(&s->irr, vector_num);
    12751282    if (trigger_mode)
     
    12771284    else
    12781285        Apic256BitReg_ClearBit(&s->tmr, vector_num);
     1286
     1287    if (!s->auTags[vector_num])
     1288        s->auTags[vector_num] = uTagSrc;
     1289    else
     1290        s->auTags[vector_num] |= RT_BIT_32(31);
     1291
    12791292    apic_update_irq(pDev, s);
    12801293}
     
    13681381{
    13691382    int dest_shorthand = (s->icr[0] >> 18) & 3;
    1370     LogFlow(("apic_deliver dest=%x dest_mode=%x dest_shorthand=%x delivery_mode=%x vector_num=%x polarity=%x trigger_mode=%x\n", dest, dest_mode, dest_shorthand, delivery_mode, vector_num, polarity, trigger_mode));
     1383    LogFlow(("apic_deliver dest=%x dest_mode=%x dest_shorthand=%x delivery_mode=%x vector_num=%x polarity=%x trigger_mode=%x uTagSrc=%#x\n", dest, dest_mode, dest_shorthand, delivery_mode, vector_num, polarity, trigger_mode));
    13711384
    13721385    VMCPUSET DstSet;
     
    14201433
    14211434    return apic_bus_deliver(pDev, &DstSet, delivery_mode, vector_num,
    1422                             polarity, trigger_mode);
    1423 }
    1424 
    1425 
    1426 PDMBOTHCBDECL(int) apicGetInterrupt(PPDMDEVINS pDevIns)
     1435                            polarity, trigger_mode, 0 /* uTagSrc*/);
     1436}
     1437
     1438
     1439PDMBOTHCBDECL(int) apicGetInterrupt(PPDMDEVINS pDevIns, uint32_t *puTagSrc)
    14271440{
    14281441    APICDeviceInfo *pDev = PDMINS_2_DATA(pDevIns, APICDeviceInfo *);
     
    14551468    if (s->tpr && (uint32_t)intno <= s->tpr)
    14561469    {
     1470        *puTagSrc = 0;
    14571471        Log(("apic_get_interrupt: returns %d (sp)\n", s->spurious_vec & 0xff));
    14581472        return s->spurious_vec & 0xff;
    14591473    }
     1474
    14601475    Apic256BitReg_ClearBit(&s->irr, intno);
    14611476    Apic256BitReg_SetBit(&s->isr, intno);
     1477
     1478    *puTagSrc = s->auTags[intno];
     1479    s->auTags[intno] = 0;
     1480
    14621481    apic_update_irq(pDev, s);
    1463     LogFlow(("CPU%d: apic_get_interrupt: returns %d\n", s->phys_id, intno));
     1482
     1483    LogFlow(("CPU%d: apic_get_interrupt: returns %d / %#x\n", s->phys_id, intno, *puTagSrc));
    14641484    return intno;
    14651485}
     
    16791699    if (!(pApic->lvt[APIC_LVT_TIMER] & APIC_LVT_MASKED)) {
    16801700        LogFlow(("apic_timer: trigger irq\n"));
    1681         apic_set_irq(pDev, pApic, pApic->lvt[APIC_LVT_TIMER] & 0xff, APIC_TRIGGER_EDGE);
     1701        apic_set_irq(pDev, pApic, pApic->lvt[APIC_LVT_TIMER] & 0xff, APIC_TRIGGER_EDGE, 0 /*uTagSrc*/);
    16821702
    16831703        if (   (pApic->lvt[APIC_LVT_TIMER] & APIC_LVT_TIMER_PERIODIC)
  • trunk/src/VBox/Devices/PC/DevIoApic.cpp

    r40280 r40907  
    8787    uint32_t                irr;
    8888    uint64_t                ioredtbl[IOAPIC_NUM_PINS];
     89    /** The IRQ tags and source IDs for each pin (tracing purposes). */
     90    uint32_t                auTagSrc[IOAPIC_NUM_PINS];
    8991
    9092    /** The device instance - R3 Ptr. */
     
    157159                else
    158160                    vector = entry & 0xff;
     161                uint32_t uTagSrc = pThis->auTagSrc[vector];
     162                pThis->auTagSrc[vector] = 0;
    159163
    160164                int rc = pThis->CTX_SUFF(pIoApicHlp)->pfnApicBusDeliver(pThis->CTX_SUFF(pDevIns),
     
    164168                                                                        vector,
    165169                                                                        polarity,
    166                                                                         trig_mode);
     170                                                                        trig_mode,
     171                                                                        uTagSrc);
    167172                /* We must be sure that attempts to reschedule in R3
    168173                   never get here */
     
    174179
    175180
    176 static void ioapic_set_irq(void *opaque, int vector, int level)
     181static void ioapic_set_irq(void *opaque, int vector, int level, uint32_t uTagSrc)
    177182{
    178183    IOAPICState *pThis = (IOAPICState*)opaque;
     
    189194            {
    190195                pThis->irr |= mask;
     196                if (!pThis->auTagSrc[vector])
     197                    pThis->auTagSrc[vector] = uTagSrc;
     198                else
     199                    pThis->auTagSrc[vector] = RT_BIT_32(31);
     200
    191201                ioapic_service(pThis);
     202
    192203                if ((level & PDM_IRQ_LEVEL_FLIP_FLOP) == PDM_IRQ_LEVEL_FLIP_FLOP)
    193204                    pThis->irr &= ~mask;
     
    202213            {
    203214                pThis->irr |= mask;
     215                if (!pThis->auTagSrc[vector])
     216                    pThis->auTagSrc[vector] = uTagSrc;
     217                else
     218                    pThis->auTagSrc[vector] = RT_BIT_32(31);
     219
    204220                ioapic_service(pThis);
    205221            }
     
    372388}
    373389
    374 PDMBOTHCBDECL(void) ioapicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel)
     390PDMBOTHCBDECL(void) ioapicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)
    375391{
    376392    /* PDM lock is taken here; */ /** @todo add assertion */
    377393    IOAPICState *pThis = PDMINS_2_DATA(pDevIns, IOAPICState *);
    378394    STAM_COUNTER_INC(&pThis->CTXSUFF(StatSetIrq));
    379     LogFlow(("ioapicSetIrq: iIrq=%d iLevel=%d\n", iIrq, iLevel));
    380     ioapic_set_irq(pThis, iIrq, iLevel);
    381 }
    382 
    383 PDMBOTHCBDECL(void) ioapicSendMsi(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue)
     395    LogFlow(("ioapicSetIrq: iIrq=%d iLevel=%d uTagSrc=%#x\n", iIrq, iLevel, uTagSrc));
     396    ioapic_set_irq(pThis, iIrq, iLevel, uTagSrc);
     397}
     398
     399PDMBOTHCBDECL(void) ioapicSendMsi(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc)
    384400{
    385401    IOAPICState *pThis = PDMINS_2_DATA(pDevIns, IOAPICState *);
     
    406422                                                            vector_num,
    407423                                                            0 /* polarity, n/a */,
    408                                                             trigger_mode);
     424                                                            trigger_mode,
     425                                                            uTagSrc);
    409426    /* We must be sure that attempts to reschedule in R3
    410427       never get here */
  • trunk/src/VBox/Devices/PC/DevPIC.cpp

    r40280 r40907  
    5151RT_C_DECLS_BEGIN
    5252
    53 PDMBOTHCBDECL(void) picSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel);
    54 PDMBOTHCBDECL(int) picGetInterrupt(PPDMDEVINS pDevIns);
     53PDMBOTHCBDECL(void) picSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc);
     54PDMBOTHCBDECL(int) picGetInterrupt(PPDMDEVINS pDevIns, uint32_t *puTagSrc);
    5555PDMBOTHCBDECL(int) picIOPortRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t *pu32, unsigned cb);
    5656PDMBOTHCBDECL(int) picIOPortWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t u32, unsigned cb);
     
    109109    uint8_t elcr_mask;
    110110    /** Pointer to the device instance, R3 Ptr. */
    111     PPDMDEVINSR3 pDevInsR3;
     111    PPDMDEVINSR3    pDevInsR3;
    112112    /** Pointer to the device instance, R0 Ptr. */
    113     PPDMDEVINSR0 pDevInsR0;
     113    PPDMDEVINSR0    pDevInsR0;
    114114    /** Pointer to the device instance, RC Ptr. */
    115     PPDMDEVINSRC pDevInsRC;
    116     RTRCPTR      Alignment0; /**< Structure size alignment. */
     115    PPDMDEVINSRC    pDevInsRC;
     116    RTRCPTR         Alignment0; /**< Structure size alignment. */
     117    /** The IRQ tags and source IDs for each (tracing purposes). */
     118    uint32_t        auTags[8];
     119
    117120} PicState;
    118121
     
    164167
    165168/* set irq level. If an edge is detected, then the IRR is set to 1 */
    166 static inline void pic_set_irq1(PicState *s, int irq, int level)
     169static inline void pic_set_irq1(PicState *s, int irq, int level, uint32_t uTagSrc)
    167170{
    168171    int mask;
     
    194197        }
    195198    }
     199
     200    /* Save the tag. */
     201    if (level)
     202    {
     203        if (!s->auTags[irq])
     204            s->auTags[irq] = uTagSrc;
     205        else
     206            s->auTags[irq] |= RT_BIT_32(31);
     207    }
     208
    196209    DumpPICState(s, "pic_set_irq1");
    197210}
     
    251264    if (irq2 >= 0) {
    252265        /* if irq request by slave pic, signal master PIC */
    253         pic_set_irq1(&pics[0], 2, 1);
     266        pic_set_irq1(&pics[0], 2, 1, pics[1].auTags[irq2]);
    254267    } else {
    255268        /* If not, clear the IR on the master PIC. */
    256         pic_set_irq1(&pics[0], 2, 0);
     269        pic_set_irq1(&pics[0], 2, 0, 0 /*uTagSrc*/);
    257270    }
    258271    /* look at requested irq */
     
    352365 * @param   iIrq            IRQ number to set.
    353366 * @param   iLevel          IRQ level.
    354  */
    355 PDMBOTHCBDECL(void) picSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel)
     367 * @param   uTagSrc         The IRQ tag and source ID (for tracing).
     368 */
     369PDMBOTHCBDECL(void) picSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)
    356370{
    357371    PDEVPIC     pThis = PDMINS_2_DATA(pDevIns, PDEVPIC);
     
    371385         * line must be held high for a while to avoid spurious interrupts.
    372386         */
    373         pic_set_irq1(&pThis->aPics[iIrq >> 3], iIrq & 7, 0);
     387        pic_set_irq1(&pThis->aPics[iIrq >> 3], iIrq & 7, 0, uTagSrc);
    374388        pic_update_irq(pThis);
    375389    }
    376     pic_set_irq1(&pThis->aPics[iIrq >> 3], iIrq & 7, iLevel & PDM_IRQ_LEVEL_HIGH);
     390    pic_set_irq1(&pThis->aPics[iIrq >> 3], iIrq & 7, iLevel & PDM_IRQ_LEVEL_HIGH, uTagSrc);
    377391    pic_update_irq(pThis);
    378392}
     
    402416 * @returns Pending interrupt number.
    403417 * @param   pDevIns         Device instance of the PICs.
    404  */
    405 PDMBOTHCBDECL(int) picGetInterrupt(PPDMDEVINS pDevIns)
     418 * @param   puTagSrc        Where to return the IRQ tag and source ID.
     419 */
     420PDMBOTHCBDECL(int) picGetInterrupt(PPDMDEVINS pDevIns, uint32_t *puTagSrc)
    406421{
    407422    PDEVPIC     pThis = PDMINS_2_DATA(pDevIns, PDEVPIC);
     
    431446            }
    432447            intno = pThis->aPics[1].irq_base + irq2;
    433             Log2(("picGetInterrupt1: %x base=%x irq=%x\n", intno, pThis->aPics[1].irq_base, irq2));
     448            *puTagSrc = pThis->aPics[0].auTags[irq2];
     449            pThis->aPics[0].auTags[irq2] = 0;
     450            Log2(("picGetInterrupt1: %x base=%x irq=%x uTagSrc=%#x\n", intno, pThis->aPics[1].irq_base, irq2, *puTagSrc));
    434451            irq = irq2 + 8;
    435452        }
    436         else {
     453        else
     454        {
    437455            intno = pThis->aPics[0].irq_base + irq;
    438             Log2(("picGetInterrupt0: %x base=%x irq=%x\n", intno, pThis->aPics[0].irq_base, irq));
     456            *puTagSrc = pThis->aPics[0].auTags[irq];
     457            pThis->aPics[0].auTags[irq] = 0;
     458            Log2(("picGetInterrupt0: %x base=%x irq=%x uTagSrc=%#x\n", intno, pThis->aPics[0].irq_base, irq, *puTagSrc));
    439459        }
    440460    }
     
    445465        irq = 7;
    446466        intno = pThis->aPics[0].irq_base + irq;
     467        *puTagSrc = 0;
    447468    }
    448469    pic_update_irq(pThis);
  • trunk/src/VBox/VMM/Makefile.kmk

    r40652 r40907  
    372372
    373373 VMMRC_SOURCES   = \
     374        VBoxVMM.d \
    374375        VMMRC/VMMRC0.asm \
    375376        VMMRC/VMMRCDeps.cpp \
  • trunk/src/VBox/VMM/VBoxVMM.d

    r40832 r40907  
    3030    /*^^VMM-ALT-TP: "%04x:%08llx rc=%d", (a_pCtx)->cs, (a_pCtx)->rip, (a_rc) */
    3131
    32     probe em__ff__high(struct VMCPU *a_pVCpu, unsigned int a_fGlobal, unsigned int a_fLocal, int a_rc);
     32    probe em__ff__high(struct VMCPU *a_pVCpu, uint32_t a_fGlobal, uint32_t a_fLocal, int a_rc);
    3333    /*^^VMM-ALT-TP: "vm=%#x cpu=%#x rc=%d", (a_fGlobal), (a_fLocal), (a_rc) */
    3434
    35     probe em__ff__all(struct VMCPU *a_pVCpu, unsigned int a_fGlobal, unsigned int a_fLocal, int a_rc);
     35    probe em__ff__all(struct VMCPU *a_pVCpu, uint32_t a_fGlobal, uint32_t a_fLocal, int a_rc);
    3636    /*^^VMM-ALT-TP: "vm=%#x cpu=%#x rc=%d", (a_fGlobal), (a_fLocal), (a_rc) */
    3737
     
    3939    /*^^VMM-ALT-TP: "%d", (a_rc) */
    4040
    41     probe em__ff__raw(struct VMCPU *a_pVCpu, unsigned int a_fGlobal, unsigned int a_fLocal);
     41    probe em__ff__raw(struct VMCPU *a_pVCpu, uint32_t a_fGlobal, uint32_t a_fLocal);
    4242    /*^^VMM-ALT-TP: "vm=%#x cpu=%#x", (a_fGlobal), (a_fLocal) */
    4343
     
    4545    /*^^VMM-ALT-TP: "%d", (a_rc) */
    4646
    47     probe r0__gvmm__vm__created(void *a_pGVM, void *a_pVM, unsigned int a_Pid, void *a_hEMT0, unsigned int a_cCpus);
     47    probe pdm__irq__get(       struct VMCPU *a_pVCpu, uint32_t a_uTag, uint32_t a_idSource, uint32_t a_iIrq);
     48    probe pdm__irq__high(       struct VMCPU *a_pVCpu, uint32_t a_uTag, uint32_t a_idSource);
     49    probe pdm__irq__low(     struct VMCPU *a_pVCpu, uint32_t a_uTag, uint32_t a_idSource);
     50    probe pdm__irq__hilo(struct VMCPU *a_pVCpu, uint32_t a_uTag, uint32_t a_idSource);
     51
     52
     53    probe r0__gvmm__vm__created(void *a_pGVM, void *a_pVM, uint32_t a_Pid, void *a_hEMT0, uint32_t a_cCpus);
    4854    probe r0__hmsvm__vmexit(struct VMCPU *a_pVM, struct CPUMCTX *a_pCtx, uint64_t a_ExitCode,
    4955                            uint64_t a_ExitInfo1, uint64_t a_ExitInfo2, uint64_t a_ExitIntInfo,
  • trunk/src/VBox/VMM/VMMAll/PDMAll.cpp

    r39402 r40907  
    3131#include <iprt/assert.h>
    3232
     33#include "PDMInline.h"
     34#include "dtrace/VBoxVMM.h"
     35
     36
    3337
    3438/**
     
    5357        Assert(pVM->pdm.s.Apic.CTX_SUFF(pDevIns));
    5458        Assert(pVM->pdm.s.Apic.CTX_SUFF(pfnGetInterrupt));
    55         int i = pVM->pdm.s.Apic.CTX_SUFF(pfnGetInterrupt)(pVM->pdm.s.Apic.CTX_SUFF(pDevIns));
     59        uint32_t uTagSrc;
     60        int i = pVM->pdm.s.Apic.CTX_SUFF(pfnGetInterrupt)(pVM->pdm.s.Apic.CTX_SUFF(pDevIns), &uTagSrc);
    5661        AssertMsg(i <= 255 && i >= 0, ("i=%d\n", i));
    5762        if (i >= 0)
     
    5964            pdmUnlock(pVM);
    6065            *pu8Interrupt = (uint8_t)i;
     66            VBOXVMM_PDM_IRQ_GET(pVCpu, RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc), i);
    6167            return VINF_SUCCESS;
    6268        }
     
    7177        Assert(pVM->pdm.s.Pic.CTX_SUFF(pDevIns));
    7278        Assert(pVM->pdm.s.Pic.CTX_SUFF(pfnGetInterrupt));
    73         int i = pVM->pdm.s.Pic.CTX_SUFF(pfnGetInterrupt)(pVM->pdm.s.Pic.CTX_SUFF(pDevIns));
     79        uint32_t uTagSrc;
     80        int i = pVM->pdm.s.Pic.CTX_SUFF(pfnGetInterrupt)(pVM->pdm.s.Pic.CTX_SUFF(pDevIns), &uTagSrc);
    7481        AssertMsg(i <= 255 && i >= 0, ("i=%d\n", i));
    7582        if (i >= 0)
     
    7784            pdmUnlock(pVM);
    7885            *pu8Interrupt = (uint8_t)i;
     86            VBOXVMM_PDM_IRQ_GET(pVCpu, RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc), i);
    7987            return VINF_SUCCESS;
    8088        }
     
    94102 * @param   pVM             VM handle.
    95103 * @param   u8Irq           The IRQ line.
    96  * @param   u8Level         The new level.
    97  */
    98 VMMDECL(int) PDMIsaSetIrq(PVM pVM, uint8_t u8Irq, uint8_t u8Level)
     104 * @param   u8Level         The new level.
     105 * @param   uTagSrc         The IRQ tag and source tracer ID. 
     106 */
     107VMMDECL(int) PDMIsaSetIrq(PVM pVM, uint8_t u8Irq, uint8_t u8Level, uint32_t uTagSrc)
    99108{
    100109    pdmLock(pVM);
     110
     111    /** @todo put the IRQ13 code elsewhere to avoid this unnecessary bloat. */
     112    if (!uTagSrc && (u8Level & PDM_IRQ_LEVEL_HIGH)) /* FPU IRQ */
     113    {
     114        if (u8Level == PDM_IRQ_LEVEL_HIGH)
     115            VBOXVMM_PDM_IRQ_HIGH(VMMGetCpu(pVM), 0, 0);
     116        else
     117            VBOXVMM_PDM_IRQ_HILO(VMMGetCpu(pVM), 0, 0);
     118    }
    101119
    102120    int rc = VERR_PDM_NO_PIC_INSTANCE;
     
    104122    {
    105123        Assert(pVM->pdm.s.Pic.CTX_SUFF(pfnSetIrq));
    106         pVM->pdm.s.Pic.CTX_SUFF(pfnSetIrq)(pVM->pdm.s.Pic.CTX_SUFF(pDevIns), u8Irq, u8Level);
     124        pVM->pdm.s.Pic.CTX_SUFF(pfnSetIrq)(pVM->pdm.s.Pic.CTX_SUFF(pDevIns), u8Irq, u8Level, uTagSrc);
    107125        rc = VINF_SUCCESS;
    108126    }
     
    112130        Assert(pVM->pdm.s.IoApic.CTX_SUFF(pfnSetIrq));
    113131
    114         /**
     132        /*
    115133         * Apply Interrupt Source Override rules.
    116134         * See ACPI 4.0 specification 5.2.12.4 and 5.2.12.5 for details on
     
    124142            u8Irq = 2;
    125143
    126         pVM->pdm.s.IoApic.CTX_SUFF(pfnSetIrq)(pVM->pdm.s.IoApic.CTX_SUFF(pDevIns), u8Irq, u8Level);
     144        pVM->pdm.s.IoApic.CTX_SUFF(pfnSetIrq)(pVM->pdm.s.IoApic.CTX_SUFF(pDevIns), u8Irq, u8Level, uTagSrc);
    127145        rc = VINF_SUCCESS;
    128146    }
    129147
     148    if (!uTagSrc && u8Level == PDM_IRQ_LEVEL_LOW)
     149        VBOXVMM_PDM_IRQ_LOW(VMMGetCpu(pVM), 0, 0);
    130150    pdmUnlock(pVM);
    131151    return rc;
     
    140160 * @param   u8Irq           The IRQ line.
    141161 * @param   u8Level         The new level.
    142  */
    143 VMMDECL(int) PDMIoApicSetIrq(PVM pVM, uint8_t u8Irq, uint8_t u8Level)
     162 * @param   uTagSrc         The IRQ tag and source tracer ID. 
     163 */
     164VMM_INT_DECL(int) PDMIoApicSetIrq(PVM pVM, uint8_t u8Irq, uint8_t u8Level, uint32_t uTagSrc)
    144165{
    145166    if (pVM->pdm.s.IoApic.CTX_SUFF(pDevIns))
     
    147168        Assert(pVM->pdm.s.IoApic.CTX_SUFF(pfnSetIrq));
    148169        pdmLock(pVM);
    149         pVM->pdm.s.IoApic.CTX_SUFF(pfnSetIrq)(pVM->pdm.s.IoApic.CTX_SUFF(pDevIns), u8Irq, u8Level);
     170        pVM->pdm.s.IoApic.CTX_SUFF(pfnSetIrq)(pVM->pdm.s.IoApic.CTX_SUFF(pDevIns), u8Irq, u8Level, uTagSrc);
    150171        pdmUnlock(pVM);
    151172        return VINF_SUCCESS;
     
    161182 * @param   GCAddr          Request address.
    162183 * @param   u8Value         Request value.
    163  */
    164 VMMDECL(int) PDMIoApicSendMsi(PVM pVM, RTGCPHYS GCAddr, uint32_t uValue)
     184 * @param   uTagSrc         The IRQ tag and source tracer ID. 
     185 */
     186VMM_INT_DECL(int) PDMIoApicSendMsi(PVM pVM, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc)
    165187{
    166188    if (pVM->pdm.s.IoApic.CTX_SUFF(pDevIns))
     
    168190        Assert(pVM->pdm.s.IoApic.CTX_SUFF(pfnSendMsi));
    169191        pdmLock(pVM);
    170         pVM->pdm.s.IoApic.CTX_SUFF(pfnSendMsi)(pVM->pdm.s.IoApic.CTX_SUFF(pDevIns), GCAddr, uValue);
     192        pVM->pdm.s.IoApic.CTX_SUFF(pfnSendMsi)(pVM->pdm.s.IoApic.CTX_SUFF(pDevIns), GCAddr, uValue, uTagSrc);
    171193        pdmUnlock(pVM);
    172194        return VINF_SUCCESS;
  • trunk/src/VBox/VMM/VMMR0/PDMR0Device.cpp

    r39078 r40907  
    3636#include <iprt/assert.h>
    3737#include <iprt/string.h>
     38
     39#include "dtrace/VBoxVMM.h"
     40#include "PDMInline.h"
    3841
    3942
     
    5659*   Internal Functions                                                         *
    5760*******************************************************************************/
    58 static void pdmR0IsaSetIrq(PVM pVM, int iIrq, int iLevel);
    59 static void pdmR0IoApicSetIrq(PVM pVM, int iIrq, int iLevel);
    60 static void pdmR0IoApicSendMsi(PVM pVM, RTGCPHYS GCAddr, uint32_t uValue);
     61static bool pdmR0IsaSetIrq(PVM pVM, int iIrq, int iLevel, uint32_t uTagSrc);
    6162
    6263
     
    7172    PDMDEV_ASSERT_DEVINS(pDevIns);
    7273    LogFlow(("pdmR0DevHlp_PCISetIrq: caller=%p/%d: iIrq=%d iLevel=%d\n", pDevIns, pDevIns->iInstance, iIrq, iLevel));
    73 
    7474    PVM          pVM     = pDevIns->Internal.s.pVMR0;
    7575    PPCIDEVICE   pPciDev = pDevIns->Internal.s.pPciDeviceR0;
    7676    PPDMPCIBUS   pPciBus = pDevIns->Internal.s.pPciBusR0;
     77
     78    pdmLock(pVM);
     79    uint32_t uTagSrc;
     80    if (iLevel & PDM_IRQ_LEVEL_HIGH)
     81    {
     82        pDevIns->Internal.s.uLastIrqTag = uTagSrc = pdmCalcIrqTag(pVM, pDevIns->idTracing);
     83        if (iLevel == PDM_IRQ_LEVEL_HIGH)
     84            VBOXVMM_PDM_IRQ_HIGH(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     85        else
     86            VBOXVMM_PDM_IRQ_HILO(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     87    }
     88    else
     89        uTagSrc = pDevIns->Internal.s.uLastIrqTag;
     90
    7791    if (    pPciDev
    7892        &&  pPciBus
    7993        &&  pPciBus->pDevInsR0)
    8094    {
    81         pdmLock(pVM);
    82         pPciBus->pfnSetIrqR0(pPciBus->pDevInsR0, pPciDev, iIrq, iLevel);
     95        pPciBus->pfnSetIrqR0(pPciBus->pDevInsR0, pPciDev, iIrq, iLevel, uTagSrc);
     96
    8397        pdmUnlock(pVM);
     98
     99        if (iLevel == PDM_IRQ_LEVEL_LOW)
     100            VBOXVMM_PDM_IRQ_LOW(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
    84101    }
    85102    else
    86103    {
     104        pdmUnlock(pVM);
     105
    87106        /* queue for ring-3 execution. */
    88107        PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueR0);
    89         if (pTask)
    90         {
    91             pTask->enmOp = PDMDEVHLPTASKOP_PCI_SET_IRQ;
    92             pTask->pDevInsR3 = PDMDEVINS_2_R3PTR(pDevIns);
    93             pTask->u.SetIRQ.iIrq = iIrq;
    94             pTask->u.SetIRQ.iLevel = iLevel;
    95 
    96             PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueR0, &pTask->Core, 0);
    97         }
    98         else
    99             AssertMsgFailed(("We're out of devhlp queue items!!!\n"));
    100     }
    101 
    102     LogFlow(("pdmR0DevHlp_PCISetIrq: caller=%p/%d: returns void\n", pDevIns, pDevIns->iInstance));
     108        AssertReturnVoid(pTask);
     109
     110        pTask->enmOp = PDMDEVHLPTASKOP_PCI_SET_IRQ;
     111        pTask->pDevInsR3 = PDMDEVINS_2_R3PTR(pDevIns);
     112        pTask->u.SetIRQ.iIrq = iIrq;
     113        pTask->u.SetIRQ.iLevel = iLevel;
     114        pTask->u.SetIRQ.uTagSrc = uTagSrc;
     115
     116        PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueR0, &pTask->Core, 0);
     117    }
     118
     119    LogFlow(("pdmR0DevHlp_PCISetIrq: caller=%p/%d: returns void; uTagSrc=%#x\n", pDevIns, pDevIns->iInstance, uTagSrc));
    103120}
    104121
     
    109126    PDMDEV_ASSERT_DEVINS(pDevIns);
    110127    LogFlow(("pdmR0DevHlp_ISASetIrq: caller=%p/%d: iIrq=%d iLevel=%d\n", pDevIns, pDevIns->iInstance, iIrq, iLevel));
    111 
    112     pdmR0IsaSetIrq(pDevIns->Internal.s.pVMR0, iIrq, iLevel);
    113 
    114     LogFlow(("pdmR0DevHlp_ISASetIrq: caller=%p/%d: returns void\n", pDevIns, pDevIns->iInstance));
     128    PVM pVM = pDevIns->Internal.s.pVMR0;
     129
     130    pdmLock(pVM);
     131    uint32_t uTagSrc;
     132    if (iLevel & PDM_IRQ_LEVEL_HIGH)
     133    {
     134        pDevIns->Internal.s.uLastIrqTag = uTagSrc = pdmCalcIrqTag(pVM, pDevIns->idTracing);
     135        if (iLevel == PDM_IRQ_LEVEL_HIGH)
     136            VBOXVMM_PDM_IRQ_HIGH(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     137        else
     138            VBOXVMM_PDM_IRQ_HILO(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     139    }
     140    else
     141        uTagSrc = pDevIns->Internal.s.uLastIrqTag;
     142
     143    bool fRc = pdmR0IsaSetIrq(pVM, iIrq, iLevel, uTagSrc);
     144
     145    if (iLevel == PDM_IRQ_LEVEL_LOW && fRc)
     146        VBOXVMM_PDM_IRQ_LOW(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     147    pdmUnlock(pVM);
     148    LogFlow(("pdmR0DevHlp_ISASetIrq: caller=%p/%d: returns void; uTagSrc=%#x\n", pDevIns, pDevIns->iInstance, uTagSrc));
    115149}
    116150
     
    213247
    214248
    215 /** @copydoc PDMDEVHLPR0::pdmR0DevHlp_PATMSetMMIOPatchInfo*/
     249/** @interface_method_impl{PDMDEVHLPR0,pfnPATMSetMMIOPatchInfo} */
    216250static DECLCALLBACK(int) pdmR0DevHlp_PATMSetMMIOPatchInfo(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, RTGCPTR pCachedData)
    217251{
     
    233267    LogFlow(("pdmR0DevHlp_GetVM: caller='%p'/%d\n", pDevIns, pDevIns->iInstance));
    234268    return pDevIns->Internal.s.pVMR0;
    235 }
    236 
    237 
    238 /** @interface_method_impl{PDMDEVHLPR0,pfnCanEmulateIoBlock} */
    239 static DECLCALLBACK(bool) pdmR0DevHlp_CanEmulateIoBlock(PPDMDEVINS pDevIns)
    240 {
    241     PDMDEV_ASSERT_DEVINS(pDevIns);
    242     LogFlow(("pdmR0DevHlp_GetVM: caller='%p'/%d\n", pDevIns, pDevIns->iInstance));
    243     return HWACCMCanEmulateIoBlock(VMMGetCpu(pDevIns->Internal.s.pVMR0));
    244269}
    245270
     
    288313    LogFlow(("pdmR3DevHlp_DBGFTraceBuf: caller='%p'/%d: returns %p\n", pDevIns, pDevIns->iInstance, hTraceBuf));
    289314    return hTraceBuf;
     315}
     316
     317
     318/** @interface_method_impl{PDMDEVHLPR0,pfnCanEmulateIoBlock} */
     319static DECLCALLBACK(bool) pdmR0DevHlp_CanEmulateIoBlock(PPDMDEVINS pDevIns)
     320{
     321    PDMDEV_ASSERT_DEVINS(pDevIns);
     322    LogFlow(("pdmR0DevHlp_GetVM: caller='%p'/%d\n", pDevIns, pDevIns->iInstance));
     323    return HWACCMCanEmulateIoBlock(VMMGetCpu(pDevIns->Internal.s.pVMR0));
    290324}
    291325
     
    568602/** @interface_method_impl{PDMIOAPICHLPR0,pfnApicBusDeliver} */
    569603static DECLCALLBACK(int) pdmR0IoApicHlp_ApicBusDeliver(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode,
    570                                                        uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode)
     604                                                       uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc)
    571605{
    572606    PDMDEV_ASSERT_DEVINS(pDevIns);
    573607    PVM pVM = pDevIns->Internal.s.pVMR0;
    574     LogFlow(("pdmR0IoApicHlp_ApicBusDeliver: caller=%p/%d: u8Dest=%RX8 u8DestMode=%RX8 u8DeliveryMode=%RX8 iVector=%RX8 u8Polarity=%RX8 u8TriggerMode=%RX8\n",
    575              pDevIns, pDevIns->iInstance, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode));
     608    LogFlow(("pdmR0IoApicHlp_ApicBusDeliver: caller=%p/%d: u8Dest=%RX8 u8DestMode=%RX8 u8DeliveryMode=%RX8 iVector=%RX8 u8Polarity=%RX8 u8TriggerMode=%RX8 uTagSrc=%#x\n",
     609             pDevIns, pDevIns->iInstance, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode, uTagSrc));
    576610    Assert(pVM->pdm.s.Apic.pDevInsR0);
    577611    if (pVM->pdm.s.Apic.pfnBusDeliverR0)
    578         return pVM->pdm.s.Apic.pfnBusDeliverR0(pVM->pdm.s.Apic.pDevInsR0, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode);
     612        return pVM->pdm.s.Apic.pfnBusDeliverR0(pVM->pdm.s.Apic.pDevInsR0, u8Dest, u8DestMode, u8DeliveryMode, iVector,
     613                                               u8Polarity, u8TriggerMode, uTagSrc);
    579614    return VINF_SUCCESS;
    580615}
     
    619654
    620655/** @interface_method_impl{PDMPCIHLPR0,pfnIsaSetIrq} */
    621 static DECLCALLBACK(void) pdmR0PciHlp_IsaSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel)
    622 {
    623     PDMDEV_ASSERT_DEVINS(pDevIns);
    624     Log4(("pdmR0PciHlp_IsaSetIrq: iIrq=%d iLevel=%d\n", iIrq, iLevel));
    625     pdmR0IsaSetIrq(pDevIns->Internal.s.pVMR0, iIrq, iLevel);
     656static DECLCALLBACK(void) pdmR0PciHlp_IsaSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)
     657{
     658    PDMDEV_ASSERT_DEVINS(pDevIns);
     659    Log4(("pdmR0PciHlp_IsaSetIrq: iIrq=%d iLevel=%d uTagSrc=%#x\n", iIrq, iLevel, uTagSrc));
     660    PVM pVM = pDevIns->Internal.s.pVMR0;
     661
     662    pdmLock(pVM);
     663    pdmR0IsaSetIrq(pVM, iIrq, iLevel, uTagSrc);
     664    pdmUnlock(pVM);
    626665}
    627666
    628667
    629668/** @interface_method_impl{PDMPCIHLPR0,pfnIoApicSetIrq} */
    630 static DECLCALLBACK(void) pdmR0PciHlp_IoApicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel)
    631 {
    632     PDMDEV_ASSERT_DEVINS(pDevIns);
    633     Log4(("pdmR0PciHlp_IoApicSetIrq: iIrq=%d iLevel=%d\n", iIrq, iLevel));
    634     pdmR0IoApicSetIrq(pDevIns->Internal.s.pVMR0, iIrq, iLevel);
    635 }
     669static DECLCALLBACK(void) pdmR0PciHlp_IoApicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)
     670{
     671    PDMDEV_ASSERT_DEVINS(pDevIns);
     672    Log4(("pdmR0PciHlp_IoApicSetIrq: iIrq=%d iLevel=%d uTagSrc=%#x\n", iIrq, iLevel, uTagSrc));
     673    PVM pVM = pDevIns->Internal.s.pVMR0;
     674
     675    if (pVM->pdm.s.IoApic.pDevInsR0)
     676    {
     677        pdmLock(pVM);
     678        pVM->pdm.s.IoApic.pfnSetIrqR0(pVM->pdm.s.IoApic.pDevInsR0, iIrq, iLevel, uTagSrc);
     679        pdmUnlock(pVM);
     680    }
     681    else if (pVM->pdm.s.IoApic.pDevInsR3)
     682    {
     683        /* queue for ring-3 execution. */
     684        PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueR0);
     685        if (pTask)
     686        {
     687            pTask->enmOp = PDMDEVHLPTASKOP_IOAPIC_SET_IRQ;
     688            pTask->pDevInsR3 = NIL_RTR3PTR; /* not required */
     689            pTask->u.SetIRQ.iIrq = iIrq;
     690            pTask->u.SetIRQ.iLevel = iLevel;
     691            pTask->u.SetIRQ.uTagSrc = uTagSrc;
     692
     693            PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueR0, &pTask->Core, 0);
     694        }
     695        else
     696            AssertMsgFailed(("We're out of devhlp queue items!!!\n"));
     697    }
     698}
     699
    636700
    637701/** @interface_method_impl{PDMPCIHLPR0,pfnIoApicSendMsi} */
    638 static DECLCALLBACK(void) pdmR0PciHlp_IoApicSendMsi(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue)
    639 {
    640     PDMDEV_ASSERT_DEVINS(pDevIns);
    641     Log4(("pdmR0PciHlp_IoApicSendMsi: Address=%p Value=%d\n", GCAddr, uValue));
    642     pdmR0IoApicSendMsi(pDevIns->Internal.s.pVMR0, GCAddr, uValue);
    643 }
     702static DECLCALLBACK(void) pdmR0PciHlp_IoApicSendMsi(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, uint32_t uValue, uint32_t uTagSrc)
     703{
     704    PDMDEV_ASSERT_DEVINS(pDevIns);
     705    Log4(("pdmR0PciHlp_IoApicSendMsi: GCPhys=%p uValue=%d uTagSrc=%#x\n", GCPhys, uValue, uTagSrc));
     706    PVM pVM = pDevIns->Internal.s.pVMR0;
     707    if (pVM->pdm.s.IoApic.pDevInsR0)
     708    {
     709        pdmLock(pVM);
     710        pVM->pdm.s.IoApic.pfnSendMsiR0(pVM->pdm.s.IoApic.pDevInsR0, GCPhys, uValue, uTagSrc);
     711        pdmUnlock(pVM);
     712    }
     713    else
     714    {
     715        AssertFatalMsgFailed(("Lazy bastards!"));
     716    }
     717}
     718
    644719
    645720/** @interface_method_impl{PDMPCIHLPR0,pfnLock} */
     
    814889
    815890/**
    816  * Sets an irq on the I/O APIC.
     891 * Sets an irq on the PIC and I/O APIC.
    817892 *
    818  * @param   pVM     The VM handle.
    819  * @param   iIrq    The irq.
    820  * @param   iLevel  The new level.
    821  */
    822 static void pdmR0IsaSetIrq(PVM pVM, int iIrq, int iLevel)
    823 {
    824     if (    (   pVM->pdm.s.IoApic.pDevInsR0
    825              || !pVM->pdm.s.IoApic.pDevInsR3)
    826         &&  (   pVM->pdm.s.Pic.pDevInsR0
    827              || !pVM->pdm.s.Pic.pDevInsR3))
    828     {
    829         pdmLock(pVM);
     893 * @returns true if     delivered, false if postponed.
     894 * @param   pVM         The VM handle.
     895 * @param   iIrq        The irq.
     896 * @param   iLevel      The new level.
     897 * @param   uTagSrc     The IRQ tag and source.
     898 *
     899 * @remarks The caller holds the PDM lock.
     900 */
     901static bool pdmR0IsaSetIrq(PVM pVM, int iIrq, int iLevel, uint32_t uTagSrc)
     902{
     903    if (RT_LIKELY(    (   pVM->pdm.s.IoApic.pDevInsR0
     904                       || !pVM->pdm.s.IoApic.pDevInsR3)
     905                  &&  (   pVM->pdm.s.Pic.pDevInsR0
     906                       || !pVM->pdm.s.Pic.pDevInsR3)))
     907    {
    830908        if (pVM->pdm.s.Pic.pDevInsR0)
    831             pVM->pdm.s.Pic.pfnSetIrqR0(pVM->pdm.s.Pic.pDevInsR0, iIrq, iLevel);
     909            pVM->pdm.s.Pic.pfnSetIrqR0(pVM->pdm.s.Pic.pDevInsR0, iIrq, iLevel, uTagSrc);
    832910        if (pVM->pdm.s.IoApic.pDevInsR0)
    833             pVM->pdm.s.IoApic.pfnSetIrqR0(pVM->pdm.s.IoApic.pDevInsR0, iIrq, iLevel);
    834         pdmUnlock(pVM);
    835     }
    836     else
    837     {
    838         /* queue for ring-3 execution. */
    839         PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueR0);
    840         if (pTask)
    841         {
    842             pTask->enmOp = PDMDEVHLPTASKOP_ISA_SET_IRQ;
    843             pTask->pDevInsR3 = NIL_RTR3PTR; /* not required */
    844             pTask->u.SetIRQ.iIrq = iIrq;
    845             pTask->u.SetIRQ.iLevel = iLevel;
    846 
    847             PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueR0, &pTask->Core, 0);
    848         }
    849         else
    850             AssertMsgFailed(("We're out of devhlp queue items!!!\n"));
    851     }
    852 }
    853 
    854 
    855 /**
    856  * Sets an irq on the I/O APIC.
    857  *
    858  * @param   pVM     The VM handle.
    859  * @param   iIrq    The irq.
    860  * @param   iLevel  The new level.
    861  */
    862 static void pdmR0IoApicSetIrq(PVM pVM, int iIrq, int iLevel)
    863 {
    864     if (pVM->pdm.s.IoApic.pDevInsR0)
    865     {
    866         pdmLock(pVM);
    867         pVM->pdm.s.IoApic.pfnSetIrqR0(pVM->pdm.s.IoApic.pDevInsR0, iIrq, iLevel);
    868         pdmUnlock(pVM);
    869     }
    870     else if (pVM->pdm.s.IoApic.pDevInsR3)
    871     {
    872         /* queue for ring-3 execution. */
    873         PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueR0);
    874         if (pTask)
    875         {
    876             pTask->enmOp = PDMDEVHLPTASKOP_IOAPIC_SET_IRQ;
    877             pTask->pDevInsR3 = NIL_RTR3PTR; /* not required */
    878             pTask->u.SetIRQ.iIrq = iIrq;
    879             pTask->u.SetIRQ.iLevel = iLevel;
    880 
    881             PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueR0, &pTask->Core, 0);
    882         }
    883         else
    884             AssertMsgFailed(("We're out of devhlp queue items!!!\n"));
    885     }
     911            pVM->pdm.s.IoApic.pfnSetIrqR0(pVM->pdm.s.IoApic.pDevInsR0, iIrq, iLevel, uTagSrc);
     912        return true;
     913    }
     914
     915    /* queue for ring-3 execution. */
     916    PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueR0);
     917    AssertReturn(pTask, false);
     918
     919    pTask->enmOp = PDMDEVHLPTASKOP_ISA_SET_IRQ;
     920    pTask->pDevInsR3 = NIL_RTR3PTR; /* not required */
     921    pTask->u.SetIRQ.iIrq = iIrq;
     922    pTask->u.SetIRQ.iLevel = iLevel;
     923    pTask->u.SetIRQ.uTagSrc = uTagSrc;
     924
     925    PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueR0, &pTask->Core, 0);
     926    return false;
    886927}
    887928
     
    913954}
    914955
    915 /**
    916  * Sends an MSI to I/O APIC.
    917  *
    918  * @param   pVM     The VM handle.
    919  * @param   GCAddr  Address of the message.
    920  * @param   uValue  Value of the message.
    921  */
    922 static void pdmR0IoApicSendMsi(PVM pVM, RTGCPHYS GCAddr, uint32_t uValue)
    923 {
    924     if (pVM->pdm.s.IoApic.pDevInsR0)
    925     {
    926         pdmLock(pVM);
    927         pVM->pdm.s.IoApic.pfnSendMsiR0(pVM->pdm.s.IoApic.pDevInsR0, GCAddr, uValue);
    928         pdmUnlock(pVM);
    929     }
    930 }
  • trunk/src/VBox/VMM/VMMR3/PDMDevHlp.cpp

    r40274 r40907  
    4444#include <iprt/thread.h>
    4545
     46#include "dtrace/VBoxVMM.h"
     47#include "PDMInline.h"
     48
    4649
    4750/*******************************************************************************
     
    13421345     * Validate input.
    13431346     */
    1344     /** @todo iIrq and iLevel checks. */
     1347    Assert(iIrq == 0);
     1348    Assert((uint32_t)iLevel <= PDM_IRQ_LEVEL_FLIP_FLOP);
    13451349
    13461350    /*
     
    13531357        Assert(pBus);
    13541358        PVM pVM = pDevIns->Internal.s.pVMR3;
     1359
    13551360        pdmLock(pVM);
    1356         pBus->pfnSetIrqR3(pBus->pDevInsR3, pPciDev, iIrq, iLevel);
     1361        uint32_t uTagSrc;
     1362        if (iLevel & PDM_IRQ_LEVEL_HIGH)
     1363        {
     1364            pDevIns->Internal.s.uLastIrqTag = uTagSrc = pdmCalcIrqTag(pVM, pDevIns->idTracing);
     1365            if (iLevel == PDM_IRQ_LEVEL_HIGH)
     1366                VBOXVMM_PDM_IRQ_HIGH(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     1367            else
     1368                VBOXVMM_PDM_IRQ_HILO(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     1369        }
     1370        else
     1371            uTagSrc = pDevIns->Internal.s.uLastIrqTag;
     1372
     1373        pBus->pfnSetIrqR3(pBus->pDevInsR3, pPciDev, iIrq, iLevel, uTagSrc);
     1374
     1375        if (iLevel == PDM_IRQ_LEVEL_LOW)
     1376            VBOXVMM_PDM_IRQ_LOW(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
    13571377        pdmUnlock(pVM);
    13581378    }
     
    14111431     * Validate input.
    14121432     */
    1413     /** @todo iIrq and iLevel checks. */
    1414 
    1415     PVM pVM = pDevIns->Internal.s.pVMR3;
    1416     PDMIsaSetIrq(pVM, iIrq, iLevel);    /* (The API takes the lock.) */
     1433    Assert(iIrq < 16);
     1434    Assert((uint32_t)iLevel <= PDM_IRQ_LEVEL_FLIP_FLOP);
     1435
     1436    PVM pVM = pDevIns->Internal.s.pVMR3;
     1437
     1438    /*
     1439     * Do the job.
     1440     */
     1441    pdmLock(pVM);
     1442    uint32_t uTagSrc;
     1443    if (iLevel & PDM_IRQ_LEVEL_HIGH)
     1444    {
     1445        pDevIns->Internal.s.uLastIrqTag = uTagSrc = pdmCalcIrqTag(pVM, pDevIns->idTracing);
     1446        if (iLevel == PDM_IRQ_LEVEL_HIGH)
     1447            VBOXVMM_PDM_IRQ_HIGH(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     1448        else
     1449            VBOXVMM_PDM_IRQ_HILO(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     1450    }
     1451    else
     1452        uTagSrc = pDevIns->Internal.s.uLastIrqTag;
     1453
     1454    PDMIsaSetIrq(pVM, iIrq, iLevel, uTagSrc);  /* (The API takes the lock recursively.) */
     1455
     1456    if (iLevel == PDM_IRQ_LEVEL_LOW)
     1457        VBOXVMM_PDM_IRQ_LOW(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     1458    pdmUnlock(pVM);
    14171459
    14181460    LogFlow(("pdmR3DevHlp_ISASetIrq: caller='%s'/%d: returns void\n", pDevIns->pReg->szName, pDevIns->iInstance));
     
    36043646    {
    36053647        case PDMDEVHLPTASKOP_ISA_SET_IRQ:
    3606             PDMIsaSetIrq(pVM, pTask->u.SetIRQ.iIrq, pTask->u.SetIRQ.iLevel);
     3648            PDMIsaSetIrq(pVM, pTask->u.SetIRQ.iIrq, pTask->u.SetIRQ.iLevel, pTask->u.SetIRQ.uTagSrc);
    36073649            break;
    36083650
    36093651        case PDMDEVHLPTASKOP_PCI_SET_IRQ:
    3610             pdmR3DevHlp_PCISetIrq(pTask->pDevInsR3, pTask->u.SetIRQ.iIrq, pTask->u.SetIRQ.iLevel);
     3652        {
     3653            /* Same as pdmR3DevHlp_PCISetIrq, except we've got a tag already. */
     3654            PPDMDEVINS pDevIns = pTask->pDevInsR3;
     3655            PPCIDEVICE pPciDev = pDevIns->Internal.s.pPciDeviceR3;
     3656            if (pPciDev)
     3657            {
     3658                PPDMPCIBUS pBus = pDevIns->Internal.s.pPciBusR3; /** @todo the bus should be associated with the PCI device not the PDM device. */
     3659                Assert(pBus);
     3660
     3661                pdmLock(pVM);
     3662                pBus->pfnSetIrqR3(pBus->pDevInsR3, pPciDev, pTask->u.SetIRQ.iIrq,
     3663                                  pTask->u.SetIRQ.iLevel, pTask->u.SetIRQ.uTagSrc);
     3664                pdmUnlock(pVM);
     3665            }
     3666            else
     3667                AssertReleaseMsgFailed(("No PCI device registered!\n"));
    36113668            break;
     3669        }
    36123670
    36133671        case PDMDEVHLPTASKOP_IOAPIC_SET_IRQ:
    3614             PDMIoApicSetIrq(pVM, pTask->u.SetIRQ.iIrq, pTask->u.SetIRQ.iLevel);
     3672            PDMIoApicSetIrq(pVM, pTask->u.SetIRQ.iIrq, pTask->u.SetIRQ.iLevel, pTask->u.SetIRQ.uTagSrc);
    36153673            break;
    36163674
  • trunk/src/VBox/VMM/VMMR3/PDMDevMiscHlp.cpp

    r40274 r40907  
    3535#include <iprt/assert.h>
    3636#include <iprt/thread.h>
     37
     38
     39#include "PDMInline.h"
     40#include "dtrace/VBoxVMM.h"
    3741
    3842
     
    378382/** @interface_method_impl{PDMIOAPICHLPR3,pfnApicBusDeliver} */
    379383static DECLCALLBACK(int) pdmR3IoApicHlp_ApicBusDeliver(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode,
    380                                                         uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode)
    381 {
    382     PDMDEV_ASSERT_DEVINS(pDevIns);
    383     PVM pVM = pDevIns->Internal.s.pVMR3;
    384     LogFlow(("pdmR3IoApicHlp_ApicBusDeliver: caller='%s'/%d: u8Dest=%RX8 u8DestMode=%RX8 u8DeliveryMode=%RX8 iVector=%RX8 u8Polarity=%RX8 u8TriggerMode=%RX8\n",
    385              pDevIns->pReg->szName, pDevIns->iInstance, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode));
     384                                                        uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc)
     385{
     386    PDMDEV_ASSERT_DEVINS(pDevIns);
     387    PVM pVM = pDevIns->Internal.s.pVMR3;
     388    LogFlow(("pdmR3IoApicHlp_ApicBusDeliver: caller='%s'/%d: u8Dest=%RX8 u8DestMode=%RX8 u8DeliveryMode=%RX8 iVector=%RX8 u8Polarity=%RX8 u8TriggerMode=%RX8 uTagSrc=%#x\n",
     389             pDevIns->pReg->szName, pDevIns->iInstance, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode, uTagSrc));
    386390    if (pVM->pdm.s.Apic.pfnBusDeliverR3)
    387         return pVM->pdm.s.Apic.pfnBusDeliverR3(pVM->pdm.s.Apic.pDevInsR3, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode);
     391        return pVM->pdm.s.Apic.pfnBusDeliverR3(pVM->pdm.s.Apic.pDevInsR3, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode, uTagSrc);
    388392    return VINF_SUCCESS;
    389393}
     
    462466
    463467/** @interface_method_impl{PDMPCIHLPR3,pfnIsaSetIrq} */
    464 static DECLCALLBACK(void) pdmR3PciHlp_IsaSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel)
    465 {
    466     PDMDEV_ASSERT_DEVINS(pDevIns);
    467     Log4(("pdmR3PciHlp_IsaSetIrq: iIrq=%d iLevel=%d\n", iIrq, iLevel));
    468     PDMIsaSetIrq(pDevIns->Internal.s.pVMR3, iIrq, iLevel);
     468static DECLCALLBACK(void) pdmR3PciHlp_IsaSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)
     469{
     470    PDMDEV_ASSERT_DEVINS(pDevIns);
     471    Log4(("pdmR3PciHlp_IsaSetIrq: iIrq=%d iLevel=%d uTagSrc=%#x\n", iIrq, iLevel, uTagSrc));
     472    PVM pVM = pDevIns->Internal.s.pVMR3;
     473    PDMIsaSetIrq(pDevIns->Internal.s.pVMR3, iIrq, iLevel, uTagSrc);
    469474}
    470475
    471476/** @interface_method_impl{PDMPCIHLPR3,pfnIoApicSetIrq} */
    472 static DECLCALLBACK(void) pdmR3PciHlp_IoApicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel)
    473 {
    474     PDMDEV_ASSERT_DEVINS(pDevIns);
    475     Log4(("pdmR3PciHlp_IoApicSetIrq: iIrq=%d iLevel=%d\n", iIrq, iLevel));
    476     PDMIoApicSetIrq(pDevIns->Internal.s.pVMR3, iIrq, iLevel);
     477static DECLCALLBACK(void) pdmR3PciHlp_IoApicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)
     478{
     479    PDMDEV_ASSERT_DEVINS(pDevIns);
     480    Log4(("pdmR3PciHlp_IoApicSetIrq: iIrq=%d iLevel=%d uTagSrc=%#x\n", iIrq, iLevel, uTagSrc));
     481    PDMIoApicSetIrq(pDevIns->Internal.s.pVMR3, iIrq, iLevel, uTagSrc);
    477482}
    478483
    479484/** @interface_method_impl{PDMPCIHLPR3,pfnIoApicSendMsi} */
    480 static DECLCALLBACK(void) pdmR3PciHlp_IoApicSendMsi(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue)
    481 {
    482     PDMDEV_ASSERT_DEVINS(pDevIns);
    483     Log4(("pdmR3PciHlp_IoApicSendMsi: address=%p value=%x\n", GCAddr, uValue));
    484     PDMIoApicSendMsi(pDevIns->Internal.s.pVMR3, GCAddr, uValue);
     485static DECLCALLBACK(void) pdmR3PciHlp_IoApicSendMsi(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc)
     486{
     487    PDMDEV_ASSERT_DEVINS(pDevIns);
     488    Log4(("pdmR3PciHlp_IoApicSendMsi: address=%p value=%x uTagSrc=%#x\n", GCAddr, uValue, uTagSrc));
     489    PDMIoApicSendMsi(pDevIns->Internal.s.pVMR3, GCAddr, uValue, uTagSrc);
    485490}
    486491
     
    612617    PDMDEV_ASSERT_DEVINS(pDevIns);
    613618    LogFlow(("pdmR3HpetHlp_SetIrq: caller='%s'/%d: iIrq=%d iLevel=%d\n", pDevIns->pReg->szName, pDevIns->iInstance, iIrq, iLevel));
    614     PDMIsaSetIrq(pDevIns->Internal.s.pVMR3, iIrq, iLevel);
     619    PVM pVM = pDevIns->Internal.s.pVMR3;
     620
     621    pdmLock(pVM);
     622    uint32_t uTagSrc;
     623    if (iLevel & PDM_IRQ_LEVEL_HIGH)
     624    {
     625        pDevIns->Internal.s.uLastIrqTag = uTagSrc = pdmCalcIrqTag(pVM, pDevIns->idTracing);
     626        if (iLevel == PDM_IRQ_LEVEL_HIGH)
     627            VBOXVMM_PDM_IRQ_HIGH(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     628        else
     629            VBOXVMM_PDM_IRQ_HILO(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     630    }
     631    else
     632        uTagSrc = pDevIns->Internal.s.uLastIrqTag;
     633
     634    PDMIsaSetIrq(pVM, iIrq, iLevel, uTagSrc); /* (The API takes the lock recursively.) */
     635
     636    if (iLevel == PDM_IRQ_LEVEL_LOW)
     637        VBOXVMM_PDM_IRQ_LOW(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     638    pdmUnlock(pVM);
    615639    return 0;
    616640}
  • trunk/src/VBox/VMM/VMMRC/PDMRCDevice.cpp

    r37410 r40907  
    3434#include <iprt/assert.h>
    3535#include <iprt/string.h>
     36
     37#include "dtrace/VBoxVMM.h"
     38#include "PDMInline.h"
    3639
    3740
     
    5457*   Internal Functions                                                         *
    5558*******************************************************************************/
    56 static void pdmRCIsaSetIrq(PVM pVM, int iIrq, int iLevel);
    57 static void pdmRCIoApicSetIrq(PVM pVM, int iIrq, int iLevel);
    58 static void pdmRCIoApicSendMsi(PVM pVM, RTGCPHYS GCAddr, uint32_t uValue);
     59static bool pdmRCIsaSetIrq(PVM pVM, int iIrq, int iLevel, uint32_t uTagSrc);
     60
    5961
    6062/** @name Raw-Mode Context Device Helpers
     
    7173    PPCIDEVICE  pPciDev = pDevIns->Internal.s.pPciDeviceRC;
    7274    PPDMPCIBUS  pPciBus = pDevIns->Internal.s.pPciBusRC;
     75
     76    pdmLock(pVM);
     77    uint32_t uTagSrc;
     78    if (iLevel & PDM_IRQ_LEVEL_HIGH)
     79    {
     80        pDevIns->Internal.s.uLastIrqTag = uTagSrc = pdmCalcIrqTag(pVM, pDevIns->idTracing);
     81        if (iLevel == PDM_IRQ_LEVEL_HIGH)
     82            VBOXVMM_PDM_IRQ_HIGH(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     83        else
     84            VBOXVMM_PDM_IRQ_HILO(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     85    }
     86    else
     87        uTagSrc = pDevIns->Internal.s.uLastIrqTag;
     88
    7389    if (    pPciDev
    7490        &&  pPciBus
    7591        &&  pPciBus->pDevInsRC)
    7692    {
    77         pdmLock(pVM);
    78         pPciBus->pfnSetIrqRC(pPciBus->pDevInsRC, pPciDev, iIrq, iLevel);
     93        pPciBus->pfnSetIrqRC(pPciBus->pDevInsRC, pPciDev, iIrq, iLevel, uTagSrc);
     94
    7995        pdmUnlock(pVM);
     96
     97        if (iLevel == PDM_IRQ_LEVEL_LOW)
     98            VBOXVMM_PDM_IRQ_LOW(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
    8099    }
    81100    else
    82101    {
     102        pdmUnlock(pVM);
     103
    83104        /* queue for ring-3 execution. */
    84105        PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueRC);
    85         if (pTask)
    86         {
    87             pTask->enmOp = PDMDEVHLPTASKOP_PCI_SET_IRQ;
    88             pTask->pDevInsR3 = PDMDEVINS_2_R3PTR(pDevIns);
    89             pTask->u.SetIRQ.iIrq = iIrq;
    90             pTask->u.SetIRQ.iLevel = iLevel;
    91 
    92             PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueRC, &pTask->Core, 0);
    93         }
    94         else
    95             AssertMsgFailed(("We're out of devhlp queue items!!!\n"));
    96     }
    97 
    98     LogFlow(("pdmRCDevHlp_PCISetIrq: caller=%p/%d: returns void\n", pDevIns, pDevIns->iInstance));
     106        AssertReturnVoid(pTask);
     107
     108        pTask->enmOp = PDMDEVHLPTASKOP_PCI_SET_IRQ;
     109        pTask->pDevInsR3 = PDMDEVINS_2_R3PTR(pDevIns);
     110        pTask->u.SetIRQ.iIrq = iIrq;
     111        pTask->u.SetIRQ.iLevel = iLevel;
     112        pTask->u.SetIRQ.uTagSrc = uTagSrc;
     113
     114        PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueRC, &pTask->Core, 0);
     115    }
     116
     117    LogFlow(("pdmRCDevHlp_PCISetIrq: caller=%p/%d: returns void; uTagSrc=%#x\n", pDevIns, pDevIns->iInstance, uTagSrc));
    99118}
    100119
     
    105124    PDMDEV_ASSERT_DEVINS(pDevIns);
    106125    LogFlow(("pdmRCDevHlp_ISASetIrq: caller=%p/%d: iIrq=%d iLevel=%d\n", pDevIns, pDevIns->iInstance, iIrq, iLevel));
    107 
    108     pdmRCIsaSetIrq(pDevIns->Internal.s.pVMRC, iIrq, iLevel);
    109 
    110     LogFlow(("pdmRCDevHlp_ISASetIrq: caller=%p/%d: returns void\n", pDevIns, pDevIns->iInstance));
     126    PVM pVM = pDevIns->Internal.s.pVMRC;
     127
     128    pdmLock(pVM);
     129    uint32_t uTagSrc;
     130    if (iLevel & PDM_IRQ_LEVEL_HIGH)
     131    {
     132        pDevIns->Internal.s.uLastIrqTag = uTagSrc = pdmCalcIrqTag(pVM, pDevIns->idTracing);
     133        if (iLevel == PDM_IRQ_LEVEL_HIGH)
     134            VBOXVMM_PDM_IRQ_HIGH(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     135        else
     136            VBOXVMM_PDM_IRQ_HILO(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     137    }
     138    else
     139        uTagSrc = pDevIns->Internal.s.uLastIrqTag;
     140
     141    bool fRc = pdmRCIsaSetIrq(pVM, iIrq, iLevel, uTagSrc);
     142
     143    if (iLevel == PDM_IRQ_LEVEL_LOW && fRc)
     144        VBOXVMM_PDM_IRQ_LOW(VMMGetCpu(pVM), RT_LOWORD(uTagSrc), RT_HIWORD(uTagSrc));
     145    pdmUnlock(pVM);
     146    LogFlow(("pdmRCDevHlp_ISASetIrq: caller=%p/%d: returns void; uTagSrc=%#x\n", pDevIns, pDevIns->iInstance, uTagSrc));
    111147}
    112148
     
    531567/** @interface_method_impl{PDMIOAPICHLPRC,pfnApicBusDeliver} */
    532568static DECLCALLBACK(int) pdmRCIoApicHlp_ApicBusDeliver(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode,
    533                                                        uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode)
     569                                                       uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc)
    534570{
    535571    PDMDEV_ASSERT_DEVINS(pDevIns);
    536572    PVM pVM = pDevIns->Internal.s.pVMRC;
    537     LogFlow(("pdmRCIoApicHlp_ApicBusDeliver: caller=%p/%d: u8Dest=%RX8 u8DestMode=%RX8 u8DeliveryMode=%RX8 iVector=%RX8 u8Polarity=%RX8 u8TriggerMode=%RX8\n",
    538              pDevIns, pDevIns->iInstance, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode));
     573    LogFlow(("pdmRCIoApicHlp_ApicBusDeliver: caller=%p/%d: u8Dest=%RX8 u8DestMode=%RX8 u8DeliveryMode=%RX8 iVector=%RX8 u8Polarity=%RX8 u8TriggerMode=%RX8 uTagSrc=%#x\n",
     574             pDevIns, pDevIns->iInstance, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode, uTagSrc));
     575    Assert(pVM->pdm.s.Apic.pDevInsRC);
    539576    if (pVM->pdm.s.Apic.pfnBusDeliverRC)
    540         return pVM->pdm.s.Apic.pfnBusDeliverRC(pVM->pdm.s.Apic.pDevInsRC, u8Dest, u8DestMode, u8DeliveryMode, iVector, u8Polarity, u8TriggerMode);
     577        return pVM->pdm.s.Apic.pfnBusDeliverRC(pVM->pdm.s.Apic.pDevInsRC, u8Dest, u8DestMode, u8DeliveryMode, iVector,
     578                                               u8Polarity, u8TriggerMode, uTagSrc);
    541579    return VINF_SUCCESS;
    542580}
     
    581619
    582620/** @interface_method_impl{PDMPCIHLPRC,pfnIsaSetIrq} */
    583 static DECLCALLBACK(void) pdmRCPciHlp_IsaSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel)
    584 {
    585     PDMDEV_ASSERT_DEVINS(pDevIns);
    586     Log4(("pdmRCPciHlp_IsaSetIrq: iIrq=%d iLevel=%d\n", iIrq, iLevel));
    587     pdmRCIsaSetIrq(pDevIns->Internal.s.pVMRC, iIrq, iLevel);
     621static DECLCALLBACK(void) pdmRCPciHlp_IsaSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)
     622{
     623    PDMDEV_ASSERT_DEVINS(pDevIns);
     624    Log4(("pdmRCPciHlp_IsaSetIrq: iIrq=%d iLevel=%d uTagSrc=%#x\n", iIrq, iLevel, uTagSrc));
     625    PVM pVM = pDevIns->Internal.s.pVMRC;
     626
     627    pdmLock(pVM);
     628    pdmRCIsaSetIrq(pDevIns->Internal.s.pVMRC, iIrq, iLevel, uTagSrc);
     629    pdmUnlock(pVM);
    588630}
    589631
    590632
    591633/** @interface_method_impl{PDMPCIHLPRC,pfnIoApicSetIrq} */
    592 static DECLCALLBACK(void) pdmRCPciHlp_IoApicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel)
    593 {
    594     PDMDEV_ASSERT_DEVINS(pDevIns);
    595     Log4(("pdmRCPciHlp_IoApicSetIrq: iIrq=%d iLevel=%d\n", iIrq, iLevel));
    596     pdmRCIoApicSetIrq(pDevIns->Internal.s.pVMRC, iIrq, iLevel);
    597 }
     634static DECLCALLBACK(void) pdmRCPciHlp_IoApicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)
     635{
     636    PDMDEV_ASSERT_DEVINS(pDevIns);
     637    Log4(("pdmRCPciHlp_IoApicSetIrq: iIrq=%d iLevel=%d uTagSrc=%#x\n", iIrq, iLevel, uTagSrc));
     638    PVM pVM = pDevIns->Internal.s.pVMRC;
     639
     640    if (pVM->pdm.s.IoApic.pDevInsRC)
     641    {
     642        pdmLock(pVM);
     643        pVM->pdm.s.IoApic.pfnSetIrqRC(pVM->pdm.s.IoApic.pDevInsRC, iIrq, iLevel, uTagSrc);
     644        pdmUnlock(pVM);
     645    }
     646    else if (pVM->pdm.s.IoApic.pDevInsR3)
     647    {
     648        /* queue for ring-3 execution. */
     649        PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueRC);
     650        if (pTask)
     651        {
     652            pTask->enmOp = PDMDEVHLPTASKOP_IOAPIC_SET_IRQ;
     653            pTask->pDevInsR3 = NIL_RTR3PTR; /* not required */
     654            pTask->u.SetIRQ.iIrq = iIrq;
     655            pTask->u.SetIRQ.iLevel = iLevel;
     656            pTask->u.SetIRQ.uTagSrc = uTagSrc;
     657
     658            PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueRC, &pTask->Core, 0);
     659        }
     660        else
     661            AssertMsgFailed(("We're out of devhlp queue items!!!\n"));
     662    }
     663}
     664
    598665
    599666/** @interface_method_impl{PDMPCIHLPRC,pfnIoApicSendMsi} */
    600 static DECLCALLBACK(void) pdmRCPciHlp_IoApicSendMsi(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue)
    601 {
    602     PDMDEV_ASSERT_DEVINS(pDevIns);
    603     Log4(("pdmRCPciHlp_IoApicSendMsi: Address=%p Value=%d\n", GCAddr, uValue));
    604     pdmRCIoApicSendMsi(pDevIns->Internal.s.pVMRC, GCAddr, uValue);
     667static DECLCALLBACK(void) pdmRCPciHlp_IoApicSendMsi(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, uint32_t uValue, uint32_t uTagSrc)
     668{
     669    PDMDEV_ASSERT_DEVINS(pDevIns);
     670    Log4(("pdmRCPciHlp_IoApicSendMsi: GCPhys=%p uValue=%d uTagSrc=%#x\n", GCPhys, uValue, uTagSrc));
     671    PVM pVM = pDevIns->Internal.s.pVMRC;
     672
     673    if (pVM->pdm.s.IoApic.pDevInsRC)
     674    {
     675        pdmLock(pVM);
     676        pVM->pdm.s.IoApic.pfnSendMsiRC(pVM->pdm.s.IoApic.pDevInsRC, GCPhys, uValue, uTagSrc);
     677        pdmUnlock(pVM);
     678    }
     679    else
     680    {
     681        AssertFatalMsgFailed(("Lazy bastarts!"));
     682    }
    605683}
    606684
     
    764842
    765843/**
    766  * Sets an irq on the I/O APIC.
     844 * Sets an irq on the PIC and I/O APIC.
    767845 *
    768  * @param   pVM     The VM handle.
    769  * @param   iIrq    The irq.
    770  * @param   iLevel  The new level.
    771  */
    772 static void pdmRCIsaSetIrq(PVM pVM, int iIrq, int iLevel)
    773 {
    774     if (    (   pVM->pdm.s.IoApic.pDevInsRC
    775              || !pVM->pdm.s.IoApic.pDevInsR3)
    776         &&  (   pVM->pdm.s.Pic.pDevInsRC
    777              || !pVM->pdm.s.Pic.pDevInsR3))
    778     {
    779         pdmLock(pVM);
     846 * @returns true if     delivered, false if postponed.
     847 * @param   pVM         The VM handle.
     848 * @param   iIrq        The irq.
     849 * @param   iLevel      The new level.
     850 * @param   uTagSrc     The IRQ tag and source.
     851 *
     852 * @remarks The caller holds the PDM lock.
     853 */
     854static bool pdmRCIsaSetIrq(PVM pVM, int iIrq, int iLevel, uint32_t uTagSrc)
     855{
     856    if (RT_LIKELY(    (   pVM->pdm.s.IoApic.pDevInsRC
     857                       || !pVM->pdm.s.IoApic.pDevInsR3)
     858                  &&  (   pVM->pdm.s.Pic.pDevInsRC
     859                       || !pVM->pdm.s.Pic.pDevInsR3)))
     860    {
    780861        if (pVM->pdm.s.Pic.pDevInsRC)
    781             pVM->pdm.s.Pic.pfnSetIrqRC(pVM->pdm.s.Pic.pDevInsRC, iIrq, iLevel);
     862            pVM->pdm.s.Pic.pfnSetIrqRC(pVM->pdm.s.Pic.pDevInsRC, iIrq, iLevel, uTagSrc);
    782863        if (pVM->pdm.s.IoApic.pDevInsRC)
    783             pVM->pdm.s.IoApic.pfnSetIrqRC(pVM->pdm.s.IoApic.pDevInsRC, iIrq, iLevel);
    784         pdmUnlock(pVM);
    785     }
    786     else
    787     {
    788         /* queue for ring-3 execution. */
    789         PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueRC);
    790         if (pTask)
    791         {
    792             pTask->enmOp = PDMDEVHLPTASKOP_ISA_SET_IRQ;
    793             pTask->pDevInsR3 = NIL_RTR3PTR; /* not required */
    794             pTask->u.SetIRQ.iIrq = iIrq;
    795             pTask->u.SetIRQ.iLevel = iLevel;
    796 
    797             PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueRC, &pTask->Core, 0);
    798         }
    799         else
    800             AssertMsgFailed(("We're out of devhlp queue items!!!\n"));
    801     }
    802 }
    803 
    804 
    805 /**
    806  * Sets an irq on the I/O APIC.
    807  *
    808  * @param   pVM     The VM handle.
    809  * @param   iIrq    The irq.
    810  * @param   iLevel  The new level.
    811  */
    812 static void pdmRCIoApicSetIrq(PVM pVM, int iIrq, int iLevel)
    813 {
    814     if (pVM->pdm.s.IoApic.pDevInsRC)
    815     {
    816         pdmLock(pVM);
    817         pVM->pdm.s.IoApic.pfnSetIrqRC(pVM->pdm.s.IoApic.pDevInsRC, iIrq, iLevel);
    818         pdmUnlock(pVM);
    819     }
    820     else if (pVM->pdm.s.IoApic.pDevInsR3)
    821     {
    822         /* queue for ring-3 execution. */
    823         PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueRC);
    824         if (pTask)
    825         {
    826             pTask->enmOp = PDMDEVHLPTASKOP_IOAPIC_SET_IRQ;
    827             pTask->pDevInsR3 = NIL_RTR3PTR; /* not required */
    828             pTask->u.SetIRQ.iIrq = iIrq;
    829             pTask->u.SetIRQ.iLevel = iLevel;
    830 
    831             PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueRC, &pTask->Core, 0);
    832         }
    833         else
    834             AssertMsgFailed(("We're out of devhlp queue items!!!\n"));
    835     }
    836 }
    837 
    838 
    839 /**
    840  * Sends an MSI to I/O APIC.
    841  *
    842  * @param   pVM     The VM handle.
    843  * @param   GCAddr  Address of the message.
    844  * @param   uValue  Value of the message.
    845  */
    846 static void pdmRCIoApicSendMsi(PVM pVM, RTGCPHYS GCAddr, uint32_t uValue)
    847 {
    848     if (pVM->pdm.s.IoApic.pDevInsRC)
    849     {
    850         pdmLock(pVM);
    851         pVM->pdm.s.IoApic.pfnSendMsiRC(pVM->pdm.s.IoApic.pDevInsRC, GCAddr, uValue);
    852         pdmUnlock(pVM);
    853     }
    854 }
     864            pVM->pdm.s.IoApic.pfnSetIrqRC(pVM->pdm.s.IoApic.pDevInsRC, iIrq, iLevel, uTagSrc);
     865        return true;
     866    }
     867
     868    /* queue for ring-3 execution. */
     869    PPDMDEVHLPTASK pTask = (PPDMDEVHLPTASK)PDMQueueAlloc(pVM->pdm.s.pDevHlpQueueRC);
     870    AssertReturn(pTask, false);
     871
     872    pTask->enmOp = PDMDEVHLPTASKOP_ISA_SET_IRQ;
     873    pTask->pDevInsR3 = NIL_RTR3PTR; /* not required */
     874    pTask->u.SetIRQ.iIrq = iIrq;
     875    pTask->u.SetIRQ.iLevel = iLevel;
     876    pTask->u.SetIRQ.uTagSrc = uTagSrc;
     877
     878    PDMQueueInsertEx(pVM->pdm.s.pDevHlpQueueRC, &pTask->Core, 0);
     879    return false;
     880}
     881
  • trunk/src/VBox/VMM/include/PDMInternal.h

    r40652 r40907  
    149149    /** Flags, see PDMDEVINSINT_FLAGS_XXX. */
    150150    uint32_t                        fIntFlags;
     151    /** The last IRQ tag (for tracing it thru clearing). */
     152    uint32_t                        uLastIrqTag;
     153    /** Size padding. */
     154    uint32_t                        u32Padding;
    151155} PDMDEVINSINT;
    152156
     
    454458    PPDMDEVINSR3                    pDevInsR3;
    455459    /** @copydoc PDMPICREG::pfnSetIrqR3 */
    456     DECLR3CALLBACKMEMBER(void,      pfnSetIrqR3,(PPDMDEVINS pDevIns, int iIrq, int iLevel));
     460    DECLR3CALLBACKMEMBER(void,      pfnSetIrqR3,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
    457461    /** @copydoc PDMPICREG::pfnGetInterruptR3 */
    458     DECLR3CALLBACKMEMBER(int,       pfnGetInterruptR3,(PPDMDEVINS pDevIns));
     462    DECLR3CALLBACKMEMBER(int,       pfnGetInterruptR3,(PPDMDEVINS pDevIns, uint32_t *puTagSrc));
    459463
    460464    /** Pointer to the PIC device instance - R0. */
    461465    PPDMDEVINSR0                    pDevInsR0;
    462466    /** @copydoc PDMPICREG::pfnSetIrqR3 */
    463     DECLR0CALLBACKMEMBER(void,      pfnSetIrqR0,(PPDMDEVINS pDevIns, int iIrq, int iLevel));
     467    DECLR0CALLBACKMEMBER(void,      pfnSetIrqR0,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
    464468    /** @copydoc PDMPICREG::pfnGetInterruptR3 */
    465     DECLR0CALLBACKMEMBER(int,       pfnGetInterruptR0,(PPDMDEVINS pDevIns));
     469    DECLR0CALLBACKMEMBER(int,       pfnGetInterruptR0,(PPDMDEVINS pDevIns, uint32_t *puTagSrc));
    466470
    467471    /** Pointer to the PIC device instance - RC. */
    468472    PPDMDEVINSRC                    pDevInsRC;
    469473    /** @copydoc PDMPICREG::pfnSetIrqR3 */
    470     DECLRCCALLBACKMEMBER(void,      pfnSetIrqRC,(PPDMDEVINS pDevIns, int iIrq, int iLevel));
     474    DECLRCCALLBACKMEMBER(void,      pfnSetIrqRC,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
    471475    /** @copydoc PDMPICREG::pfnGetInterruptR3 */
    472     DECLRCCALLBACKMEMBER(int,       pfnGetInterruptRC,(PPDMDEVINS pDevIns));
     476    DECLRCCALLBACKMEMBER(int,       pfnGetInterruptRC,(PPDMDEVINS pDevIns, uint32_t *puTagSrc));
    473477    /** Alignment padding. */
    474478    RTRCPTR                         RCPtrPadding;
     
    484488    PPDMDEVINSR3                    pDevInsR3;
    485489    /** @copydoc PDMAPICREG::pfnGetInterruptR3 */
    486     DECLR3CALLBACKMEMBER(int,       pfnGetInterruptR3,(PPDMDEVINS pDevIns));
     490    DECLR3CALLBACKMEMBER(int,       pfnGetInterruptR3,(PPDMDEVINS pDevIns, uint32_t *puTagSrc));
    487491    /** @copydoc PDMAPICREG::pfnHasPendingIrqR3 */
    488492    DECLR3CALLBACKMEMBER(bool,      pfnHasPendingIrqR3,(PPDMDEVINS pDevIns));
     
    501505    /** @copydoc PDMAPICREG::pfnBusDeliverR3 */
    502506    DECLR3CALLBACKMEMBER(int,       pfnBusDeliverR3,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode,
    503                                                      uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode));
     507                                                     uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc));
    504508    /** @copydoc PDMAPICREG::pfnLocalInterruptR3 */
    505509    DECLR3CALLBACKMEMBER(int,       pfnLocalInterruptR3,(PPDMDEVINS pDevIns, uint8_t u8Pin, uint8_t u8Level));
     
    508512    PPDMDEVINSR0                    pDevInsR0;
    509513    /** @copydoc PDMAPICREG::pfnGetInterruptR3 */
    510     DECLR0CALLBACKMEMBER(int,       pfnGetInterruptR0,(PPDMDEVINS pDevIns));
     514    DECLR0CALLBACKMEMBER(int,       pfnGetInterruptR0,(PPDMDEVINS pDevIns, uint32_t *puTagSrc));
    511515    /** @copydoc PDMAPICREG::pfnHasPendingIrqR3 */
    512516    DECLR0CALLBACKMEMBER(bool,      pfnHasPendingIrqR0,(PPDMDEVINS pDevIns));
     
    525529    /** @copydoc PDMAPICREG::pfnBusDeliverR3 */
    526530    DECLR0CALLBACKMEMBER(int,       pfnBusDeliverR0,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode,
    527                                                      uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode));
     531                                                     uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc));
    528532    /** @copydoc PDMAPICREG::pfnLocalInterruptR3 */
    529533    DECLR0CALLBACKMEMBER(int,       pfnLocalInterruptR0,(PPDMDEVINS pDevIns, uint8_t u8Pin, uint8_t u8Level));
     
    532536    PPDMDEVINSRC                    pDevInsRC;
    533537    /** @copydoc PDMAPICREG::pfnGetInterruptR3 */
    534     DECLRCCALLBACKMEMBER(int,       pfnGetInterruptRC,(PPDMDEVINS pDevIns));
     538    DECLRCCALLBACKMEMBER(int,       pfnGetInterruptRC,(PPDMDEVINS pDevIns, uint32_t *puTagSrc));
    535539    /** @copydoc PDMAPICREG::pfnHasPendingIrqR3 */
    536540    DECLRCCALLBACKMEMBER(bool,      pfnHasPendingIrqRC,(PPDMDEVINS pDevIns));
     
    549553    /** @copydoc PDMAPICREG::pfnBusDeliverR3 */
    550554    DECLRCCALLBACKMEMBER(int,       pfnBusDeliverRC,(PPDMDEVINS pDevIns, uint8_t u8Dest, uint8_t u8DestMode, uint8_t u8DeliveryMode,
    551                                                      uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode));
     555                                                     uint8_t iVector, uint8_t u8Polarity, uint8_t u8TriggerMode, uint32_t uTagSrc));
    552556    /** @copydoc PDMAPICREG::pfnLocalInterruptR3 */
    553557    DECLRCCALLBACKMEMBER(int,       pfnLocalInterruptRC,(PPDMDEVINS pDevIns, uint8_t u8Pin, uint8_t u8Level));
     
    565569    PPDMDEVINSR3                    pDevInsR3;
    566570    /** @copydoc PDMIOAPICREG::pfnSetIrqR3 */
    567     DECLR3CALLBACKMEMBER(void,      pfnSetIrqR3,(PPDMDEVINS pDevIns, int iIrq, int iLevel));
     571    DECLR3CALLBACKMEMBER(void,      pfnSetIrqR3,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
    568572    /** @copydoc PDMIOAPICREG::pfnSendMsiR3 */
    569     DECLR3CALLBACKMEMBER(void,      pfnSendMsiR3,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue));
     573    DECLR3CALLBACKMEMBER(void,      pfnSendMsiR3,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc));
    570574
    571575    /** Pointer to the PIC device instance - R0. */
    572576    PPDMDEVINSR0                    pDevInsR0;
    573577    /** @copydoc PDMIOAPICREG::pfnSetIrqR3 */
    574     DECLR0CALLBACKMEMBER(void,      pfnSetIrqR0,(PPDMDEVINS pDevIns, int iIrq, int iLevel));
     578    DECLR0CALLBACKMEMBER(void,      pfnSetIrqR0,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
    575579    /** @copydoc PDMIOAPICREG::pfnSendMsiR3 */
    576     DECLR0CALLBACKMEMBER(void,      pfnSendMsiR0,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue));
     580    DECLR0CALLBACKMEMBER(void,      pfnSendMsiR0,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc));
    577581
    578582    /** Pointer to the APIC device instance - RC Ptr. */
    579583    PPDMDEVINSRC                    pDevInsRC;
    580584    /** @copydoc PDMIOAPICREG::pfnSetIrqR3 */
    581     DECLRCCALLBACKMEMBER(void,      pfnSetIrqRC,(PPDMDEVINS pDevIns, int iIrq, int iLevel));
     585    DECLRCCALLBACKMEMBER(void,      pfnSetIrqRC,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
    582586     /** @copydoc PDMIOAPICREG::pfnSendMsiR3 */
    583     DECLRCCALLBACKMEMBER(void,      pfnSendMsiRC,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue));
     587    DECLRCCALLBACKMEMBER(void,      pfnSendMsiRC,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc));
    584588
    585589    uint8_t                         Alignment[4];
     
    601605    PPDMDEVINSR3                    pDevInsR3;
    602606    /** @copydoc PDMPCIBUSREG::pfnSetIrqR3 */
    603     DECLR3CALLBACKMEMBER(void,      pfnSetIrqR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel));
     607    DECLR3CALLBACKMEMBER(void,      pfnSetIrqR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTagSrc));
    604608    /** @copydoc PDMPCIBUSREG::pfnRegisterR3 */
    605609    DECLR3CALLBACKMEMBER(int,       pfnRegisterR3,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, const char *pszName, int iDev));
     
    622626    R0PTRTYPE(PPDMDEVINS)           pDevInsR0;
    623627    /** @copydoc PDMPCIBUSREG::pfnSetIrqR3 */
    624     DECLR0CALLBACKMEMBER(void,      pfnSetIrqR0,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel));
     628    DECLR0CALLBACKMEMBER(void,      pfnSetIrqR0,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTagSrc));
    625629
    626630    /** Pointer to PCI Bus device instance. */
    627631    PPDMDEVINSRC                    pDevInsRC;
    628632    /** @copydoc PDMPCIBUSREG::pfnSetIrqR3 */
    629     DECLRCCALLBACKMEMBER(void,      pfnSetIrqRC,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel));
     633    DECLRCCALLBACKMEMBER(void,      pfnSetIrqRC,(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTagSrc));
    630634} PDMPCIBUS;
    631635
     
    892896            /** The new level. */
    893897            int                     iLevel;
     898            /** The IRQ tag and source. */
     899            uint32_t                uTagSrc;
    894900        } SetIRQ;
     901
     902        /** Expanding the structure.. */
     903        uint64_t    au64[2];
    895904    } u;
    896905} PDMDEVHLPTASK;
     
    10061015     * See PDM_QUEUE_FLUSH_FLAG_ACTIVE and PDM_QUEUE_FLUSH_FLAG_PENDING. */
    10071016    uint32_t volatile               fQueueFlushing;
    1008     /** Alignment padding. */
    1009     uint32_t                        u32Padding2;
     1017    /** The current IRQ tag (tracing purposes). */
     1018    uint32_t                        uIrqTag;
    10101019
    10111020    /** @name   VMM device heap
  • trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp

    r40274 r40907  
    162162    do \
    163163    { \
    164         printf("info: %s::%s offset %#x (%d) sizeof %d\n",  #strct, #member, (int)RT_OFFSETOF(strct, member), (int)RT_OFFSETOF(strct, member), (int)RT_SIZEOFMEMB(strct, member)); \
    165     } while (0)
    166 
     164        printf("info: %10s::%-24s offset %#6x (%6d) sizeof %4d\n",  #strct, #member, (int)RT_OFFSETOF(strct, member), (int)RT_OFFSETOF(strct, member), (int)RT_SIZEOFMEMB(strct, member)); \
     165    } while (0)
    167166
    168167
     
    336335
    337336    /* pdm */
     337    PRINT_OFFSET(PDMDEVINS, Internal);
     338    PRINT_OFFSET(PDMDEVINS, achInstanceData);
    338339    CHECK_MEMBER_ALIGNMENT(PDMDEVINS, achInstanceData, 64);
    339340    CHECK_PADDING(PDMDEVINS, Internal, 1);
    340     CHECK_MEMBER_ALIGNMENT(PDMUSBINS, achInstanceData, 16);
     341
     342    PRINT_OFFSET(PDMUSBINS, Internal);
     343    PRINT_OFFSET(PDMUSBINS, achInstanceData);
     344    CHECK_MEMBER_ALIGNMENT(PDMUSBINS, achInstanceData, 32);
    341345    CHECK_PADDING(PDMUSBINS, Internal, 1);
    342     CHECK_MEMBER_ALIGNMENT(PDMDRVINS, achInstanceData, 16);
     346
     347    PRINT_OFFSET(PDMDRVINS, Internal);
     348    PRINT_OFFSET(PDMDRVINS, achInstanceData);
     349    CHECK_MEMBER_ALIGNMENT(PDMDRVINS, achInstanceData, 32);
    343350    CHECK_PADDING(PDMDRVINS, Internal, 1);
     351
    344352    CHECK_PADDING2(PDMCRITSECT);
    345353
  • trunk/src/recompiler/VBoxREMWrapper.cpp

    r40829 r40907  
    763763    { REMPARMDESC_FLAGS_INT,        sizeof(PVM),                NULL },
    764764    { REMPARMDESC_FLAGS_INT,        sizeof(uint8_t),            NULL },
    765     { REMPARMDESC_FLAGS_INT,        sizeof(uint8_t),            NULL }
     765    { REMPARMDESC_FLAGS_INT,        sizeof(uint8_t),            NULL },
     766    { REMPARMDESC_FLAGS_INT,        sizeof(uint32_t),           NULL }
    766767};
    767768static const REMPARMDESC g_aArgsPDMR3CritSectInit[] =
  • trunk/src/recompiler/VBoxRecompiler.c

    r40282 r40907  
    44524452void cpu_set_ferr(CPUX86State *env)
    44534453{
    4454     int rc = PDMIsaSetIrq(env->pVM, 13, 1);
     4454    int rc = PDMIsaSetIrq(env->pVM, 13, 1, 0 /*uTagSrc*/);
    44554455    LogFlow(("cpu_set_ferr: rc=%d\n", rc)); NOREF(rc);
    44564456}
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette