Changeset 76196 in vbox for trunk/src/VBox/Devices/VMMDev
- Timestamp:
- Dec 12, 2018 7:24:05 PM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 127453
- Location:
- trunk/src/VBox/Devices/VMMDev
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
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.