VirtualBox

Changeset 51042 in vbox


Ignore:
Timestamp:
Apr 10, 2014 8:05:24 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
93262
Message:

wddm/DevVGA: complex command submission; bugfixes

Location:
trunk
Files:
5 edited

Legend:

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

    r50958 r51042  
    15831583/* actual command is stored in guest system memory */
    15841584#define VBOXCMDVBVA_OPTYPE_SYSMEMCMD                    8
     1585/* complex command - i.e. can contain multiple commands
     1586 * i.e. the VBOXCMDVBVA_OPTYPE_COMPLEXCMD VBOXCMDVBVA_HDR is followed
     1587 * by one or more VBOXCMDVBVA_HDR commands.
     1588 * Each command's size is specified in it's VBOXCMDVBVA_HDR's u32FenceID field */
     1589#define VBOXCMDVBVA_OPTYPE_COMPLEXCMD                   9
    15851590
    15861591/* nop - is a one-bit command. The buffer size to skip is determined by VBVA buffer size */
     
    16291634    } u;
    16301635    /* DXGK DDI fence ID */
    1631     volatile uint32_t u32FenceID;
     1636    uint32_t u32FenceID;
    16321637} VBOXCMDVBVA_HDR;
    16331638
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVbva.cpp

    r51036 r51042  
    930930}
    931931
    932 int VBoxCmdVbvaSubmit(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, struct VBOXCMDVBVA_HDR *pCmd, uint32_t u32FenceID, uint32_t cbCmd)
    933 {
    934     int rc = VINF_SUCCESS;
    935 
    936     Assert(u32FenceID);
     932void VBoxCmdVbvaSubmitUnlock(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, VBOXCMDVBVA_HDR* pCmd, uint32_t u32FenceID)
     933{
     934    if (u32FenceID)
     935        pVbva->u32FenceSubmitted = u32FenceID;
     936    else
     937        WARN(("no cmd fence specified"));
    937938
    938939    pCmd->u8State = VBOXCMDVBVA_STATE_SUBMITTED;
    939 #ifdef DEBUG_misha
    940     Assert(u32FenceID == pVbva->u32FenceSubmitted + 1);
    941 #endif
    942     if (VBoxVBVAExGetSize(&pVbva->Vbva) < cbCmd)
    943     {
    944         WARN(("buffer does not fit the vbva buffer, we do not support splitting buffers"));
    945         return VERR_NOT_SUPPORTED;
    946     }
    947 
    948     if (!VBoxVBVAExBufferBeginUpdate(&pVbva->Vbva, &VBoxCommonFromDeviceExt(pDevExt)->guestCtx))
    949     {
    950         WARN(("VBoxVBVAExBufferBeginUpdate failed!"));
    951         return VERR_GENERAL_FAILURE;
    952     }
    953 
    954     void* pvBuffer = VBoxVBVAExAllocContiguous(&pVbva->Vbva, &VBoxCommonFromDeviceExt(pDevExt)->guestCtx, cbCmd);
    955     if (!pvBuffer)
    956     {
    957         WARN(("failed to allocate contiguous buffer, trying nopping the tail"));
    958         uint32_t cbTail = VBoxVBVAExGetFreeTail(&pVbva->Vbva);
    959         if (!cbTail)
    960         {
    961             WARN(("this is not a free tail case, cbTail is NULL"));
    962             return VERR_BUFFER_OVERFLOW;
    963         }
    964 
    965         Assert(cbTail < cbCmd);
    966 
    967         pvBuffer = VBoxVBVAExAllocContiguous(&pVbva->Vbva, &VBoxCommonFromDeviceExt(pDevExt)->guestCtx, cbTail);
    968 
    969         Assert(pvBuffer);
    970 
    971         *((uint8_t*)pvBuffer) = VBOXCMDVBVA_OPTYPE_NOP;
    972 
    973         VBoxVBVAExBufferEndUpdate(&pVbva->Vbva);
    974 
    975         if (!VBoxVBVAExBufferBeginUpdate(&pVbva->Vbva, &VBoxCommonFromDeviceExt(pDevExt)->guestCtx))
    976         {
    977             WARN(("VBoxVBVAExBufferBeginUpdate 2 failed!"));
    978             return VERR_GENERAL_FAILURE;
    979         }
    980 
    981         pvBuffer = VBoxVBVAExAllocContiguous(&pVbva->Vbva, &VBoxCommonFromDeviceExt(pDevExt)->guestCtx, cbCmd);
    982         if (!pvBuffer)
    983         {
    984             WARN(("failed to allocate contiguous buffer, failing"));
    985             return VERR_GENERAL_FAILURE;
    986         }
    987     }
    988 
    989     pVbva->u32FenceSubmitted = u32FenceID;
    990 
    991     Assert(pvBuffer);
    992 
    993     memcpy(pvBuffer, pCmd, cbCmd);
    994 
    995     ((VBOXCMDVBVA_HDR*)pvBuffer)->u32FenceID = u32FenceID;
     940
     941    pCmd->u32FenceID = u32FenceID;
    996942
    997943    VBoxVBVAExBufferEndUpdate(&pVbva->Vbva);
     
    1008954        {
    1009955            WARN(("VBoxHGSMIBufferAlloc failed\n"));
    1010             return VERR_OUT_OF_RESOURCES;
     956            return;
    1011957        }
    1012958
     
    1017963        VBoxHGSMIBufferFree(pCtx, pSubmit);
    1018964    }
     965}
     966
     967VBOXCMDVBVA_HDR* VBoxCmdVbvaSubmitLock(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, uint32_t cbCmd)
     968{
     969    if (VBoxVBVAExGetSize(&pVbva->Vbva) < cbCmd)
     970    {
     971        WARN(("buffer does not fit the vbva buffer, we do not support splitting buffers"));
     972        NULL;
     973    }
     974
     975    if (!VBoxVBVAExBufferBeginUpdate(&pVbva->Vbva, &VBoxCommonFromDeviceExt(pDevExt)->guestCtx))
     976    {
     977        WARN(("VBoxVBVAExBufferBeginUpdate failed!"));
     978        return NULL;
     979    }
     980
     981    void* pvBuffer = VBoxVBVAExAllocContiguous(&pVbva->Vbva, &VBoxCommonFromDeviceExt(pDevExt)->guestCtx, cbCmd);
     982    if (!pvBuffer)
     983    {
     984        WARN(("failed to allocate contiguous buffer, trying nopping the tail"));
     985        uint32_t cbTail = VBoxVBVAExGetFreeTail(&pVbva->Vbva);
     986        if (!cbTail)
     987        {
     988            WARN(("this is not a free tail case, cbTail is NULL"));
     989            return NULL;
     990        }
     991
     992        Assert(cbTail < cbCmd);
     993
     994        pvBuffer = VBoxVBVAExAllocContiguous(&pVbva->Vbva, &VBoxCommonFromDeviceExt(pDevExt)->guestCtx, cbTail);
     995
     996        Assert(pvBuffer);
     997
     998        *((uint8_t*)pvBuffer) = VBOXCMDVBVA_OPTYPE_NOP;
     999
     1000        VBoxVBVAExBufferEndUpdate(&pVbva->Vbva);
     1001
     1002        if (!VBoxVBVAExBufferBeginUpdate(&pVbva->Vbva, &VBoxCommonFromDeviceExt(pDevExt)->guestCtx))
     1003        {
     1004            WARN(("VBoxVBVAExBufferBeginUpdate 2 failed!"));
     1005            return NULL;
     1006        }
     1007
     1008        pvBuffer = VBoxVBVAExAllocContiguous(&pVbva->Vbva, &VBoxCommonFromDeviceExt(pDevExt)->guestCtx, cbCmd);
     1009        if (!pvBuffer)
     1010        {
     1011            WARN(("failed to allocate contiguous buffer, failing"));
     1012            return NULL;
     1013        }
     1014    }
     1015
     1016    Assert(pvBuffer);
     1017
     1018    return (VBOXCMDVBVA_HDR*)pvBuffer;
     1019}
     1020
     1021int VBoxCmdVbvaSubmit(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, struct VBOXCMDVBVA_HDR *pCmd, uint32_t u32FenceID, uint32_t cbCmd)
     1022{
     1023    VBOXCMDVBVA_HDR* pHdr = VBoxCmdVbvaSubmitLock(pDevExt, pVbva, cbCmd);
     1024
     1025    if (!pHdr)
     1026    {
     1027        WARN(("VBoxCmdVbvaSubmitLock failed"));
     1028        return VERR_GENERAL_FAILURE;
     1029    }
     1030
     1031    memcpy(pHdr, pCmd, cbCmd);
     1032
     1033    VBoxCmdVbvaSubmitUnlock(pDevExt, pVbva, pCmd, u32FenceID);
    10191034
    10201035    return VINF_SUCCESS;
     
    10831098        if (u8State == VBOXCMDVBVA_STATE_IN_PROGRESS)
    10841099        {
    1085             Assert(u32FenceID);
    10861100            if (!u32FenceID)
     1101            {
     1102                WARN(("fence is NULL"));
    10871103                continue;
    1088 
    1089 #ifdef DEBUG_misha
    1090             Assert(u32FenceID == pVbva->u32FenceCompleted + 1);
    1091 #endif
     1104            }
     1105
    10921106            pVbva->u32FenceCompleted = u32FenceID;
    10931107        }
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVbva.h

    r51036 r51042  
    213213int VBoxCmdVbvaCreate(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, ULONG offBuffer, ULONG cbBuffer);
    214214int VBoxCmdVbvaSubmit(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, struct VBOXCMDVBVA_HDR *pCmd, uint32_t u32FenceID, uint32_t cbCmd);
     215void VBoxCmdVbvaSubmitUnlock(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, VBOXCMDVBVA_HDR* pCmd, uint32_t u32FenceID);
     216VBOXCMDVBVA_HDR* VBoxCmdVbvaSubmitLock(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, uint32_t cbCmd);
    215217bool VBoxCmdVbvaPreempt(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, uint32_t u32FenceID);
    216218uint32_t VBoxCmdVbvaCheckCompleted(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, bool fPingHost);
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp

    r51036 r51042  
    31113111    VBOXCMDVBVA_HDR *pHdr;
    31123112    VBOXCMDVBVA_HDR NopCmd;
     3113    uint32_t cbCurCmd, cbCurDma;
    31133114    if (cbCmd < sizeof (VBOXCMDVBVA_HDR))
    31143115    {
    3115         if (cbCmd)
     3116        if (cbCmd || cbDma)
    31163117        {
    31173118            WARN(("invalid command data"));
    31183119            return STATUS_INVALID_PARAMETER;
    31193120        }
     3121        Assert(!cbDma);
    31203122        NopCmd.u8OpCode = VBOXCMDVBVA_OPTYPE_NOPCMD;
    31213123        NopCmd.u8Flags = 0;
     
    31243126        cbCmd = sizeof (VBOXCMDVBVA_HDR);
    31253127        pHdr = &NopCmd;
     3128        cbCurCmd = sizeof (VBOXCMDVBVA_HDR);
     3129        cbCurDma = 0;
    31263130    }
    31273131    else
    31283132    {
    31293133        pHdr = (VBOXCMDVBVA_HDR*)(((uint8_t*)pSubmitCommand->pDmaBufferPrivateData) + pSubmitCommand->DmaBufferPrivateDataSubmissionStartOffset);
    3130         if (cbCmd != pHdr->u32FenceID)
    3131         {
    3132             WARN(("partial submission start!"));
    3133             cbCmd = pHdr->u32FenceID;
    3134         }
    3135     }
    3136 
    3137     switch (pHdr->u8OpCode)
    3138     {
    3139         case VBOXCMDVBVA_OPTYPE_SYSMEMCMD:
    3140         {
    3141             VBOXCMDVBVA_SYSMEMCMD *pSysMem = (VBOXCMDVBVA_SYSMEMCMD*)pHdr;
    3142             if (pSubmitCommand->DmaBufferPhysicalAddress.QuadPart & PAGE_OFFSET_MASK)
    3143             {
    3144                 WARN(("command should be page aligned for now"));
    3145                 return STATUS_INVALID_PARAMETER;
    3146             }
    3147             pSysMem->phCmd = (VBOXCMDVBVAPHADDR)(pSubmitCommand->DmaBufferPhysicalAddress.QuadPart + pSubmitCommand->DmaBufferSubmissionStartOffset);
     3134        cbCurCmd = pHdr->u32FenceID & 0xff;
     3135        cbCurDma = pHdr->u32FenceID >> 16;
     3136    }
     3137
     3138
     3139    VBOXCMDVBVA_HDR *pDstHdr, *pCurDstCmd;
     3140    if (cbCmd != cbCurCmd || cbCurDma != cbDma)
     3141    {
     3142        if (cbCmd < cbCurCmd || cbDma < cbCurDma)
     3143        {
     3144            WARN(("incorrect buffer size"));
     3145            return STATUS_INVALID_PARAMETER;
     3146        }
     3147
     3148        pDstHdr = VBoxCmdVbvaSubmitLock(pDevExt, &pDevExt->CmdVbva, cbCmd + sizeof (VBOXCMDVBVA_HDR));
     3149        if (!pDstHdr)
     3150        {
     3151            WARN(("VBoxCmdVbvaSubmitLock failed"));
     3152            return STATUS_UNSUCCESSFUL;
     3153        }
     3154
     3155        pDstHdr->u8OpCode = VBOXCMDVBVA_OPTYPE_COMPLEXCMD;
     3156        pDstHdr->u8Flags = 0;
     3157        pDstHdr->u.u8PrimaryID = 0;
     3158
     3159        pCurDstCmd = pDstHdr + 1;
     3160    }
     3161    else
     3162    {
     3163        pDstHdr = VBoxCmdVbvaSubmitLock(pDevExt, &pDevExt->CmdVbva, cbCmd);
     3164        if (!pDstHdr)
     3165        {
     3166            WARN(("VBoxCmdVbvaSubmitLock failed"));
     3167            return STATUS_UNSUCCESSFUL;
     3168        }
     3169        pCurDstCmd = pDstHdr;
     3170    }
     3171
     3172    PHYSICAL_ADDRESS phAddr;
     3173    phAddr.QuadPart = pSubmitCommand->DmaBufferPhysicalAddress.QuadPart + pSubmitCommand->DmaBufferSubmissionStartOffset;
     3174    NTSTATUS Status = STATUS_SUCCESS;
     3175    for (;;)
     3176    {
     3177        switch (pHdr->u8OpCode)
     3178        {
     3179            case VBOXCMDVBVA_OPTYPE_SYSMEMCMD:
     3180            {
     3181                VBOXCMDVBVA_SYSMEMCMD *pSysMem = (VBOXCMDVBVA_SYSMEMCMD*)pHdr;
     3182                if (pSubmitCommand->DmaBufferPhysicalAddress.QuadPart & PAGE_OFFSET_MASK)
     3183                {
     3184                    WARN(("command should be page aligned for now"));
     3185                    return STATUS_INVALID_PARAMETER;
     3186                }
     3187                pSysMem->phCmd = (VBOXCMDVBVAPHADDR)(pSubmitCommand->DmaBufferPhysicalAddress.QuadPart + pSubmitCommand->DmaBufferSubmissionStartOffset);
    31483188#ifdef DEBUG
    3149             {
    3150                 uint32_t cbRealDmaCmd = (pSysMem->Hdr.u8Flags | (pSysMem->Hdr.u.u8PrimaryID << 8));
    3151                 Assert(cbRealDmaCmd >= cbDma);
    3152                 if (cbDma < cbRealDmaCmd)
    3153                     WARN(("parrtial sysmem transfer"));
    3154             }
    3155 #endif
     3189                {
     3190                    uint32_t cbRealDmaCmd = (pSysMem->Hdr.u8Flags | (pSysMem->Hdr.u.u8PrimaryID << 8));
     3191                    Assert(cbRealDmaCmd >= cbDma);
     3192                    if (cbDma < cbRealDmaCmd)
     3193                        WARN(("parrtial sysmem transfer"));
     3194                }
     3195#endif
     3196                break;
     3197            }
     3198            default:
     3199                break;
     3200        }
     3201
     3202        memcpy(pCurDstCmd, pHdr, cbCurCmd);
     3203        pCurDstCmd->u32FenceID = cbCurCmd;
     3204
     3205        phAddr.QuadPart += cbCurDma;
     3206        pHdr = (VBOXCMDVBVA_HDR*)(((uint8_t*)pHdr) + cbCurCmd);
     3207        pCurDstCmd = (VBOXCMDVBVA_HDR*)(((uint8_t*)pCurDstCmd) + cbCurCmd);
     3208        cbCmd -= cbCurCmd;
     3209        cbDma -= cbCurDma;
     3210        if (!cbCmd)
     3211        {
     3212            if (cbDma)
     3213            {
     3214                WARN(("invalid param"));
     3215                Status = STATUS_INVALID_PARAMETER;
     3216            }
    31563217            break;
    31573218        }
    3158         default:
     3219
     3220        if (cbCmd < sizeof (VBOXCMDVBVA_HDR))
     3221        {
     3222            WARN(("invalid param"));
     3223            Status = STATUS_INVALID_PARAMETER;
    31593224            break;
    3160     }
    3161 
    3162     int rc = VBoxCmdVbvaSubmit(pDevExt, &pDevExt->CmdVbva, pHdr, pSubmitCommand->SubmissionFenceId, cbCmd);
    3163     if (RT_SUCCESS(rc))
    3164         return STATUS_SUCCESS;
    3165 
    3166     WARN(("VBoxCmdVbvaSubmit failed rc %d", rc));
    3167     return STATUS_UNSUCCESSFUL;
     3225        }
     3226
     3227        cbCurCmd = pHdr->u32FenceID & 0xff;
     3228        cbCurDma = pHdr->u32FenceID >> 16;
     3229
     3230        if (cbCmd < cbCurCmd)
     3231        {
     3232            WARN(("invalid param"));
     3233            Status = STATUS_INVALID_PARAMETER;
     3234            break;
     3235        }
     3236
     3237        if (cbDma < cbCurDma)
     3238        {
     3239            WARN(("invalid param"));
     3240            Status = STATUS_INVALID_PARAMETER;
     3241            break;
     3242        }
     3243    }
     3244
     3245    uint32_t u32FenceId = pSubmitCommand->SubmissionFenceId;
     3246
     3247    if (!NT_SUCCESS(Status))
     3248    {
     3249        /* nop the entire command on failure */
     3250        pDstHdr->u8OpCode = VBOXCMDVBVA_OPTYPE_NOPCMD;
     3251        pDstHdr->u8Flags = 0;
     3252        pDstHdr->u.i8Result = 0;
     3253        u32FenceId = 0;
     3254    }
     3255
     3256    VBoxCmdVbvaSubmitUnlock(pDevExt, &pDevExt->CmdVbva, pDstHdr, u32FenceId);
     3257
     3258    return Status;
    31683259}
    31693260#endif
     
    34553546            if (pAlloc->AllocData.hostID)
    34563547            {
     3548                VBOXCMDVBVA_HDR *pHdr = (VBOXCMDVBVA_HDR*)pBuildPagingBuffer->pDmaBufferPrivateData;
     3549
    34573550                cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
     3551                cbPrivateData = sizeof (*pHdr);
     3552
     3553                pHdr->u8OpCode = VBOXCMDVBVA_OPTYPE_NOPCMD;
     3554                pHdr->u8Flags = 0;
     3555                pHdr->u.u8PrimaryID = 0;
     3556                pHdr->u8State = VBOXCMDVBVA_STATE_SUBMITTED;
     3557                pHdr->u32FenceID = cbPrivateData | (cbBuffer << 16);
    34583558                break;
    34593559            }
     
    34713571            pPaging->Hdr.u8Flags = 0;
    34723572            pPaging->Hdr.u8State = VBOXCMDVBVA_STATE_SUBMITTED;
    3473             pPaging->Hdr.u32FenceID = 0;
    34743573
    34753574            PMDL pMdl;
     
    35243623
    35253624            VBOXCMDVBVA_SYSMEMCMD *pSysMemCmd = (VBOXCMDVBVA_SYSMEMCMD*)pBuildPagingBuffer->pDmaBufferPrivateData;
     3625
     3626            cbPrivateData = sizeof (*pSysMemCmd);
     3627
    35263628            pSysMemCmd->Hdr.u8OpCode = VBOXCMDVBVA_OPTYPE_SYSMEMCMD;
    35273629            pSysMemCmd->Hdr.u8Flags = cbBuffer & 0xff;
    35283630            pSysMemCmd->Hdr.u.u8PrimaryID = (cbBuffer >> 8) & 0xff;
    35293631            pSysMemCmd->Hdr.u8State = VBOXCMDVBVA_STATE_SUBMITTED;
    3530             pSysMemCmd->Hdr.u32FenceID = sizeof (*pSysMemCmd);
     3632            pSysMemCmd->Hdr.u32FenceID = cbPrivateData | (cbBuffer << 16);
    35313633            pSysMemCmd->phCmd = 0;
    3532 
    3533             cbPrivateData = sizeof (*pSysMemCmd);
    35343634
    35353635            break;
     
    35513651            }
    35523652
     3653            cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
     3654
    35533655            VBOXCMDVBVA_HDR *pHdr = (VBOXCMDVBVA_HDR*)pBuildPagingBuffer->pDmaBufferPrivateData;
     3656
     3657            cbPrivateData = sizeof (*pHdr);
     3658
    35543659            pHdr->u8OpCode = VBOXCMDVBVA_OPTYPE_NOPCMD;
    35553660            pHdr->u8Flags = 0;
    35563661            pHdr->u.u8PrimaryID = 0;
    35573662            pHdr->u8State = VBOXCMDVBVA_STATE_SUBMITTED;
    3558             pHdr->u32FenceID = sizeof (*pHdr);
    3559 
    3560             cbPrivateData = sizeof (*pHdr);
     3663            pHdr->u32FenceID = cbPrivateData | (cbBuffer << 16);
     3664
    35613665            /** @todo: add necessary bits */
    35623666//            WARN(("Impl!"));
    3563             cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
    35643667            break;
    35653668        }
     
    35823685    }
    35833686
     3687    Assert(cbPrivateData >= sizeof (VBOXCMDVBVA_HDR) || pBuildPagingBuffer->Operation == DXGK_OPERATION_DISCARD_CONTENT);
    35843688    Assert(pBuildPagingBuffer->Operation == DXGK_OPERATION_DISCARD_CONTENT || cbBuffer);
    35853689    Assert(cbBuffer <= pBuildPagingBuffer->DmaSize);
     
    59816085        }
    59826086
     6087        Assert(cbPrivateData >= sizeof (VBOXCMDVBVA_HDR));
    59836088        pRender->pDmaBufferPrivateData = ((uint8_t*)pRender->pDmaBufferPrivateData) + cbPrivateData;
    59846089        pRender->pDmaBuffer = ((uint8_t*)pRender->pDmaBuffer) + cbBuffer;
    59856090
    59866091        pCmd->u8State = VBOXCMDVBVA_STATE_SUBMITTED;
    5987         pCmd->u32FenceID = cbPrivateData;
     6092        pCmd->u32FenceID = cbPrivateData | (cbBuffer << 16);
    59886093    }
    59896094    __except (EXCEPTION_EXECUTE_HANDLER)
     
    65386643    pHdr->u8State = VBOXCMDVBVA_STATE_SUBMITTED;
    65396644
    6540     pHdr->u32FenceID = cbPrivateData;
     6645    pHdr->u32FenceID = cbPrivateData | (cbBuffer << 16);
    65416646
    65426647    Assert(cbBuffer);
    65436648    Assert(cbPrivateData);
     6649    Assert(cbPrivateData >= sizeof (VBOXCMDVBVA_HDR));
    65446650    pPresent->pDmaBuffer = ((uint8_t*)pPresent->pDmaBuffer) + cbBuffer;
    65456651    pPresent->pDmaBufferPrivateData = ((uint8_t*)pPresent->pDmaBufferPrivateData) + cbPrivateData;
  • trunk/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp

    r51013 r51042  
    15571557        case VBOXCMDVBVA_OPTYPE_SYSMEMCMD:
    15581558        {
     1559            if (cbCmd < sizeof (VBOXCMDVBVA_SYSMEMCMD))
     1560            {
     1561                WARN(("invalid command size"));
     1562                return -1;
     1563            }
    15591564            VBOXCMDVBVA_SYSMEMCMD *pSysmemCmd = (VBOXCMDVBVA_SYSMEMCMD*)pCmd;
    15601565            const VBOXCMDVBVA_HDR *pRealCmdHdr;
     
    17001705            PDMDevHlpPhysReleasePageMappingLock(pDevIns, &Lock);
    17011706            return i8Result;
     1707        }
     1708        case VBOXCMDVBVA_OPTYPE_COMPLEXCMD:
     1709        {
     1710            Assert(cbCmd >= sizeof (VBOXCMDVBVA_HDR));
     1711            ++pCmd;
     1712            cbCmd -= sizeof (*pCmd);
     1713            uint32_t cbCurCmd = 0;
     1714            for ( ; cbCmd; cbCmd -= cbCurCmd, pCmd = (VBOXCMDVBVA_HDR*)(((uint8_t*)pCmd) + cbCurCmd))
     1715            {
     1716                if (cbCmd < sizeof (VBOXCMDVBVA_HDR))
     1717                {
     1718                    WARN(("invalid command size"));
     1719                    return -1;
     1720                }
     1721
     1722                cbCurCmd = pCmd->u32FenceID;
     1723                if (cbCmd < cbCurCmd)
     1724                {
     1725                    WARN(("invalid command size"));
     1726                    return -1;
     1727                }
     1728
     1729                int8_t i8Result = vboxVDMACrCmdVbvaProcess(pVdma, pCmd, cbCurCmd);
     1730                if (i8Result < 0)
     1731                {
     1732                    WARN(("vboxVDMACrCmdVbvaProcess failed"));
     1733                    return i8Result;
     1734                }
     1735            }
     1736            return 0;
    17021737        }
    17031738        default:
Note: See TracChangeset for help on using the changeset viewer.

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