Changeset 23610 in vbox
- Timestamp:
- Oct 7, 2009 9:22:10 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 53284
- Location:
- trunk
- Files:
-
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/iprt/memobj.h
r20525 r23610 146 146 * @returns IPRT status code. 147 147 * @param pMemObj Where to store the ring-0 memory object handle. 148 * @param R3Ptr User virtual address. This is rounded down to a page boundrary. 149 * @param cb Number of bytes to lock. This is rounded up to nearest page boundrary. 150 * @param R0Process The process to lock pages in. NIL_R0PROCESS is an alias for the current one. 151 * 152 * @remarks RTR0MemGetAddressR3() and RTR0MemGetAddress() will return the rounded 148 * @param R3Ptr User virtual address. This is rounded down to a page 149 * boundrary. 150 * @param cb Number of bytes to lock. This is rounded up to 151 * nearest page boundrary. 152 * @param fAccess The desired access, a combination of RTMEM_PROT_READ 153 * and RTMEM_PROT_WRITE. 154 * @param R0Process The process to lock pages in. NIL_R0PROCESS is an 155 * alias for the current one. 156 * 157 * @remarks RTR0MemGetAddressR3() and RTR0MemGetAddress() will return therounded 153 158 * down address. 159 * 154 160 * @remarks Linux: This API requires that the memory begin locked is in a memory 155 161 * mapping that is not required in any forked off child process. This … … 157 163 * lifting it. 158 164 */ 159 RTR0DECL(int) RTR0MemObjLockUser(PRTR0MEMOBJ pMemObj, RTR3PTR R3Ptr, size_t cb, RTR0PROCESS R0Process);165 RTR0DECL(int) RTR0MemObjLockUser(PRTR0MEMOBJ pMemObj, RTR3PTR R3Ptr, size_t cb, uint32_t fAccess, RTR0PROCESS R0Process); 160 166 161 167 /** … … 166 172 * @param pv Kernel virtual address. This is rounded down to a page boundrary. 167 173 * @param cb Number of bytes to lock. This is rounded up to nearest page boundrary. 174 * @param fAccess The desired access, a combination of RTMEM_PROT_READ 175 * and RTMEM_PROT_WRITE. 168 176 * 169 177 * @remark RTR0MemGetAddress() will return the rounded down address. 170 178 */ 171 RTR0DECL(int) RTR0MemObjLockKernel(PRTR0MEMOBJ pMemObj, void *pv, size_t cb );179 RTR0DECL(int) RTR0MemObjLockKernel(PRTR0MEMOBJ pMemObj, void *pv, size_t cb, uint32_t fAccess); 172 180 173 181 /** -
trunk/src/VBox/Additions/common/VBoxGuestLib/HGCMInternal.cpp
r21778 r23610 47 47 /** Linux needs to use bounce buffers since RTR0MemObjLockUser has unwanted 48 48 * side effects. */ 49 # define USE_BOUNC H_BUFFERS49 # define USE_BOUNCE_BUFFERS 50 50 #endif 51 51 … … 64 64 uint32_t iParm; 65 65 RTR0MEMOBJ hObj; 66 #ifdef USE_BOUNC H_BUFFERS66 #ifdef USE_BOUNCE_BUFFERS 67 67 void *pvSmallBuf; 68 68 #endif … … 274 274 if (cb != 0) 275 275 { 276 #ifdef USE_BOUNC H_BUFFERS276 #ifdef USE_BOUNCE_BUFFERS 277 277 void *pvSmallBuf = NULL; 278 278 #endif … … 280 280 RTR0MEMOBJ hObj; 281 281 int rc; 282 uint32_t fAccess = pSrcParm->type == VMMDevHGCMParmType_LinAddr_In 283 || pSrcParm->type == VMMDevHGCMParmType_LinAddr_Locked_In 284 ? RTMEM_PROT_READ 285 : RTMEM_PROT_READ | RTMEM_PROT_WRITE; 282 286 283 287 AssertReturn(iLockBuf < RT_ELEMENTS(pParmInfo->aLockBufs), VERR_INVALID_PARAMETER); … … 286 290 AssertMsgReturn(cb <= VBGLR0_MAX_HGCM_KERNEL_PARM, ("%#x > %#x\n", cb, VBGLR0_MAX_HGCM_KERNEL_PARM), 287 291 VERR_OUT_OF_RANGE); 288 rc = RTR0MemObjLockKernel(&hObj, (void *)pSrcParm->u.Pointer.u.linearAddr, cb );292 rc = RTR0MemObjLockKernel(&hObj, (void *)pSrcParm->u.Pointer.u.linearAddr, cb, fAccess); 289 293 if (RT_FAILURE(rc)) 290 294 { … … 306 310 } 307 311 308 #ifndef USE_BOUNC H_BUFFERS309 rc = RTR0MemObjLockUser(&hObj, (RTR3PTR)pSrcParm->u.Pointer.u.linearAddr, cb, NIL_RTR0PROCESS);312 #ifndef USE_BOUNCE_BUFFERS 313 rc = RTR0MemObjLockUser(&hObj, (RTR3PTR)pSrcParm->u.Pointer.u.linearAddr, cb, fAccess, NIL_RTR0PROCESS); 310 314 if (RT_FAILURE(rc)) 311 315 { … … 317 321 iParm, pSrcParm->type, cb, pSrcParm->u.Pointer.u.linearAddr, hObj)); 318 322 319 #else /* USE_BOUNC H_BUFFERS */323 #else /* USE_BOUNCE_BUFFERS */ 320 324 /* 321 325 * This is a bit massive, but we don't want to waste a … … 347 351 } 348 352 } 349 rc = RTR0MemObjLockKernel(&hObj, pvSmallBuf, cb );353 rc = RTR0MemObjLockKernel(&hObj, pvSmallBuf, cb, fAccess); 350 354 if (RT_FAILURE(rc)) 351 355 { … … 380 384 iParm, pSrcParm->type, cb, pSrcParm->u.Pointer.u.linearAddr, hObj)); 381 385 } 382 #endif /* USE_BOUNC H_BUFFERS */386 #endif /* USE_BOUNCE_BUFFERS */ 383 387 } 384 388 385 389 pParmInfo->aLockBufs[iLockBuf].iParm = iParm; 386 390 pParmInfo->aLockBufs[iLockBuf].hObj = hObj; 387 #ifdef USE_BOUNC H_BUFFERS391 #ifdef USE_BOUNCE_BUFFERS 388 392 pParmInfo->aLockBufs[iLockBuf].pvSmallBuf = pvSmallBuf; 389 393 #endif … … 541 545 if (pSrcParm->u.Pointer.size != 0) 542 546 { 543 #ifdef USE_BOUNC H_BUFFERS547 #ifdef USE_BOUNCE_BUFFERS 544 548 void *pvSmallBuf = pParmInfo->aLockBufs[iLockBuf].pvSmallBuf; 545 549 #endif … … 557 561 pDstParm->u.PageList.offset = offExtra; 558 562 pDstPgLst->flags = vbglR0HGCMInternalLinAddrTypeToPageListFlags(pSrcParm->type); 559 #ifdef USE_BOUNC H_BUFFERS563 #ifdef USE_BOUNCE_BUFFERS 560 564 if (fIsUser) 561 565 pDstPgLst->offFirstPage = (uintptr_t)pvSmallBuf & PAGE_OFFSET_MASK; … … 576 580 pDstParm->type = vbglR0HGCMInternalConvertLinAddrType(pSrcParm->type); 577 581 pDstParm->u.Pointer.size = pSrcParm->u.Pointer.size; 578 #ifdef USE_BOUNC H_BUFFERS582 #ifdef USE_BOUNCE_BUFFERS 579 583 if (fIsUser) 580 584 pDstParm->u.Pointer.u.linearAddr = pvSmallBuf … … 749 753 HGCMFunctionParameter *pDstParm = VBOXGUEST_HGCM_CALL_PARMS(pCallInfo); 750 754 uint32_t cParms = pCallInfo->cParms; 751 #ifdef USE_BOUNC H_BUFFERS755 #ifdef USE_BOUNCE_BUFFERS 752 756 uint32_t iLockBuf = 0; 753 757 #endif … … 777 781 case VMMDevHGCMParmType_LinAddr_Locked_In: 778 782 case VMMDevHGCMParmType_LinAddr_In: 779 #ifdef USE_BOUNC H_BUFFERS783 #ifdef USE_BOUNCE_BUFFERS 780 784 if ( fIsUser 781 785 && iLockBuf < pParmInfo->cLockBufs … … 798 802 case VMMDevHGCMParmType_LinAddr: 799 803 { 800 #ifdef USE_BOUNC H_BUFFERS804 #ifdef USE_BOUNCE_BUFFERS 801 805 if (fIsUser) 802 806 { … … 830 834 } 831 835 832 #ifdef USE_BOUNC H_BUFFERS836 #ifdef USE_BOUNCE_BUFFERS 833 837 Assert(!fIsUser || pParmInfo->cLockBufs == iLockBuf); 834 838 #endif … … 904 908 { 905 909 RTR0MemObjFree(ParmInfo.aLockBufs[ParmInfo.cLockBufs].hObj, false /*fFreeMappings*/); 906 #ifdef USE_BOUNC H_BUFFERS910 #ifdef USE_BOUNCE_BUFFERS 907 911 RTMemTmpFree(ParmInfo.aLockBufs[ParmInfo.cLockBufs].pvSmallBuf); 908 912 #endif -
trunk/src/VBox/Additions/common/VBoxGuestLib/SysHlp.cpp
r21412 r23610 100 100 * know they aren't pagable. 101 101 */ 102 RTR0MEMOBJ MemObj = NIL_RTR0MEMOBJ; 102 RTR0MEMOBJ MemObj = NIL_RTR0MEMOBJ; 103 uint32_t fAccess = RTMEM_PROT_READ | (fWriteAccess ? RTMEM_PROT_WRITE : 0); 103 104 if ((fFlags & VBGLR0_HGCMCALL_F_MODE_MASK) == VBGLR0_HGCMCALL_F_USER) 104 rc = RTR0MemObjLockUser(&MemObj, (RTR3PTR)pv, u32Size, NIL_RTR0PROCESS);105 rc = RTR0MemObjLockUser(&MemObj, (RTR3PTR)pv, u32Size, fAccess, NIL_RTR0PROCESS); 105 106 else 106 rc = RTR0MemObjLockKernel(&MemObj, pv, u32Size );107 rc = RTR0MemObjLockKernel(&MemObj, pv, u32Size, fAccess); 107 108 if (RT_SUCCESS(rc)) 108 109 *ppvCtx = MemObj; -
trunk/src/VBox/HostDrivers/Support/SUPDrv.c
r22615 r23610 203 203 DECLASM(int) UNWIND_WRAP(RTR0MemObjAllocCont)(PRTR0MEMOBJ pMemObj, size_t cb, bool fExecutable); 204 204 DECLASM(int) UNWIND_WRAP(RTR0MemObjEnterPhys)(PRTR0MEMOBJ pMemObj, RTHCPHYS Phys, size_t cb); 205 DECLASM(int) UNWIND_WRAP(RTR0MemObjLockUser)(PRTR0MEMOBJ pMemObj, RTR3PTR R3Ptr, size_t cb, RTR0PROCESS R0Process);205 DECLASM(int) UNWIND_WRAP(RTR0MemObjLockUser)(PRTR0MEMOBJ pMemObj, RTR3PTR R3Ptr, size_t cb, uint32_t fFlags, RTR0PROCESS R0Process); 206 206 DECLASM(int) UNWIND_WRAP(RTR0MemObjMapKernel)(PRTR0MEMOBJ pMemObj, RTR0MEMOBJ MemObjToMap, void *pvFixed, size_t uAlignment, unsigned fProt); 207 207 DECLASM(int) UNWIND_WRAP(RTR0MemObjMapKernelEx)(PRTR0MEMOBJ pMemObj, RTR0MEMOBJ MemObjToMap, void *pvFixed, size_t uAlignment, unsigned fProt, size_t offSub, size_t cbSub); … … 2321 2321 */ 2322 2322 Mem.eType = MEMREF_TYPE_LOCKED; 2323 rc = RTR0MemObjLockUser(&Mem.MemObj, pvR3, cb, RT R0ProcHandleSelf());2323 rc = RTR0MemObjLockUser(&Mem.MemObj, pvR3, cb, RTMEM_PROT_READ | RTMEM_PROT_WRITE, RTR0ProcHandleSelf()); 2324 2324 if (RT_SUCCESS(rc)) 2325 2325 { -
trunk/src/VBox/HostDrivers/Support/SUPDrvIOC.h
r22615 r23610 197 197 * - Nothing. 198 198 */ 199 #define SUPDRV_IOC_VERSION 0x00 0f0000199 #define SUPDRV_IOC_VERSION 0x00100000 200 200 201 201 /** SUP_IOCTL_COOKIE. */ -
trunk/src/VBox/HostDrivers/Support/SUPLib.cpp
r22615 r23610 272 272 strcpy(CookieReq.u.In.szMagic, SUPCOOKIE_MAGIC); 273 273 CookieReq.u.In.u32ReqVersion = SUPDRV_IOC_VERSION; 274 const uint32_t MinVersion = (SUPDRV_IOC_VERSION & 0xffff0000) == 0x000f0000275 ? 0x000f0000276 : SUPDRV_IOC_VERSION & 0xffff0000;277 CookieReq.u.In.u32MinVersion = MinVersion;274 const uint32_t uMinVersion = (SUPDRV_IOC_VERSION & 0xffff0000) == 0x00100000 275 ? 0x00100000 276 : SUPDRV_IOC_VERSION & 0xffff0000; 277 CookieReq.u.In.u32MinVersion = uMinVersion; 278 278 rc = suplibOsIOCtl(&g_supLibData, SUP_IOCTL_COOKIE, &CookieReq, SUP_IOCTL_COOKIE_SIZE); 279 279 if ( RT_SUCCESS(rc) … … 281 281 { 282 282 if ( (CookieReq.u.Out.u32SessionVersion & 0xffff0000) == (SUPDRV_IOC_VERSION & 0xffff0000) 283 && CookieReq.u.Out.u32SessionVersion >= MinVersion)283 && CookieReq.u.Out.u32SessionVersion >= uMinVersion) 284 284 { 285 285 /* … … 348 348 { 349 349 LogRel(("Support driver version mismatch: SessionVersion=%#x DriverVersion=%#x ClientVersion=%#x MinVersion=%#x\n", 350 CookieReq.u.Out.u32SessionVersion, CookieReq.u.Out.u32DriverVersion, SUPDRV_IOC_VERSION, MinVersion));350 CookieReq.u.Out.u32SessionVersion, CookieReq.u.Out.u32DriverVersion, SUPDRV_IOC_VERSION, uMinVersion)); 351 351 rc = VERR_VM_DRIVER_VERSION_MISMATCH; 352 352 } -
trunk/src/VBox/HostDrivers/Support/win/SUPDrvA-win.asm
r22077 r23610 99 99 NtWrapDyn2DrvFunctionWithAllRegParams supdrvNtWrap, RTR0MemObjAllocCont 100 100 NtWrapDyn2DrvFunctionWithAllRegParams supdrvNtWrap, RTR0MemObjEnterPhys 101 NtWrapDyn2DrvFunctionWith AllRegParamssupdrvNtWrap, RTR0MemObjLockUser101 NtWrapDyn2DrvFunctionWith5Params supdrvNtWrap, RTR0MemObjLockUser 102 102 NtWrapDyn2DrvFunctionWith5Params supdrvNtWrap, RTR0MemObjMapKernel 103 103 NtWrapDyn2DrvFunctionWith7Params supdrvNtWrap, RTR0MemObjMapKernelEx -
trunk/src/VBox/Runtime/include/internal/memobj.h
r20525 r23610 335 335 * @param R3Ptr User virtual address, page aligned. 336 336 * @param cb Number of bytes to lock, page aligned. 337 * @param fAccess The desired access, a combination of RTMEM_PROT_READ 338 * and RTMEM_PROT_WRITE. 337 339 * @param R0Process The process to lock pages in. 338 340 */ 339 int rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3Ptr, size_t cb, RTR0PROCESS R0Process);341 int rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3Ptr, size_t cb, uint32_t fAccess, RTR0PROCESS R0Process); 340 342 341 343 /** … … 346 348 * @param pv Kernel virtual address, page aligned. 347 349 * @param cb Number of bytes to lock, page aligned. 348 */ 349 int rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb); 350 * @param fAccess The desired access, a combination of RTMEM_PROT_READ 351 * and RTMEM_PROT_WRITE. 352 */ 353 int rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb, uint32_t fAccess); 350 354 351 355 /** -
trunk/src/VBox/Runtime/r0drv/darwin/memobj-r0drv-darwin.cpp
r22069 r23610 655 655 * @return IPRT status code. 656 656 * 657 * @param ppMem Where to store the memory object pointer. 658 * @param pv First page. 659 * @param cb Number of bytes. 660 * @param Task The task \a pv and \a cb refers to. 657 * @param ppMem Where to store the memory object pointer. 658 * @param pv First page. 659 * @param cb Number of bytes. 660 * @param fAccess The desired access, a combination of RTMEM_PROT_READ 661 * and RTMEM_PROT_WRITE. 662 * @param Task The task \a pv and \a cb refers to. 661 663 */ 662 static int rtR0MemObjNativeLock(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb, task_t Task) 663 { 664 static int rtR0MemObjNativeLock(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb, uint32_t fAccess, task_t Task) 665 { 666 NOREF(fAccess); 664 667 #ifdef USE_VM_MAP_WIRE 665 668 vm_map_t Map = get_task_map(Task); … … 729 732 730 733 731 int rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3Ptr, size_t cb, RTR0PROCESS R0Process)732 { 733 return rtR0MemObjNativeLock(ppMem, (void *)R3Ptr, cb, (task_t)R0Process);734 } 735 736 737 int rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb )738 { 739 return rtR0MemObjNativeLock(ppMem, pv, cb, kernel_task);734 int rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3Ptr, size_t cb, uint32_t fAccess, RTR0PROCESS R0Process) 735 { 736 return rtR0MemObjNativeLock(ppMem, (void *)R3Ptr, cb, fAccess, (task_t)R0Process); 737 } 738 739 740 int rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb, uint32_t fAccess) 741 { 742 return rtR0MemObjNativeLock(ppMem, pv, cb, fAccess, kernel_task); 740 743 } 741 744 -
trunk/src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c
r22574 r23610 378 378 379 379 380 int rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3Ptr, size_t cb, RTR0PROCESS R0Process)380 int rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3Ptr, size_t cb, uint32_t fAccess, RTR0PROCESS R0Process) 381 381 { 382 382 int rc; 383 NOREF(fAccess); 383 384 384 385 /* create the object. */ … … 406 407 407 408 408 int rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb )409 int rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb, uint32_t fAccess) 409 410 { 410 411 int rc; 412 NOREF(fAccess); 411 413 412 414 /* create the object. */ -
trunk/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
r22680 r23610 734 734 735 735 736 int rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3Ptr, size_t cb, RTR0PROCESS R0Process)736 int rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3Ptr, size_t cb, uint32_t fAccess, RTR0PROCESS R0Process) 737 737 { 738 738 const int cPages = cb >> PAGE_SHIFT; … … 741 741 PRTR0MEMOBJLNX pMemLnx; 742 742 int rc = VERR_NO_MEMORY; 743 NOREF(fAccess); 743 744 744 745 /* … … 830 831 831 832 832 int rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb )833 int rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb, uint32_t fFlags) 833 834 { 834 835 void *pvLast = (uint8_t *)pv + cb - 1; … … 839 840 uint8_t *pbPage; 840 841 size_t iPage; 842 NOREF(fAccess); 841 843 842 844 /* -
trunk/src/VBox/Runtime/r0drv/memobj-r0drv.cpp
r22052 r23610 492 492 * @returns IPRT status code. 493 493 * @param pMemObj Where to store the ring-0 memory object handle. 494 * @param R3Ptr User virtual address. This is rounded down to a page boundrary. 495 * @param cb Number of bytes to lock. This is rounded up to nearest page boundrary. 496 * @param R0Process The process to lock pages in. NIL_R0PROCESS is an alias for the current one. 494 * @param R3Ptr User virtual address. This is rounded down to a page 495 * boundrary. 496 * @param cb Number of bytes to lock. This is rounded up to 497 * nearest page boundrary. 498 * @param fAccess The desired access, a combination of RTMEM_PROT_READ 499 * and RTMEM_PROT_WRITE. 500 * @param R0Process The process to lock pages in. NIL_R0PROCESS is an 501 * alias for the current one. 497 502 * 498 503 * @remarks RTR0MemGetAddressR3() and RTR0MemGetAddress() will return therounded … … 504 509 * lifting it. 505 510 */ 506 RTR0DECL(int) RTR0MemObjLockUser(PRTR0MEMOBJ pMemObj, RTR3PTR R3Ptr, size_t cb, RTR0PROCESS R0Process)511 RTR0DECL(int) RTR0MemObjLockUser(PRTR0MEMOBJ pMemObj, RTR3PTR R3Ptr, size_t cb, uint32_t fAccess, RTR0PROCESS R0Process) 507 512 { 508 513 /* sanity checks. */ … … 515 520 if (R0Process == NIL_RTR0PROCESS) 516 521 R0Process = RTR0ProcHandleSelf(); 522 AssertReturn(!(fAccess & ~(RTMEM_PROT_READ | RTMEM_PROT_WRITE)), VERR_INVALID_PARAMETER); 523 AssertReturn(fAccess, VERR_INVALID_PARAMETER); 517 524 RT_ASSERT_PREEMPTIBLE(); 518 525 519 526 /* do the locking. */ 520 return rtR0MemObjNativeLockUser(pMemObj, R3PtrAligned, cbAligned, R0Process);527 return rtR0MemObjNativeLockUser(pMemObj, R3PtrAligned, cbAligned, fAccess, R0Process); 521 528 } 522 529 RT_EXPORT_SYMBOL(RTR0MemObjLockUser); … … 530 537 * @param pv Kernel virtual address. This is rounded down to a page boundrary. 531 538 * @param cb Number of bytes to lock. This is rounded up to nearest page boundrary. 539 * @param fAccess The desired access, a combination of RTMEM_PROT_READ 540 * and RTMEM_PROT_WRITE. 532 541 * 533 542 * @remark RTR0MemGetAddress() will return the rounded down address. 534 543 */ 535 RTR0DECL(int) RTR0MemObjLockKernel(PRTR0MEMOBJ pMemObj, void *pv, size_t cb )544 RTR0DECL(int) RTR0MemObjLockKernel(PRTR0MEMOBJ pMemObj, void *pv, size_t cb, uint32_t fAccess) 536 545 { 537 546 /* sanity checks. */ … … 543 552 AssertReturn(cb <= cbAligned, VERR_INVALID_PARAMETER); 544 553 AssertPtrReturn(pvAligned, VERR_INVALID_POINTER); 554 AssertReturn(!(fAccess & ~(RTMEM_PROT_READ | RTMEM_PROT_WRITE)), VERR_INVALID_PARAMETER); 555 AssertReturn(fAccess, VERR_INVALID_PARAMETER); 545 556 RT_ASSERT_PREEMPTIBLE(); 546 557 547 558 /* do the allocation. */ 548 return rtR0MemObjNativeLockKernel(pMemObj, pvAligned, cbAligned );559 return rtR0MemObjNativeLockKernel(pMemObj, pvAligned, cbAligned, fAccess); 549 560 } 550 561 RT_EXPORT_SYMBOL(RTR0MemObjLockKernel); -
trunk/src/VBox/Runtime/r0drv/nt/memobj-r0drv-nt.cpp
r23065 r23610 501 501 * @return IPRT status code. 502 502 * 503 * @param ppMem Where to store the memory object pointer. 504 * @param pv First page. 505 * @param cb Number of bytes. 506 * @param R0Process The process \a pv and \a cb refers to. 503 * @param ppMem Where to store the memory object pointer. 504 * @param pv First page. 505 * @param cb Number of bytes. 506 * @param fAccess The desired access, a combination of RTMEM_PROT_READ 507 * and RTMEM_PROT_WRITE. 508 * @param R0Process The process \a pv and \a cb refers to. 507 509 */ 508 static int rtR0MemObjNtLock(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb, RTR0PROCESS R0Process)510 static int rtR0MemObjNtLock(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb, uint32_t fAccess, RTR0PROCESS R0Process) 509 511 { 510 512 /* … … 549 551 __try 550 552 { 551 MmProbeAndLockPages(pMdl, R0Process == NIL_RTR0PROCESS ? KernelMode : UserMode, IoModifyAccess); 553 MmProbeAndLockPages(pMdl, 554 R0Process == NIL_RTR0PROCESS ? KernelMode : UserMode, 555 fAccess == RTMEM_PROT_READ 556 ? IoReadAccess 557 : fAccess == RTMEM_PROT_WRITE 558 ? IoWriteAccess 559 : IoModifyAccess); 552 560 553 561 pMemNt->apMdls[iMdl] = pMdl; … … 561 569 } 562 570 563 if (R0Process != NIL_RTR0PROCESS 571 if (R0Process != NIL_RTR0PROCESS) 564 572 { 565 573 /* Make sure the user process can't change the allocation. */ 566 pMemNt->pvSecureMem = MmSecureVirtualMemory(pv, cb, PAGE_READWRITE); 574 pMemNt->pvSecureMem = MmSecureVirtualMemory(pv, cb, 575 fAccess & RTMEM_PROT_WRITE 576 ? PAGE_READWRITE 577 : PAGE_READONLY); 567 578 if (!pMemNt->pvSecureMem) 568 579 { … … 604 615 605 616 606 int rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3Ptr, size_t cb, RTR0PROCESS R0Process)617 int rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3Ptr, size_t cb, uint32_t fAccess, RTR0PROCESS R0Process) 607 618 { 608 619 AssertMsgReturn(R0Process == RTR0ProcHandleSelf(), ("%p != %p\n", R0Process, RTR0ProcHandleSelf()), VERR_NOT_SUPPORTED); 609 620 /* (Can use MmProbeAndLockProcessPages if we need to mess with other processes later.) */ 610 return rtR0MemObjNtLock(ppMem, (void *)R3Ptr, cb, R0Process);611 } 612 613 614 int rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb )615 { 616 return rtR0MemObjNtLock(ppMem, pv, cb, NIL_RTR0PROCESS);621 return rtR0MemObjNtLock(ppMem, (void *)R3Ptr, cb, fAccess, R0Process); 622 } 623 624 625 int rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb, uint32_t fAccess) 626 { 627 return rtR0MemObjNtLock(ppMem, pv, cb, fAccess, NIL_RTR0PROCESS); 617 628 } 618 629 -
trunk/src/VBox/Runtime/r0drv/os2/memobj-r0drv-os2.cpp
r21497 r23610 242 242 243 243 244 int rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3Ptr, size_t cb, RTR0PROCESS R0Process)244 int rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3Ptr, size_t cb, uint32_t fAccess, RTR0PROCESS R0Process) 245 245 { 246 246 AssertMsgReturn(R0Process == RTR0ProcHandleSelf(), ("%p != %p\n", R0Process, RTR0ProcHandleSelf()), VERR_NOT_SUPPORTED); … … 254 254 /* lock it. */ 255 255 ULONG cPagesRet = cPages; 256 int rc = KernVMLock(VMDHL_LONG | VMDHL_WRITE, (void *)R3Ptr, cb, &pMemOs2->Lock, &pMemOs2->aPages[0], &cPagesRet); 256 int rc = KernVMLock(VMDHL_LONG | (fAccess & RTMEM_PROT_WRITE ? VMDHL_WRITE : 0), 257 (void *)R3Ptr, cb, &pMemOs2->Lock, &pMemOs2->aPages[0], &cPagesRet); 257 258 if (!rc) 258 259 { … … 269 270 270 271 271 int rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb )272 int rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb, uint32_t fAccess) 272 273 { 273 274 /* create the object. */ … … 279 280 /* lock it. */ 280 281 ULONG cPagesRet = cPages; 281 int rc = KernVMLock(VMDHL_LONG | VMDHL_WRITE, pv, cb, &pMemOs2->Lock, &pMemOs2->aPages[0], &cPagesRet); 282 int rc = KernVMLock(VMDHL_LONG | (fAccess & RTMEM_PROT_WRITE ? VMDHL_WRITE : 0), 283 pv, cb, &pMemOs2->Lock, &pMemOs2->aPages[0], &cPagesRet); 282 284 if (!rc) 283 285 { -
trunk/src/VBox/Runtime/r0drv/solaris/memobj-r0drv-solaris.c
r22073 r23610 272 272 273 273 274 int rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3Ptr, size_t cb, RTR0PROCESS R0Process)274 int rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3Ptr, size_t cb, uint32_t fAccess, RTR0PROCESS R0Process) 275 275 { 276 276 AssertReturn(R0Process == RTR0ProcHandleSelf(), VERR_INVALID_PARAMETER); 277 NOREF(fAccess); 277 278 278 279 /* Create the locking object */ … … 306 307 307 308 308 int rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb) 309 { 309 int rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb, uint32_t fAccess) 310 { 311 NOREF(fAccess); 312 310 313 /* Create the locking object */ 311 314 PRTR0MEMOBJSOLARIS pMemSolaris = (PRTR0MEMOBJSOLARIS)rtR0MemObjNew(sizeof(*pMemSolaris), RTR0MEMOBJTYPE_LOCK, pv, cb); -
trunk/src/VBox/Runtime/r0drv/solaris/vbi/memobj-r0drv-solaris.c
r22073 r23610 213 213 214 214 215 int rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3Ptr, size_t cb, RTR0PROCESS R0Process)215 int rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3Ptr, size_t cb, uint32_t fAccess, RTR0PROCESS R0Process) 216 216 { 217 217 AssertReturn(R0Process == RTR0ProcHandleSelf(), VERR_INVALID_PARAMETER); 218 NOREF(fAccess); 218 219 219 220 /* Create the locking object */ … … 239 240 240 241 241 int rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb) 242 { 242 int rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb, uint32_t fAccess) 243 { 244 NOREF(fAccess); 245 243 246 PRTR0MEMOBJSOLARIS pMemSolaris = (PRTR0MEMOBJSOLARIS)rtR0MemObjNew(sizeof(*pMemSolaris), RTR0MEMOBJTYPE_LOCK, pv, cb); 244 247 if (!pMemSolaris) -
trunk/src/VBox/VMM/VMMR0/GMMR0.cpp
r20900 r23610 3105 3105 */ 3106 3106 RTR0MEMOBJ MemObj; 3107 rc = RTR0MemObjLockUser(&MemObj, pvR3, GMM_CHUNK_SIZE, NIL_RTR0PROCESS);3107 rc = RTR0MemObjLockUser(&MemObj, pvR3, GMM_CHUNK_SIZE, RTMEM_PROT_READ | RTMEM_PROT_WRITE, NIL_RTR0PROCESS); 3108 3108 if (RT_SUCCESS(rc)) 3109 3109 {
Note:
See TracChangeset
for help on using the changeset viewer.