- Timestamp:
- Feb 2, 2007 2:02:14 AM (18 years ago)
- svn:sync-xref-src-repo-rev:
- 18143
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified trunk/src/VBox/Runtime/r3/posix/alloc-posix.cpp ¶
r341 r533 35 35 #include <sys/mman.h> 36 36 37 #if !defined(RT_USE_MMAP) && (defined(__LINUX__)) 38 # define RT_USE_MMAP 39 #endif 40 41 /******************************************************************************* 42 * Structures and Typedefs * 43 *******************************************************************************/ 44 #ifdef RT_USE_MMAP 45 /** 46 * RTMemExecAlloc() header used when using mmap for allocating the memory. 47 */ 48 typedef struct RTMEMEXECHDR 49 { 50 /** Magic number (RTMEMEXECHDR_MAGIC). */ 51 size_t uMagic; 52 /** The size we requested from mmap. */ 53 size_t cb; 54 # if ARCH_BITS == 32 55 uint32_t Alignment[2]; 56 # endif 57 } RTMEMEXECHDR, *PRTMEMEXECHDR; 58 59 /** MAgic for RTMEMEXECHDR. */ 60 #define RTMEMEXECHDR_MAGIC (~(size_t)0xfeedbabe) 61 62 #endif /* RT_USE_MMAP */ 63 64 37 65 38 66 #ifdef IN_RING3 … … 49 77 AssertMsg(cb, ("Allocating ZERO bytes is really not a good idea! Good luck with the next assertion!\n")); 50 78 51 #if defined(__AMD64__) && defined(__LINUX__)79 #ifdef RT_USE_MMAP 52 80 /* 53 81 * Use mmap to get low memory. 54 82 */ 55 void *pv = mmap(NULL, RT_ALIGN_Z(cb, PAGE_SIZE), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS | MAP_32BIT, -1, 0); 83 void *pv = mmap(NULL, RT_ALIGN_Z(cb, PAGE_SIZE), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS 84 #if defined(__AMD64__) && defined(MAP_32BIT) 85 | MAP_32BIT 86 #endif 87 , -1, 0); 56 88 AssertMsgReturn(pv != MAP_FAILED, ("errno=%d cb=%#zx\n", errno, cb), NULL); 89 PRTMEMEXECHDR pHdr = (PRTMEMEXECHDR)pv; 90 pHdr->uMagic = RTMEMEXECHDR_MAGIC; 91 pHdr->cb = RT_ALIGN_Z(cb, PAGE_SIZE); 92 pv = pHdr + 1; 57 93 58 94 #else … … 98 134 if (pv) 99 135 { 100 #if defined(__AMD64__) && defined(__LINUX__) 101 int rc = munmap(pv, 0);/** @todo fix me! */ 136 #ifdef RT_USE_MMAP 137 PRTMEMEXECHDR pHdr = (PRTMEMEXECHDR)pv - 1; 138 AssertMsgReturnVoid(RT_ALIGN_P(pHdr, PAGE_SIZE) == pHdr, ("pHdr=%p pv=%p\n", pHdr, pv)); 139 AssertMsgReturnVoid(pHdr->uMagic == RTMEMEXECHDR_MAGIC, ("pHdr=%p(uMagic=%#zx) pv=%p\n", pHdr, pHdr->uMagic, pv)); 140 int rc = munmap(pHdr, pHdr->cb); 102 141 AssertMsg(!rc, ("munmap -> %d errno=%d\n", rc, errno)); 103 142 #else
Note:
See TracChangeset
for help on using the changeset viewer.