VirtualBox

Changeset 71686 in vbox


Ignore:
Timestamp:
Apr 5, 2018 3:03:53 PM (7 years ago)
Author:
vboxsync
Message:

DevVGA: Code cleanup in progress. bugref:9094

Location:
trunk/src/VBox/Devices/Graphics
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp

    r69963 r71686  
    145145#endif
    146146
     147#include <VBox/AssertGuest.h>
    147148#include <VBox/VMMDev.h>
    148149#include <VBoxVideo.h>
     
    212213    struct
    213214    {
    214         SVGAGuestPtr        ptr;
    215         uint32_t            bytesPerLine;
    216         SVGAGMRImageFormat format;
     215        SVGAGuestPtr RT_UNTRUSTED_GUEST         ptr;
     216        uint32_t RT_UNTRUSTED_GUEST             bytesPerLine;
     217        SVGAGMRImageFormat RT_UNTRUSTED_GUEST  format;
    217218    } GMRFB;
    218219    struct
     
    709710    *pu32 = 0;
    710711
     712    /* Rough index register validation. */
     713    uint32_t idxReg = pThis->svga.u32IndexReg;
     714#if !defined(IN_RING3) && defined(VBOX_STRICT)
     715    ASSERT_GUEST_MSG_RETURN(idxReg < SVGA_SCRATCH_BASE + pThis->svga.cScratchRegion, ("idxReg=%#x\n", idxReg),
     716                            VINF_IOM_R3_IOPORT_READ);
     717#else
     718    ASSERT_GUEST_MSG_STMT_RETURN(idxReg < SVGA_SCRATCH_BASE + pThis->svga.cScratchRegion, ("idxReg=%#x\n", idxReg),
     719                                 STAM_REL_COUNTER_INC(&pThis->svga.StatRegUnknownRd),
     720                                 VINF_SUCCESS);
     721#endif
     722    RT_UNTRUSTED_VALIDATED_FENCE();
     723
    711724    /* We must adjust the register number if we're in SVGA_ID_0 mode because the PALETTE range moved. */
    712     uint32_t idxReg = pThis->svga.u32IndexReg;
    713725    if (   idxReg >= SVGA_REG_CAPABILITIES
    714726        && pThis->svga.u32SVGAId == SVGA_ID_0)
     
    11681180        if ((offReg = idxReg - SVGA_SCRATCH_BASE) < pThis->svga.cScratchRegion)
    11691181        {
     1182            RT_UNTRUSTED_VALIDATED_FENCE();
    11701183            *pu32 = pThis->svga.au32ScratchRegion[offReg];
    11711184            STAM_REL_COUNTER_INC(&pThis->svga.StatRegScratchRd);
     
    11751188            /* Note! Using last_palette rather than palette here to preserve the VGA one. */
    11761189            STAM_REL_COUNTER_INC(&pThis->svga.StatRegPaletteRd);
     1190            RT_UNTRUSTED_VALIDATED_FENCE();
    11771191            uint32_t u32 = pThis->last_palette[offReg / 3];
    11781192            switch (offReg % 3)
     
    13321346    int            rc = VINF_SUCCESS;
    13331347
     1348    /* Rough index register validation. */
     1349    uint32_t idxReg = pThis->svga.u32IndexReg;
     1350#if !defined(IN_RING3) && defined(VBOX_STRICT)
     1351    ASSERT_GUEST_MSG_RETURN(idxReg < SVGA_SCRATCH_BASE + pThis->svga.cScratchRegion, ("idxReg=%#x\n", idxReg),
     1352                            VINF_IOM_R3_IOPORT_WRITE);
     1353#else
     1354    ASSERT_GUEST_MSG_STMT_RETURN(idxReg < SVGA_SCRATCH_BASE + pThis->svga.cScratchRegion, ("idxReg=%#x\n", idxReg),
     1355                                 STAM_REL_COUNTER_INC(&pThis->svga.StatRegUnknownWr),
     1356                                 VINF_SUCCESS);
     1357#endif
     1358    RT_UNTRUSTED_VALIDATED_FENCE();
     1359
    13341360    /* We must adjust the register number if we're in SVGA_ID_0 mode because the PALETTE range moved. */
    1335     uint32_t idxReg = pThis->svga.u32IndexReg;
    13361361    if (   idxReg >= SVGA_REG_CAPABILITIES
    13371362        && pThis->svga.u32SVGAId == SVGA_ID_0)
     
    16061631        uint32_t idGMR = pThis->svga.u32CurrentGMRId;
    16071632        AssertBreak(idGMR < pThis->svga.cGMR);
     1633        RT_UNTRUSTED_VALIDATED_FENCE();
    16081634
    16091635        /* Free the old GMR if present. */
     
    17341760        if ((offReg = idxReg - SVGA_SCRATCH_BASE) < pThis->svga.cScratchRegion)
    17351761        {
     1762            RT_UNTRUSTED_VALIDATED_FENCE();
    17361763            pThis->svga.au32ScratchRegion[offReg] = u32;
    17371764            STAM_REL_COUNTER_INC(&pThis->svga.StatRegScratchWr);
     
    17431770            STAM_REL_COUNTER_INC(&pThis->svga.StatRegPaletteWr);
    17441771            u32 &= 0xff;
     1772            RT_UNTRUSTED_VALIDATED_FENCE();
    17451773            uint32_t uRgb = pThis->last_palette[offReg / 3];
    17461774            switch (offReg % 3)
     
    18111839        *pu32 = pThis->svga.u32IrqStatus;
    18121840        break;
     1841
     1842    default:
     1843        ASSERT_GUEST_MSG_FAILED(("vmsvgaIORead: Unknown register %u (%#x) was read from.\n", uPort - pThis->svga.BasePort, uPort));
     1844        *pu32 = UINT32_MAX;
     1845        break;
    18131846    }
    18141847
     
    18611894            PDMDevHlpPCISetIrqNoWait(pDevIns, 0, 0);
    18621895        }
     1896        break;
     1897
     1898    default:
     1899        ASSERT_GUEST_MSG_FAILED(("vmsvgaIOWrite: Unknown register %u (%#x) was written to, value %#x LB %u.\n",
     1900                                 uPort - pThis->svga.BasePort, uPort, u32, cb));
    18631901        break;
    18641902    }
     
    29132951 *                          statistics collection.
    29142952 */
    2915 static void *vmsvgaFIFOGetCmdPayload(uint32_t cbPayloadReq, uint32_t volatile *pFIFO,
     2953static void *vmsvgaFIFOGetCmdPayload(uint32_t cbPayloadReq, uint32_t RT_UNTRUSTED_VOLATILE_GUEST *pFIFO,
    29162954                                     uint32_t offCurrentCmd, uint32_t offFifoMin, uint32_t offFifoMax,
    29172955                                     uint8_t *pbBounceBuf, uint32_t *pcbAlreadyRead,
     
    29592997    uint32_t cbAfter, cbBefore;
    29602998    uint32_t offNextCmd = pFIFO[SVGA_FIFO_NEXT_CMD];
     2999    RT_UNTRUSTED_NONVOLATILE_COPY_FENCE();
    29613000    if (offNextCmd >= offCurrentCmd)
    29623001    {
     
    30053044
    30063045            offNextCmd = pFIFO[SVGA_FIFO_NEXT_CMD];
     3046            RT_UNTRUSTED_NONVOLATILE_COPY_FENCE();
    30073047            if (offNextCmd >= offCurrentCmd)
    30083048            {
     
    30443084    }
    30453085    *pcbAlreadyRead = cbPayloadReq;
     3086    RT_UNTRUSTED_NONVOLATILE_COPY_FENCE();
    30463087    return pbBounceBuf;
    30473088}
     
    31063147    LogFlow(("vmsvgaFIFOLoop: started loop\n"));
    31073148    bool fBadOrDisabledFifo = false;
    3108     uint32_t volatile * const pFIFO = pThis->svga.pFIFOR3;
     3149    uint32_t RT_UNTRUSTED_VOLATILE_GUEST * const pFIFO = pThis->svga.pFIFOR3;
    31093150    while (pThread->enmState == PDMTHREADSTATE_RUNNING)
    31103151    {
     
    31833224        uint32_t const offFifoMax    = pFIFO[SVGA_FIFO_MAX];
    31843225        uint32_t       offCurrentCmd = pFIFO[SVGA_FIFO_STOP];
     3226        RT_UNTRUSTED_NONVOLATILE_COPY_FENCE();
    31853227        if (RT_UNLIKELY(   !VMSVGA_IS_VALID_FIFO_REG(SVGA_FIFO_STOP, offFifoMin)
    31863228                        || offFifoMax <= offFifoMin
     
    31973239            continue;
    31983240        }
     3241        RT_UNTRUSTED_VALIDATED_FENCE();
    31993242        if (RT_UNLIKELY(offCurrentCmd & 3))
    32003243        {
     
    32203263                                                               pbBounceBuf, &cbPayload, pThread, pThis, pSVGAState); \
    32213264                if (RT_UNLIKELY((uintptr_t)(a_PtrVar) < 2)) { if ((uintptr_t)(a_PtrVar) == 1) continue; break; } \
     3265                RT_UNTRUSTED_NONVOLATILE_COPY_FENCE(); \
    32223266            } else do {} while (0)
    32233267/** @def VMSVGAFIFO_GET_MORE_CMD_BUFFER_BREAK
     
    32733317             */
    32743318            SVGAFifoCmdId const enmCmdId = (SVGAFifoCmdId)pFIFO[offCurrentCmd / sizeof(uint32_t)];
     3319            RT_UNTRUSTED_NONVOLATILE_COPY_FENCE();
    32753320            LogFlow(("vmsvgaFIFOLoop: FIFO command (iCmd=0x%x) %s 0x%x\n",
    32763321                     offCurrentCmd / sizeof(uint32_t), vmsvgaFIFOCmdToString(enmCmdId), enmCmdId));
     
    33373382                AssertBreak(pCursor->andMaskDepth <= 32);
    33383383                AssertBreak(pCursor->xorMaskDepth <= 32);
     3384                RT_UNTRUSTED_VALIDATED_FENCE();
    33393385
    33403386                uint32_t cbAndLine = RT_ALIGN_32(pCursor->width * (pCursor->andMaskDepth + (pCursor->andMaskDepth == 15)), 32) / 8;
     
    33643410                /* Check against a reasonable upper limit to prevent integer overflows in the sanity checks below. */
    33653411                AssertBreak(pCursor->height < 2048 && pCursor->width < 2048);
     3412                RT_UNTRUSTED_VALIDATED_FENCE();
    33663413
    33673414                /* Refetch the bitmap data as well. */
     
    33973444                /* Refetch the command buffer with the variable data; undo size increase (ugly) */
    33983445                AssertBreak(pEscape->size < pThis->svga.cbFIFO);
     3446                RT_UNTRUSTED_VALIDATED_FENCE();
    33993447                uint32_t cbCmd = sizeof(SVGAFifoCmdEscape) + pEscape->size;
    34003448                VMSVGAFIFO_GET_MORE_CMD_BUFFER_BREAK(pEscape, SVGAFifoCmdEscape, cbCmd);
     
    34033451                {
    34043452                    AssertBreak(pEscape->size >= sizeof(uint32_t));
     3453                    RT_UNTRUSTED_VALIDATED_FENCE();
    34053454                    uint32_t cmd = *(uint32_t *)(pEscape + 1);
    34063455                    Log(("vmsvgaFIFOLoop: ESCAPE (%x %x) VMWARE cmd=%x\n", pEscape->nsid, pEscape->size, cmd));
     
    34313480                            break;
    34323481                        }
     3482
     3483                        default:
     3484                            Log(("SVGA_CMD_ESCAPE: Unknown vmware escape: %x\n", cmd));
     3485                            break;
    34333486                    }
    34343487                }
     
    34493502                AssertBreak(pCmd->gmrId < pThis->svga.cGMR);
    34503503                AssertBreak(pCmd->numPages <= VMSVGA_MAX_GMR_PAGES);
     3504                RT_UNTRUSTED_VALIDATED_FENCE();
    34513505
    34523506                if (!pCmd->numPages)
     
    34823536                Log(("vmsvgaFIFOLoop: SVGA_CMD_REMAP_GMR2 id=%x flags=%x offset=%x npages=%x\n", pCmd->gmrId, pCmd->flags, pCmd->offsetPages, pCmd->numPages));
    34833537                AssertBreak(pCmd->gmrId < pThis->svga.cGMR);
     3538                RT_UNTRUSTED_VALIDATED_FENCE();
    34843539
    34853540                /* Calculate the size of what comes after next and fetch it. */
     
    35053560                /* Validate current GMR id and size. */
    35063561                AssertBreak(pCmd->gmrId < pThis->svga.cGMR);
     3562                RT_UNTRUSTED_VALIDATED_FENCE();
    35073563                PGMR pGMR = &pSVGAState->paGMR[pCmd->gmrId];
    35083564                AssertBreak(   (uint64_t)pCmd->offsetPages + pCmd->numPages
     
    35363592                            paNewPage64[idxPage++] = (pGMR->paDesc[i].GCPhys + j * X86_PAGE_SIZE) >> X86_PAGE_SHIFT;
    35373593                    AssertBreakStmt(idxPage == pGMR->cbTotal >> X86_PAGE_SHIFT, RTMemFree(paNewPage64));
     3594                    RT_UNTRUSTED_VALIDATED_FENCE();
    35383595                }
    35393596
     
    36633720                AssertBreak(uHeight <= cbVram / cbPitch);
    36643721
     3722                RT_UNTRUSTED_VALIDATED_FENCE();
     3723
    36653724                /** @todo multi monitor support and screen object capabilities.   */
    36663725                pThis->svga.uWidth        = uWidth;
     
    37473806                AssertBreak(offsetDest < cbVram);
    37483807                offsetDest += pThis->svga.uScreenOffset;
     3808
     3809                RT_UNTRUSTED_VALIDATED_FENCE();
    37493810
    37503811                rc = vmsvgaGMRTransfer(pThis, SVGA3D_WRITE_HOST_VRAM, pThis->CTX_SUFF(vram_ptr) + offsetDest, pThis->svga.cbScanline, pSVGAState->GMRFB.ptr, offsetSource, pSVGAState->GMRFB.bytesPerLine, cbCopyWidth, height);
     
    37953856                    &&  (int)enmCmdId <  SVGA_3D_CMD_MAX)
    37963857                {
     3858                    RT_UNTRUSTED_VALIDATED_FENCE();
     3859
    37973860                    /* All 3d commands start with a common header, which defines the size of the command. */
    37983861                    SVGA3dCmdHeader *pHdr;
     
    38073870 */
    38083871#  define VMSVGAFIFO_CHECK_3D_CMD_MIN_SIZE_BREAK(a_cbMin) \
    3809     AssertMsgBreak((a_cbMin) <= pHdr->size, ("size=%#x a_cbMin=%#zx\n", pHdr->size, (size_t)(a_cbMin)))
     3872     do { AssertMsgBreak(pHdr->size >= (a_cbMin), ("size=%#x a_cbMin=%#zx\n", pHdr->size, (size_t)(a_cbMin))); \
     3873          RT_UNTRUSTED_VALIDATED_FENCE(); \
     3874     } while (0)
    38103875                    switch ((int)enmCmdId)
    38113876                    {
     
    40274092                        STAM_REL_COUNTER_INC(&pSVGAState->StatR3Cmd3dClear);
    40284093
    4029                         uint32_t         cRects;
    4030                         cRects = (pHdr->size - sizeof(*pCmd)) / sizeof(SVGA3dRect);
     4094                        uint32_t cRects = (pHdr->size - sizeof(*pCmd)) / sizeof(SVGA3dRect);
    40314095                        rc = vmsvga3dCommandClear(pThis, pCmd->cid, pCmd->clearFlag, pCmd->color, pCmd->depth, pCmd->stencil, cRects, (SVGA3dRect *)(pCmd + 1));
    40324096                        break;
     
    40994163                        STAM_REL_COUNTER_INC(&pSVGAState->StatR3Cmd3dDrawPrimitives);
    41004164
    4101                         uint32_t cVertexDivisor = (pHdr->size - sizeof(*pCmd) - sizeof(SVGA3dVertexDecl) * pCmd->numVertexDecls - sizeof(SVGA3dPrimitiveRange) * pCmd->numRanges) / sizeof(uint32_t);
    4102                         Assert(pCmd->numRanges <= SVGA3D_MAX_DRAW_PRIMITIVE_RANGES);
    4103                         Assert(pCmd->numVertexDecls <= SVGA3D_MAX_VERTEX_ARRAYS);
    4104                         Assert(!cVertexDivisor || cVertexDivisor == pCmd->numVertexDecls);
     4165                        AssertBreak(pCmd->numRanges <= SVGA3D_MAX_DRAW_PRIMITIVE_RANGES);
     4166                        AssertBreak(pCmd->numVertexDecls <= SVGA3D_MAX_VERTEX_ARRAYS);
     4167                        uint32_t const cbRangesAndVertexDecls = pCmd->numVertexDecls * sizeof(SVGA3dVertexDecl)
     4168                                                              + pCmd->numRanges * sizeof(SVGA3dPrimitiveRange);
     4169                        ASSERT_GUEST_BREAK(cbRangesAndVertexDecls <= pHdr->size - sizeof(*pCmd));
     4170
     4171                        uint32_t cVertexDivisor = (pHdr->size - sizeof(*pCmd) - cbRangesAndVertexDecls) / sizeof(uint32_t);
     4172                        AssertBreak(!cVertexDivisor || cVertexDivisor == pCmd->numVertexDecls);
     4173
     4174                        RT_UNTRUSTED_VALIDATED_FENCE();
    41054175
    41064176                        SVGA3dVertexDecl     *pVertexDecl    = (SVGA3dVertexDecl *)(pCmd + 1);
    4107                         SVGA3dPrimitiveRange *pNumRange      = (SVGA3dPrimitiveRange *) (&pVertexDecl[pCmd->numVertexDecls]);
    4108                         SVGA3dVertexDivisor  *pVertexDivisor = (cVertexDivisor) ? (SVGA3dVertexDivisor *)(&pNumRange[pCmd->numRanges]) : NULL;
     4177                        SVGA3dPrimitiveRange *pNumRange      = (SVGA3dPrimitiveRange *)&pVertexDecl[pCmd->numVertexDecls];
     4178                        SVGA3dVertexDivisor  *pVertexDivisor = cVertexDivisor ? (SVGA3dVertexDivisor *)&pNumRange[pCmd->numRanges] : NULL;
    41094179
    41104180                        STAM_PROFILE_START(&pSVGAState->StatR3Cmd3dDrawPrimitivesProf, a);
    4111                         rc = vmsvga3dDrawPrimitives(pThis, pCmd->cid, pCmd->numVertexDecls, pVertexDecl, pCmd->numRanges, pNumRange, cVertexDivisor, pVertexDivisor);
     4181                        rc = vmsvga3dDrawPrimitives(pThis, pCmd->cid, pCmd->numVertexDecls, pVertexDecl, pCmd->numRanges,
     4182                                                    pNumRange, cVertexDivisor, pVertexDivisor);
    41124183                        STAM_PROFILE_STOP(&pSVGAState->StatR3Cmd3dDrawPrimitivesProf, a);
    41134184                        break;
     
    43134384    {
    43144385        AssertReturn(src.gmrId < pThis->svga.cGMR, VERR_INVALID_PARAMETER);
     4386        RT_UNTRUSTED_VALIDATED_FENCE();
    43154387        pGMR = &pSVGAState->paGMR[src.gmrId];
    43164388        cbGmrTotal = pGMR->cbTotal;
     
    43564428                     src.gmrId, src.offset, offSrc, cbSrcPitch, cHeight, cbWidth, cbGmrTotal),
    43574429                    VERR_INVALID_PARAMETER);
     4430
     4431    RT_UNTRUSTED_VALIDATED_FENCE();
    43584432
    43594433    /* Shortcut for the framebuffer. */
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp

    r69904 r71686  
    62086208    Log(("vmsvga3dDrawPrimitives cid=%x numVertexDecls=%d numRanges=%d, cVertexDivisor=%d\n", cid, numVertexDecls, numRanges, cVertexDivisor));
    62096209
     6210    /* Caller already check these, but it cannot hurt to check again... */
    62106211    AssertReturn(numVertexDecls && numVertexDecls <= SVGA3D_MAX_VERTEX_ARRAYS, VERR_INVALID_PARAMETER);
    62116212    AssertReturn(numRanges && numRanges <= SVGA3D_MAX_DRAW_PRIMITIVE_RANGES, VERR_INVALID_PARAMETER);
    62126213    AssertReturn(!cVertexDivisor || cVertexDivisor == numVertexDecls, VERR_INVALID_PARAMETER);
     6214
    62136215    /** @todo Non-zero cVertexDivisor */
    62146216    Assert(!cVertexDivisor);
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp

    r69965 r71686  
    52845284    LogFunc(("%x numVertexDecls=%d numRanges=%d, cVertexDivisor=%d\n", cid, numVertexDecls, numRanges, cVertexDivisor));
    52855285
     5286    /* Caller already check these, but it cannot hurt to check again... */
    52865287    AssertReturn(numVertexDecls && numVertexDecls <= SVGA3D_MAX_VERTEX_ARRAYS, VERR_INVALID_PARAMETER);
    52875288    AssertReturn(numRanges && numRanges <= SVGA3D_MAX_DRAW_PRIMITIVE_RANGES, VERR_INVALID_PARAMETER);
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