VirtualBox

Changeset 84826 in vbox for trunk


Ignore:
Timestamp:
Jun 15, 2020 8:20:40 AM (5 years ago)
Author:
vboxsync
Message:

AMD IOMMU: bugref:9654 PDM interface changes for supplying bus:device:function for devices' initiating PCI interrupts and MSIs.

Location:
trunk
Files:
18 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/msi.h

    r84677 r84826  
    145145 * fields but specifies reserved bits.
    146146 */
    147 typedef union
     147typedef union MSIADDR
    148148{
    149149    struct
     
    177177
    178178/**
    179  * MSI Data Register (PCI + MMIO).
     179 * MSI Data Register.
    180180 * In accordance to the Intel spec.
    181181 * See Intel spec. 10.11.2 "Message Data Register Format".
     
    184184 * fields but specifies reserved bits.
    185185 */
    186 typedef union
     186typedef union MSIDATA
    187187{
    188188    struct
     
    210210 * MSI Message (Address and Data Register Pair).
    211211 */
    212 typedef struct
     212typedef struct MSIMSG
    213213{
    214214    /** The MSI Address Register. */
     
    217217    MSIDATA     Data;
    218218} MSIMSG;
    219 /** Pointer to an MSI message struct. */
    220 typedef MSIMSG *PMSIMSG;
    221 /** Pointer to a const MSI message struct. */
    222 typedef MSIMSG const *PCMSIMSG;
    223219
    224220#endif /* !VBOX_INCLUDED_msi_h */
  • trunk/include/VBox/pci.h

    r84799 r84826  
    469469/** Make a device+function number.   */
    470470#define VBOX_PCI_DEVFN_MAKE(a_uPciDevNo, a_uPciFunNo) (((a_uPciDevNo) << VBOX_PCI_DEVFN_DEV_SHIFT) | (a_uPciFunNo))
    471 /** Make a bus+device+function number. */
    472 #define VBOX_PCI_BUSDEVFN_MAKE(a_uPciBusNo, a_uPciDevFunNo) (((a_uPciBusNo) << VBOX_PCI_BUS_SHIFT) | (a_uPciDevFunNo))
     471
     472/** Checks whether the PCIBDF is valid. */
     473#define PCIBDF_IS_VALID(a_uBusDevFn)    (!((a_uBusDevFn) & PCI_BDF_F_INVALID))
     474/** Make a PCIBDF given the bus and device:function. */
     475#define PCIBDF_MAKE(a_uBus, a_uDevFn)   (((a_uBus) << VBOX_PCI_BUS_SHIFT) | (a_uDevFn))
    473476
    474477
  • trunk/include/VBox/types.h

    r84458 r84826  
    12011201
    12021202
     1203/**
     1204 * A PCI bus:device:function (BDF) identifier.
     1205 *
     1206 * All 16 bits of a BDF are valid according to the PCI spec. We need one extra bit
     1207 * to determine whether the BDF is valid in interfaces where the BDF may be
     1208 * optional.
     1209 */
     1210typedef uint32_t PCIBDF;
     1211/** PCIBDF flag: Invalid. */
     1212#define PCI_BDF_F_INVALID           RT_BIT(31)
     1213/** Nil PCIBDF value. */
     1214#define NIL_PCIBDF                  PCI_BDF_F_INVALID
     1215
     1216/** Pointer to an MSI message struct. */
     1217typedef struct MSIMSG *PMSIMSG;
     1218/** Pointer to a const MSI message struct. */
     1219typedef const struct MSIMSG *PCMSIMSG;
     1220
     1221
    12031222/** @} */
    12041223
  • trunk/include/VBox/vmm/pdmapi.h

    r84459 r84826  
    5353VMM_INT_DECL(bool)      PDMHasIoApic(PVM pVM);
    5454VMM_INT_DECL(bool)      PDMHasApic(PVM pVM);
    55 VMM_INT_DECL(int)       PDMIoApicSetIrq(PVM pVM, uint8_t u8Irq, uint8_t u8Level, uint32_t uTagSrc);
     55VMM_INT_DECL(int)       PDMIoApicSetIrq(PVM pVM, PCIBDF uBusDevFn, uint8_t u8Irq, uint8_t u8Level, uint32_t uTagSrc);
    5656VMM_INT_DECL(VBOXSTRICTRC) PDMIoApicBroadcastEoi(PVM pVM, uint8_t uVector);
    57 VMM_INT_DECL(int)       PDMIoApicSendMsi(PVM pVM, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc);
     57VMM_INT_DECL(int)       PDMIoApicSendMsi(PVM pVM, PCIBDF uBusDevFn, PCMSIMSG pMsi, uint32_t uTagSrc);
    5858VMM_INT_DECL(int)       PDMVmmDevHeapR3ToGCPhys(PVM pVM, RTR3PTR pv, RTGCPHYS *pGCPhys);
    5959VMM_INT_DECL(bool)      PDMVmmDevHeapIsEnabled(PVM pVM);
  • trunk/include/VBox/vmm/pdmdev.h

    r84714 r84826  
    10341034     *
    10351035     * @param   pDevIns         PCI device instance.
     1036     * @param   uBusDevFn       The bus:device:function of the device initiating the
     1037     *                          IRQ. Pass NIL_PCIBDF when it's not a PCI device or
     1038     *                          interrupt.
    10361039     * @param   iIrq            IRQ number to set.
    10371040     * @param   iLevel          IRQ level. See the PDM_IRQ_LEVEL_* \#defines.
     
    10391042     * @thread  EMT only.
    10401043     */
    1041     DECLRCCALLBACKMEMBER(void,  pfnIoApicSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
     1044    DECLRCCALLBACKMEMBER(void,  pfnIoApicSetIrq,(PPDMDEVINS pDevIns, PCIBDF uBusDevFn, int iIrq, int iLevel, uint32_t uTagSrc));
    10421045
    10431046    /**
     
    10451048     *
    10461049     * @param   pDevIns         PCI device instance.
    1047      * @param   GCPhys          Physical address MSI request was written.
    1048      * @param   uValue          Value written.
     1050     * @param   uBusDevFn       The bus:device:function of the device initiating the
     1051     *                          MSI. Cannot be NIL_PCIBDF.
     1052     * @param   pMsi            The MSI to send.
    10491053     * @param   uTagSrc         The IRQ tag and source (for tracing).
    10501054     * @thread  EMT only.
    10511055     */
    1052     DECLRCCALLBACKMEMBER(void,  pfnIoApicSendMsi,(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, uint32_t uValue, uint32_t uTagSrc));
     1056    DECLRCCALLBACKMEMBER(void,  pfnIoApicSendMsi,(PPDMDEVINS pDevIns, PCIBDF uBusDevFn, PCMSIMSG pMsi, uint32_t uTagSrc));
    10531057
    10541058
     
    10881092
    10891093/** Current PDMPCIHLPRC version number. */
    1090 #define PDM_PCIHLPRC_VERSION                    PDM_VERSION_MAKE(0xfffd, 3, 0)
     1094#define PDM_PCIHLPRC_VERSION                    PDM_VERSION_MAKE(0xfffd, 4, 0)
    10911095
    10921096
     
    11141118     *
    11151119     * @param   pDevIns         PCI device instance.
     1120     * @param   uBusDevFn       The bus:device:function of the device initiating the
     1121     *                          IRQ. Pass NIL_PCIBDF when it's not a PCI device or
     1122     *                          interrupt.
    11161123     * @param   iIrq            IRQ number to set.
    11171124     * @param   iLevel          IRQ level. See the PDM_IRQ_LEVEL_* \#defines.
     
    11191126     * @thread  EMT only.
    11201127     */
    1121     DECLR0CALLBACKMEMBER(void,  pfnIoApicSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
     1128    DECLR0CALLBACKMEMBER(void,  pfnIoApicSetIrq,(PPDMDEVINS pDevIns, PCIBDF uBusDevFn, int iIrq, int iLevel, uint32_t uTagSrc));
    11221129
    11231130    /**
     
    11251132     *
    11261133     * @param   pDevIns         PCI device instance.
    1127      * @param   GCPhys          Physical address MSI request was written.
    1128      * @param   uValue          Value written.
     1134     * @param   uBusDevFn       The bus:device:function of the device initiating the
     1135     *                          MSI. Cannot be NIL_PCIBDF.
     1136     * @param   pMsi            The MSI to send.
    11291137     * @param   uTagSrc         The IRQ tag and source (for tracing).
    11301138     * @thread  EMT only.
    11311139     */
    1132     DECLR0CALLBACKMEMBER(void,  pfnIoApicSendMsi,(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, uint32_t uValue, uint32_t uTagSrc));
     1140    DECLR0CALLBACKMEMBER(void,  pfnIoApicSendMsi,(PPDMDEVINS pDevIns, PCIBDF uBusDevFn, PCMSIMSG pMsi, uint32_t uTagSrc));
    11331141
    11341142    /**
     
    11671175
    11681176/** Current PDMPCIHLPR0 version number. */
    1169 #define PDM_PCIHLPR0_VERSION                    PDM_VERSION_MAKE(0xfffc, 5, 0)
     1177#define PDM_PCIHLPR0_VERSION                    PDM_VERSION_MAKE(0xfffc, 6, 0)
    11701178
    11711179/**
     
    11911199     *
    11921200     * @param   pDevIns         The PCI device instance.
     1201     * @param   uBusDevFn       The bus:device:function of the device initiating the
     1202     *                          IRQ. Pass NIL_PCIBDF when it's not a PCI device or
     1203     *                          interrupt.
    11931204     * @param   iIrq            IRQ number to set.
    11941205     * @param   iLevel          IRQ level. See the PDM_IRQ_LEVEL_* \#defines.
    11951206     * @param   uTagSrc         The IRQ tag and source (for tracing).
    11961207     */
    1197     DECLR3CALLBACKMEMBER(void,  pfnIoApicSetIrq,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
     1208    DECLR3CALLBACKMEMBER(void,  pfnIoApicSetIrq,(PPDMDEVINS pDevIns, PCIBDF uBusDevFn, int iIrq, int iLevel, uint32_t uTagSrc));
    11981209
    11991210    /**
     
    12011212     *
    12021213     * @param   pDevIns         PCI device instance.
    1203      * @param   GCPhys          Physical address MSI request was written.
    1204      * @param   uValue          Value written.
     1214     * @param   uBusDevFn       The bus:device:function of the device initiating the
     1215     *                          MSI. Cannot be NIL_PCIBDF.
     1216     * @param   pMsi            The MSI to send.
    12051217     * @param   uTagSrc         The IRQ tag and source (for tracing).
    12061218     */
    1207     DECLR3CALLBACKMEMBER(void,  pfnIoApicSendMsi,(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, uint32_t uValue, uint32_t uTagSrc));
     1219    DECLR3CALLBACKMEMBER(void,  pfnIoApicSendMsi,(PPDMDEVINS pDevIns, PCIBDF uBusDevFn, PCMSIMSG pMsi, uint32_t uTagSrc));
    12081220
    12091221    /**
     
    12421254
    12431255/** Current PDMPCIHLPR3 version number. */
    1244 #define PDM_PCIHLPR3_VERSION                    PDM_VERSION_MAKE(0xfffb, 4, 0)
     1256#define PDM_PCIHLPR3_VERSION                    PDM_VERSION_MAKE(0xfffb, 5, 0)
    12451257
    12461258
     
    16951707     *
    16961708     * @param   pDevIns         Device instance of the I/O APIC.
     1709     * @param   uBusDevFn       The bus:device:function of the device initiating the
     1710     *                          IRQ. Can be NIL_PCIBDF.
    16971711     * @param   iIrq            IRQ number to set.
    16981712     * @param   iLevel          IRQ level. See the PDM_IRQ_LEVEL_* \#defines.
     
    17021716     *          Actually, as per 2018-07-21 this isn't true (bird).
    17031717     */
    1704     DECLCALLBACKMEMBER(void, pfnSetIrq)(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc);
     1718    DECLCALLBACKMEMBER(void, pfnSetIrq)(PPDMDEVINS pDevIns, PCIBDF uBusDevFn, int iIrq, int iLevel, uint32_t uTagSrc);
    17051719
    17061720    /**
     
    17081722     *
    17091723     * @param   pDevIns         Device instance of the I/O APIC.
    1710      * @param   GCPhys          Request address.
    1711      * @param   uValue          Request value.
     1724     * @param   uBusDevFn       The bus:device:function of the device initiating the
     1725     *                          MSI. Cannot be NIL_PCIBDF.
     1726     * @param   pMsi            The MSI to send.
    17121727     * @param   uTagSrc         The IRQ tag and source (for tracing).
    17131728     *
     
    17151730     *          Actually, as per 2018-07-21 this isn't true (bird).
    17161731     */
    1717     DECLCALLBACKMEMBER(void, pfnSendMsi)(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, uint32_t uValue, uint32_t uTagSrc);
     1732    DECLCALLBACKMEMBER(void, pfnSendMsi)(PPDMDEVINS pDevIns, PCIBDF uBusDevFn, PCMSIMSG pMsi, uint32_t uTagSrc);
    17181733
    17191734    /**
     
    17391754
    17401755/** Current PDMAPICREG version number. */
    1741 #define PDM_IOAPICREG_VERSION                   PDM_VERSION_MAKE(0xfff2, 6, 0)
     1756#define PDM_IOAPICREG_VERSION                   PDM_VERSION_MAKE(0xfff2, 7, 0)
    17421757
    17431758
  • trunk/src/VBox/Devices/Bus/DevIommuAmd.cpp

    r84808 r84826  
    42234223        if (uNextLevel == 7)
    42244224        {
    4225             /* The default page size of the translation is overriden. */
     4225            /* The default page size of the translation is overridden. */
    42264226            RTGCPHYS const GCPhysPte = PtEntity.u64 & IOMMU_PTENTITY_ADDR_MASK;
    42274227            uint8_t        cShift    = X86_PAGE_4K_SHIFT;
  • trunk/src/VBox/Devices/Bus/DevPCI.cpp

    r82968 r84826  
    246246    /* This is only allowed to be called with a pointer to the host bus. */
    247247    AssertMsg(pBus->iBus == 0, ("iBus=%u\n", pBus->iBus));
     248    uint16_t const uBusDevFn = PCIBDF_MAKE(pBus->iBus, uDevFn);
    248249
    249250    if (iAcpiIrq == -1) {
     
    261262        Log3Func(("%s: irq_num1=%d level=%d apic_irq=%d apic_level=%d irq_num1=%d\n",
    262263              R3STRING(pPciDev->pszNameR3), irq_num1, iLevel, apic_irq, apic_level, irq_num));
    263         pBusCC->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pDevIns, apic_irq, apic_level, uTagSrc);
     264        pBusCC->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pDevIns, uBusDevFn, apic_irq, apic_level, uTagSrc);
    264265
    265266        if ((iLevel & PDM_IRQ_LEVEL_FLIP_FLOP) == PDM_IRQ_LEVEL_FLIP_FLOP) {
     
    269270            Log3Func(("%s: irq_num1=%d level=%d apic_irq=%d apic_level=%d irq_num1=%d (flop)\n",
    270271                  R3STRING(pPciDev->pszNameR3), irq_num1, iLevel, apic_irq, apic_level, irq_num));
    271             pBusCC->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pDevIns, apic_irq, apic_level, uTagSrc);
     272            pBusCC->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pDevIns, uBusDevFn, apic_irq, apic_level, uTagSrc);
    272273        }
    273274    } else {
    274         Log3Func(("%s: irq_num1=%d level=%d iAcpiIrq=%d\n",
    275               R3STRING(pPciDev->pszNameR3), irq_num1, iLevel, iAcpiIrq));
    276         pBusCC->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pDevIns, iAcpiIrq, iLevel, uTagSrc);
     275        Log3Func(("%s: irq_num1=%d level=%d iAcpiIrq=%d\n", R3STRING(pPciDev->pszNameR3), irq_num1, iLevel, iAcpiIrq));
     276        pBusCC->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pDevIns, uBusDevFn, iAcpiIrq, iLevel, uTagSrc);
    277277    }
    278278}
  • trunk/src/VBox/Devices/Bus/DevPciIch9.cpp

    r82968 r84826  
    547547    /* This is only allowed to be called with a pointer to the root bus. */
    548548    AssertMsg(pBus->iBus == 0, ("iBus=%u\n", pBus->iBus));
     549    uint16_t const uBusDevFn = PCIBDF_MAKE(pBus->iBus, uDevFn);
    549550
    550551    if (iForcedIrq == -1)
     
    563564        Log3Func(("%s: irq_num1=%d level=%d apic_irq=%d apic_level=%d irq_num1=%d uTagSrc=%#x\n",
    564565                  R3STRING(pPciDev->pszNameR3), irq_num1, iLevel, apic_irq, apic_level, irq_num, uTagSrc));
    565         pBusCC->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pDevIns, apic_irq, apic_level, uTagSrc);
     566        pBusCC->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pDevIns, uBusDevFn, apic_irq, apic_level, uTagSrc);
    566567
    567568        if ((iLevel & PDM_IRQ_LEVEL_FLIP_FLOP) == PDM_IRQ_LEVEL_FLIP_FLOP)
     
    576577            Log3Func(("%s: irq_num1=%d level=%d apic_irq=%d apic_level=%d irq_num1=%d uTagSrc=%#x (flop)\n",
    577578                      R3STRING(pPciDev->pszNameR3), irq_num1, iLevel, apic_irq, apic_level, irq_num, uTagSrc));
    578             pBusCC->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pDevIns, apic_irq, apic_level, uTagSrc);
     579            pBusCC->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pDevIns, uBusDevFn, apic_irq, apic_level, uTagSrc);
    579580        }
    580581    } else {
    581582        Log3Func(("(forced) %s: irq_num1=%d level=%d acpi_irq=%d uTagSrc=%#x\n",
    582583                  R3STRING(pPciDev->pszNameR3), irq_num1, iLevel, iForcedIrq, uTagSrc));
    583         pBusCC->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pDevIns, iForcedIrq, iLevel, uTagSrc);
     584        pBusCC->CTX_SUFF(pPciHlp)->pfnIoApicSetIrq(pDevIns, uBusDevFn, iForcedIrq, iLevel, uTagSrc);
    584585    }
    585586}
  • trunk/src/VBox/Devices/Bus/MsiCommon.cpp

    r82968 r84826  
    2727#include "MsiCommon.h"
    2828#include "PciInline.h"
     29#include "DevPciInternal.h"
    2930
    3031
     
    330331    }
    331332
    332     RTGCPHYS   GCAddr = msiGetMsiAddress(pDev);
    333     uint32_t   u32Value = msiGetMsiData(pDev, iVector);
     333    MSIMSG Msi;
     334    Msi.Addr.u64 = msiGetMsiAddress(pDev);
     335    Msi.Data.u32 = msiGetMsiData(pDev, iVector);
    334336
    335337    if (puPending)
    336338        *puPending &= ~(1<<iVector);
    337339
     340    PPDMDEVINS pDevInsBus = pPciHlp->pfnGetBusByNo(pDevIns, pDev->Int.s.idxPdmBus);
     341    Assert(pDevInsBus);
     342    PDEVPCIBUS pBus = PDMINS_2_DATA(pDevInsBus, PDEVPCIBUS);
     343    uint16_t const uBusDevFn = PCIBDF_MAKE(pBus->iBus, pDev->uDevFn);
     344
    338345    Assert(pPciHlp->pfnIoApicSendMsi != NULL);
    339     pPciHlp->pfnIoApicSendMsi(pDevIns, GCAddr, u32Value, uTagSrc);
    340 }
    341 
     346    pPciHlp->pfnIoApicSendMsi(pDevIns, uBusDevFn, &Msi, uTagSrc);
     347}
     348
  • trunk/src/VBox/Devices/Bus/MsixCommon.cpp

    r82968 r84826  
    2929
    3030#include "MsiCommon.h"
     31#include "DevPCIInternal.h"
    3132#include "PciInline.h"
    3233
     
    268269    msixClearPending(pDev, iVector);
    269270
    270     RTGCPHYS   GCAddr = msixGetMsiAddress(pDev, iVector);
    271     uint32_t   u32Value = msixGetMsiData(pDev, iVector);
    272 
    273     pPciHlp->pfnIoApicSendMsi(pDevIns, GCAddr, u32Value, uTagSrc);
     271    MSIMSG Msi;
     272    Msi.Addr.u64 = msixGetMsiAddress(pDev, iVector);
     273    Msi.Data.u32 = msixGetMsiData(pDev, iVector);
     274
     275    PPDMDEVINS pDevInsBus = pPciHlp->pfnGetBusByNo(pDevIns, pDev->Int.s.idxPdmBus);
     276    Assert(pDevInsBus);
     277    PDEVPCIBUS pBus = PDMINS_2_DATA(pDevInsBus, PDEVPCIBUS);
     278    uint16_t const uBusDevFn = PCIBDF_MAKE(pBus->iBus, pDev->uDevFn);
     279
     280    pPciHlp->pfnIoApicSendMsi(pDevIns, uBusDevFn, &Msi, uTagSrc);
    274281}
    275282
  • trunk/src/VBox/Devices/PC/DevIoApic.cpp

    r84677 r84826  
    166166#define IOAPIC_DIRECT_OFF_EOI                   0x40    /* Newer I/O APIC only. */
    167167
     168/** The I/O APIC's Bus:Device:Function. */
     169#define IOAPIC_BUS_DEV_FN                       NIL_PCIBDF
     170
    168171/* Use PDM critsect for now for I/O APIC locking, see @bugref{8245#c121}. */
    169172#define IOAPIC_WITH_PDM_CRITSECT
     
    472475 * @param   pThis       The shared I/O APIC device state.
    473476 * @param   pThisCC     The I/O APIC device state for the current context.
     477 * @param   uBusDevFn   The bus:device:function of the device initiating the IRQ.
    474478 * @param   idxRte      The index of the RTE (validated).
    475479 *
     
    478482 *          function.
    479483 */
    480 static void ioapicSignalIntrForRte(PPDMDEVINS pDevIns, PIOAPIC pThis, PIOAPICCC pThisCC, uint8_t idxRte)
     484static void ioapicSignalIntrForRte(PPDMDEVINS pDevIns, PIOAPIC pThis, PIOAPICCC pThisCC, PCIBDF uBusDevFn, uint8_t idxRte)
    481485{
    482486#ifndef IOAPIC_WITH_PDM_CRITSECT
     
    499503            }
    500504        }
     505
     506        /** @todo IOMMU: Call into the IOMMU on how to remap this interrupt. uBusDevFn
     507         *        will be needed then. */
     508        NOREF(uBusDevFn);
    501509
    502510        uint8_t const  u8Vector       = IOAPIC_RTE_GET_VECTOR(u64Rte);
     
    622630        uint32_t const uPinMask = UINT32_C(1) << idxRte;
    623631        if (pThis->uIrr & uPinMask)
    624             ioapicSignalIntrForRte(pDevIns, pThis, pThisCC, idxRte);
     632            ioapicSignalIntrForRte(pDevIns, pThis, pThisCC, IOAPIC_BUS_DEV_FN, idxRte);
    625633
    626634        IOAPIC_UNLOCK(pDevIns, pThis, pThisCC);
     
    737745                uint32_t const uPinMask = UINT32_C(1) << idxRte;
    738746                if (pThis->uIrr & uPinMask)
    739                     ioapicSignalIntrForRte(pDevIns, pThis, pThisCC, idxRte);
     747                    ioapicSignalIntrForRte(pDevIns, pThis, pThisCC, IOAPIC_BUS_DEV_FN, idxRte);
    740748            }
    741749        }
     
    754762 * @interface_method_impl{PDMIOAPICREG,pfnSetIrq}
    755763 */
    756 static DECLCALLBACK(void) ioapicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)
    757 {
    758 #define IOAPIC_ASSERT_IRQ(a_idxRte, a_PinMask) do { \
     764static DECLCALLBACK(void) ioapicSetIrq(PPDMDEVINS pDevIns, PCIBDF uBusDevFn, int iIrq, int iLevel, uint32_t uTagSrc)
     765{
     766#define IOAPIC_ASSERT_IRQ(a_uBusDevFn, a_idxRte, a_PinMask) do { \
    759767        pThis->au32TagSrc[(a_idxRte)] = !pThis->au32TagSrc[(a_idxRte)] ? uTagSrc : RT_BIT_32(31); \
    760768        pThis->uIrr |= a_PinMask; \
    761         ioapicSignalIntrForRte(pDevIns, pThis, pThisCC, (a_idxRte)); \
     769        ioapicSignalIntrForRte(pDevIns, pThis, pThisCC, (a_uBusDevFn), (a_idxRte)); \
    762770    } while (0)
    763771
     
    803811                 */
    804812                if (!uPrevIrr)
    805                     IOAPIC_ASSERT_IRQ(idxRte, uPinMask);
     813                    IOAPIC_ASSERT_IRQ(uBusDevFn, idxRte, uPinMask);
    806814                else
    807815                {
     
    827835                }
    828836
    829                 IOAPIC_ASSERT_IRQ(idxRte, uPinMask);
     837                IOAPIC_ASSERT_IRQ(uBusDevFn, idxRte, uPinMask);
    830838            }
    831839        }
     
    838846             * hence just the assert is done.
    839847             */
    840             IOAPIC_ASSERT_IRQ(idxRte, uPinMask);
     848            IOAPIC_ASSERT_IRQ(uBusDevFn, idxRte, uPinMask);
    841849        }
    842850
     
    850858 * @interface_method_impl{PDMIOAPICREG,pfnSendMsi}
    851859 */
    852 static DECLCALLBACK(void) ioapicSendMsi(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, uint32_t uValue, uint32_t uTagSrc)
     860static DECLCALLBACK(void) ioapicSendMsi(PPDMDEVINS pDevIns, PCIBDF uBusDevFn, PCMSIMSG pMsi, uint32_t uTagSrc)
    853861{
    854862    PIOAPICCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PIOAPICCC);
    855     LogFlow(("IOAPIC: ioapicSendMsi: GCPhys=%#RGp uValue=%#RX32\n", GCPhys, uValue));
    856 
    857     MSIMSG Msi;
    858     Msi.Addr.u64 = GCPhys;
    859     Msi.Data.u32 = uValue;
     863    LogFlow(("IOAPIC: ioapicSendMsi: uBusDevFn=%#x Addr=%#RX64 Data=%#RX32\n", uBusDevFn, pMsi->Addr.u64, pMsi->Data.u32));
    860864
    861865    XAPICINTR ApicIntr;
    862866    RT_ZERO(ApicIntr);
    863     ioapicGetApicIntrFromMsi(&Msi, &ApicIntr);
     867    ioapicGetApicIntrFromMsi(pMsi, &ApicIntr);
     868
     869    /** @todo IOMMU: Call into the IOMMU to remap the MSI. uBusDevFn will be used
     870     *        then. */
     871    NOREF(uBusDevFn);
    864872
    865873    /*
  • trunk/src/VBox/VMM/VMMAll/PDMAll.cpp

    r82968 r84826  
    156156            u8Irq = 2;
    157157
    158         pVM->pdm.s.IoApic.CTX_SUFF(pfnSetIrq)(pVM->pdm.s.IoApic.CTX_SUFF(pDevIns), u8Irq, u8Level, uTagSrc);
     158        pVM->pdm.s.IoApic.CTX_SUFF(pfnSetIrq)(pVM->pdm.s.IoApic.CTX_SUFF(pDevIns), NIL_PCIBDF, u8Irq, u8Level, uTagSrc);
    159159        rc = VINF_SUCCESS;
    160160    }
     
    173173 * @param   pVM         The cross context VM structure.
    174174 * @param   u8Irq       The IRQ line.
     175 * @param   uBusDevFn   The bus:device:function of the device initiating the IRQ.
     176 *                      Pass NIL_PCIBDF when it's not a PCI device or interrupt.
    175177 * @param   u8Level     The new level.
    176178 * @param   uTagSrc     The IRQ tag and source tracer ID.
    177179 */
    178 VMM_INT_DECL(int) PDMIoApicSetIrq(PVM pVM, uint8_t u8Irq, uint8_t u8Level, uint32_t uTagSrc)
     180VMM_INT_DECL(int) PDMIoApicSetIrq(PVM pVM, PCIBDF uBusDevFn, uint8_t u8Irq, uint8_t u8Level, uint32_t uTagSrc)
    179181{
    180182    if (pVM->pdm.s.IoApic.CTX_SUFF(pDevIns))
    181183    {
    182184        Assert(pVM->pdm.s.IoApic.CTX_SUFF(pfnSetIrq));
    183         pVM->pdm.s.IoApic.CTX_SUFF(pfnSetIrq)(pVM->pdm.s.IoApic.CTX_SUFF(pDevIns), u8Irq, u8Level, uTagSrc);
     185        pVM->pdm.s.IoApic.CTX_SUFF(pfnSetIrq)(pVM->pdm.s.IoApic.CTX_SUFF(pDevIns), uBusDevFn, u8Irq, u8Level, uTagSrc);
    184186        return VINF_SUCCESS;
    185187    }
     
    218220 * @returns VBox status code.
    219221 * @param   pVM         The cross context VM structure.
    220  * @param   GCAddr      Request address.
    221  * @param   uValue      Request value.
     222 * @param   uBusDevFn   The bus:device:function of the device initiating the MSI.
     223 *                      Cannot be NIL_PCIBDF.
     224 * @param   pMsi        The MSI to send.
    222225 * @param   uTagSrc     The IRQ tag and source tracer ID.
    223226 */
    224 VMM_INT_DECL(int) PDMIoApicSendMsi(PVM pVM, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc)
    225 {
     227VMM_INT_DECL(int) PDMIoApicSendMsi(PVM pVM, PCIBDF uBusDevFn, PCMSIMSG pMsi, uint32_t uTagSrc)
     228{
     229    Assert(PCIBDF_IS_VALID(uBusDevFn));
    226230    if (pVM->pdm.s.IoApic.CTX_SUFF(pDevIns))
    227231    {
    228232        Assert(pVM->pdm.s.IoApic.CTX_SUFF(pfnSendMsi));
    229         pVM->pdm.s.IoApic.CTX_SUFF(pfnSendMsi)(pVM->pdm.s.IoApic.CTX_SUFF(pDevIns), GCAddr, uValue, uTagSrc);
     233        pVM->pdm.s.IoApic.CTX_SUFF(pfnSendMsi)(pVM->pdm.s.IoApic.CTX_SUFF(pDevIns), uBusDevFn, pMsi, uTagSrc);
    230234        return VINF_SUCCESS;
    231235    }
  • trunk/src/VBox/VMM/VMMR0/PDMR0DevHlp.cpp

    r84823 r84826  
    164164
    165165        RTGCPHYS GCPhysOut;
    166         uint16_t const uDeviceId = VBOX_PCI_BUSDEVFN_MAKE(pBus->iBus, pPciDev->uDevFn);
     166        uint16_t const uDeviceId = PCIBDF_MAKE(pBus->iBus, pPciDev->uDevFn);
    167167        int rc = pIommu->pfnMemRead(pDevInsIommu, uDeviceId, GCPhys, cbRead, &GCPhysOut);
    168168        if (RT_FAILURE(rc))
     
    216216
    217217        RTGCPHYS GCPhysOut;
    218         uint16_t const uDeviceId = VBOX_PCI_BUSDEVFN_MAKE(pBus->iBus, pPciDev->uDevFn);
     218        uint16_t const uDeviceId = PCIBDF_MAKE(pBus->iBus, pPciDev->uDevFn);
    219219        int rc = pIommu->pfnMemWrite(pDevInsIommu, uDeviceId, GCPhys, cbWrite, &GCPhysOut);
    220220        if (RT_FAILURE(rc))
     
    16121612
    16131613/** @interface_method_impl{PDMPCIHLPR0,pfnIoApicSetIrq} */
    1614 static DECLCALLBACK(void) pdmR0PciHlp_IoApicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)
    1615 {
    1616     PDMDEV_ASSERT_DEVINS(pDevIns);
    1617     Log4(("pdmR0PciHlp_IoApicSetIrq: iIrq=%d iLevel=%d uTagSrc=%#x\n", iIrq, iLevel, uTagSrc));
     1614static DECLCALLBACK(void) pdmR0PciHlp_IoApicSetIrq(PPDMDEVINS pDevIns, PCIBDF uBusDevFn, int iIrq, int iLevel, uint32_t uTagSrc)
     1615{
     1616    PDMDEV_ASSERT_DEVINS(pDevIns);
     1617    Log4(("pdmR0PciHlp_IoApicSetIrq: uBusDevFn=%#x iIrq=%d iLevel=%d uTagSrc=%#x\n", uBusDevFn, iIrq, iLevel, uTagSrc));
    16181618    PGVM pGVM = pDevIns->Internal.s.pGVM;
    16191619
    16201620    if (pGVM->pdm.s.IoApic.pDevInsR0)
    1621         pGVM->pdm.s.IoApic.pfnSetIrqR0(pGVM->pdm.s.IoApic.pDevInsR0, iIrq, iLevel, uTagSrc);
     1621        pGVM->pdm.s.IoApic.pfnSetIrqR0(pGVM->pdm.s.IoApic.pDevInsR0, uBusDevFn, iIrq, iLevel, uTagSrc);
    16221622    else if (pGVM->pdm.s.IoApic.pDevInsR3)
    16231623    {
     
    16281628            pTask->enmOp = PDMDEVHLPTASKOP_IOAPIC_SET_IRQ;
    16291629            pTask->pDevInsR3 = NIL_RTR3PTR; /* not required */
     1630            pTask->u.IoApicSetIRQ.uBusDevFn = uBusDevFn;
    16301631            pTask->u.IoApicSetIRQ.iIrq = iIrq;
    16311632            pTask->u.IoApicSetIRQ.iLevel = iLevel;
     
    16411642
    16421643/** @interface_method_impl{PDMPCIHLPR0,pfnIoApicSendMsi} */
    1643 static DECLCALLBACK(void) pdmR0PciHlp_IoApicSendMsi(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, uint32_t uValue, uint32_t uTagSrc)
    1644 {
    1645     PDMDEV_ASSERT_DEVINS(pDevIns);
    1646     Log4(("pdmR0PciHlp_IoApicSendMsi: GCPhys=%p uValue=%d uTagSrc=%#x\n", GCPhys, uValue, uTagSrc));
     1644static DECLCALLBACK(void) pdmR0PciHlp_IoApicSendMsi(PPDMDEVINS pDevIns, PCIBDF uBusDevFn, PCMSIMSG pMsi, uint32_t uTagSrc)
     1645{
     1646    PDMDEV_ASSERT_DEVINS(pDevIns);
     1647    Assert(PCIBDF_IS_VALID(uBusDevFn));
     1648    Log4(("pdmR0PciHlp_IoApicSendMsi: uBusDevFn=%#x Msi=(Addr:%#RX64 Data:%#RX32) uTagSrc=%#x\n", uBusDevFn, pMsi->Addr.u64,
     1649          pMsi->Data.u32, uTagSrc));
    16471650    PGVM pGVM = pDevIns->Internal.s.pGVM;
    16481651    if (pGVM->pdm.s.IoApic.pDevInsR0)
    1649         pGVM->pdm.s.IoApic.pfnSendMsiR0(pGVM->pdm.s.IoApic.pDevInsR0, GCPhys, uValue, uTagSrc);
     1652        pGVM->pdm.s.IoApic.pfnSendMsiR0(pGVM->pdm.s.IoApic.pDevInsR0, uBusDevFn, pMsi, uTagSrc);
    16501653    else
    16511654        AssertFatalMsgFailed(("Lazy bastards!"));
     
    17561759 * @returns true if delivered, false if postponed.
    17571760 * @param   pGVM        The global (ring-0) VM structure.
     1761 * @param   uBusDevFn   The bus:device:function of the device initiating the IRQ.
     1762 *                      Can be NIL_PCIBDF.
    17581763 * @param   iIrq        The irq.
    17591764 * @param   iLevel      The new level.
     
    17721777            pGVM->pdm.s.Pic.pfnSetIrqR0(pGVM->pdm.s.Pic.pDevInsR0, iIrq, iLevel, uTagSrc);
    17731778        if (pGVM->pdm.s.IoApic.pDevInsR0)
    1774             pGVM->pdm.s.IoApic.pfnSetIrqR0(pGVM->pdm.s.IoApic.pDevInsR0, iIrq, iLevel, uTagSrc);
     1779            pGVM->pdm.s.IoApic.pfnSetIrqR0(pGVM->pdm.s.IoApic.pDevInsR0, NIL_PCIBDF, iIrq, iLevel, uTagSrc);
    17751780        return true;
    17761781    }
     
    17821787    pTask->enmOp = PDMDEVHLPTASKOP_ISA_SET_IRQ;
    17831788    pTask->pDevInsR3 = NIL_RTR3PTR; /* not required */
     1789    pTask->u.IsaSetIRQ.uBusDevFn = NIL_PCIBDF;
    17841790    pTask->u.IsaSetIRQ.iIrq = iIrq;
    17851791    pTask->u.IsaSetIRQ.iLevel = iLevel;
  • trunk/src/VBox/VMM/VMMR0/PDMR0DevHlpTracing.cpp

    r84809 r84826  
    322322
    323323        RTGCPHYS GCPhysOut;
    324         uint16_t const uDeviceId = VBOX_PCI_BUSDEVFN_MAKE(pBus->iBus, pPciDev->uDevFn);
     324        uint16_t const uDeviceId = PCIBDF_MAKE(pBus->iBus, pPciDev->uDevFn);
    325325        int rc = pIommu->pfnMemRead(pDevInsIommu, uDeviceId, GCPhys, cbRead, &GCPhysOut);
    326326        if (RT_FAILURE(rc))
     
    374374
    375375        RTGCPHYS GCPhysOut;
    376         uint16_t const uDeviceId = VBOX_PCI_BUSDEVFN_MAKE(pBus->iBus, pPciDev->uDevFn);
     376        uint16_t const uDeviceId = PCIBDF_MAKE(pBus->iBus, pPciDev->uDevFn);
    377377        int rc = pIommu->pfnMemWrite(pDevInsIommu, uDeviceId, GCPhys, cbWrite, &GCPhysOut);
    378378        if (RT_FAILURE(rc))
  • trunk/src/VBox/VMM/VMMR3/PDMDevHlp.cpp

    r84809 r84826  
    18041804
    18051805        RTGCPHYS GCPhysOut;
    1806         uint16_t const uDevId = VBOX_PCI_BUSDEVFN_MAKE(pBus->iBus, pPciDev->uDevFn);
     1806        uint16_t const uDevId = PCIBDF_MAKE(pBus->iBus, pPciDev->uDevFn);
    18071807        int rc = pIommu->pfnMemRead(pDevInsIommu, uDevId, GCPhys, cbRead, &GCPhysOut);
    18081808        if (RT_FAILURE(rc))
     
    18561856
    18571857        RTGCPHYS GCPhysOut;
    1858         uint16_t const uDevId = VBOX_PCI_BUSDEVFN_MAKE(pBus->iBus, pPciDev->uDevFn);
     1858        uint16_t const uDevId = PCIBDF_MAKE(pBus->iBus, pPciDev->uDevFn);
    18591859        int rc = pIommu->pfnMemWrite(pDevInsIommu, uDevId, GCPhys, cbWrite, &GCPhysOut);
    18601860        if (RT_FAILURE(rc))
     
    51935193
    51945194        case PDMDEVHLPTASKOP_IOAPIC_SET_IRQ:
    5195             PDMIoApicSetIrq(pVM, pTask->u.IoApicSetIRQ.iIrq, pTask->u.IoApicSetIRQ.iLevel, pTask->u.IoApicSetIRQ.uTagSrc);
     5195        {
     5196            PDMIoApicSetIrq(pVM, pTask->u.IoApicSetIRQ.uBusDevFn, pTask->u.IoApicSetIRQ.iIrq, pTask->u.IoApicSetIRQ.iLevel,
     5197                            pTask->u.IoApicSetIRQ.uTagSrc);
    51965198            break;
     5199        }
    51975200
    51985201        default:
  • trunk/src/VBox/VMM/VMMR3/PDMDevHlpTracing.cpp

    r84809 r84826  
    427427
    428428        RTGCPHYS GCPhysOut;
    429         uint16_t const uDevId = VBOX_PCI_BUSDEVFN_MAKE(pBus->iBus, pPciDev->uDevFn);
     429        uint16_t const uDevId = PCIBDF_MAKE(pBus->iBus, pPciDev->uDevFn);
    430430        int rc = pIommu->pfnMemRead(pDevInsIommu, uDevId, GCPhys, cbRead, &GCPhysOut);
    431431        if (RT_FAILURE(rc))
     
    479479
    480480        RTGCPHYS GCPhysOut;
    481         uint16_t const uDevId = VBOX_PCI_BUSDEVFN_MAKE(pBus->iBus, pPciDev->uDevFn);
     481        uint16_t const uDevId = PCIBDF_MAKE(pBus->iBus, pPciDev->uDevFn);
    482482        int rc = pIommu->pfnMemWrite(pDevInsIommu, uDevId, GCPhys, cbWrite, &GCPhysOut);
    483483        if (RT_FAILURE(rc))
  • trunk/src/VBox/VMM/VMMR3/PDMDevMiscHlp.cpp

    r84678 r84826  
    204204
    205205/** @interface_method_impl{PDMPCIHLPR3,pfnIoApicSetIrq} */
    206 static DECLCALLBACK(void) pdmR3PciHlp_IoApicSetIrq(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc)
    207 {
    208     PDMDEV_ASSERT_DEVINS(pDevIns);
    209     Log4(("pdmR3PciHlp_IoApicSetIrq: iIrq=%d iLevel=%d uTagSrc=%#x\n", iIrq, iLevel, uTagSrc));
    210     PDMIoApicSetIrq(pDevIns->Internal.s.pVMR3, iIrq, iLevel, uTagSrc);
     206static DECLCALLBACK(void) pdmR3PciHlp_IoApicSetIrq(PPDMDEVINS pDevIns, PCIBDF uBusDevFn, int iIrq, int iLevel, uint32_t uTagSrc)
     207{
     208    PDMDEV_ASSERT_DEVINS(pDevIns);
     209    Log4(("pdmR3PciHlp_IoApicSetIrq: uBusDevFn=%#x iIrq=%d iLevel=%d uTagSrc=%#x\n", uBusDevFn, iIrq, iLevel, uTagSrc));
     210    PDMIoApicSetIrq(pDevIns->Internal.s.pVMR3, uBusDevFn, iIrq, iLevel, uTagSrc);
    211211}
    212212
    213213
    214214/** @interface_method_impl{PDMPCIHLPR3,pfnIoApicSendMsi} */
    215 static DECLCALLBACK(void) pdmR3PciHlp_IoApicSendMsi(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, uint32_t uValue, uint32_t uTagSrc)
    216 {
    217     PDMDEV_ASSERT_DEVINS(pDevIns);
    218     Log4(("pdmR3PciHlp_IoApicSendMsi: address=%p value=%x uTagSrc=%#x\n", GCPhys, uValue, uTagSrc));
    219     PDMIoApicSendMsi(pDevIns->Internal.s.pVMR3, GCPhys, uValue, uTagSrc);
     215static DECLCALLBACK(void) pdmR3PciHlp_IoApicSendMsi(PPDMDEVINS pDevIns, PCIBDF uBusDevFn, PCMSIMSG pMsi, uint32_t uTagSrc)
     216{
     217    PDMDEV_ASSERT_DEVINS(pDevIns);
     218    Assert(PCIBDF_IS_VALID(uBusDevFn));
     219    Log4(("pdmR3PciHlp_IoApicSendMsi: uBusDevFn=%#x Msi (Addr=%#RX64 Data=%#x) uTagSrc=%#x\n", uBusDevFn,
     220          pMsi->Addr.u64, pMsi->Data.u32, uTagSrc));
     221    PDMIoApicSendMsi(pDevIns->Internal.s.pVMR3, uBusDevFn, pMsi, uTagSrc);
    220222}
    221223
  • trunk/src/VBox/VMM/include/PDMInternal.h

    r84755 r84826  
    788788    PPDMDEVINSR3                    pDevInsR3;
    789789    /** @copydoc PDMIOAPICREG::pfnSetIrq */
    790     DECLR3CALLBACKMEMBER(void,      pfnSetIrqR3,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
     790    DECLR3CALLBACKMEMBER(void,      pfnSetIrqR3,(PPDMDEVINS pDevIns, PCIBDF uBusDevFn, int iIrq, int iLevel, uint32_t uTagSrc));
    791791    /** @copydoc PDMIOAPICREG::pfnSendMsi */
    792     DECLR3CALLBACKMEMBER(void,      pfnSendMsiR3,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc));
     792    DECLR3CALLBACKMEMBER(void,      pfnSendMsiR3,(PPDMDEVINS pDevIns, PCIBDF uBusDevFn, PCMSIMSG pMsi, uint32_t uTagSrc));
    793793    /** @copydoc PDMIOAPICREG::pfnSetEoi */
    794794    DECLR3CALLBACKMEMBER(VBOXSTRICTRC, pfnSetEoiR3,(PPDMDEVINS pDevIns, uint8_t u8Vector));
     
    797797    PPDMDEVINSR0                    pDevInsR0;
    798798    /** @copydoc PDMIOAPICREG::pfnSetIrq */
    799     DECLR0CALLBACKMEMBER(void,      pfnSetIrqR0,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
     799    DECLR0CALLBACKMEMBER(void,      pfnSetIrqR0,(PPDMDEVINS pDevIns, PCIBDF uBusDevFn, int iIrq, int iLevel, uint32_t uTagSrc));
    800800    /** @copydoc PDMIOAPICREG::pfnSendMsi */
    801     DECLR0CALLBACKMEMBER(void,      pfnSendMsiR0,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc));
     801    DECLR0CALLBACKMEMBER(void,      pfnSendMsiR0,(PPDMDEVINS pDevIns, PCIBDF uBusDevFn, PCMSIMSG pMsi, uint32_t uTagSrc));
    802802    /** @copydoc PDMIOAPICREG::pfnSetEoi */
    803803    DECLR0CALLBACKMEMBER(VBOXSTRICTRC, pfnSetEoiR0,(PPDMDEVINS pDevIns, uint8_t u8Vector));
     
    806806    PPDMDEVINSRC                    pDevInsRC;
    807807    /** @copydoc PDMIOAPICREG::pfnSetIrq */
    808     DECLRCCALLBACKMEMBER(void,      pfnSetIrqRC,(PPDMDEVINS pDevIns, int iIrq, int iLevel, uint32_t uTagSrc));
     808    DECLRCCALLBACKMEMBER(void,      pfnSetIrqRC,(PPDMDEVINS pDevIns, PCIBDF uBusDevFn, int iIrq, int iLevel, uint32_t uTagSrc));
    809809     /** @copydoc PDMIOAPICREG::pfnSendMsi */
    810     DECLRCCALLBACKMEMBER(void,      pfnSendMsiRC,(PPDMDEVINS pDevIns, RTGCPHYS GCAddr, uint32_t uValue, uint32_t uTagSrc));
     810    DECLRCCALLBACKMEMBER(void,      pfnSendMsiRC,(PPDMDEVINS pDevIns, PCIBDF uBusDevFn, PCMSIMSG pMsi, uint32_t uTagSrc));
    811811     /** @copydoc PDMIOAPICREG::pfnSendMsi */
    812812    DECLRCCALLBACKMEMBER(VBOXSTRICTRC, pfnSetEoiRC,(PPDMDEVINS pDevIns, uint8_t u8Vector));
     
    12221222        struct PDMDEVHLPTASKISASETIRQ
    12231223        {
     1224            /** The bus:device:function of the device initiating the IRQ. Can be NIL_PCIBDF.  */
     1225            PCIBDF                  uBusDevFn;
    12241226            /** The IRQ */
    12251227            int                     iIrq;
Note: See TracChangeset for help on using the changeset viewer.

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