Changeset 39603 in vbox
- Timestamp:
- Dec 14, 2011 11:12:56 AM (13 years ago)
- Location:
- trunk
- Files:
-
- 11 edited
-
include/VBox/VBoxVideo.h (modified) (3 diffs)
-
include/VBox/vmm/pdmifs.h (modified) (2 diffs)
-
src/VBox/Devices/Graphics/DevVGA.h (modified) (1 diff)
-
src/VBox/Devices/Graphics/DevVGA_VBVA.cpp (modified) (2 diffs)
-
src/VBox/Devices/Graphics/DevVGA_VDMA.cpp (modified) (11 diffs)
-
src/VBox/GuestHost/OpenGL/include/cr_server.h (modified) (1 diff)
-
src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp (modified) (2 diffs)
-
src/VBox/HostServices/SharedOpenGL/crserverlib/server.h (modified) (1 diff)
-
src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c (modified) (11 diffs)
-
src/VBox/Main/include/DisplayImpl.h (modified) (2 diffs)
-
src/VBox/Main/src-client/DisplayImpl.cpp (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/VBoxVideo.h
r39359 r39603 1135 1135 } 1136 1136 1137 #define VBoxSHGSMIBufferHeaderSize() (sizeof (VBOXSHGSMIHEADER)) 1138 1137 1139 DECLINLINE(PVBOXSHGSMIHEADER) VBoxSHGSMIBufferHeader (const void *pvData) 1138 1140 { … … 1268 1270 #define VBOXVDMACMD_SIZE(_t) (VBOXVDMACMD_SIZE_FROMBODYSIZE(sizeof (_t))) 1269 1271 #define VBOXVDMACMD_BODY(_pCmd, _t) ( (_t*)(((uint8_t*)(_pCmd)) + VBOXVDMACMD_HEADER_SIZE()) ) 1272 #define VBOXVDMACMD_BODY_SIZE(_s) ( (_s) - VBOXVDMACMD_HEADER_SIZE() ) 1270 1273 #define VBOXVDMACMD_FROM_BODY(_pCmd) ( (VBOXVDMACMD*)(((uint8_t*)(_pCmd)) - VBOXVDMACMD_HEADER_SIZE()) ) 1271 1274 #define VBOXVDMACMD_BODY_FIELD_OFFSET(_ot, _t, _f) ( (_ot)(uintptr_t)( VBOXVDMACMD_BODY(0, uint8_t) + RT_OFFSETOF(_t, _f) ) ) … … 1403 1406 union 1404 1407 { 1405 void *pv RamBase;1408 void *pvVRamBase; 1406 1409 uint64_t uAlignment; 1407 1410 }; 1411 uint64_t cbVRam; 1408 1412 } VBOXVDMACMD_CHROMIUM_CTL_CRHGSMI_SETUP, *PVBOXVDMACMD_CHROMIUM_CTL_CRHGSMI_SETUP; 1409 1413 -
trunk/include/VBox/vmm/pdmifs.h
r38878 r39603 715 715 * @thread The emulation thread. 716 716 */ 717 DECLR3CALLBACKMEMBER(void, pfnCrHgsmiCommandProcess, (PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CMD pCmd ));717 DECLR3CALLBACKMEMBER(void, pfnCrHgsmiCommandProcess, (PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CMD pCmd, uint32_t cbCmd)); 718 718 719 719 /** … … 724 724 * @thread The emulation thread. 725 725 */ 726 DECLR3CALLBACKMEMBER(void, pfnCrHgsmiControlProcess, (PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CTL pCtl ));726 DECLR3CALLBACKMEMBER(void, pfnCrHgsmiControlProcess, (PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CTL pCtl, uint32_t cbCtl)); 727 727 728 728 -
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 -
trunk/src/VBox/GuestHost/OpenGL/include/cr_server.h
r39288 r39603 315 315 * NOTE: it is ALWAYS responsibility of the crVBoxServerCrHgsmiCmd to complete the command! 316 316 * */ 317 extern DECLEXPORT(int32_t) crVBoxServerCrHgsmiCmd(struct VBOXVDMACMD_CHROMIUM_CMD *pCmd );318 extern DECLEXPORT(int32_t) crVBoxServerCrHgsmiCtl(struct VBOXVDMACMD_CHROMIUM_CTL *pCtl );317 extern DECLEXPORT(int32_t) crVBoxServerCrHgsmiCmd(struct VBOXVDMACMD_CHROMIUM_CMD *pCmd, uint32_t cbCmd); 318 extern DECLEXPORT(int32_t) crVBoxServerCrHgsmiCtl(struct VBOXVDMACMD_CHROMIUM_CTL *pCtl, uint32_t cbCtl); 319 319 #endif 320 320 -
trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp
r39507 r39603 939 939 if (cParms == 1 && paParms[0].type == VBOX_HGCM_SVC_PARM_PTR) 940 940 { 941 rc = crVBoxServerCrHgsmiCmd((PVBOXVDMACMD_CHROMIUM_CMD)paParms[0].u.pointer.addr );941 rc = crVBoxServerCrHgsmiCmd((PVBOXVDMACMD_CHROMIUM_CMD)paParms[0].u.pointer.addr, paParms[0].u.pointer.size); 942 942 if (VERR_NOT_SUPPORTED == rc) 943 943 { … … 952 952 Assert(cParms == 1 && paParms[0].type == VBOX_HGCM_SVC_PARM_PTR); 953 953 if (cParms == 1 && paParms[0].type == VBOX_HGCM_SVC_PARM_PTR) 954 rc = crVBoxServerCrHgsmiCtl((PVBOXVDMACMD_CHROMIUM_CTL)paParms[0].u.pointer.addr );954 rc = crVBoxServerCrHgsmiCtl((PVBOXVDMACMD_CHROMIUM_CTL)paParms[0].u.pointer.addr, paParms[0].u.pointer.size); 955 955 else 956 956 rc = VERR_INVALID_PARAMETER; -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h
r39288 r39603 20 20 21 21 extern uint8_t* g_pvVRamBase; 22 extern uint32_t g_cbVRam; 22 23 extern HCRHGSMICMDCOMPLETION g_hCrHgsmiCompletion; 23 24 extern PFNCRHGSMICMDCOMPLETION g_pfnCrHgsmiCompletion; 24 25 25 26 #define VBOXCRHGSMI_PTR(_off, _t) ((_t*)(g_pvVRamBase + (_off))) 27 #define VBOXCRHGSMI_PTR_SAFE(_off, _cb, _t) ((_t*)crServerCrHgsmiPtrGet(_off, _cb)) 28 29 DECLINLINE(void*) crServerCrHgsmiPtrGet(VBOXVIDEOOFFSET offBuffer, uint32_t cbBuffer) 30 { 31 return ((offBuffer) + (cbBuffer) <= g_cbVRam ? VBOXCRHGSMI_PTR(offBuffer, void) : NULL); 32 } 26 33 27 34 DECLINLINE(void) crServerCrHgsmiCmdComplete(struct VBOXVDMACMD_CHROMIUM_CMD *pCmd, int cmdProcessingRc) -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c
r39288 r39603 33 33 # include <VBox/HostServices/VBoxCrOpenGLSvc.h> 34 34 uint8_t* g_pvVRamBase = NULL; 35 uint32_t g_cbVRam = 0; 35 36 HCRHGSMICMDCOMPLETION g_hCrHgsmiCompletion = NULL; 36 37 PFNCRHGSMICMDCOMPLETION g_pfnCrHgsmiCompletion = NULL; … … 1353 1354 * NOTE: it is ALWAYS responsibility of the crVBoxServerCrHgsmiCmd to complete the command! 1354 1355 * */ 1355 int32_t crVBoxServerCrHgsmiCmd(struct VBOXVDMACMD_CHROMIUM_CMD *pCmd )1356 int32_t crVBoxServerCrHgsmiCmd(struct VBOXVDMACMD_CHROMIUM_CMD *pCmd, uint32_t cbCmd) 1356 1357 { 1357 1358 int32_t rc; 1358 1359 uint32_t cBuffers = pCmd->cBuffers; 1359 1360 uint32_t cParams; 1361 uint32_t cbHdr; 1360 1362 CRVBOXHGSMIHDR *pHdr; 1361 1363 uint32_t u32Function; … … 1365 1367 if (!g_pvVRamBase) 1366 1368 { 1367 CRASSERT(0);1369 crWarning("g_pvVRamBase is not initialized"); 1368 1370 crServerCrHgsmiCmdComplete(pCmd, VERR_INVALID_STATE); 1369 1371 return VINF_SUCCESS; … … 1372 1374 if (!cBuffers) 1373 1375 { 1374 CRASSERT(0);1376 crWarning("zero buffers passed in!"); 1375 1377 crServerCrHgsmiCmdComplete(pCmd, VERR_INVALID_PARAMETER); 1376 1378 return VINF_SUCCESS; … … 1379 1381 cParams = cBuffers-1; 1380 1382 1381 pHdr = VBOXCRHGSMI_PTR(pCmd->aBuffers[0].offBuffer, CRVBOXHGSMIHDR); 1383 cbHdr = pCmd->aBuffers[0].cbBuffer; 1384 pHdr = VBOXCRHGSMI_PTR_SAFE(pCmd->aBuffers[0].offBuffer, cbHdr, CRVBOXHGSMIHDR); 1385 if (!pHdr) 1386 { 1387 crWarning("invalid header buffer!"); 1388 crServerCrHgsmiCmdComplete(pCmd, VERR_INVALID_PARAMETER); 1389 return VINF_SUCCESS; 1390 } 1391 1392 if (cbHdr < sizeof (*pHdr)) 1393 { 1394 crWarning("invalid header buffer size!"); 1395 crServerCrHgsmiCmdComplete(pCmd, VERR_INVALID_PARAMETER); 1396 return VINF_SUCCESS; 1397 } 1398 1382 1399 u32Function = pHdr->u32Function; 1383 1400 u32ClientID = pHdr->u32ClientID; … … 1395 1412 VBOXVDMACMD_CHROMIUM_BUFFER *pBuf = &pCmd->aBuffers[1]; 1396 1413 /* Fetch parameters. */ 1397 uint8_t *pBuffer = VBOXCRHGSMI_PTR(pBuf->offBuffer, uint8_t);1398 1414 uint32_t cbBuffer = pBuf->cbBuffer; 1399 1400 CRASSERT(pBuffer); 1415 uint8_t *pBuffer = VBOXCRHGSMI_PTR_SAFE(pBuf->offBuffer, cbBuffer, uint8_t); 1416 1417 if (cbHdr < sizeof (*pFnCmd)) 1418 { 1419 crWarning("invalid write cmd buffer size!"); 1420 rc = VERR_INVALID_PARAMETER; 1421 break; 1422 } 1423 1401 1424 CRASSERT(cbBuffer); 1425 if (!pBuffer) 1426 { 1427 crWarning("invalid buffer data received from guest!"); 1428 rc = VERR_INVALID_PARAMETER; 1429 break; 1430 } 1402 1431 1403 1432 rc = crVBoxServerClientGet(u32ClientID, &pClient); … … 1438 1467 uint32_t u32InjectClientID = pFnCmd->u32ClientID; 1439 1468 VBOXVDMACMD_CHROMIUM_BUFFER *pBuf = &pCmd->aBuffers[1]; 1440 uint8_t *pBuffer = VBOXCRHGSMI_PTR(pBuf->offBuffer, uint8_t);1441 1469 uint32_t cbBuffer = pBuf->cbBuffer; 1442 1443 CRASSERT(pBuffer); 1470 uint8_t *pBuffer = VBOXCRHGSMI_PTR_SAFE(pBuf->offBuffer, cbBuffer, uint8_t); 1471 1472 if (cbHdr < sizeof (*pFnCmd)) 1473 { 1474 crWarning("invalid inject cmd buffer size!"); 1475 rc = VERR_INVALID_PARAMETER; 1476 break; 1477 } 1478 1444 1479 CRASSERT(cbBuffer); 1480 if (!pBuffer) 1481 { 1482 crWarning("invalid buffer data received from guest!"); 1483 rc = VERR_INVALID_PARAMETER; 1484 break; 1485 } 1445 1486 1446 1487 rc = crVBoxServerClientGet(u32InjectClientID, &pClient); … … 1477 1518 VBOXVDMACMD_CHROMIUM_BUFFER *pBuf = &pCmd->aBuffers[1]; 1478 1519 /* Fetch parameters. */ 1479 uint8_t *pBuffer = VBOXCRHGSMI_PTR(pBuf->offBuffer, uint8_t);1480 1520 uint32_t cbBuffer = pBuf->cbBuffer; 1521 uint8_t *pBuffer = VBOXCRHGSMI_PTR_SAFE(pBuf->offBuffer, cbBuffer, uint8_t); 1522 1523 if (cbHdr < sizeof (*pFnCmd)) 1524 { 1525 crWarning("invalid read cmd buffer size!"); 1526 rc = VERR_INVALID_PARAMETER; 1527 break; 1528 } 1529 1530 1531 if (!pBuffer) 1532 { 1533 crWarning("invalid buffer data received from guest!"); 1534 rc = VERR_INVALID_PARAMETER; 1535 break; 1536 } 1481 1537 1482 1538 rc = crVBoxServerClientGet(u32ClientID, &pClient); … … 1518 1574 1519 1575 /* Fetch parameters. */ 1520 uint8_t *pBuffer = VBOXCRHGSMI_PTR(pBuf->offBuffer, uint8_t);1521 1576 uint32_t cbBuffer = pBuf->cbBuffer; 1522 1523 uint8_t *pWriteback = VBOXCRHGSMI_PTR(pWbBuf->offBuffer, uint8_t); 1577 uint8_t *pBuffer = VBOXCRHGSMI_PTR_SAFE(pBuf->offBuffer, cbBuffer, uint8_t); 1578 1524 1579 uint32_t cbWriteback = pWbBuf->cbBuffer; 1525 1526 CRASSERT(pBuffer); 1580 uint8_t *pWriteback = VBOXCRHGSMI_PTR_SAFE(pWbBuf->offBuffer, cbWriteback, uint8_t); 1581 1582 if (cbHdr < sizeof (*pFnCmd)) 1583 { 1584 crWarning("invalid write_read cmd buffer size!"); 1585 rc = VERR_INVALID_PARAMETER; 1586 break; 1587 } 1588 1589 1527 1590 CRASSERT(cbBuffer); 1528 1591 if (!pBuffer) 1592 { 1593 crWarning("invalid write buffer data received from guest!"); 1594 rc = VERR_INVALID_PARAMETER; 1595 break; 1596 } 1597 1598 CRASSERT(cbWriteback); 1599 if (!pWriteback) 1600 { 1601 crWarning("invalid writeback buffer data received from guest!"); 1602 rc = VERR_INVALID_PARAMETER; 1603 break; 1604 } 1529 1605 rc = crVBoxServerClientGet(u32ClientID, &pClient); 1530 1606 if (RT_FAILURE(rc)) … … 1582 1658 } 1583 1659 1584 int32_t crVBoxServerCrHgsmiCtl(struct VBOXVDMACMD_CHROMIUM_CTL *pCtl )1660 int32_t crVBoxServerCrHgsmiCtl(struct VBOXVDMACMD_CHROMIUM_CTL *pCtl, uint32_t cbCtl) 1585 1661 { 1586 1662 int rc = VINF_SUCCESS; … … 1591 1667 { 1592 1668 PVBOXVDMACMD_CHROMIUM_CTL_CRHGSMI_SETUP pSetup = (PVBOXVDMACMD_CHROMIUM_CTL_CRHGSMI_SETUP)pCtl; 1593 g_pvVRamBase = (uint8_t*)pSetup->pvRamBase; 1669 g_pvVRamBase = (uint8_t*)pSetup->pvVRamBase; 1670 g_cbVRam = pSetup->cbVRam; 1594 1671 rc = VINF_SUCCESS; 1595 1672 break; -
trunk/src/VBox/Main/include/DisplayImpl.h
r35638 r39603 131 131 #endif 132 132 #ifdef VBOX_WITH_CRHGSMI 133 void handleCrHgsmiCommandProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CMD pCmd );134 void handleCrHgsmiControlProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CTL pCtl );133 void handleCrHgsmiCommandProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CMD pCmd, uint32_t cbCmd); 134 void handleCrHgsmiControlProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CTL pCtl, uint32_t cbCtl); 135 135 136 136 void handleCrHgsmiCommandCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam); … … 202 202 203 203 #ifdef VBOX_WITH_CRHGSMI 204 static DECLCALLBACK(void) displayCrHgsmiCommandProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CMD pCmd );205 static DECLCALLBACK(void) displayCrHgsmiControlProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CTL pCtl );204 static DECLCALLBACK(void) displayCrHgsmiCommandProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CMD pCmd, uint32_t cbCmd); 205 static DECLCALLBACK(void) displayCrHgsmiControlProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CTL pCtl, uint32_t cbCtl); 206 206 207 207 static DECLCALLBACK(void) displayCrHgsmiCommandCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam, void *pvContext); -
trunk/src/VBox/Main/src-client/DisplayImpl.cpp
r39391 r39603 3497 3497 } 3498 3498 3499 void Display::handleCrHgsmiCommandProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CMD pCmd )3499 void Display::handleCrHgsmiCommandProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CMD pCmd, uint32_t cbCmd) 3500 3500 { 3501 3501 int rc = VERR_INVALID_FUNCTION; … … 3503 3503 parm.type = VBOX_HGCM_SVC_PARM_PTR; 3504 3504 parm.u.pointer.addr = pCmd; 3505 parm.u.pointer.size = 0;3505 parm.u.pointer.size = cbCmd; 3506 3506 3507 3507 if (mhCrOglSvc) … … 3525 3525 } 3526 3526 3527 void Display::handleCrHgsmiControlProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CTL pCtl )3527 void Display::handleCrHgsmiControlProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CTL pCtl, uint32_t cbCtl) 3528 3528 { 3529 3529 int rc = VERR_INVALID_FUNCTION; … … 3531 3531 parm.type = VBOX_HGCM_SVC_PARM_PTR; 3532 3532 parm.u.pointer.addr = pCtl; 3533 parm.u.pointer.size = 0;3533 parm.u.pointer.size = cbCtl; 3534 3534 3535 3535 if (mhCrOglSvc) … … 3552 3552 3553 3553 3554 DECLCALLBACK(void) Display::displayCrHgsmiCommandProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CMD pCmd )3554 DECLCALLBACK(void) Display::displayCrHgsmiCommandProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CMD pCmd, uint32_t cbCmd) 3555 3555 { 3556 3556 PDRVMAINDISPLAY pDrv = PDMIDISPLAYCONNECTOR_2_MAINDISPLAY(pInterface); 3557 3557 3558 pDrv->pDisplay->handleCrHgsmiCommandProcess(pInterface, pCmd );3559 } 3560 3561 DECLCALLBACK(void) Display::displayCrHgsmiControlProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CTL pCmd )3558 pDrv->pDisplay->handleCrHgsmiCommandProcess(pInterface, pCmd, cbCmd); 3559 } 3560 3561 DECLCALLBACK(void) Display::displayCrHgsmiControlProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CTL pCmd, uint32_t cbCmd) 3562 3562 { 3563 3563 PDRVMAINDISPLAY pDrv = PDMIDISPLAYCONNECTOR_2_MAINDISPLAY(pInterface); 3564 3564 3565 pDrv->pDisplay->handleCrHgsmiControlProcess(pInterface, pCmd );3565 pDrv->pDisplay->handleCrHgsmiControlProcess(pInterface, pCmd, cbCmd); 3566 3566 } 3567 3567
Note:
See TracChangeset
for help on using the changeset viewer.

