Changeset 71607 in vbox for trunk/src/VBox/HostServices
- Timestamp:
- Apr 1, 2018 11:38:00 PM (7 years ago)
- svn:sync-xref-src-repo-rev:
- 121634
- Location:
- trunk/src/VBox/HostServices/SharedOpenGL/crserverlib
- Files:
-
- 1 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/presenter/server_presenter.cpp
r69500 r71607 3888 3888 } 3889 3889 3890 int8_t crVBoxServerCrCmdClrFillProcess(const VBOXCMDVBVA_CLRFILL_HDR *pCmd, uint32_t cbCmd) 3891 { 3890 /** @todo RT_UNTRUSTED_VOLATILE_GUEST */ 3891 int8_t crVBoxServerCrCmdClrFillProcess(VBOXCMDVBVA_CLRFILL_HDR const RT_UNTRUSTED_VOLATILE_GUEST *pCmdTodo, uint32_t cbCmd) 3892 { 3893 VBOXCMDVBVA_CLRFILL_HDR const *pCmd = (VBOXCMDVBVA_CLRFILL_HDR const *)pCmdTodo; 3892 3894 uint8_t u8Flags = pCmd->Hdr.u8Flags; 3893 3895 uint8_t u8Cmd = (VBOXCMDVBVA_OPF_CLRFILL_TYPE_MASK & u8Flags); … … 3912 3914 } 3913 3915 3914 int8_t crVBoxServerCrCmdBltProcess(const VBOXCMDVBVA_BLT_HDR *pCmd, uint32_t cbCmd) 3915 { 3916 /** @todo RT_UNTRUSTED_VOLATILE_GUEST */ 3917 int8_t crVBoxServerCrCmdBltProcess(VBOXCMDVBVA_BLT_HDR const RT_UNTRUSTED_VOLATILE_GUEST *pCmdTodo, uint32_t cbCmd) 3918 { 3919 VBOXCMDVBVA_BLT_HDR const *pCmd = (VBOXCMDVBVA_BLT_HDR const *)pCmdTodo; 3916 3920 uint8_t u8Flags = pCmd->Hdr.u8Flags; 3917 3921 uint8_t u8Cmd = (VBOXCMDVBVA_OPF_BLT_TYPE_MASK & u8Flags); … … 3955 3959 } 3956 3960 3957 int8_t crVBoxServerCrCmdFlipProcess(const VBOXCMDVBVA_FLIP *pFlip, uint32_t cbCmd) 3958 { 3961 /** @todo RT_UNTRUSTED_VOLATILE_GUEST */ 3962 int8_t crVBoxServerCrCmdFlipProcess(VBOXCMDVBVA_FLIP const RT_UNTRUSTED_VOLATILE_GUEST *pFlipTodo, uint32_t cbCmd) 3963 { 3964 VBOXCMDVBVA_FLIP const *pFlip = (VBOXCMDVBVA_FLIP const *)pFlipTodo; 3959 3965 uint32_t hostId; 3960 3966 const VBOXCMDVBVA_RECT *pPRects = pFlip->aRects; -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h
r69474 r71607 470 470 void CrFbTexDataInit(CR_TEXDATA* pFbTex, const VBOXVR_TEXTURE *pTex, PFNCRTEXDATA_RELEASED pfnTextureReleased); 471 471 472 int8_t crVBoxServerCrCmdBltProcess( const VBOXCMDVBVA_BLT_HDR*pCmd, uint32_t cbCmd);473 int8_t crVBoxServerCrCmdClrFillProcess( const VBOXCMDVBVA_CLRFILL_HDR*pCmd, uint32_t cbCmd);474 int8_t crVBoxServerCrCmdFlipProcess( const VBOXCMDVBVA_FLIP*pFlip, uint32_t cbCmd);472 int8_t crVBoxServerCrCmdBltProcess(VBOXCMDVBVA_BLT_HDR const RT_UNTRUSTED_VOLATILE_GUEST *pCmd, uint32_t cbCmd); 473 int8_t crVBoxServerCrCmdClrFillProcess(VBOXCMDVBVA_CLRFILL_HDR const RT_UNTRUSTED_VOLATILE_GUEST *pCmd, uint32_t cbCmd); 474 int8_t crVBoxServerCrCmdFlipProcess(VBOXCMDVBVA_FLIP const RT_UNTRUSTED_VOLATILE_GUEST *pFlip, uint32_t cbCmd); 475 475 476 476 -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c
r69390 r71607 34 34 #include <VBox/err.h> 35 35 #include <VBox/log.h> 36 #include <VBox/AssertGuest.h> 36 37 37 38 #ifdef VBOXCR_LOGFPS … … 67 68 int tearingdown = 0; /* can't be static */ 68 69 69 static DECLCALLBACK(int8_t) crVBoxCrCmdCmd(HVBOXCRCMDSVR hSvr, const VBOXCMDVBVA_HDR *pCmd, uint32_t cbCmd); 70 static DECLCALLBACK(int8_t) crVBoxCrCmdCmd(HVBOXCRCMDSVR hSvr, 71 const VBOXCMDVBVA_HDR RT_UNTRUSTED_VOLATILE_GUEST *pCmd, uint32_t cbCmd); 70 72 71 73 DECLINLINE(CRClient*) crVBoxServerClientById(uint32_t u32ClientID) … … 2873 2875 #ifdef VBOX_WITH_CRHGSMI 2874 2876 2875 static int32_t crVBoxServerCmdVbvaCrCmdProcess(const struct VBOXCMDVBVA_CRCMD_CMD *pCmd, uint32_t cbCmd) 2876 { 2877 /** @todo RT_UNTRUSTED_VOLATILE_GUEST */ 2878 static int32_t crVBoxServerCmdVbvaCrCmdProcess(VBOXCMDVBVA_CRCMD_CMD const RT_UNTRUSTED_VOLATILE_GUEST *pCmdTodo, uint32_t cbCmd) 2879 { 2880 VBOXCMDVBVA_CRCMD_CMD const *pCmd = (VBOXCMDVBVA_CRCMD_CMD const *)pCmdTodo; 2877 2881 int32_t rc; 2878 2882 uint32_t cBuffers = pCmd->cBuffers; … … 3233 3237 } 3234 3238 3235 static int crVBoxCrConnectEx(VBOXCMDVBVA_3DCTL_CONNECT *pConnect, uint32_t u32ClientId)3239 static int crVBoxCrConnectEx(VBOXCMDVBVA_3DCTL_CONNECT RT_UNTRUSTED_VOLATILE_GUEST *pConnect, uint32_t u32ClientId) 3236 3240 { 3237 3241 CRClient *pClient; 3238 3242 int rc; 3243 uint32_t const uMajorVersion = pConnect->u32MajorVersion; 3244 uint32_t const uMinorVersion = pConnect->u32MinorVersion; 3245 uint64_t const uPid = pConnect->u64Pid; 3246 RT_UNTRUSTED_NONVOLATILE_COPY_FENCE(); 3239 3247 3240 3248 if (u32ClientId == CRHTABLE_HANDLE_INVALID) … … 3252 3260 if (RT_SUCCESS(rc)) 3253 3261 { 3254 rc = crVBoxServerClientObjSetVersion(pClient, pConnect->u32MajorVersion, pConnect->u32MinorVersion);3262 rc = crVBoxServerClientObjSetVersion(pClient, uMajorVersion, uMinorVersion); 3255 3263 if (RT_SUCCESS(rc)) 3256 3264 { 3257 rc = crVBoxServerClientObjSetPID(pClient, pConnect->u64Pid);3265 rc = crVBoxServerClientObjSetPID(pClient, uPid); 3258 3266 if (RT_SUCCESS(rc)) 3259 3267 { … … 3264 3272 return VINF_SUCCESS; 3265 3273 } 3266 else 3267 WARN(("CrHTablePutToSlot failed %d", rc)); 3274 WARN(("CrHTablePutToSlot failed %d", rc)); 3268 3275 } 3269 3276 else … … 3283 3290 } 3284 3291 3285 static int crVBoxCrConnect(VBOXCMDVBVA_3DCTL_CONNECT *pConnect)3292 static int crVBoxCrConnect(VBOXCMDVBVA_3DCTL_CONNECT RT_UNTRUSTED_VOLATILE_GUEST *pConnect) 3286 3293 { 3287 3294 return crVBoxCrConnectEx(pConnect, CRHTABLE_HANDLE_INVALID); 3288 3295 } 3289 3296 3290 static DECLCALLBACK(int) crVBoxCrCmdGuestCtl(HVBOXCRCMDSVR hSvr, uint8_t* pCmd, uint32_t cbCmd) 3291 { 3292 VBOXCMDVBVA_3DCTL *pCtl = (VBOXCMDVBVA_3DCTL*)pCmd; 3293 if (cbCmd < sizeof (VBOXCMDVBVA_3DCTL)) 3294 { 3295 WARN(("invalid buffer size")); 3296 return VERR_INVALID_PARAMETER; 3297 } 3298 3299 switch (pCtl->u32Type) 3300 { 3301 case VBOXCMDVBVA3DCTL_TYPE_CONNECT: 3302 { 3303 if (cbCmd != sizeof (VBOXCMDVBVA_3DCTL_CONNECT)) 3304 { 3305 WARN(("invalid command size")); 3306 return VERR_INVALID_PARAMETER; 3307 } 3308 3309 return crVBoxCrConnect((VBOXCMDVBVA_3DCTL_CONNECT*)pCtl); 3310 } 3311 case VBOXCMDVBVA3DCTL_TYPE_DISCONNECT: 3312 { 3313 if (cbCmd != sizeof (VBOXCMDVBVA_3DCTL)) 3314 { 3315 WARN(("invalid command size")); 3316 return VERR_INVALID_PARAMETER; 3317 } 3318 3319 return crVBoxCrDisconnect(pCtl->u32CmdClientId); 3320 } 3321 case VBOXCMDVBVA3DCTL_TYPE_CMD: 3322 { 3323 VBOXCMDVBVA_3DCTL_CMD *p3DCmd; 3324 if (cbCmd < sizeof (VBOXCMDVBVA_3DCTL_CMD)) 3325 { 3326 WARN(("invalid size")); 3327 return VERR_INVALID_PARAMETER; 3328 } 3329 3330 p3DCmd = (VBOXCMDVBVA_3DCTL_CMD*)pCmd; 3331 3332 return crVBoxCrCmdCmd(NULL, &p3DCmd->Cmd, cbCmd - RT_OFFSETOF(VBOXCMDVBVA_3DCTL_CMD, Cmd)); 3333 } 3334 default: 3335 WARN(("crVBoxCrCmdGuestCtl: invalid function %d", pCtl->u32Type)); 3336 return VERR_INVALID_PARAMETER; 3297 /** 3298 * @interface_method_impl{VBOXCRCMD_SVRINFO,pfnGuestCtl} 3299 */ 3300 static DECLCALLBACK(int) crVBoxCrCmdGuestCtl(HVBOXCRCMDSVR hSvr, uint8_t RT_UNTRUSTED_VOLATILE_GUEST *pbCmd, uint32_t cbCmd) 3301 { 3302 /* 3303 * Toplevel input validation. 3304 */ 3305 ASSERT_GUEST_LOGREL_RETURN(cbCmd >= sizeof(VBOXCMDVBVA_3DCTL), VERR_INVALID_PARAMETER); 3306 { 3307 VBOXCMDVBVA_3DCTL RT_UNTRUSTED_VOLATILE_GUEST *pCtl = (VBOXCMDVBVA_3DCTL RT_UNTRUSTED_VOLATILE_GUEST*)pbCmd; 3308 const uint32_t uType = pCtl->u32Type; 3309 RT_UNTRUSTED_NONVOLATILE_COPY_FENCE(); 3310 3311 ASSERT_GUEST_LOGREL_RETURN( uType == VBOXCMDVBVA3DCTL_TYPE_CMD 3312 || uType == VBOXCMDVBVA3DCTL_TYPE_CONNECT 3313 || uType == VBOXCMDVBVA3DCTL_TYPE_DISCONNECT 3314 , VERR_INVALID_PARAMETER); 3315 RT_UNTRUSTED_VALIDATED_FENCE(); 3316 3317 /* 3318 * Call worker abd process the request. 3319 */ 3320 switch (uType) 3321 { 3322 case VBOXCMDVBVA3DCTL_TYPE_CMD: 3323 ASSERT_GUEST_LOGREL_RETURN(cbCmd >= sizeof(VBOXCMDVBVA_3DCTL_CMD), VERR_INVALID_PARAMETER); 3324 { 3325 VBOXCMDVBVA_3DCTL_CMD RT_UNTRUSTED_VOLATILE_GUEST *p3DCmd 3326 = (VBOXCMDVBVA_3DCTL_CMD RT_UNTRUSTED_VOLATILE_GUEST *)pbCmd; 3327 return crVBoxCrCmdCmd(NULL, &p3DCmd->Cmd, cbCmd - RT_OFFSETOF(VBOXCMDVBVA_3DCTL_CMD, Cmd)); 3328 } 3329 3330 case VBOXCMDVBVA3DCTL_TYPE_CONNECT: 3331 ASSERT_GUEST_LOGREL_RETURN(cbCmd == sizeof(VBOXCMDVBVA_3DCTL_CONNECT), VERR_INVALID_PARAMETER); 3332 return crVBoxCrConnect((VBOXCMDVBVA_3DCTL_CONNECT RT_UNTRUSTED_VOLATILE_GUEST *)pCtl); 3333 3334 case VBOXCMDVBVA3DCTL_TYPE_DISCONNECT: 3335 ASSERT_GUEST_LOGREL_RETURN(cbCmd == sizeof(VBOXCMDVBVA_3DCTL), VERR_INVALID_PARAMETER); 3336 { 3337 uint32_t idClient = pCtl->u32CmdClientId; 3338 RT_UNTRUSTED_NONVOLATILE_COPY_FENCE(); 3339 return crVBoxCrDisconnect(idClient); 3340 } 3341 3342 default: 3343 AssertFailedReturn(VERR_IPE_NOT_REACHED_DEFAULT_CASE); 3344 } 3337 3345 } 3338 3346 } … … 3512 3520 3513 3521 3514 static DECLCALLBACK(int8_t) crVBoxCrCmdCmd(HVBOXCRCMDSVR hSvr, const VBOXCMDVBVA_HDR *pCmd, uint32_t cbCmd) 3515 { 3516 switch (pCmd->u8OpCode) 3522 /** 3523 * @interface_method_impl{VBOXCRCMD_SVRINFO,pfnCmd} 3524 */ 3525 static DECLCALLBACK(int8_t) crVBoxCrCmdCmd(HVBOXCRCMDSVR hSvr, 3526 const VBOXCMDVBVA_HDR RT_UNTRUSTED_VOLATILE_GUEST *pCmd, uint32_t cbCmd) 3527 { 3528 uint8_t bOpcode = pCmd->u8OpCode; 3529 RT_UNTRUSTED_NONVOLATILE_COPY_FENCE(); 3530 ASSERT_GUEST_LOGREL_MSG_RETURN( bOpcode == VBOXCMDVBVA_OPTYPE_CRCMD 3531 || bOpcode == VBOXCMDVBVA_OPTYPE_FLIP 3532 || bOpcode == VBOXCMDVBVA_OPTYPE_BLT 3533 || bOpcode == VBOXCMDVBVA_OPTYPE_CLRFILL, 3534 ("%#x\n", bOpcode), -1); 3535 RT_UNTRUSTED_VALIDATED_FENCE(); 3536 3537 switch (bOpcode) 3517 3538 { 3518 3539 case VBOXCMDVBVA_OPTYPE_CRCMD: 3519 { 3520 const VBOXCMDVBVA_CRCMD *pCrCmdDr; 3521 const VBOXCMDVBVA_CRCMD_CMD *pCrCmd; 3522 int rc; 3523 pCrCmdDr = (const VBOXCMDVBVA_CRCMD*)pCmd; 3524 pCrCmd = &pCrCmdDr->Cmd; 3525 if (cbCmd < sizeof (VBOXCMDVBVA_CRCMD)) 3540 ASSERT_GUEST_LOGREL_MSG_RETURN(cbCmd >= sizeof(VBOXCMDVBVA_CRCMD), ("cbCmd=%u\n", cbCmd), -1); 3526 3541 { 3527 WARN(("invalid buffer size")); 3528 return -1; 3529 } 3530 rc = crVBoxServerCmdVbvaCrCmdProcess(pCrCmd, cbCmd - RT_OFFSETOF(VBOXCMDVBVA_CRCMD, Cmd)); 3531 if (RT_SUCCESS(rc)) 3532 { 3533 /* success */ 3542 VBOXCMDVBVA_CRCMD const RT_UNTRUSTED_VOLATILE_GUEST *pCrCmdDr 3543 = (VBOXCMDVBVA_CRCMD const RT_UNTRUSTED_VOLATILE_GUEST *)pCmd; 3544 VBOXCMDVBVA_CRCMD_CMD const RT_UNTRUSTED_VOLATILE_GUEST *pCrCmd = &pCrCmdDr->Cmd; 3545 int rc = crVBoxServerCmdVbvaCrCmdProcess(pCrCmd, cbCmd - RT_OFFSETOF(VBOXCMDVBVA_CRCMD, Cmd)); 3546 ASSERT_GUEST_LOGREL_RC_RETURN(rc, -1); 3534 3547 return 0; 3535 3548 } 3536 3549 3537 WARN(("crVBoxServerCmdVbvaCrCmdProcess failed, rc %d", rc));3538 return -1;3539 }3540 3550 case VBOXCMDVBVA_OPTYPE_FLIP: 3541 { 3542 const VBOXCMDVBVA_FLIP *pFlip; 3543 3544 if (cbCmd < VBOXCMDVBVA_SIZEOF_FLIPSTRUCT_MIN) 3551 ASSERT_GUEST_LOGREL_MSG_RETURN(cbCmd >= VBOXCMDVBVA_SIZEOF_FLIPSTRUCT_MIN, ("cbCmd=%u\n", cbCmd), -1); 3545 3552 { 3546 WARN(("invalid buffer size (cbCmd(%u) < sizeof(VBOXCMDVBVA_FLIP)(%u))", cbCmd, sizeof(VBOXCMDVBVA_FLIP))); 3547 return -1; 3553 VBOXCMDVBVA_FLIP const RT_UNTRUSTED_VOLATILE_GUEST *pFlip 3554 = (VBOXCMDVBVA_FLIP const RT_UNTRUSTED_VOLATILE_GUEST *)pCmd; 3555 return crVBoxServerCrCmdFlipProcess(pFlip, cbCmd); 3548 3556 } 3549 3557 3550 pFlip = (const VBOXCMDVBVA_FLIP*)pCmd;3551 return crVBoxServerCrCmdFlipProcess(pFlip, cbCmd);3552 }3553 3558 case VBOXCMDVBVA_OPTYPE_BLT: 3554 { 3555 if (cbCmd < sizeof (VBOXCMDVBVA_BLT_HDR)) 3556 { 3557 WARN(("invalid buffer size")); 3558 return -1; 3559 } 3560 3561 return crVBoxServerCrCmdBltProcess((const VBOXCMDVBVA_BLT_HDR*)pCmd, cbCmd); 3562 } 3559 ASSERT_GUEST_LOGREL_MSG_RETURN(cbCmd >= sizeof(VBOXCMDVBVA_BLT_HDR), ("cbCmd=%u\n", cbCmd), -1); 3560 return crVBoxServerCrCmdBltProcess((VBOXCMDVBVA_BLT_HDR const RT_UNTRUSTED_VOLATILE_GUEST *)pCmd, cbCmd); 3561 3563 3562 case VBOXCMDVBVA_OPTYPE_CLRFILL: 3564 { 3565 if (cbCmd < sizeof (VBOXCMDVBVA_CLRFILL_HDR)) 3566 { 3567 WARN(("invalid buffer size")); 3568 return -1; 3569 } 3570 3571 return crVBoxServerCrCmdClrFillProcess((const VBOXCMDVBVA_CLRFILL_HDR*)pCmd, cbCmd); 3572 } 3563 ASSERT_GUEST_LOGREL_MSG_RETURN(cbCmd >= sizeof(VBOXCMDVBVA_CLRFILL_HDR), ("cbCmd=%u\n", cbCmd), -1); 3564 return crVBoxServerCrCmdClrFillProcess((VBOXCMDVBVA_CLRFILL_HDR const RT_UNTRUSTED_VOLATILE_GUEST *)pCmd, cbCmd); 3565 3573 3566 default: 3574 WARN(("unsupported command")); 3575 return -1; 3567 AssertFailedReturn(VERR_IPE_NOT_REACHED_DEFAULT_CASE); 3576 3568 } 3577 3569 /* not reached */
Note:
See TracChangeset
for help on using the changeset viewer.