Changeset 39603 in vbox for trunk/src/VBox/Devices/Graphics
- Timestamp:
- Dec 14, 2011 11:12:56 AM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 75377
- Location:
- trunk/src/VBox/Devices/Graphics
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Graphics/DevVGA.h
r36899 r39603 512 512 int vboxVDMAConstruct(PVGASTATE pVGAState, uint32_t cPipeElements); 513 513 int vboxVDMADestruct(PVBOXVDMAHOST pVdma); 514 void vboxVDMAControl(PVBOXVDMAHOST pVdma, PVBOXVDMA_CTL pCmd );515 void vboxVDMACommand(PVBOXVDMAHOST pVdma, PVBOXVDMACBUF_DR pCmd );514 void vboxVDMAControl(PVBOXVDMAHOST pVdma, PVBOXVDMA_CTL pCmd, uint32_t cbCmd); 515 void vboxVDMACommand(PVBOXVDMAHOST pVdma, PVBOXVDMACBUF_DR pCmd, uint32_t cbCmd); 516 516 int vboxVDMASaveStateExecPrep(struct VBOXVDMAHOST *pVdma, PSSMHANDLE pSSM); 517 517 int vboxVDMASaveStateExecDone(struct VBOXVDMAHOST *pVdma, PSSMHANDLE pSSM); -
trunk/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp
r38514 r39603 1657 1657 case VBVA_VDMA_CMD: 1658 1658 { 1659 if (cbBuffer < VBoxSHGSMIBufferHeaderSize() + sizeof (VBOXVDMACBUF_DR)) 1660 { 1661 rc = VERR_INVALID_PARAMETER; 1662 break; 1663 } 1659 1664 PVBOXVDMACBUF_DR pCmd = (PVBOXVDMACBUF_DR)VBoxSHGSMIBufferData ((PVBOXSHGSMIHEADER)pvBuffer); 1660 vboxVDMACommand(pVGAState->pVdma, pCmd );1665 vboxVDMACommand(pVGAState->pVdma, pCmd, cbBuffer - VBoxSHGSMIBufferHeaderSize()); 1661 1666 rc = VINF_SUCCESS; 1662 1667 break; … … 1664 1669 case VBVA_VDMA_CTL: 1665 1670 { 1671 if (cbBuffer < VBoxSHGSMIBufferHeaderSize() + sizeof (VBOXVDMA_CTL)) 1672 { 1673 rc = VERR_INVALID_PARAMETER; 1674 break; 1675 } 1666 1676 PVBOXVDMA_CTL pCmd = (PVBOXVDMA_CTL)VBoxSHGSMIBufferData ((PVBOXSHGSMIHEADER)pvBuffer); 1667 vboxVDMAControl(pVGAState->pVdma, pCmd );1677 vboxVDMAControl(pVGAState->pVdma, pCmd, cbBuffer - VBoxSHGSMIBufferHeaderSize()); 1668 1678 rc = VINF_SUCCESS; 1669 1679 break; -
trunk/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp
r37490 r39603 157 157 158 158 159 static int vboxVDMACrCtlPostAsync (PVGASTATE pVGAState, PVBOXVDMACMD_CHROMIUM_CTL pCmd, PFNVBOXVDMACRCTL_CALLBACK pfnCompletion, void *pvCompletion)159 static int vboxVDMACrCtlPostAsync (PVGASTATE pVGAState, PVBOXVDMACMD_CHROMIUM_CTL pCmd, uint32_t cbCmd, PFNVBOXVDMACRCTL_CALLBACK pfnCompletion, void *pvCompletion) 160 160 { 161 161 if (pVGAState->pDrv->pfnCrHgsmiControlProcess) … … 164 164 pHdr->pfnCompletion = pfnCompletion; 165 165 pHdr->pvCompletion = pvCompletion; 166 pVGAState->pDrv->pfnCrHgsmiControlProcess(pVGAState->pDrv, pCmd );166 pVGAState->pDrv->pfnCrHgsmiControlProcess(pVGAState->pDrv, pCmd, cbCmd); 167 167 return VINF_SUCCESS; 168 168 } … … 173 173 } 174 174 175 static int vboxVDMACrCtlPost(PVGASTATE pVGAState, PVBOXVDMACMD_CHROMIUM_CTL pCmd )175 static int vboxVDMACrCtlPost(PVGASTATE pVGAState, PVBOXVDMACMD_CHROMIUM_CTL pCmd, uint32_t cbCmd) 176 176 { 177 177 RTSEMEVENT hComplEvent; … … 180 180 if(RT_SUCCESS(rc)) 181 181 { 182 rc = vboxVDMACrCtlPostAsync (pVGAState, pCmd, vboxVDMACrCtlCbSetEvent, (void*)hComplEvent);182 rc = vboxVDMACrCtlPostAsync (pVGAState, pCmd, cbCmd, vboxVDMACrCtlCbSetEvent, (void*)hComplEvent); 183 183 #ifdef DEBUG_misha 184 184 AssertRC(rc); … … 209 209 { 210 210 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)); 213 214 AssertRC(rc); 214 215 if (RT_SUCCESS(rc)) … … 225 226 226 227 /* 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; 228 static int vboxVDMACmdCheckCrCmd(struct VBOXVDMAHOST *pVdma, PVBOXVDMACBUF_DR pCmdDr, uint32_t cbCmdDr) 229 { 230 PVBOXVDMACMD pDmaCmd = NULL; 231 uint32_t cbDmaCmd = 0; 230 232 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 } 237 252 238 253 if (pDmaCmd) 239 254 { 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)) 248 264 { 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); 272 274 break; 273 275 } 274 case VBOXVDMACMD_TYPE_DMA_BPB_TRANSFER:276 else 275 277 { 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); 278 300 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; 287 302 } 288 default: 289 break; 290 } 291 } 292 } 293 return bCompleted; 303 break; 304 } 305 default: 306 break; 307 } 308 } 309 return rc; 294 310 } 295 311 … … 920 936 #endif 921 937 922 static void vboxVDMACommandProcess(PVBOXVDMAHOST pVdma, PVBOXVDMACBUF_DR pCmd )938 static void vboxVDMACommandProcess(PVBOXVDMAHOST pVdma, PVBOXVDMACBUF_DR pCmd, uint32_t cbCmd) 923 939 { 924 940 PHGSMIINSTANCE pHgsmi = pVdma->pHgsmi; … … 1171 1187 if (pCmd) 1172 1188 { 1173 int rc = vboxVDMACrCtlPost(pVGAState, pCmd );1189 int rc = vboxVDMACrCtlPost(pVGAState, pCmd, sizeof (*pCmd)); 1174 1190 AssertRC(rc); 1175 1191 if (RT_SUCCESS(rc)) … … 1195 1211 if (pCmd) 1196 1212 { 1197 int rc = vboxVDMACrCtlPost(pVGAState, pCmd );1213 int rc = vboxVDMACrCtlPost(pVGAState, pCmd, sizeof (*pCmd)); 1198 1214 AssertRC(rc); 1199 1215 if (RT_SUCCESS(rc)) … … 1211 1227 1212 1228 1213 void vboxVDMAControl(struct VBOXVDMAHOST *pVdma, PVBOXVDMA_CTL pCmd )1229 void vboxVDMAControl(struct VBOXVDMAHOST *pVdma, PVBOXVDMA_CTL pCmd, uint32_t cbCmd) 1214 1230 { 1215 1231 #if 1 … … 1264 1280 } 1265 1281 1266 void vboxVDMACommand(struct VBOXVDMAHOST *pVdma, PVBOXVDMACBUF_DR pCmd) 1267 { 1282 void vboxVDMACommand(struct VBOXVDMAHOST *pVdma, PVBOXVDMACBUF_DR pCmd, uint32_t cbCmd) 1283 { 1284 int rc = VERR_NOT_IMPLEMENTED; 1285 1268 1286 #ifdef VBOX_WITH_CRHGSMI 1269 1287 /* chromium commands are processed by crhomium hgcm thread independently from our internal cmd processing pipeline 1270 1288 * this is why we process them specially */ 1271 if (vboxVDMACmdCheckCrCmd(pVdma, pCmd)) 1289 rc = vboxVDMACmdCheckCrCmd(pVdma, pCmd, cbCmd); 1290 if (rc == VINF_SUCCESS) 1272 1291 return; 1292 1293 if (RT_FAILURE(rc)) 1294 { 1295 pCmd->rc = rc; 1296 rc = VBoxSHGSMICommandComplete (pVdma->pHgsmi, pCmd); 1297 AssertRC(rc); 1298 return; 1299 } 1273 1300 #endif 1274 1301 1275 1302 #ifndef VBOX_VDMA_WITH_WORKERTHREAD 1276 vboxVDMACommandProcess(pVdma, pCmd );1303 vboxVDMACommandProcess(pVdma, pCmd, cbCmd); 1277 1304 #else 1278 int rc = VERR_NOT_IMPLEMENTED;1279 1305 1280 1306 # ifdef DEBUG_misha
Note:
See TracChangeset
for help on using the changeset viewer.