- Timestamp:
- Jan 2, 2023 3:26:21 PM (2 years ago)
- Location:
- trunk/src/VBox/Additions/common/VBoxGuest/lib
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR0LibInternal.h
r97937 r97940 134 134 * @{ 135 135 */ 136 RTSEMFASTMUTEX mutexHeap;136 RTSEMFASTMUTEX hMtxHeap; 137 137 /** Head of the block list (both free and allocated blocks). 138 138 * This runs parallel to the chunk list and is sorted by address within each -
trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR0LibPhysHeap.cpp
r97938 r97940 36 36 * @ref grp_rt_heap_offset "RTHeapOffset" in IPRT, except that this code handles 37 37 * mutiple chunks and has a physical address associated with each chunk and 38 * block. 38 * block. The alignment is fixed (VBGL_PH_ALLOC_ALIGN). 39 39 * 40 40 * When allocating memory, a free block is found that satisfies the request, … … 68 68 * Defined Constants And Macros * 69 69 *********************************************************************************************************************************/ 70 #define VBGL_PH_ASSERT Assert 71 # define VBGL_PH_ASSERT_MSG AssertMsg72 73 /*#define DUMPHEAP*/ 74 75 #ifdef DUMPHEAP76 # define VBGL_PH_ dprintf(a)RTAssertMsg2Weak a70 /** Enables heap dumping. */ 71 #if defined(DOXYGEN_RUNNING) || 0 72 # define VBGL_PH_DUMPHEAP 73 #endif 74 75 #ifdef VBGL_PH_DUMPHEAP 76 # define VBGL_PH_DPRINTF(a) RTAssertMsg2Weak a 77 77 #else 78 # define VBGL_PH_ dprintf(a)78 # define VBGL_PH_DPRINTF(a) do { } while (0) 79 79 #endif 80 80 81 /* Heap chunk signature */81 /** Heap chunk signature */ 82 82 #define VBGL_PH_CHUNKSIGNATURE UINT32_C(0xADDCCCCC) 83 /* Heap chunk allocation unit */83 /** Heap chunk allocation unit */ 84 84 #define VBGL_PH_CHUNKSIZE (0x10000) 85 85 86 /* Heap block signature */86 /** Heap block signature */ 87 87 #define VBGL_PH_BLOCKSIGNATURE UINT32_C(0xADDBBBBB) 88 88 … … 228 228 229 229 230 #ifndef DUMPHEAP 230 /** 231 * Debug function that dumps the heap. 232 */ 233 #ifndef VBGL_PH_DUMPHEAP 231 234 # define dumpheap(pszWhere) do { } while (0) 232 235 #else 233 void dumpheap(const char *pszWhere)234 { 235 VBGL_PH_ dprintf(("VBGL_PH dump at '%s'\n", pszWhere));236 237 VBGL_PH_ dprintf(("Chunks:\n"));236 static void dumpheap(const char *pszWhere) 237 { 238 VBGL_PH_DPRINTF(("VBGL_PH dump at '%s'\n", pszWhere)); 239 240 VBGL_PH_DPRINTF(("Chunks:\n")); 238 241 for (VBGLPHYSHEAPCHUNK *pChunk = g_vbgldata.pChunkHead; pChunk; pChunk = pChunk->pNext) 239 VBGL_PH_ dprintf(("%p: pNext = %p, pPrev = %p, sign = %08X, size = %8d, cBlocks = %8d, cFreeBlocks=%8d, phys = %08X\n",242 VBGL_PH_DPRINTF(("%p: pNext = %p, pPrev = %p, sign = %08X, size = %8d, cBlocks = %8d, cFreeBlocks=%8d, phys = %08X\n", 240 243 pChunk, pChunk->pNext, pChunk->pPrev, pChunk->u32Signature, pChunk->cbChunk, 241 244 pChunk->cBlocks, pChunk->cFreeBlocks, pChunk->physAddr)); 242 245 243 VBGL_PH_ dprintf(("Allocated blocks:\n"));246 VBGL_PH_DPRINTF(("Allocated blocks:\n")); 244 247 for (VBGLPHYSHEAPBLOCK *pBlock = g_vbgldata.pBlockHead; pBlock; pBlock = pBlock->pNext) 245 VBGL_PH_ dprintf(("%p: pNext = %p, pPrev = %p, size = %05x, sign = %08X, %s, pChunk = %p\n",248 VBGL_PH_DPRINTF(("%p: pNext = %p, pPrev = %p, size = %05x, sign = %08X, %s, pChunk = %p\n", 246 249 pBlock, pBlock->pNext, pBlock->pPrev, pBlock->cbUser, 247 250 pBlock->u32Signature, pBlock->fAllocated ? "allocated" : " free", pBlock->pChunk)); 248 251 249 VBGL_PH_ dprintf(("Free blocks:\n"));252 VBGL_PH_DPRINTF(("Free blocks:\n")); 250 253 for (VBGLPHYSHEAPFREEBLOCK *pBlock = g_vbgldata.pFreeHead; pBlock; pBlock = pBlock->pNextFree) 251 VBGL_PH_ dprintf(("%p: pNextFree = %p, pPrevFree = %p, size = %05x, sign = %08X, pChunk = %p%s\n",254 VBGL_PH_DPRINTF(("%p: pNextFree = %p, pPrevFree = %p, size = %05x, sign = %08X, pChunk = %p%s\n", 252 255 pBlock, pBlock->pNextFree, pBlock->pPrevFree, pBlock->Core.cbUser, 253 256 pBlock->Core.u32Signature, pBlock->Core.pChunk, 254 257 !pBlock->Core.fAllocated ? "" : " !!allocated-block-on-freelist!!")); 255 258 256 VBGL_PH_ dprintf(("VBGL_PH dump at '%s' done\n", pszWhere));259 VBGL_PH_DPRINTF(("VBGL_PH dump at '%s' done\n", pszWhere)); 257 260 } 258 261 #endif 259 262 260 263 264 /** 265 * Initialize a free block 266 */ 261 267 static void vbglPhysHeapInitFreeBlock(VBGLPHYSHEAPFREEBLOCK *pBlock, VBGLPHYSHEAPCHUNK *pChunk, uint32_t cbUser) 262 268 { 263 VBGL_PH_ASSERT(pBlock != NULL);264 VBGL_PH_ASSERT(pChunk != NULL);269 Assert(pBlock != NULL); 270 Assert(pChunk != NULL); 265 271 266 272 pBlock->Core.u32Signature = VBGL_PH_BLOCKSIGNATURE; … … 294 300 static void vbglPhysHeapInsertBlock(VBGLPHYSHEAPBLOCK *pBlock) 295 301 { 296 VBGL_PH_ASSERT_MSG(pBlock->pNext == NULL, ("pBlock->pNext = %p\n", pBlock->pNext));297 VBGL_PH_ASSERT_MSG(pBlock->pPrev == NULL, ("pBlock->pPrev = %p\n", pBlock->pPrev));302 AssertMsg(pBlock->pNext == NULL, ("pBlock->pNext = %p\n", pBlock->pNext)); 303 AssertMsg(pBlock->pPrev == NULL, ("pBlock->pPrev = %p\n", pBlock->pPrev)); 298 304 299 305 /* inserting to head of list */ … … 319 325 static void vbglPhysHeapInsertBlockAfter(VBGLPHYSHEAPBLOCK *pBlock, VBGLPHYSHEAPBLOCK *pInsertAfter) 320 326 { 321 VBGL_PH_ASSERT_MSG(pBlock->pNext == NULL, ("pBlock->pNext = %p\n", pBlock->pNext));322 VBGL_PH_ASSERT_MSG(pBlock->pPrev == NULL, ("pBlock->pPrev = %p\n", pBlock->pPrev));327 AssertMsg(pBlock->pNext == NULL, ("pBlock->pNext = %p\n", pBlock->pNext)); 328 AssertMsg(pBlock->pPrev == NULL, ("pBlock->pPrev = %p\n", pBlock->pPrev)); 323 329 324 330 pBlock->pNext = pInsertAfter->pNext; … … 389 395 { 390 396 Assert(!pBlock->Core.fAllocated); 391 VBGL_PH_ASSERT_MSG(pBlock->pNextFree == NULL, ("pBlock->pNextFree = %p\n", pBlock->pNextFree));392 VBGL_PH_ASSERT_MSG(pBlock->pPrevFree == NULL, ("pBlock->pPrevFree = %p\n", pBlock->pPrevFree));397 AssertMsg(pBlock->pNextFree == NULL, ("pBlock->pNextFree = %p\n", pBlock->pNextFree)); 398 AssertMsg(pBlock->pPrevFree == NULL, ("pBlock->pPrevFree = %p\n", pBlock->pPrevFree)); 393 399 394 400 /* inserting to head of list */ … … 418 424 { 419 425 Assert(!pBlock->Core.fAllocated); 420 VBGL_PH_ASSERT_MSG(pBlock->pNextFree == NULL, ("pBlock->pNextFree = %p\n", pBlock->pNextFree));421 VBGL_PH_ASSERT_MSG(pBlock->pPrevFree == NULL, ("pBlock->pPrevFree = %p\n", pBlock->pPrevFree));426 AssertMsg(pBlock->pNextFree == NULL, ("pBlock->pNextFree = %p\n", pBlock->pNextFree)); 427 AssertMsg(pBlock->pPrevFree == NULL, ("pBlock->pPrevFree = %p\n", pBlock->pPrevFree)); 422 428 423 429 /* inserting after the tiven node */ … … 483 489 VBGLPHYSHEAPCHUNK *pChunk; 484 490 uint32_t cbChunk; 485 VBGL_PH_ dprintf(("Allocating new chunk for %#x byte allocation\n", cbMinBlock));491 VBGL_PH_DPRINTF(("Allocating new chunk for %#x byte allocation\n", cbMinBlock)); 486 492 AssertReturn(cbMinBlock <= VBGL_PH_LARGEST_ALLOC_SIZE, NULL); /* paranoia */ 487 493 … … 557 563 g_vbgldata.pChunkHead = pChunk; 558 564 559 VBGL_PH_ dprintf(("Allocated chunk %p LB %#x, block %p LB %#x\n", pChunk, cbChunk, pBlock, pBlock->Core.cbUser));565 VBGL_PH_DPRINTF(("Allocated chunk %p LB %#x, block %p LB %#x\n", pChunk, cbChunk, pBlock, pBlock->Core.cbUser)); 560 566 return pBlock; 561 567 } … … 570 576 static void vbglPhysHeapChunkDelete(VBGLPHYSHEAPCHUNK *pChunk) 571 577 { 572 uintptr_t 573 VBGL_PH_ASSERT(pChunk != NULL);574 VBGL_PH_ASSERT_MSG(pChunk->u32Signature == VBGL_PH_CHUNKSIGNATURE, ("pChunk->u32Signature = %08X\n", pChunk->u32Signature));575 576 VBGL_PH_ dprintf(("Deleting chunk %p size %x\n", pChunk, pChunk->cbChunk));578 uintptr_t uEnd, uCur; 579 Assert(pChunk != NULL); 580 AssertMsg(pChunk->u32Signature == VBGL_PH_CHUNKSIGNATURE, ("pChunk->u32Signature = %08X\n", pChunk->u32Signature)); 581 582 VBGL_PH_DPRINTF(("Deleting chunk %p size %x\n", pChunk, pChunk->cbChunk)); 577 583 578 584 /* … … 601 607 } 602 608 603 VBGL_PH_ASSERT_MSG(uCur == uEnd, ("uCur = %p, uEnd = %p, pChunk->cbChunk = %08X\n", uCur, uEnd, pChunk->cbChunk));609 AssertMsg(uCur == uEnd, ("uCur = %p, uEnd = %p, pChunk->cbChunk = %08X\n", uCur, uEnd, pChunk->cbChunk)); 604 610 605 611 /* … … 643 649 AssertCompile(VBGL_PH_ALLOC_ALIGN <= sizeof(pBlock->Core)); 644 650 645 rc = RTSemFastMutexRequest(g_vbgldata. mutexHeap);651 rc = RTSemFastMutexRequest(g_vbgldata.hMtxHeap); 646 652 AssertRCReturn(rc, NULL); 647 653 … … 749 755 { 750 756 /* We have a free block, either found or allocated. */ 751 VBGL_PH_ASSERT_MSG(pBlock->Core.u32Signature == VBGL_PH_BLOCKSIGNATURE,752 753 VBGL_PH_ASSERT_MSG(!pBlock->Core.fAllocated, ("pBlock = %p\n", pBlock));757 AssertMsg(pBlock->Core.u32Signature == VBGL_PH_BLOCKSIGNATURE, 758 ("pBlock = %p, pBlock->u32Signature = %08X\n", pBlock, pBlock->Core.u32Signature)); 759 AssertMsg(!pBlock->Core.fAllocated, ("pBlock = %p\n", pBlock)); 754 760 755 761 /* … … 787 793 * Return success. 788 794 */ 789 rc = RTSemFastMutexRelease(g_vbgldata. mutexHeap);790 791 VBGL_PH_ dprintf(("VbglR0PhysHeapAlloc: returns %p size %x\n", pBlock + 1, pBlock->Core.cbUser));795 rc = RTSemFastMutexRelease(g_vbgldata.hMtxHeap); 796 797 VBGL_PH_DPRINTF(("VbglR0PhysHeapAlloc: returns %p size %x\n", pBlock + 1, pBlock->Core.cbUser)); 792 798 return &pBlock->Core + 1; 793 799 } … … 796 802 * Return failure. 797 803 */ 798 rc = RTSemFastMutexRelease(g_vbgldata. mutexHeap);804 rc = RTSemFastMutexRelease(g_vbgldata.hMtxHeap); 799 805 AssertRC(rc); 800 806 801 VBGL_PH_ dprintf(("VbglR0PhysHeapAlloc: returns NULL (requested %#x bytes)\n", cb));807 VBGL_PH_DPRINTF(("VbglR0PhysHeapAlloc: returns NULL (requested %#x bytes)\n", cb)); 802 808 return NULL; 803 809 } … … 837 843 VBGLPHYSHEAPFREEBLOCK *pBlock; 838 844 839 int rc = RTSemFastMutexRequest(g_vbgldata. mutexHeap);845 int rc = RTSemFastMutexRequest(g_vbgldata.hMtxHeap); 840 846 AssertRCReturnVoid(rc); 841 847 … … 856 862 * Change the block status to freeed. 857 863 */ 858 VBGL_PH_ dprintf(("VbglR0PhysHeapFree: %p size %#x\n", pv, pBlock->Core.cbUser));864 VBGL_PH_DPRINTF(("VbglR0PhysHeapFree: %p size %#x\n", pv, pBlock->Core.cbUser)); 859 865 860 866 pBlock->Core.fAllocated = false; … … 951 957 pBlock, pBlock->Core.u32Signature, pBlock->Core.cbUser, pBlock->Core.fAllocated)); 952 958 953 rc = RTSemFastMutexRelease(g_vbgldata. mutexHeap);959 rc = RTSemFastMutexRelease(g_vbgldata.hMtxHeap); 954 960 AssertRC(rc); 955 961 } … … 957 963 958 964 #ifdef IN_TESTCASE /* For the testcase only */ 959 # include <iprt/err.h>960 965 961 966 /** … … 970 975 DECLVBGL(size_t) VbglR0PhysHeapGetFreeSize(void) 971 976 { 972 int rc = RTSemFastMutexRequest(g_vbgldata. mutexHeap);977 int rc = RTSemFastMutexRequest(g_vbgldata.hMtxHeap); 973 978 AssertRCReturn(rc, 0); 974 979 … … 981 986 } 982 987 983 RTSemFastMutexRelease(g_vbgldata. mutexHeap);988 RTSemFastMutexRelease(g_vbgldata.hMtxHeap); 984 989 return cbTotal; 985 990 } … … 1105 1110 DECLVBGL(int) VbglR0PhysHeapCheck(PRTERRINFO pErrInfo) 1106 1111 { 1107 int rc = RTSemFastMutexRequest(g_vbgldata. mutexHeap);1112 int rc = RTSemFastMutexRequest(g_vbgldata.hMtxHeap); 1108 1113 AssertRCReturn(rc, 0); 1109 1114 1110 1115 rc = vbglR0PhysHeapCheckLocked(pErrInfo); 1111 1116 1112 RTSemFastMutexRelease(g_vbgldata. mutexHeap);1117 RTSemFastMutexRelease(g_vbgldata.hMtxHeap); 1113 1118 return rc; 1114 1119 } … … 1118 1123 DECLR0VBGL(int) VbglR0PhysHeapInit(void) 1119 1124 { 1120 g_vbgldata. mutexHeap = NIL_RTSEMFASTMUTEX;1125 g_vbgldata.hMtxHeap = NIL_RTSEMFASTMUTEX; 1121 1126 1122 1127 /* Allocate the first chunk of the heap. */ 1123 1128 VBGLPHYSHEAPFREEBLOCK *pBlock = vbglPhysHeapChunkAlloc(0); 1124 1129 if (pBlock) 1125 return RTSemFastMutexCreate(&g_vbgldata. mutexHeap);1130 return RTSemFastMutexCreate(&g_vbgldata.hMtxHeap); 1126 1131 return VERR_NO_CONT_MEMORY; 1127 1132 } … … 1132 1137 vbglPhysHeapChunkDelete(g_vbgldata.pChunkHead); 1133 1138 1134 RTSemFastMutexDestroy(g_vbgldata. mutexHeap);1135 g_vbgldata. mutexHeap = NIL_RTSEMFASTMUTEX;1136 } 1137 1139 RTSemFastMutexDestroy(g_vbgldata.hMtxHeap); 1140 g_vbgldata.hMtxHeap = NIL_RTSEMFASTMUTEX; 1141 } 1142
Note:
See TracChangeset
for help on using the changeset viewer.