void memoryInitialize(void) { MEMHeapHandle mem1_heap_handle = MEMGetBaseHeapHandle(MEM_BASE_HEAP_MEM1); unsigned int mem1_allocatable_size = MEMGetAllocatableSizeForFrmHeapEx(mem1_heap_handle, 4); void *mem1_memory = MEMAllocFromFrmHeapEx(mem1_heap_handle, mem1_allocatable_size, 4); if(mem1_memory) mem1_heap = MEMCreateExpHeapEx(mem1_memory, mem1_allocatable_size, 0); MEMHeapHandle bucket_heap_handle = MEMGetBaseHeapHandle(MEM_BASE_HEAP_FG); unsigned int bucket_allocatable_size = MEMGetAllocatableSizeForFrmHeapEx(bucket_heap_handle, 4); void *bucket_memory = MEMAllocFromFrmHeapEx(bucket_heap_handle, bucket_allocatable_size, 4); if(bucket_memory) bucket_heap = MEMCreateExpHeapEx(bucket_memory, bucket_allocatable_size, 0); }
void __preinit_user(MEMHeapHandle *mem1, MEMHeapHandle *foreground, MEMHeapHandle *mem2) { uint32_t addr, size; MEMAllocFromDefaultHeap = CustomAllocFromDefaultHeap; MEMAllocFromDefaultHeapEx = CustomAllocFromDefaultHeapEx; MEMFreeToDefaultHeap = CustomFreeToDefaultHeap; if (OSGetForegroundBucket(NULL, NULL)) { OSGetMemBound(OS_MEM1, &addr, &size); *mem1 = MEMCreateFrmHeapEx((void *)addr, size, 0); OSGetForegroundBucketFreeArea(&addr, &size); *foreground = MEMCreateFrmHeapEx((void *)addr, size, 0); } OSGetMemBound(OS_MEM2, &addr, &size); sCustomHeap = MEMCreateExpHeapEx((void *)addr, size, MEM_HEAP_FLAG_USE_LOCK); sCustomHeapAddr = addr; sCustomHeapSize = size; *mem2 = sCustomHeap; OSDynLoad_SetAllocator(CustomDynLoadAlloc, CustomDynLoadFree); OSDynLoad_SetTLSAllocator(CustomDynLoadAlloc, CustomDynLoadFree); }
void initialiseSystemHeap(virt_ptr<void> base, uint32_t size) { if (internal::isAppDebugLevelVerbose()) { COSInfo(COSReportModule::Unknown2, "RPL_SYSHEAP:Event,Change,Hex Addr,Bytes,Available"); COSInfo( COSReportModule::Unknown2, fmt::format("RPL_SYSHEAP:SYSHEAP START,CREATE,=\"{}\",{}", base, size)); } sSystemHeapData->handle = MEMCreateExpHeapEx(base, size, MEMHeapFlags::ThreadSafe); sSystemHeapData->numAllocs = 0u; sSystemHeapData->numFrees = 0u; OSMemoryBarrier(); }
/** * Initialise an expanded heap. */ ExpandedHeap * MEMCreateExpHeap(ExpandedHeap *heap, uint32_t size) { return MEMCreateExpHeapEx(heap, size, 0); }