MemoryMappingModule/source/main.cpp

98 lines
3.3 KiB
C++
Raw Normal View History

2020-05-29 19:25:05 +02:00
#include <coreinit/debug.h>
#include <cstddef>
#include <malloc.h>
#include <wums.h>
#include <whb/log.h>
#include <whb/log_udp.h>
#include <coreinit/memexpheap.h>
2020-05-29 19:25:05 +02:00
#include "memory_mapping.h"
#include <function_patcher/function_patching.h>
2020-05-29 19:25:05 +02:00
#include "logger.h"
#include "function_replacements.h"
2020-05-29 19:25:05 +02:00
WUMS_MODULE_EXPORT_NAME("homebrew_memorymapping");
WUMS_MODULE_SKIP_ENTRYPOINT();
WUMS_MODULE_INIT_BEFORE_RELOCATION_DONE_HOOK();
2020-05-29 19:25:05 +02:00
2020-06-03 18:36:02 +02:00
WUMS_INITIALIZE() {
2020-05-29 19:25:05 +02:00
WHBLogUdpInit();
DEBUG_FUNCTION_LINE("Setting up memory mapping!");
static uint8_t ucSetupRequired = 1;
2020-06-03 18:36:02 +02:00
if (!ucSetupRequired) {
2020-05-29 19:25:05 +02:00
return;
}
ucSetupRequired = 0;
MemoryMapping_setupMemoryMapping();
MemoryMapping_CreateHeaps();
DEBUG_FUNCTION_LINE("total free space %d KiB", MemoryMapping_GetFreeSpace() / 1024);
DEBUG_FUNCTION_LINE("Patch functions");
FunctionPatcherPatchFunction(function_replacements, function_replacements_size);
DEBUG_FUNCTION_LINE("Patch functions finished");
2020-05-29 19:25:05 +02:00
}
WUMS_APPLICATION_STARTS() {
WHBLogUdpInit();
//MemoryMapping_DestroyHeaps();
//MemoryMapping_CreateHeaps();
for (int32_t i = 0; /* waiting for a break */; i++) {
if (mem_mapping[i].physical_addresses == NULL) {
break;
}
void *address = (void *) (mem_mapping[i].effective_start_address);
MEMExpHeapBlock *curUsedBlock = ((MEMExpHeap *) address)->usedList.head;
while (curUsedBlock != nullptr) {
DEBUG_FUNCTION_LINE("[Memory leak info] %08X is still allocated (%d bytes)", &curUsedBlock[1], curUsedBlock->blockSize);
curUsedBlock = curUsedBlock->next;
}
}
DEBUG_FUNCTION_LINE("total free space %d KiB", MemoryMapping_GetFreeSpace() / 1024);
2020-05-29 19:25:05 +02:00
}
2020-06-03 18:36:02 +02:00
void MemoryMappingFree(void *ptr) {
//DEBUG_FUNCTION_LINE("[%08X] free", ptr);
MemoryMapping_free(ptr);
2020-05-29 19:25:05 +02:00
}
2020-06-03 18:36:02 +02:00
uint32_t MemoryMappingEffectiveToPhysical(uint32_t address) {
return MemoryMapping_EffectiveToPhysical(address);
2020-05-29 19:25:05 +02:00
}
2020-06-03 18:36:02 +02:00
uint32_t MemoryMappingPhysicalToEffective(uint32_t address) {
return MemoryMapping_PhysicalToEffective(address);
2020-05-29 19:25:05 +02:00
}
2020-06-03 18:36:02 +02:00
void *MemoryMappingAlloc(uint32_t size) {
void *res = MemoryMapping_alloc(size, 0x04);
2020-05-30 21:47:44 +02:00
//DEBUG_FUNCTION_LINE("[res: %08X] alloc %d ", res, size);
return res;
}
2020-06-03 18:36:02 +02:00
void *MemoryMappingAllocEx(uint32_t size, uint32_t align) {
void *res = MemoryMapping_alloc(size, align);
2020-05-30 21:47:44 +02:00
//DEBUG_FUNCTION_LINE("[res %08X] allocEX %d %d ", res, size, align);
return res;
}
2020-06-27 11:17:38 +02:00
void *MemoryMappingAllocForGX2Ex(uint32_t size, uint32_t align) {
void *res = MemoryMapping_allocVideoMemory(size, align);
//DEBUG_FUNCTION_LINE("[res %08X] allocEX %d %d ", res, size, align);
return res;
}
2020-05-30 21:47:44 +02:00
uint32_t MEMAllocFromMappedMemory __attribute__((__section__ (".data"))) = (uint32_t) MemoryMappingAlloc;
uint32_t MEMAllocFromMappedMemoryEx __attribute__((__section__ (".data"))) = (uint32_t) MemoryMappingAllocEx;
2020-06-27 11:17:38 +02:00
uint32_t MEMAllocFromMappedMemoryForGX2Ex __attribute__((__section__ (".data"))) = (uint32_t) MemoryMappingAllocForGX2Ex;
2020-05-30 21:47:44 +02:00
uint32_t MEMFreeToMappedMemory __attribute__((__section__ (".data"))) = (uint32_t) MemoryMappingFree;
2020-05-29 19:25:05 +02:00
WUMS_EXPORT_FUNCTION(MemoryMappingEffectiveToPhysical);
2020-05-30 21:47:44 +02:00
WUMS_EXPORT_FUNCTION(MemoryMappingPhysicalToEffective);
WUMS_EXPORT_DATA(MEMAllocFromMappedMemory);
WUMS_EXPORT_DATA(MEMAllocFromMappedMemoryEx);
2020-06-27 11:17:38 +02:00
WUMS_EXPORT_DATA(MEMAllocFromMappedMemoryForGX2Ex);
2020-05-30 21:47:44 +02:00
WUMS_EXPORT_DATA(MEMFreeToMappedMemory);