Changeset 76196 in vbox
- Timestamp:
- Dec 12, 2018 7:24:05 PM (6 years ago)
- Location:
- trunk
- Files:
-
- 5 edited
-
include/VBox/VMMDev.h (modified) (1 diff)
-
include/VBox/VMMDevCoreTypes.h (modified) (1 diff)
-
src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR0LibHGCMInternal.cpp (modified) (3 diffs)
-
src/VBox/Devices/VMMDev/VMMDev.cpp (modified) (1 diff)
-
src/VBox/Devices/VMMDev/VMMDevHGCM.cpp (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/VMMDev.h
r76107 r76196 541 541 * @{ */ 542 542 /** Physical page lists are supported by HGCM. */ 543 #define VMMDEV_HVF_HGCM_PHYS_PAGE_LIST RT_BIT_32(0)543 #define VMMDEV_HVF_HGCM_PHYS_PAGE_LIST RT_BIT_32(0) 544 544 /** HGCM supports the embedded buffer parameter type. */ 545 #define VMMDEV_HVF_HGCM_EMBEDDED_BUFFERS RT_BIT_32(1) 545 #define VMMDEV_HVF_HGCM_EMBEDDED_BUFFERS RT_BIT_32(1) 546 /** HGCM supports the contiguous page list parameter type. */ 547 #define VMMDEV_HVF_HGCM_CONTIGUOUS_PAGE_LIST RT_BIT_32(2) 546 548 /** VMMDev supports fast IRQ acknowledgements. */ 547 #define VMMDEV_HVF_FAST_IRQ_ACK RT_BIT_32(31)549 #define VMMDEV_HVF_FAST_IRQ_ACK RT_BIT_32(31) 548 550 /** @} */ 549 551 -
trunk/include/VBox/VMMDevCoreTypes.h
r75548 r76196 275 275 VMMDevHGCMParmType_PageList = 10, /**< Physical addresses of locked pages for a buffer. */ 276 276 VMMDevHGCMParmType_Embedded = 11, /**< Small buffer embedded in request. */ 277 VMMDevHGCMParmType_ContiguousPageList = 12, /**< Like PageList but with physically contiguous memory, so only one page entry. */ 277 278 VMMDevHGCMParmType_SizeHack = 0x7fffffff 278 279 } HGCMFunctionParameterType; -
trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR0LibHGCMInternal.cpp
r75753 r76196 218 218 219 219 case VMMDevHGCMParmType_PageList: 220 case VMMDevHGCMParmType_ContiguousPageList: 220 221 if (fIsUser) 221 222 return VERR_INVALID_PARAMETER; … … 553 554 554 555 case VMMDevHGCMParmType_PageList: 555 pDstParm->type = VMMDevHGCMParmType_PageList; 556 case VMMDevHGCMParmType_ContiguousPageList: 557 pDstParm->type = pSrcParm->type; 556 558 pDstParm->u.PageList.size = pSrcParm->u.PageList.size; 557 559 if (pSrcParm->u.PageList.size) … … 857 859 858 860 case VMMDevHGCMParmType_PageList: 861 case VMMDevHGCMParmType_ContiguousPageList: 859 862 pDstParm->u.PageList.size = pSrcParm->u.PageList.size; 860 863 break; -
trunk/src/VBox/Devices/VMMDev/VMMDev.cpp
r75990 r76196 2299 2299 pReq->build = RTBldCfgVersionBuild(); 2300 2300 pReq->revision = RTBldCfgRevision(); 2301 pReq->features = VMMDEV_HVF_HGCM_PHYS_PAGE_LIST | VMMDEV_HVF_HGCM_EMBEDDED_BUFFERS | VMMDEV_HVF_FAST_IRQ_ACK; 2301 pReq->features = VMMDEV_HVF_HGCM_PHYS_PAGE_LIST 2302 | VMMDEV_HVF_HGCM_EMBEDDED_BUFFERS 2303 | VMMDEV_HVF_HGCM_CONTIGUOUS_PAGE_LIST 2304 | VMMDEV_HVF_FAST_IRQ_ACK; 2302 2305 return VINF_SUCCESS; 2303 2306 } -
trunk/src/VBox/Devices/VMMDev/VMMDevHGCM.cpp
r76145 r76196 329 329 || pGuestParm->enmType == VMMDevHGCMParmType_LinAddr_Out 330 330 || pGuestParm->enmType == VMMDevHGCMParmType_LinAddr 331 || pGuestParm->enmType == VMMDevHGCMParmType_PageList) 331 || pGuestParm->enmType == VMMDevHGCMParmType_PageList 332 || pGuestParm->enmType == VMMDevHGCMParmType_ContiguousPageList) 332 333 if (pGuestParm->u.ptr.paPages != &pGuestParm->u.ptr.GCPhysSinglePage) 333 334 RTMemFree(pGuestParm->u.ptr.paPages); … … 667 668 case VMMDevHGCMParmType_PageList: 668 669 case VMMDevHGCMParmType_Embedded: 670 case VMMDevHGCMParmType_ContiguousPageList: 669 671 { 670 672 const uint32_t cbData = pGuestParm->u.ptr.cbData; … … 684 686 if (pGuestParm->enmType != VMMDevHGCMParmType_Embedded) 685 687 { 686 int rc = vmmdevHGCMGuestBufferRead(pThis->pDevInsR3, pv, cbData, &pGuestParm->u.ptr); 687 ASSERT_GUEST_RETURN(RT_SUCCESS(rc), rc); 688 RT_UNTRUSTED_NONVOLATILE_COPY_FENCE(); 688 if (pGuestParm->enmType != VMMDevHGCMParmType_ContiguousPageList) 689 { 690 int rc = vmmdevHGCMGuestBufferRead(pThis->pDevInsR3, pv, cbData, &pGuestParm->u.ptr); 691 ASSERT_GUEST_RETURN(RT_SUCCESS(rc), rc); 692 RT_UNTRUSTED_NONVOLATILE_COPY_FENCE(); 693 } 694 else 695 { 696 int rc = PDMDevHlpPhysRead(pThis->pDevInsR3, 697 pGuestParm->u.ptr.paPages[0] | pGuestParm->u.ptr.offFirstPage, 698 pv, cbData); 699 ASSERT_GUEST_RETURN(RT_SUCCESS(rc), rc); 700 RT_UNTRUSTED_NONVOLATILE_COPY_FENCE(); 701 } 689 702 } 690 703 else … … 898 911 899 912 case VMMDevHGCMParmType_PageList: 913 case VMMDevHGCMParmType_ContiguousPageList: 900 914 { 901 915 #ifdef VBOX_WITH_64_BITS_GUESTS … … 929 943 && pPageListInfo->cPages <= cMaxPages, 930 944 VERR_INVALID_PARAMETER); 945 946 /* Contiguous page lists only ever have a single page. */ 947 ASSERT_GUEST_RETURN( pPageListInfo->cPages == 1 948 || pGuestParm->enmType == VMMDevHGCMParmType_PageList, VERR_INVALID_PARAMETER); 931 949 932 950 /* Other fields of PageListInfo. */ … … 1198 1216 AssertReturn(pCmd->enmCmdType == VBOXHGCMCMDTYPE_CALL, VERR_INTERNAL_ERROR); 1199 1217 1200 int rc = VINF_SUCCESS;1201 1202 1218 /* 1203 1219 * Go over parameter descriptions saved in pCmd. … … 1230 1246 const VBOXHGCMPARMPTR * const pPtr = &pGuestParm->u.ptr; 1231 1247 if ( pPtr->cbData > 0 1232 && pPtr->fu32Direction & VBOX_HGCM_F_PARM_DIRECTION_FROM_HOST)1248 && (pPtr->fu32Direction & VBOX_HGCM_F_PARM_DIRECTION_FROM_HOST)) 1233 1249 { 1234 1250 const void *pvSrc = pHostParm->u.pointer.addr; 1235 1251 uint32_t cbSrc = pHostParm->u.pointer.size; 1236 rc = vmmdevHGCMGuestBufferWrite(pThis->pDevInsR3, pPtr, pvSrc, cbSrc); 1252 int rc = vmmdevHGCMGuestBufferWrite(pThis->pDevInsR3, pPtr, pvSrc, cbSrc); 1253 if (RT_FAILURE(rc)) 1254 break; 1237 1255 } 1238 1256 break; … … 1254 1272 } 1255 1273 1274 case VMMDevHGCMParmType_ContiguousPageList: 1275 { 1276 /** @todo Update the return buffer size. */ 1277 const VBOXHGCMPARMPTR * const pPtr = &pGuestParm->u.ptr; 1278 if ( pPtr->cbData > 0 1279 && (pPtr->fu32Direction & VBOX_HGCM_F_PARM_DIRECTION_FROM_HOST)) 1280 { 1281 const void *pvSrc = pHostParm->u.pointer.addr; 1282 uint32_t cbSrc = pHostParm->u.pointer.size; 1283 uint32_t cbToCopy = RT_MIN(cbSrc, pPtr->cbData); 1284 int rc = PDMDevHlpPhysWrite(pThis->pDevInsR3, pGuestParm->u.ptr.paPages[0], pvSrc, cbToCopy); 1285 if (RT_FAILURE(rc)) 1286 break; 1287 } 1288 break; 1289 } 1290 1256 1291 default: 1257 1292 break; 1258 1293 } 1259 1260 if (RT_FAILURE(rc)) 1261 break; 1262 } 1263 1264 return rc; 1294 } 1295 1296 return VINF_SUCCESS; 1265 1297 } 1266 1298 … … 1642 1674 || pGuestParm->enmType == VMMDevHGCMParmType_LinAddr 1643 1675 || pGuestParm->enmType == VMMDevHGCMParmType_PageList 1644 || pGuestParm->enmType == VMMDevHGCMParmType_Embedded) 1676 || pGuestParm->enmType == VMMDevHGCMParmType_Embedded 1677 || pGuestParm->enmType == VMMDevHGCMParmType_ContiguousPageList) 1645 1678 { 1646 1679 const VBOXHGCMPARMPTR * const pPtr = &pGuestParm->u.ptr; … … 1776 1809 || pGuestParm->enmType == VMMDevHGCMParmType_LinAddr 1777 1810 || pGuestParm->enmType == VMMDevHGCMParmType_PageList 1778 || pGuestParm->enmType == VMMDevHGCMParmType_Embedded) 1811 || pGuestParm->enmType == VMMDevHGCMParmType_Embedded 1812 || pGuestParm->enmType == VMMDevHGCMParmType_ContiguousPageList) 1779 1813 { 1780 1814 VBOXHGCMPARMPTR * const pPtr = &pGuestParm->u.ptr; … … 1789 1823 else 1790 1824 { 1791 AssertReturn(pGuestParm->enmType != VMMDevHGCMParmType_Embedded, VERR_INTERNAL_ERROR_3); 1825 AssertReturn( pGuestParm->enmType != VMMDevHGCMParmType_Embedded 1826 && pGuestParm->enmType != VMMDevHGCMParmType_ContiguousPageList, VERR_INTERNAL_ERROR_3); 1792 1827 pPtr->paPages = (RTGCPHYS *)RTMemAlloc(pPtr->cPages * sizeof(RTGCPHYS)); 1793 1828 AssertStmt(pPtr->paPages, rc = VERR_NO_MEMORY);
Note:
See TracChangeset
for help on using the changeset viewer.

