VirtualBox

Changeset 39603 in vbox for trunk/src/VBox/Devices/Graphics


Ignore:
Timestamp:
Dec 14, 2011 11:12:56 AM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
75377
Message:

crHgsmi: cleanup

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Graphics/DevVGA.h

    r36899 r39603  
    512512int vboxVDMAConstruct(PVGASTATE pVGAState, uint32_t cPipeElements);
    513513int vboxVDMADestruct(PVBOXVDMAHOST pVdma);
    514 void vboxVDMAControl(PVBOXVDMAHOST pVdma, PVBOXVDMA_CTL pCmd);
    515 void vboxVDMACommand(PVBOXVDMAHOST pVdma, PVBOXVDMACBUF_DR pCmd);
     514void vboxVDMAControl(PVBOXVDMAHOST pVdma, PVBOXVDMA_CTL pCmd, uint32_t cbCmd);
     515void vboxVDMACommand(PVBOXVDMAHOST pVdma, PVBOXVDMACBUF_DR pCmd, uint32_t cbCmd);
    516516int vboxVDMASaveStateExecPrep(struct VBOXVDMAHOST *pVdma, PSSMHANDLE pSSM);
    517517int vboxVDMASaveStateExecDone(struct VBOXVDMAHOST *pVdma, PSSMHANDLE pSSM);
  • trunk/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp

    r38514 r39603  
    16571657        case VBVA_VDMA_CMD:
    16581658        {
     1659            if (cbBuffer < VBoxSHGSMIBufferHeaderSize() + sizeof (VBOXVDMACBUF_DR))
     1660            {
     1661                rc = VERR_INVALID_PARAMETER;
     1662                break;
     1663            }
    16591664            PVBOXVDMACBUF_DR pCmd = (PVBOXVDMACBUF_DR)VBoxSHGSMIBufferData ((PVBOXSHGSMIHEADER)pvBuffer);
    1660             vboxVDMACommand(pVGAState->pVdma, pCmd);
     1665            vboxVDMACommand(pVGAState->pVdma, pCmd, cbBuffer - VBoxSHGSMIBufferHeaderSize());
    16611666            rc = VINF_SUCCESS;
    16621667            break;
     
    16641669        case VBVA_VDMA_CTL:
    16651670        {
     1671            if (cbBuffer < VBoxSHGSMIBufferHeaderSize() + sizeof (VBOXVDMA_CTL))
     1672            {
     1673                rc = VERR_INVALID_PARAMETER;
     1674                break;
     1675            }
    16661676            PVBOXVDMA_CTL pCmd = (PVBOXVDMA_CTL)VBoxSHGSMIBufferData ((PVBOXSHGSMIHEADER)pvBuffer);
    1667             vboxVDMAControl(pVGAState->pVdma, pCmd);
     1677            vboxVDMAControl(pVGAState->pVdma, pCmd, cbBuffer - VBoxSHGSMIBufferHeaderSize());
    16681678            rc = VINF_SUCCESS;
    16691679            break;
  • trunk/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp

    r37490 r39603  
    157157
    158158
    159 static int vboxVDMACrCtlPostAsync (PVGASTATE pVGAState, PVBOXVDMACMD_CHROMIUM_CTL pCmd, PFNVBOXVDMACRCTL_CALLBACK pfnCompletion, void *pvCompletion)
     159static int vboxVDMACrCtlPostAsync (PVGASTATE pVGAState, PVBOXVDMACMD_CHROMIUM_CTL pCmd, uint32_t cbCmd, PFNVBOXVDMACRCTL_CALLBACK pfnCompletion, void *pvCompletion)
    160160{
    161161    if (pVGAState->pDrv->pfnCrHgsmiControlProcess)
     
    164164        pHdr->pfnCompletion = pfnCompletion;
    165165        pHdr->pvCompletion = pvCompletion;
    166         pVGAState->pDrv->pfnCrHgsmiControlProcess(pVGAState->pDrv, pCmd);
     166        pVGAState->pDrv->pfnCrHgsmiControlProcess(pVGAState->pDrv, pCmd, cbCmd);
    167167        return VINF_SUCCESS;
    168168    }
     
    173173}
    174174
    175 static int vboxVDMACrCtlPost(PVGASTATE pVGAState, PVBOXVDMACMD_CHROMIUM_CTL pCmd)
     175static int vboxVDMACrCtlPost(PVGASTATE pVGAState, PVBOXVDMACMD_CHROMIUM_CTL pCmd, uint32_t cbCmd)
    176176{
    177177    RTSEMEVENT hComplEvent;
     
    180180    if(RT_SUCCESS(rc))
    181181    {
    182         rc = vboxVDMACrCtlPostAsync (pVGAState, pCmd, vboxVDMACrCtlCbSetEvent, (void*)hComplEvent);
     182        rc = vboxVDMACrCtlPostAsync (pVGAState, pCmd, cbCmd, vboxVDMACrCtlCbSetEvent, (void*)hComplEvent);
    183183#ifdef DEBUG_misha
    184184        AssertRC(rc);
     
    209209    {
    210210        PVGASTATE pVGAState = pVdma->pVGAState;
    211         pCmd->pvRamBase = pVGAState->vram_ptrR3;
    212         int rc = vboxVDMACrCtlPost(pVGAState, &pCmd->Hdr);
     211        pCmd->pvVRamBase = pVGAState->vram_ptrR3;
     212        pCmd->cbVRam = pVGAState->vram_size;
     213        int rc = vboxVDMACrCtlPost(pVGAState, &pCmd->Hdr, sizeof (*pCmd));
    213214        AssertRC(rc);
    214215        if (RT_SUCCESS(rc))
     
    225226
    226227/* check if this is external cmd to be passed to chromium backend */
    227 static bool vboxVDMACmdCheckCrCmd(struct VBOXVDMAHOST *pVdma, PVBOXVDMACBUF_DR pCmd)
    228 {
    229     PVBOXVDMACMD pDmaCmd;
     228static int vboxVDMACmdCheckCrCmd(struct VBOXVDMAHOST *pVdma, PVBOXVDMACBUF_DR pCmdDr, uint32_t cbCmdDr)
     229{
     230    PVBOXVDMACMD pDmaCmd = NULL;
     231    uint32_t cbDmaCmd = 0;
    230232    uint8_t * pvRam = pVdma->pVGAState->vram_ptrR3;
    231     bool bCompleted = false;
    232 
    233     if (pCmd->fFlags & VBOXVDMACBUF_FLAG_BUF_FOLLOWS_DR)
    234         pDmaCmd = VBOXVDMACBUF_DR_TAIL(pCmd, VBOXVDMACMD);
    235     else
    236         pDmaCmd = NULL;
     233    int rc = VINF_NOT_SUPPORTED;
     234
     235    if (pCmdDr->fFlags & VBOXVDMACBUF_FLAG_BUF_FOLLOWS_DR)
     236    {
     237        if (cbCmdDr < sizeof (*pCmdDr) + VBOXVDMACMD_HEADER_SIZE())
     238        {
     239            AssertMsgFailed(("invalid buffer data!"));
     240            return VERR_INVALID_PARAMETER;
     241        }
     242
     243        cbDmaCmd = pCmdDr->cbBuf;
     244        if (cbDmaCmd < cbCmdDr - sizeof (*pCmdDr) - VBOXVDMACMD_HEADER_SIZE())
     245        {
     246            AssertMsgFailed(("invalid command buffer data!"));
     247            return VERR_INVALID_PARAMETER;
     248        }
     249
     250        pDmaCmd = VBOXVDMACBUF_DR_TAIL(pCmdDr, VBOXVDMACMD);
     251    }
    237252
    238253    if (pDmaCmd)
    239254    {
    240         uint32_t cbCmd = pCmd->cbBuf;
    241         Assert(cbCmd >= VBOXVDMACMD_HEADER_SIZE());
    242 
    243         if (cbCmd >= VBOXVDMACMD_HEADER_SIZE())
    244         {
    245             switch (pDmaCmd->enmType)
    246             {
    247                 case VBOXVDMACMD_TYPE_CHROMIUM_CMD:
     255        Assert(cbDmaCmd >= VBOXVDMACMD_HEADER_SIZE());
     256        uint32_t cbBody = VBOXVDMACMD_BODY_SIZE(cbDmaCmd);
     257
     258        switch (pDmaCmd->enmType)
     259        {
     260            case VBOXVDMACMD_TYPE_CHROMIUM_CMD:
     261            {
     262                PVBOXVDMACMD_CHROMIUM_CMD pCrCmd = VBOXVDMACMD_BODY(pDmaCmd, VBOXVDMACMD_CHROMIUM_CMD);
     263                if (cbBody < sizeof (*pCrCmd))
    248264                {
    249                     PVBOXVDMACMD_CHROMIUM_CMD pCrCmd = VBOXVDMACMD_BODY(pDmaCmd, VBOXVDMACMD_CHROMIUM_CMD);
    250                     PVGASTATE pVGAState = pVdma->pVGAState;
    251                     bCompleted = true;
    252                     if (pVGAState->pDrv->pfnCrHgsmiCommandProcess)
    253                     {
    254                         VBoxSHGSMICommandMarkAsynchCompletion(pCmd);
    255                         pVGAState->pDrv->pfnCrHgsmiCommandProcess(pVGAState->pDrv, pCrCmd);
    256                         break;
    257                     }
    258                     else
    259                     {
    260                         Assert(0);
    261                     }
    262 
    263                     int tmpRc = VBoxSHGSMICommandComplete (pVdma->pHgsmi, pCmd);
    264                     AssertRC(tmpRc);
    265 //                uint32_t cBufs = pCrCmd->cBuffers;
    266 //                for (uint32_t i = 0; i < cBufs; ++i)
    267 //                {
    268 //                    PVBOXVDMACMD_CHROMIUM_BUFFER pBuf = &pCrCmd->aBuffers[i];
    269 //                    void *pvBuffer = pvRam + pBuf->offBuffer;
    270 //                    uint32_t cbBuffer = pBuf->cbBuffer;
    271 //                }
     265                    AssertMsgFailed(("invalid chromium command buffer size!"));
     266                    return VERR_INVALID_PARAMETER;
     267                }
     268                PVGASTATE pVGAState = pVdma->pVGAState;
     269                rc = VINF_SUCCESS;
     270                if (pVGAState->pDrv->pfnCrHgsmiCommandProcess)
     271                {
     272                    VBoxSHGSMICommandMarkAsynchCompletion(pCmdDr);
     273                    pVGAState->pDrv->pfnCrHgsmiCommandProcess(pVGAState->pDrv, pCrCmd, cbBody);
    272274                    break;
    273275                }
    274                 case VBOXVDMACMD_TYPE_DMA_BPB_TRANSFER:
     276                else
    275277                {
    276                     PVBOXVDMACMD_DMA_BPB_TRANSFER pTransfer = VBOXVDMACMD_BODY(pDmaCmd, VBOXVDMACMD_DMA_BPB_TRANSFER);
    277                     int rc = vboxVDMACmdExecBpbTransfer(pVdma, pTransfer, sizeof (*pTransfer));
     278                    Assert(0);
     279                }
     280
     281                int tmpRc = VBoxSHGSMICommandComplete (pVdma->pHgsmi, pCmdDr);
     282                AssertRC(tmpRc);
     283                break;
     284            }
     285            case VBOXVDMACMD_TYPE_DMA_BPB_TRANSFER:
     286            {
     287                PVBOXVDMACMD_DMA_BPB_TRANSFER pTransfer = VBOXVDMACMD_BODY(pDmaCmd, VBOXVDMACMD_DMA_BPB_TRANSFER);
     288                if (cbBody < sizeof (*pTransfer))
     289                {
     290                    AssertMsgFailed(("invalid bpb transfer buffer size!"));
     291                    return VERR_INVALID_PARAMETER;
     292                }
     293
     294                rc = vboxVDMACmdExecBpbTransfer(pVdma, pTransfer, sizeof (*pTransfer));
     295                AssertRC(rc);
     296                if (RT_SUCCESS(rc))
     297                {
     298                    pCmdDr->rc = VINF_SUCCESS;
     299                    rc = VBoxSHGSMICommandComplete (pVdma->pHgsmi, pCmdDr);
    278300                    AssertRC(rc);
    279                     if (RT_SUCCESS(rc))
    280                     {
    281                         pCmd->rc = VINF_SUCCESS;
    282                         rc = VBoxSHGSMICommandComplete (pVdma->pHgsmi, pCmd);
    283                         AssertRC(rc);
    284                         bCompleted = true;
    285                     }
    286                     break;
     301                    rc = VINF_SUCCESS;
    287302                }
    288                 default:
    289                     break;
    290             }
    291         }
    292     }
    293     return bCompleted;
     303                break;
     304            }
     305            default:
     306                break;
     307        }
     308    }
     309    return rc;
    294310}
    295311
     
    920936#endif
    921937
    922 static void vboxVDMACommandProcess(PVBOXVDMAHOST pVdma, PVBOXVDMACBUF_DR pCmd)
     938static void vboxVDMACommandProcess(PVBOXVDMAHOST pVdma, PVBOXVDMACBUF_DR pCmd, uint32_t cbCmd)
    923939{
    924940    PHGSMIINSTANCE pHgsmi = pVdma->pHgsmi;
     
    11711187    if (pCmd)
    11721188    {
    1173         int rc = vboxVDMACrCtlPost(pVGAState, pCmd);
     1189        int rc = vboxVDMACrCtlPost(pVGAState, pCmd, sizeof (*pCmd));
    11741190        AssertRC(rc);
    11751191        if (RT_SUCCESS(rc))
     
    11951211    if (pCmd)
    11961212    {
    1197         int rc = vboxVDMACrCtlPost(pVGAState, pCmd);
     1213        int rc = vboxVDMACrCtlPost(pVGAState, pCmd, sizeof (*pCmd));
    11981214        AssertRC(rc);
    11991215        if (RT_SUCCESS(rc))
     
    12111227
    12121228
    1213 void vboxVDMAControl(struct VBOXVDMAHOST *pVdma, PVBOXVDMA_CTL pCmd)
     1229void vboxVDMAControl(struct VBOXVDMAHOST *pVdma, PVBOXVDMA_CTL pCmd, uint32_t cbCmd)
    12141230{
    12151231#if 1
     
    12641280}
    12651281
    1266 void vboxVDMACommand(struct VBOXVDMAHOST *pVdma, PVBOXVDMACBUF_DR pCmd)
    1267 {
     1282void vboxVDMACommand(struct VBOXVDMAHOST *pVdma, PVBOXVDMACBUF_DR pCmd, uint32_t cbCmd)
     1283{
     1284    int rc = VERR_NOT_IMPLEMENTED;
     1285
    12681286#ifdef VBOX_WITH_CRHGSMI
    12691287    /* chromium commands are processed by crhomium hgcm thread independently from our internal cmd processing pipeline
    12701288     * this is why we process them specially */
    1271     if (vboxVDMACmdCheckCrCmd(pVdma, pCmd))
     1289    rc = vboxVDMACmdCheckCrCmd(pVdma, pCmd, cbCmd);
     1290    if (rc == VINF_SUCCESS)
    12721291        return;
     1292
     1293    if (RT_FAILURE(rc))
     1294    {
     1295        pCmd->rc = rc;
     1296        rc = VBoxSHGSMICommandComplete (pVdma->pHgsmi, pCmd);
     1297        AssertRC(rc);
     1298        return;
     1299    }
    12731300#endif
    12741301
    12751302#ifndef VBOX_VDMA_WITH_WORKERTHREAD
    1276     vboxVDMACommandProcess(pVdma, pCmd);
     1303    vboxVDMACommandProcess(pVdma, pCmd, cbCmd);
    12771304#else
    1278     int rc = VERR_NOT_IMPLEMENTED;
    12791305
    12801306# ifdef DEBUG_misha
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