| 88 | } |
| 89 | |
| 90 | void DebugTarget::SetupTargetBinary() |
| 91 | { |
| 92 | bool wantsHotHeap = (mDebugger->mHotSwapEnabled == true && mDebugger->mDbgProcessId == 0); |
| 93 | |
| 94 | #ifdef BF_DBG_32 |
| 95 | if (wantsHotHeap) |
| 96 | mHotHeap = new HotHeap(); |
| 97 | #else |
| 98 | if (wantsHotHeap) |
| 99 | { |
| 100 | // 64-bit hot loaded code needs to be placed close to the original EXE so 32-bit relative |
| 101 | // offsets within the hot code can still reach the old code |
| 102 | addr_target checkHotReserveAddr = (addr_target)mTargetBinary->mImageBase + mTargetBinary->mImageSize; |
| 103 | int mb = 1024 * 1024; |
| 104 | int reserveSize = 512 * mb; |
| 105 | |
| 106 | // Round up to MB boundary + 64MB, to help keep other DLLs at their preferred base addresses |
| 107 | checkHotReserveAddr = ((checkHotReserveAddr + 64 * mb) & ~(mb - 1)); |
| 108 | |
| 109 | checkHotReserveAddr = (addr_target)mTargetBinary->mImageBase; |
| 110 | |
| 111 | addr_target reservedPtr = NULL; |
| 112 | while ((addr_target)checkHotReserveAddr < (addr_target)mTargetBinary->mImageBase + 0x30000000) |
| 113 | { |
| 114 | reservedPtr = (addr_target)VirtualAllocEx(mDebugger->mProcessInfo.hProcess, (void*)(intptr)checkHotReserveAddr, reserveSize, MEM_RESERVE, PAGE_EXECUTE_READWRITE); |
| 115 | if (reservedPtr != NULL) |
| 116 | { |
| 117 | mHotHeapAddr = reservedPtr; |
| 118 | mHotHeapReserveSize = reserveSize; |
| 119 | BfLogDbg("VirtualAllocEx %p %d. ImageBase: %p\n", mHotHeapAddr, mHotHeapReserveSize, mTargetBinary->mImageBase); |
| 120 | break; |
| 121 | } |
| 122 | checkHotReserveAddr += 4 * mb; |
| 123 | } |
| 124 | |
| 125 | if (reservedPtr == 0) |
| 126 | { |
| 127 | BfLogDbg("VirtualAllocEx failed. ImageBase: %p\n", mTargetBinary->mImageBase); |
| 128 | mDebugger->Fail("Failed to reserve memory for hot swapping"); |
| 129 | } |
| 130 | else |
| 131 | { |
| 132 | BF_ASSERT(mHotHeap == NULL); |
| 133 | mHotHeap = new HotHeap(reservedPtr, reserveSize); |
| 134 | } |
| 135 | } |
| 136 | #endif |
| 137 | } |
| 138 | |
| 139 | void DebugTarget::CheckTargetBinary(DbgModule* module) |
| 140 | { |