VirtualBox

Changeset 75585 in vbox


Ignore:
Timestamp:
Nov 19, 2018 6:03:23 PM (6 years ago)
Author:
vboxsync
Message:

VMMDev,PGM: New I/O port for ACKing IRQs and retreiving pending events. This is handled in ring-0/raw-mode and saves a bit of time compared to the ring-3 trip we've been doing for VMMDevReq_AcknowledgeEvents thus far. Requires the start of the VMMDev memory being mapped into R00/RC, the former requires some hacks on linux+windows as RTR0MemObjMapKernelEx is missing some functionality here. bugref:9172

Location:
trunk
Files:
5 edited

Legend:

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

    r75533 r75585  
    6565/** Port for generic request interface (relative offset). */
    6666#define VMMDEV_PORT_OFF_REQUEST                             0
     67/** Port for requests that can be handled w/o going to ring-3 (relative offset).
     68 * This works like VMMDevReq_AcknowledgeEvents when read.  */
     69#define VMMDEV_PORT_OFF_REQUEST_FAST                        8
    6770
    6871
     
    529532AssertCompileSize(VMMDevReqHostVersion, 24+16);
    530533
    531 /** @name VMMDevReqHostVersion::features
     534/** @name VMMDEV_HVF_XXX - VMMDevReqHostVersion::features
    532535 * @{ */
    533536/** Physical page lists are supported by HGCM. */
    534 #define VMMDEV_HVF_HGCM_PHYS_PAGE_LIST  RT_BIT(0)
     537#define VMMDEV_HVF_HGCM_PHYS_PAGE_LIST      RT_BIT_32(0)
     538/** HGCM supports the embedded buffer parameter type. */
     539#define VMMDEV_HVF_HGCM_EMBEDDED_BUFFERS    RT_BIT_32(1)
     540/** VMMDev supports fast IRQ acknowledgements. */
     541#define VMMDEV_HVF_FAST_IRQ_ACK             RT_BIT_32(31)
    535542/** @} */
    536543
  • trunk/src/VBox/Devices/VMMDev/VMMDev.cpp

    r75537 r75585  
    151151
    152152#ifndef VBOX_DEVICE_STRUCT_TESTCASE
     153#ifdef IN_RING3
    153154
    154155/* -=-=-=-=- Misc Helpers -=-=-=-=- */
     
    229230}
    230231
     232#endif /* IN_RING3 */
     233
     234
    231235/**
    232236 * Sets the IRQ (raise it or lower it) for 1.03 additions.
     
    241245    {
    242246        /* Filter unsupported events */
    243         uint32_t fEvents = pThis->u32HostEventFlags & pThis->pVMMDevRAMR3->V.V1_03.u32GuestEventMask;
     247        uint32_t fEvents = pThis->u32HostEventFlags & pThis->CTX_SUFF(pVMMDevRAM)->V.V1_03.u32GuestEventMask;
    244248
    245249        Log(("vmmdevSetIRQ: fEvents=%#010x, u32HostEventFlags=%#010x, u32GuestEventMask=%#010x.\n",
    246              fEvents, pThis->u32HostEventFlags, pThis->pVMMDevRAMR3->V.V1_03.u32GuestEventMask));
     250             fEvents, pThis->u32HostEventFlags, pThis->CTX_SUFF(pVMMDevRAM)->V.V1_03.u32GuestEventMask));
    247251
    248252        /* Move event flags to VMMDev RAM */
    249         pThis->pVMMDevRAMR3->V.V1_03.u32HostEvents = fEvents;
     253        pThis->CTX_SUFF(pVMMDevRAM)->V.V1_03.u32HostEvents = fEvents;
    250254
    251255        uint32_t uIRQLevel = 0;
     
    260264        /* Set IRQ level for pin 0 (see NoWait comment in vmmdevMaybeSetIRQ). */
    261265        /** @todo make IRQ pin configurable, at least a symbolic constant */
    262         PDMDevHlpPCISetIrqNoWait(pThis->pDevIns, 0, uIRQLevel);
     266        PDMDevHlpPCISetIrqNoWait(pThis->CTX_SUFF(pDevIns), 0, uIRQLevel);
    263267        Log(("vmmdevSetIRQ: IRQ set %d\n", uIRQLevel));
    264268    }
     
    266270        Log(("vmmdevSetIRQ: IRQ is not generated, guest has not yet reported to us.\n"));
    267271}
     272
     273
     274#ifdef IN_RING3
    268275
    269276/**
     
    287294         */
    288295        pThis->pVMMDevRAMR3->V.V1_04.fHaveEvents = true;
    289         PDMDevHlpPCISetIrqNoWait(pThis->pDevIns, 0, 1);
     296        PDMDevHlpPCISetIrqNoWait(pThis->pDevInsR3, 0, 1);
    290297        Log3(("vmmdevMaybeSetIRQ: IRQ set.\n"));
    291298    }
     
    356363     * Only notify the VM when it's running.
    357364     */
    358     VMSTATE enmVMState = PDMDevHlpVMState(pThis->pDevIns);
     365    VMSTATE enmVMState = PDMDevHlpVMState(pThis->pDevInsR3);
    359366/** @todo r=bird: Shouldn't there be more states here?  Wouldn't we drop
    360367 *        notifications now when we're in the process of suspending or
     
    443450
    444451    /* Clear our IRQ in case it was high for whatever reason. */
    445     PDMDevHlpPCISetIrqNoWait(pThis->pDevIns, 0, 0);
     452    PDMDevHlpPCISetIrqNoWait(pThis->pDevInsR3, 0, 0);
    446453
    447454    return VINF_SUCCESS;
     
    563570    {
    564571        VMMDevReqNtBugCheck const *pReq = (VMMDevReqNtBugCheck const *)pReqHdr;
    565         DBGFR3ReportBugCheck(PDMDevHlpGetVM(pThis->pDevIns), PDMDevHlpGetVMCPU(pThis->pDevIns), DBGFEVENT_BSOD_VMMDEV,
     572        DBGFR3ReportBugCheck(PDMDevHlpGetVM(pThis->pDevInsR3), PDMDevHlpGetVMCPU(pThis->pDevInsR3), DBGFEVENT_BSOD_VMMDEV,
    566573                             pReq->uBugCheck, pReq->auParameters[0], pReq->auParameters[1],
    567574                             pReq->auParameters[2], pReq->auParameters[3]);
     
    570577    {
    571578        LogRel(("VMMDev: NT BugCheck w/o data.\n"));
    572         DBGFR3ReportBugCheck(PDMDevHlpGetVM(pThis->pDevIns), PDMDevHlpGetVMCPU(pThis->pDevIns), DBGFEVENT_BSOD_VMMDEV,
     579        DBGFR3ReportBugCheck(PDMDevHlpGetVM(pThis->pDevInsR3), PDMDevHlpGetVMCPU(pThis->pDevInsR3), DBGFEVENT_BSOD_VMMDEV,
    573580                             0, 0, 0, 0, 0);
    574581    }
     
    724731
    725732    /* Clear our IRQ in case it was high for whatever reason. */
    726     PDMDevHlpPCISetIrqNoWait(pThis->pDevIns, 0, 0);
     733    PDMDevHlpPCISetIrqNoWait(pThis->pDevInsR3, 0, 0);
    727734
    728735    return VINF_SUCCESS;
     
    11621169    {
    11631170        RTTIMESPEC now;
    1164         pReq->time = RTTimeSpecGetMilli(PDMDevHlpTMUtcNow(pThis->pDevIns, &now));
     1171        pReq->time = RTTimeSpecGetMilli(PDMDevHlpTMUtcNow(pThis->pDevInsR3, &now));
    11651172        return VINF_SUCCESS;
    11661173    }
     
    11811188    AssertMsgReturn(pReq->header.size == sizeof(*pReq), ("%u\n", pReq->header.size), VERR_INVALID_PARAMETER);
    11821189
    1183     return PGMR3MappingsSize(PDMDevHlpGetVM(pThis->pDevIns), &pReq->hypervisorSize);
     1190    return PGMR3MappingsSize(PDMDevHlpGetVM(pThis->pDevInsR3), &pReq->hypervisorSize);
    11841191}
    11851192
     
    11981205
    11991206    int rc;
    1200     PVM pVM = PDMDevHlpGetVM(pThis->pDevIns);
     1207    PVM pVM = PDMDevHlpGetVM(pThis->pDevInsR3);
    12011208    if (pReq->hypervisorStart == 0)
    12021209        rc = PGMR3MappingsUnfix(pVM);
     
    12321239    AssertMsgReturn(pReq->header.size == sizeof(*pReq), ("%u\n", pReq->header.size), VERR_INVALID_PARAMETER);
    12331240
    1234     return VMMR3RegisterPatchMemory(PDMDevHlpGetVM(pThis->pDevIns), pReq->pPatchMem, pReq->cbPatchMem);
     1241    return VMMR3RegisterPatchMemory(PDMDevHlpGetVM(pThis->pDevInsR3), pReq->pPatchMem, pReq->cbPatchMem);
    12351242}
    12361243
     
    12481255    AssertMsgReturn(pReq->header.size == sizeof(*pReq), ("%u\n", pReq->header.size), VERR_INVALID_PARAMETER);
    12491256
    1250     return VMMR3DeregisterPatchMemory(PDMDevHlpGetVM(pThis->pDevIns), pReq->pPatchMem, pReq->cbPatchMem);
     1257    return VMMR3DeregisterPatchMemory(PDMDevHlpGetVM(pThis->pDevInsR3), pReq->pPatchMem, pReq->cbPatchMem);
    12511258}
    12521259
     
    12691276        {
    12701277            LogRel(("VMMDev: Guest requests the VM to be suspended (paused)\n"));
    1271             return PDMDevHlpVMSuspend(pThis->pDevIns);
     1278            return PDMDevHlpVMSuspend(pThis->pDevInsR3);
    12721279        }
    12731280
     
    12751282        {
    12761283            LogRel(("VMMDev: Guest requests the VM to be turned off\n"));
    1277             return PDMDevHlpVMPowerOff(pThis->pDevIns);
     1284            return PDMDevHlpVMPowerOff(pThis->pDevInsR3);
    12781285        }
    12791286
     
    12831290            {
    12841291                LogRel(("VMMDev: Guest requests the VM to be saved and powered off\n"));
    1285                 return PDMDevHlpVMSuspendSaveAndPowerOff(pThis->pDevIns);
     1292                return PDMDevHlpVMSuspendSaveAndPowerOff(pThis->pDevInsR3);
    12861293            }
    12871294            LogRel(("VMMDev: Guest requests the VM to be saved and powered off, declined\n"));
     
    16631670}
    16641671
     1672#endif /* IN_RING3 */
     1673
    16651674
    16661675/**
     
    16751684    VMMDevEvents *pReq = (VMMDevEvents *)pReqHdr;
    16761685    AssertMsgReturn(pReq->header.size == sizeof(*pReq), ("%u\n", pReq->header.size), VERR_INVALID_PARAMETER);
     1686    STAM_REL_COUNTER_INC(&pThis->StatSlowIrqAck);
    16771687
    16781688    if (!VMMDEV_INTERFACE_VERSION_IS_1_03(pThis))
    16791689    {
     1690        /*
     1691         * Note! This code is duplicated in vmmdevFastRequestIrqAck.
     1692         */
    16801693        if (pThis->fNewGuestFilterMask)
    16811694        {
     
    16871700
    16881701        pThis->u32HostEventFlags &= ~pThis->u32GuestFilterMask;
    1689         pThis->pVMMDevRAMR3->V.V1_04.fHaveEvents = false;
    1690         PDMDevHlpPCISetIrqNoWait(pThis->pDevIns, 0, 0);
     1702        pThis->CTX_SUFF(pVMMDevRAM)->V.V1_04.fHaveEvents = false;
     1703
     1704        PDMDevHlpPCISetIrqNoWait(pThis->CTX_SUFF(pDevIns), 0, 0);
    16911705    }
    16921706    else
     
    16951709}
    16961710
     1711
     1712#ifdef IN_RING3
    16971713
    16981714/**
     
    20482064
    20492065    Log(("VMMDevReq_ChangeMemBalloon\n"));
    2050     int rc = PGMR3PhysChangeMemBalloon(PDMDevHlpGetVM(pThis->pDevIns), !!pReq->fInflate, pReq->cPages, pReq->aPhysPage);
     2066    int rc = PGMR3PhysChangeMemBalloon(PDMDevHlpGetVM(pThis->pDevInsR3), !!pReq->fInflate, pReq->cPages, pReq->aPhysPage);
    20512067    if (pReq->fInflate)
    20522068        STAM_REL_U32_INC(&pThis->StatMemBalloonChunks);
     
    22842300    pReq->build     = RTBldCfgVersionBuild();
    22852301    pReq->revision  = RTBldCfgRevision();
    2286     pReq->features  = VMMDEV_HVF_HGCM_PHYS_PAGE_LIST;
     2302    pReq->features  = VMMDEV_HVF_HGCM_PHYS_PAGE_LIST | VMMDEV_HVF_HGCM_EMBEDDED_BUFFERS | VMMDEV_HVF_FAST_IRQ_ACK;
    22872303    return VINF_SUCCESS;
    22882304}
     
    24062422     * Forward the request to the VMM.
    24072423     */
    2408     return PGMR3SharedModuleRegister(PDMDevHlpGetVM(pThis->pDevIns), pReq->enmGuestOS, pReq->szName, pReq->szVersion,
     2424    return PGMR3SharedModuleRegister(PDMDevHlpGetVM(pThis->pDevInsR3), pReq->enmGuestOS, pReq->szName, pReq->szVersion,
    24092425                                     pReq->GCBaseAddr, pReq->cbModule, pReq->cRegions, pReq->aRegions);
    24102426}
     
    24362452     * Forward the request to the VMM.
    24372453     */
    2438     return PGMR3SharedModuleUnregister(PDMDevHlpGetVM(pThis->pDevIns), pReq->szName, pReq->szVersion,
     2454    return PGMR3SharedModuleUnregister(PDMDevHlpGetVM(pThis->pDevInsR3), pReq->szName, pReq->szVersion,
    24392455                                       pReq->GCBaseAddr, pReq->cbModule);
    24402456}
     
    24522468    AssertMsgReturn(pReq->header.size == sizeof(VMMDevSharedModuleCheckRequest),
    24532469                    ("%u\n", pReq->header.size), VERR_INVALID_PARAMETER);
    2454     return PGMR3SharedModuleCheckAll(PDMDevHlpGetVM(pThis->pDevIns));
     2470    return PGMR3SharedModuleCheckAll(PDMDevHlpGetVM(pThis->pDevInsR3));
    24552471}
    24562472
     
    24902506
    24912507# ifdef DEBUG
    2492     return PGMR3SharedModuleGetPageState(PDMDevHlpGetVM(pThis->pDevIns), pReq->GCPtrPage, &pReq->fShared, &pReq->uPageFlags);
     2508    return PGMR3SharedModuleGetPageState(PDMDevHlpGetVM(pThis->pDevInsR3), pReq->GCPtrPage, &pReq->fShared, &pReq->uPageFlags);
    24932509# else
    24942510    RT_NOREF1(pThis);
     
    25502566     * Write the core file.
    25512567     */
    2552     PUVM pUVM = PDMDevHlpGetUVM(pThis->pDevIns);
     2568    PUVM pUVM = PDMDevHlpGetUVM(pThis->pDevInsR3);
    25532569    return DBGFR3CoreWrite(pUVM, szCorePath, true /*fReplaceFile*/);
    25542570}
     
    25702586    {
    25712587        int32_t rcReq = VINF_HGCM_ASYNC_EXECUTE;
    2572         PDMDevHlpPhysWrite(pThis->pDevIns, GCPhysReqHdr + RT_UOFFSETOF(VMMDevRequestHeader, rc), &rcReq, sizeof(rcReq));
     2588        PDMDevHlpPhysWrite(pThis->pDevInsR3, GCPhysReqHdr + RT_UOFFSETOF(VMMDevRequestHeader, rc), &rcReq, sizeof(rcReq));
    25732589    }
    25742590}
     
    28702886
    28712887/**
    2872  * @callback_method_impl{FNIOMIOPORTOUT, Port I/O Handler for the generic
    2873  *                     request interface.}
     2888 * @callback_method_impl{FNIOMIOPORTOUT,
     2889 * Port I/O write andler for the generic request interface.}
    28742890 */
    28752891static DECLCALLBACK(int) vmmdevRequestHandler(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t u32, unsigned cb)
     
    29312947             * wasting time with the heap.  Larger allocations goes to the heap, though.
    29322948             */
    2933             VMCPUID              iCpu = PDMDevHlpGetCurrentCpuId(pThis->pDevIns);
     2949            VMCPUID              iCpu = PDMDevHlpGetCurrentCpuId(pDevIns);
    29342950            VMMDevRequestHeader *pRequestHeaderFree = NULL;
    29352951            VMMDevRequestHeader *pRequestHeader     = NULL;
     
    30263042}
    30273043
     3044#endif /* IN_RING3 */
     3045
     3046
     3047/**
     3048 * @callback_method_impl{FNIOMIOPORTOUT,
     3049 * Port I/O write handler for requests that can be handled w/o going to ring-3.}
     3050 */
     3051PDMBOTHCBDECL(int) vmmdevFastRequestHandler(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t u32, unsigned cb)
     3052{
     3053#ifndef IN_RING3
     3054# if 0 /* This functionality is offered through reading the port (vmmdevFastRequestIrqAck). Leaving it here for later. */
     3055    PVMMDEV pThis = (VMMDevState *)pvUser;
     3056    Assert(PDMINS_2_DATA(pDevIns, PVMMDEV) == pThis);
     3057    RT_NOREF2(Port, cb);
     3058
     3059    /*
     3060     * We only process a limited set of requests here, reflecting the rest down
     3061     * to ring-3.  So, try read the whole request into a stack buffer and check
     3062     * if we can handle it.
     3063     */
     3064    union
     3065    {
     3066        VMMDevRequestHeader Hdr;
     3067        VMMDevEvents        Ack;
     3068    } uReq;
     3069    RT_ZERO(uReq);
     3070
     3071    VBOXSTRICTRC rcStrict;
     3072    if (pThis->fu32AdditionsOk)
     3073    {
     3074        /* Read it into memory. */
     3075        uint32_t cbToRead = sizeof(uReq); /* (Adjust to stay within a page if we support more than ack requests.) */
     3076        rcStrict = PDMDevHlpPhysRead(pDevIns, u32, &uReq, cbToRead);
     3077        if (rcStrict == VINF_SUCCESS)
     3078        {
     3079            /*
     3080             * Validate the request and check that we want to handle it here.
     3081             */
     3082            if (   uReq.Hdr.size        >= sizeof(uReq.Hdr)
     3083                && uReq.Hdr.version     == VMMDEV_REQUEST_HEADER_VERSION
     3084                && (   uReq.Hdr.requestType == VMMDevReq_AcknowledgeEvents
     3085                    && uReq.Hdr.size        == sizeof(uReq.Ack)
     3086                    && cbToRead             == sizeof(uReq.Ack)
     3087                    && pThis->CTX_SUFF(pVMMDevRAM) != NULL)
     3088               )
     3089            {
     3090                RT_UNTRUSTED_VALIDATED_FENCE();
     3091
     3092                /*
     3093                 * Try grab the critical section.
     3094                 */
     3095                int rc2 = PDMCritSectEnter(&pThis->CritSect, VINF_IOM_R3_IOPORT_WRITE);
     3096                if (rc2 == VINF_SUCCESS)
     3097                {
     3098                    /*
     3099                     * Handle the request and write back the result to the guest.
     3100                     */
     3101                    uReq.Hdr.rc = vmmdevReqHandler_AcknowledgeEvents(pThis, &uReq.Hdr);
     3102
     3103                    rcStrict = PDMDevHlpPhysWrite(pDevIns, u32, &uReq, uReq.Hdr.size);
     3104                    PDMCritSectLeave(&pThis->CritSect);
     3105                    if (rcStrict == VINF_SUCCESS)
     3106                    { /* likely */ }
     3107                    else
     3108                        Log(("vmmdevFastRequestHandler: PDMDevHlpPhysWrite(%#RX32+rc,4) -> %Rrc (%RTbool)\n",
     3109                             u32, VBOXSTRICTRC_VAL(rcStrict), PGM_PHYS_RW_IS_SUCCESS(rcStrict) ));
     3110                }
     3111                else
     3112                {
     3113                    Log(("vmmdevFastRequestHandler: PDMCritSectEnter -> %Rrc\n", rc2));
     3114                    rcStrict = rc2;
     3115                }
     3116            }
     3117            else
     3118            {
     3119                Log(("vmmdevFastRequestHandler: size=%#x version=%#x requestType=%d (pVMMDevRAM=%p) -> R3\n",
     3120                     uReq.Hdr.size, uReq.Hdr.version, uReq.Hdr.requestType, pThis->CTX_SUFF(pVMMDevRAM) ));
     3121                rcStrict = VINF_IOM_R3_IOPORT_WRITE;
     3122            }
     3123        }
     3124        else
     3125            Log(("vmmdevFastRequestHandler: PDMDevHlpPhysRead(%#RX32,%#RX32) -> %Rrc\n", u32, cbToRead, VBOXSTRICTRC_VAL(rcStrict)));
     3126    }
     3127    else
     3128    {
     3129        Log(("vmmdevFastRequestHandler: additions nok-okay\n"));
     3130        rcStrict = VINF_IOM_R3_IOPORT_WRITE;
     3131    }
     3132
     3133    return VBOXSTRICTRC_VAL(rcStrict);
     3134# else
     3135    RT_NOREF(pDevIns, pvUser, Port, u32, cb);
     3136    return VINF_IOM_R3_IOPORT_WRITE;
     3137# endif
     3138
     3139#else  /* IN_RING3 */
     3140    return vmmdevRequestHandler(pDevIns, pvUser, Port, u32, cb);
     3141#endif /* IN_RING3 */
     3142}
     3143
     3144
     3145/**
     3146 * @callback_method_impl{FNIOMIOPORTIN,
     3147 * Port I/O read handler for IRQ acknowledging and getting pending events (same
     3148 * as VMMDevReq_AcknowledgeEvents, just faster).}
     3149 */
     3150PDMBOTHCBDECL(int) vmmdevFastRequestIrqAck(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, uint32_t *pu32, unsigned cb)
     3151{
     3152    PVMMDEV pThis = (VMMDevState *)pvUser;
     3153    Assert(PDMINS_2_DATA(pDevIns, PVMMDEV) == pThis);
     3154    RT_NOREF(Port);
     3155
     3156    /* Only 32-bit accesses. */
     3157    ASSERT_GUEST_MSG_RETURN(cb == sizeof(uint32_t), ("cb=%d\n", cb), VERR_IOM_IOPORT_UNUSED);
     3158
     3159    /* The VMMDev memory mapping might've failed, go to ring-3 in that case. */
     3160    VBOXSTRICTRC rcStrict;
     3161#ifndef IN_RING3
     3162    if (pThis->CTX_SUFF(pVMMDevRAM) != NULL)
     3163#endif
     3164    {
     3165        /* Enter critical section and check that the additions has been properly
     3166           initialized and that we're not in legacy v1.3 device mode. */
     3167        rcStrict = PDMCritSectEnter(&pThis->CritSect, VINF_IOM_R3_IOPORT_READ);
     3168        if (rcStrict == VINF_SUCCESS)
     3169        {
     3170            if (   pThis->fu32AdditionsOk
     3171                && !VMMDEV_INTERFACE_VERSION_IS_1_03(pThis))
     3172            {
     3173                /*
     3174                 * Do the job.
     3175                 *
     3176                 * Note! This code is duplicated in vmmdevReqHandler_AcknowledgeEvents.
     3177                 */
     3178                STAM_REL_COUNTER_INC(&pThis->CTX_SUFF_Z(StatFastIrqAck));
     3179
     3180                if (pThis->fNewGuestFilterMask)
     3181                {
     3182                    pThis->fNewGuestFilterMask = false;
     3183                    pThis->u32GuestFilterMask = pThis->u32NewGuestFilterMask;
     3184                }
     3185
     3186                *pu32 = pThis->u32HostEventFlags & pThis->u32GuestFilterMask;
     3187
     3188                pThis->u32HostEventFlags &= ~pThis->u32GuestFilterMask;
     3189                pThis->CTX_SUFF(pVMMDevRAM)->V.V1_04.fHaveEvents = false;
     3190
     3191                PDMDevHlpPCISetIrqNoWait(pDevIns, 0, 0);
     3192            }
     3193            else
     3194            {
     3195                Log(("vmmdevFastRequestIrqAck: fu32AdditionsOk=%d interfaceVersion=%#x\n", pThis->fu32AdditionsOk,
     3196                     pThis->guestInfo.interfaceVersion));
     3197                *pu32 = UINT32_MAX;
     3198            }
     3199
     3200            PDMCritSectLeave(&pThis->CritSect);
     3201        }
     3202    }
     3203#ifndef IN_RING3
     3204    else
     3205        rcStrict = VINF_IOM_R3_IOPORT_READ;
     3206#endif
     3207    return VBOXSTRICTRC_VAL(rcStrict);
     3208}
     3209
     3210
     3211
     3212#ifdef IN_RING3
    30283213
    30293214/* -=-=-=-=-=- PCI Device -=-=-=-=-=- */
     
    31173302    int rc = PDMDevHlpIOPortRegister(pDevIns, (RTIOPORT)GCPhysAddress + VMMDEV_PORT_OFF_REQUEST, 1,
    31183303                                     pThis, vmmdevRequestHandler, NULL, NULL, NULL, "VMMDev Request Handler");
    3119     AssertRC(rc);
     3304    AssertLogRelRCReturn(rc, rc);
     3305
     3306    /* The fast one: */
     3307    rc = PDMDevHlpIOPortRegister(pDevIns, (RTIOPORT)GCPhysAddress + VMMDEV_PORT_OFF_REQUEST_FAST, 1,
     3308                                 pThis, vmmdevFastRequestHandler, vmmdevFastRequestIrqAck, NULL, NULL, "VMMDev Fast R0/RC Requests");
     3309    AssertLogRelRCReturn(rc, rc);
     3310    if (pThis->fRZEnabled)
     3311    {
     3312        rc = PDMDevHlpIOPortRegisterR0(pDevIns, (RTIOPORT)GCPhysAddress + VMMDEV_PORT_OFF_REQUEST_FAST, 1,
     3313                                       PDMINS_2_DATA_R0PTR(pDevIns), "vmmdevFastRequestHandler", "vmmdevFastRequestIrqAck",
     3314                                       NULL, NULL, "VMMDev Fast R0/RC Requests");
     3315        AssertLogRelRCReturn(rc, rc);
     3316        rc = PDMDevHlpIOPortRegisterRC(pDevIns, (RTIOPORT)GCPhysAddress + VMMDEV_PORT_OFF_REQUEST_FAST, 1,
     3317                                       PDMINS_2_DATA_RCPTR(pDevIns), "vmmdevFastRequestHandler", "vmmdevFastRequestIrqAck",
     3318                                       NULL, NULL, "VMMDev Fast R0/RC Requests");
     3319        AssertLogRelRCReturn(rc, rc);
     3320    }
     3321
    31203322    return rc;
    31213323}
     
    40994301static DECLCALLBACK(void) vmmdevRelocate(PPDMDEVINS pDevIns, RTGCINTPTR offDelta)
    41004302{
    4101     NOREF(pDevIns);
    4102     NOREF(offDelta);
     4303    if (offDelta)
     4304    {
     4305        PVMMDEV pThis = PDMINS_2_DATA(pDevIns, PVMMDEV);
     4306        LogFlow(("vmmdevRelocate: offDelta=%RGv\n", offDelta));
     4307
     4308        if (pThis->pVMMDevRAMRC)
     4309            pThis->pVMMDevRAMRC += offDelta;
     4310        pThis->pDevInsRC = PDMDEVINS_2_RCPTR(pDevIns);
     4311    }
    41034312}
    41044313
     
    41644373     */
    41654374    /* Save PDM device instance data for future reference. */
    4166     pThis->pDevIns = pDevIns;
     4375    pThis->pDevInsR3 = pDevIns;
     4376    pThis->pDevInsR0 = PDMDEVINS_2_R0PTR(pDevIns);
     4377    pThis->pDevInsRC = PDMDEVINS_2_RCPTR(pDevIns);
    41674378
    41684379    /* PCI vendor, just a free bogus value */
     
    43794590    /*
    43804591     * Allocate and initialize the MMIO2 memory.
     4592     *
     4593     * We map the first page into raw-mode and kernel contexts so we can handle
     4594     * interrupt acknowledge requests more timely.
    43814595     */
    43824596    rc = PDMDevHlpMMIO2Register(pDevIns, &pThis->PciDev, 1 /*iRegion*/, VMMDEV_RAM_SIZE, 0 /*fFlags*/,
     
    43864600                                   N_("Failed to allocate %u bytes of memory for the VMM device"), VMMDEV_RAM_SIZE);
    43874601    vmmdevInitRam(pThis);
    4388 
     4602    if (pThis->fRZEnabled)
     4603    {
     4604        rc = PDMDevHlpMMIO2MapKernel(pDevIns, &pThis->PciDev, 1 /*iRegion*/, 0 /*off*/, PAGE_SIZE, "VMMDev", &pThis->pVMMDevRAMR0);
     4605        if (RT_FAILURE(rc))
     4606            return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,
     4607                                       N_("Failed to map first page of the VMMDev ram into kernel space: %Rrc"), rc);
     4608
     4609#ifdef VBOX_WITH_RAW_MODE
     4610        rc = PDMDevHlpMMHyperMapMMIO2(pDevIns, &pThis->PciDev, 1 /*iRegion*/, 0 /*off*/, PAGE_SIZE, "VMMDev", &pThis->pVMMDevRAMRC);
     4611        if (RT_FAILURE(rc))
     4612            return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,
     4613                                       N_("Failed to map first page of the VMMDev ram into raw-mode context: %Rrc"), rc);
     4614#endif
     4615    }
     4616
     4617    /*
     4618     * Allocate and initialize the MMIO2 heap.
     4619     */
    43894620    if (pThis->fHeapEnabled)
    43904621    {
     
    44834714     * Statistics.
    44844715     */
    4485     PDMDevHlpSTAMRegisterF(pDevIns, &pThis->StatMemBalloonChunks, STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT, "Memory balloon size", "/Devices/VMMDev/BalloonChunks");
     4716    PDMDevHlpSTAMRegisterF(pDevIns, &pThis->StatMemBalloonChunks, STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
     4717                           "Memory balloon size",                           "/Devices/VMMDev/BalloonChunks");
     4718    PDMDevHlpSTAMRegisterF(pDevIns, &pThis->StatFastIrqAckR3,      STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
     4719                           "Fast IRQ acknowledgments handled in ring-3.",   "/Devices/VMMDev/FastIrqAckR3");
     4720    PDMDevHlpSTAMRegisterF(pDevIns, &pThis->StatFastIrqAckRZ,      STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
     4721                           "Fast IRQ acknowledgments handled in ring-0 or raw-mode.", "/Devices/VMMDev/FastIrqAckRZ");
     4722    PDMDevHlpSTAMRegisterF(pDevIns, &pThis->StatSlowIrqAck,        STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
     4723                           "Slow IRQ acknowledgments (old style).",         "/Devices/VMMDev/SlowIrqAck");
     4724    PDMDevHlpSTAMRegisterF(pDevIns, &pThis->StatReqBufAllocs,      STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
     4725                           "Times a larger request buffer was required.",   "/Devices/VMMDev/LargeReqBufAllocs");
    44864726#ifdef VBOX_WITH_HGCM
    44874727    PDMDevHlpSTAMRegisterF(pDevIns, &pThis->StatHgcmCmdArrival,    STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_TICKS_PER_CALL,
     
    44944734                           "Times the allocation cache could not be used.", "/HGCM/LargeCmdAllocs");
    44954735#endif
    4496     PDMDevHlpSTAMRegisterF(pDevIns, &pThis->StatReqBufAllocs,      STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
    4497                            "Times a larger request buffer was required.",   "/HGCM/LargeReqBufAllocs");
    44984736
    44994737    /*
     
    45604798    PDM_DEVREG_VERSION
    45614799};
     4800#endif /* IN_RING3 */
    45624801#endif /* !VBOX_DEVICE_STRUCT_TESTCASE */
    4563 
  • trunk/src/VBox/Devices/VMMDev/VMMDevHGCM.cpp

    r75555 r75585  
    328328        if (pCmd->pvReqLocked)
    329329        {
    330             PDMDevHlpPhysReleasePageMappingLock(pThis->pDevIns, &pCmd->ReqMapLock);
     330            PDMDevHlpPhysReleasePageMappingLock(pThis->pDevInsR3, &pCmd->ReqMapLock);
    331331            pCmd->pvReqLocked = NULL;
    332332        }
     
    673673                        if (pGuestParm->enmType != VMMDevHGCMParmType_Embedded)
    674674                        {
    675                             int rc = vmmdevHGCMGuestBufferRead(pThis->pDevIns, pv, cbData, &pGuestParm->u.ptr);
     675                            int rc = vmmdevHGCMGuestBufferRead(pThis->pDevInsR3, pv, cbData, &pGuestParm->u.ptr);
    676676                            ASSERT_GUEST_RETURN(RT_SUCCESS(rc), rc);
    677677                            RT_UNTRUSTED_NONVOLATILE_COPY_FENCE();
     
    872872                         */
    873873                        RTGCPHYS GCPhys;
    874                         int rc2 = PDMDevHlpPhysGCPtr2GCPhys(pThis->pDevIns, GCPtr, &GCPhys);
     874                        int rc2 = PDMDevHlpPhysGCPtr2GCPhys(pThis->pDevInsR3, GCPtr, &GCPhys);
    875875                        if (RT_FAILURE(rc2))
    876876                            GCPhys = NIL_RTGCPHYS;
     
    10711071                        pHeader->result    = VINF_SUCCESS;
    10721072                        pHeader->fu32Flags |= VBOX_HGCM_REQ_DONE;
    1073                         PDMDevHlpPhysWrite(pThis->pDevIns, GCPhys, pHeader,  sizeof(*pHeader));
     1073                        PDMDevHlpPhysWrite(pThis->pDevInsR3, GCPhys, pHeader,  sizeof(*pHeader));
    10741074                    }
    10751075                    vmmdevHGCMCmdFree(pThis, pCmd);
     
    12121212                    const void *pvSrc = pHostParm->u.pointer.addr;
    12131213                    uint32_t cbSrc = pHostParm->u.pointer.size;
    1214                     rc = vmmdevHGCMGuestBufferWrite(pThis->pDevIns, pPtr, pvSrc, cbSrc);
     1214                    rc = vmmdevHGCMGuestBufferWrite(pThis->pDevInsR3, pPtr, pvSrc, cbSrc);
    12151215                }
    12161216                break;
     
    12281228                        memcpy((uint8_t *)pCmd->pvReqLocked + pPtr->offFirstPage, pvSrc, cbSrc);
    12291229                    else
    1230                         rc = PDMDevHlpPhysWrite(pThis->pDevIns, pGuestParm->u.ptr.GCPhysSinglePage, pvSrc, cbSrc);
     1230                        rc = PDMDevHlpPhysWrite(pThis->pDevInsR3, pGuestParm->u.ptr.GCPhysSinglePage, pvSrc, cbSrc);
    12311231                }
    12321232                break;
     
    13001300                 * The request data is not be used for anything but checking the request type.
    13011301                 */
    1302                 PDMDevHlpPhysRead(pThis->pDevIns, pCmd->GCPhys, pHeader, pCmd->cbRequest);
     1302                PDMDevHlpPhysRead(pThis->pDevInsR3, pCmd->GCPhys, pHeader, pCmd->cbRequest);
    13031303                RT_UNTRUSTED_NONVOLATILE_COPY_FENCE();
    13041304
     
    13601360
    13611361                /* First write back the request. */
    1362                 PDMDevHlpPhysWrite(pThis->pDevIns, pCmd->GCPhys, pHeader, pCmd->cbRequest);
     1362                PDMDevHlpPhysWrite(pThis->pDevInsR3, pCmd->GCPhys, pHeader, pCmd->cbRequest);
    13631363
    13641364                /* Mark request as processed. */
     
    13661366
    13671367                /* Second write the flags to mark the request as processed. */
    1368                 PDMDevHlpPhysWrite(pThis->pDevIns, pCmd->GCPhys + RT_UOFFSETOF(VMMDevHGCMRequestHeader, fu32Flags),
     1368                PDMDevHlpPhysWrite(pThis->pDevInsR3, pCmd->GCPhys + RT_UOFFSETOF(VMMDevHGCMRequestHeader, fu32Flags),
    13691369                                   &pHeader->fu32Flags, sizeof(pHeader->fu32Flags));
    13701370
     
    14911491 *        efficient...? */
    14921492    /* Not safe to execute asynchronously; forward to EMT */
    1493     int rc = VMR3ReqCallVoidNoWait(PDMDevHlpGetVM(pThis->pDevIns), VMCPUID_ANY,
     1493    int rc = VMR3ReqCallVoidNoWait(PDMDevHlpGetVM(pThis->pDevInsR3), VMCPUID_ANY,
    14941494                                   (PFNRT)hgcmCompletedWorker, 3, pInterface, result, pCmd);
    14951495    AssertRC(rc);
     
    21412141        AssertBreakStmt(pReqHdr, vmmdevHGCMCmdFree(pThis, pCmd); rcFunc = VERR_NO_MEMORY);
    21422142
    2143         PDMDevHlpPhysRead(pThis->pDevIns, pCmd->GCPhys, pReqHdr, pCmd->cbRequest);
     2143        PDMDevHlpPhysRead(pThis->pDevInsR3, pCmd->GCPhys, pReqHdr, pCmd->cbRequest);
    21442144        RT_UNTRUSTED_NONVOLATILE_COPY_FENCE();
    21452145
     
    22282228
    22292229            /* Write back only the header. */
    2230             PDMDevHlpPhysWrite(pThis->pDevIns, pCmd->GCPhys, pReqHdr, sizeof(*pReqHdr));
     2230            PDMDevHlpPhysWrite(pThis->pDevInsR3, pCmd->GCPhys, pReqHdr, sizeof(*pReqHdr));
    22312231
    22322232            VMMDevNotifyGuest(pThis, VMMDEV_EVENT_HGCM);
  • trunk/src/VBox/Devices/VMMDev/VMMDevState.h

    r75537 r75585  
    135135    uint32_t fHostCursorRequested;
    136136
     137#if HC_ARCH_BITS == 32
    137138    /** Alignment padding. */
    138139    uint32_t u32Alignment0;
    139 
    140     /** Pointer to device instance. */
    141     PPDMDEVINSR3 pDevIns;
     140#endif
     141
     142    /** Pointer to device instance - RC pointer. */
     143    PPDMDEVINSRC pDevInsRC;
     144    /** Pointer to device instance - R3 poitner. */
     145    PPDMDEVINSR3 pDevInsR3;
     146    /** Pointer to device instance - R0 pointer. */
     147    PPDMDEVINSR0 pDevInsR0;
     148
    142149    /** LUN\#0 + Status: VMMDev port base interface. */
    143150    PDMIBASE IBase;
     
    163170    uint32_t u32Alignment2;
    164171
     172    /** Statistics counter for slow IRQ ACK. */
     173    STAMCOUNTER StatSlowIrqAck;
     174    /** Statistics counter for fast IRQ ACK - R3. */
     175    STAMCOUNTER StatFastIrqAckR3;
     176    /** Statistics counter for fast IRQ ACK - R0 / RC. */
     177    STAMCOUNTER StatFastIrqAckRZ;
    165178    /** IRQ number assigned to the device */
    166179    uint32_t irq;
     
    179192
    180193    /** GC physical address of VMMDev RAM area */
    181     RTGCPHYS32 GCPhysVMMDevRAM;
     194    RTGCPHYS32                  GCPhysVMMDevRAM;
    182195    /** R3 pointer to VMMDev RAM area */
    183     R3PTRTYPE(VMMDevMemory *) pVMMDevRAMR3;
    184 
    185     /** R3 pointer to VMMDev Heap RAM area
    186      */
     196    R3PTRTYPE(VMMDevMemory *)   pVMMDevRAMR3;
     197    /** R0 pointer to VMMDev RAM area - first page only, could be NULL! */
     198    R0PTRTYPE(VMMDevMemory *)   pVMMDevRAMR0;
     199    /** R0 pointer to VMMDev RAM area - first page only, could be NULL! */
     200    RCPTRTYPE(VMMDevMemory *)   pVMMDevRAMRC;
     201    RTGCPTR                     RCPtrAlignment3b;
     202
     203    /** R3 pointer to VMMDev Heap RAM area. */
    187204    R3PTRTYPE(VMMDevMemory *) pVMMDevHeapR3;
    188205    /** GC physical address of VMMDev Heap RAM area */
  • trunk/src/VBox/VMM/VMMR3/PGMPhys.cpp

    r73606 r75585  
    38773877     * Pass the request on to the support library/driver.
    38783878     */
    3879     int rc = SUPR3PageMapKernel(pFirstRegMmio->pvR3, off, cb, 0, pR0Ptr);
     3879#if defined(RT_OS_WINDOWS) || defined(RT_OS_LINUX) || defined(RT_OS_OS2) /** @todo Fully implement RTR0MemObjMapKernelEx everywhere. */
     3880    AssertLogRelReturn(off == 0, VERR_NOT_SUPPORTED);
     3881    AssertLogRelReturn(pFirstRegMmio->fFlags & PGMREGMMIORANGE_F_LAST_CHUNK, VERR_NOT_SUPPORTED);
     3882    int rc = SUPR3PageMapKernel(pFirstRegMmio->pvR3, 0 /*off*/, pFirstRegMmio->RamRange.cb, 0 /*fFlags*/, pR0Ptr);
     3883#else
     3884    int rc = SUPR3PageMapKernel(pFirstRegMmio->pvR3, off, cb, 0 /*fFlags*/, pR0Ptr);
     3885#endif
    38803886
    38813887    return rc;
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