Changeset 51042 in vbox
- Timestamp:
- Apr 10, 2014 8:05:24 PM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 93262
- Location:
- trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/VBoxVideo.h
r50958 r51042 1583 1583 /* actual command is stored in guest system memory */ 1584 1584 #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 1585 1590 1586 1591 /* nop - is a one-bit command. The buffer size to skip is determined by VBVA buffer size */ … … 1629 1634 } u; 1630 1635 /* DXGK DDI fence ID */ 1631 volatileuint32_t u32FenceID;1636 uint32_t u32FenceID; 1632 1637 } VBOXCMDVBVA_HDR; 1633 1638 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVbva.cpp
r51036 r51042 930 930 } 931 931 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); 932 void 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")); 937 938 938 939 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; 996 942 997 943 VBoxVBVAExBufferEndUpdate(&pVbva->Vbva); … … 1008 954 { 1009 955 WARN(("VBoxHGSMIBufferAlloc failed\n")); 1010 return VERR_OUT_OF_RESOURCES;956 return; 1011 957 } 1012 958 … … 1017 963 VBoxHGSMIBufferFree(pCtx, pSubmit); 1018 964 } 965 } 966 967 VBOXCMDVBVA_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 1021 int 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); 1019 1034 1020 1035 return VINF_SUCCESS; … … 1083 1098 if (u8State == VBOXCMDVBVA_STATE_IN_PROGRESS) 1084 1099 { 1085 Assert(u32FenceID);1086 1100 if (!u32FenceID) 1101 { 1102 WARN(("fence is NULL")); 1087 1103 continue; 1088 1089 #ifdef DEBUG_misha 1090 Assert(u32FenceID == pVbva->u32FenceCompleted + 1); 1091 #endif 1104 } 1105 1092 1106 pVbva->u32FenceCompleted = u32FenceID; 1093 1107 } -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVbva.h
r51036 r51042 213 213 int VBoxCmdVbvaCreate(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, ULONG offBuffer, ULONG cbBuffer); 214 214 int VBoxCmdVbvaSubmit(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, struct VBOXCMDVBVA_HDR *pCmd, uint32_t u32FenceID, uint32_t cbCmd); 215 void VBoxCmdVbvaSubmitUnlock(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, VBOXCMDVBVA_HDR* pCmd, uint32_t u32FenceID); 216 VBOXCMDVBVA_HDR* VBoxCmdVbvaSubmitLock(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, uint32_t cbCmd); 215 217 bool VBoxCmdVbvaPreempt(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, uint32_t u32FenceID); 216 218 uint32_t VBoxCmdVbvaCheckCompleted(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, bool fPingHost); -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
r51036 r51042 3111 3111 VBOXCMDVBVA_HDR *pHdr; 3112 3112 VBOXCMDVBVA_HDR NopCmd; 3113 uint32_t cbCurCmd, cbCurDma; 3113 3114 if (cbCmd < sizeof (VBOXCMDVBVA_HDR)) 3114 3115 { 3115 if (cbCmd )3116 if (cbCmd || cbDma) 3116 3117 { 3117 3118 WARN(("invalid command data")); 3118 3119 return STATUS_INVALID_PARAMETER; 3119 3120 } 3121 Assert(!cbDma); 3120 3122 NopCmd.u8OpCode = VBOXCMDVBVA_OPTYPE_NOPCMD; 3121 3123 NopCmd.u8Flags = 0; … … 3124 3126 cbCmd = sizeof (VBOXCMDVBVA_HDR); 3125 3127 pHdr = &NopCmd; 3128 cbCurCmd = sizeof (VBOXCMDVBVA_HDR); 3129 cbCurDma = 0; 3126 3130 } 3127 3131 else 3128 3132 { 3129 3133 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); 3148 3188 #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 } 3156 3217 break; 3157 3218 } 3158 default: 3219 3220 if (cbCmd < sizeof (VBOXCMDVBVA_HDR)) 3221 { 3222 WARN(("invalid param")); 3223 Status = STATUS_INVALID_PARAMETER; 3159 3224 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; 3168 3259 } 3169 3260 #endif … … 3455 3546 if (pAlloc->AllocData.hostID) 3456 3547 { 3548 VBOXCMDVBVA_HDR *pHdr = (VBOXCMDVBVA_HDR*)pBuildPagingBuffer->pDmaBufferPrivateData; 3549 3457 3550 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); 3458 3558 break; 3459 3559 } … … 3471 3571 pPaging->Hdr.u8Flags = 0; 3472 3572 pPaging->Hdr.u8State = VBOXCMDVBVA_STATE_SUBMITTED; 3473 pPaging->Hdr.u32FenceID = 0;3474 3573 3475 3574 PMDL pMdl; … … 3524 3623 3525 3624 VBOXCMDVBVA_SYSMEMCMD *pSysMemCmd = (VBOXCMDVBVA_SYSMEMCMD*)pBuildPagingBuffer->pDmaBufferPrivateData; 3625 3626 cbPrivateData = sizeof (*pSysMemCmd); 3627 3526 3628 pSysMemCmd->Hdr.u8OpCode = VBOXCMDVBVA_OPTYPE_SYSMEMCMD; 3527 3629 pSysMemCmd->Hdr.u8Flags = cbBuffer & 0xff; 3528 3630 pSysMemCmd->Hdr.u.u8PrimaryID = (cbBuffer >> 8) & 0xff; 3529 3631 pSysMemCmd->Hdr.u8State = VBOXCMDVBVA_STATE_SUBMITTED; 3530 pSysMemCmd->Hdr.u32FenceID = sizeof (*pSysMemCmd);3632 pSysMemCmd->Hdr.u32FenceID = cbPrivateData | (cbBuffer << 16); 3531 3633 pSysMemCmd->phCmd = 0; 3532 3533 cbPrivateData = sizeof (*pSysMemCmd);3534 3634 3535 3635 break; … … 3551 3651 } 3552 3652 3653 cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE; 3654 3553 3655 VBOXCMDVBVA_HDR *pHdr = (VBOXCMDVBVA_HDR*)pBuildPagingBuffer->pDmaBufferPrivateData; 3656 3657 cbPrivateData = sizeof (*pHdr); 3658 3554 3659 pHdr->u8OpCode = VBOXCMDVBVA_OPTYPE_NOPCMD; 3555 3660 pHdr->u8Flags = 0; 3556 3661 pHdr->u.u8PrimaryID = 0; 3557 3662 pHdr->u8State = VBOXCMDVBVA_STATE_SUBMITTED; 3558 pHdr->u32FenceID = sizeof (*pHdr); 3559 3560 cbPrivateData = sizeof (*pHdr); 3663 pHdr->u32FenceID = cbPrivateData | (cbBuffer << 16); 3664 3561 3665 /** @todo: add necessary bits */ 3562 3666 // WARN(("Impl!")); 3563 cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE;3564 3667 break; 3565 3668 } … … 3582 3685 } 3583 3686 3687 Assert(cbPrivateData >= sizeof (VBOXCMDVBVA_HDR) || pBuildPagingBuffer->Operation == DXGK_OPERATION_DISCARD_CONTENT); 3584 3688 Assert(pBuildPagingBuffer->Operation == DXGK_OPERATION_DISCARD_CONTENT || cbBuffer); 3585 3689 Assert(cbBuffer <= pBuildPagingBuffer->DmaSize); … … 5981 6085 } 5982 6086 6087 Assert(cbPrivateData >= sizeof (VBOXCMDVBVA_HDR)); 5983 6088 pRender->pDmaBufferPrivateData = ((uint8_t*)pRender->pDmaBufferPrivateData) + cbPrivateData; 5984 6089 pRender->pDmaBuffer = ((uint8_t*)pRender->pDmaBuffer) + cbBuffer; 5985 6090 5986 6091 pCmd->u8State = VBOXCMDVBVA_STATE_SUBMITTED; 5987 pCmd->u32FenceID = cbPrivateData ;6092 pCmd->u32FenceID = cbPrivateData | (cbBuffer << 16); 5988 6093 } 5989 6094 __except (EXCEPTION_EXECUTE_HANDLER) … … 6538 6643 pHdr->u8State = VBOXCMDVBVA_STATE_SUBMITTED; 6539 6644 6540 pHdr->u32FenceID = cbPrivateData ;6645 pHdr->u32FenceID = cbPrivateData | (cbBuffer << 16); 6541 6646 6542 6647 Assert(cbBuffer); 6543 6648 Assert(cbPrivateData); 6649 Assert(cbPrivateData >= sizeof (VBOXCMDVBVA_HDR)); 6544 6650 pPresent->pDmaBuffer = ((uint8_t*)pPresent->pDmaBuffer) + cbBuffer; 6545 6651 pPresent->pDmaBufferPrivateData = ((uint8_t*)pPresent->pDmaBufferPrivateData) + cbPrivateData; -
trunk/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp
r51013 r51042 1557 1557 case VBOXCMDVBVA_OPTYPE_SYSMEMCMD: 1558 1558 { 1559 if (cbCmd < sizeof (VBOXCMDVBVA_SYSMEMCMD)) 1560 { 1561 WARN(("invalid command size")); 1562 return -1; 1563 } 1559 1564 VBOXCMDVBVA_SYSMEMCMD *pSysmemCmd = (VBOXCMDVBVA_SYSMEMCMD*)pCmd; 1560 1565 const VBOXCMDVBVA_HDR *pRealCmdHdr; … … 1700 1705 PDMDevHlpPhysReleasePageMappingLock(pDevIns, &Lock); 1701 1706 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; 1702 1737 } 1703 1738 default:
Note:
See TracChangeset
for help on using the changeset viewer.