2020-06-06 22:39:25 +02:00
|
|
|
#include "function_replacements.h"
|
2022-02-02 18:34:27 +01:00
|
|
|
#include "memory_mapping.h"
|
2022-10-09 14:21:46 +02:00
|
|
|
#include "version.h"
|
2022-05-08 20:43:03 +02:00
|
|
|
#include <coreinit/debug.h>
|
2022-02-02 18:34:27 +01:00
|
|
|
#include <function_patcher/function_patching.h>
|
|
|
|
#include <wums.h>
|
2022-05-08 20:43:03 +02:00
|
|
|
#ifdef DEBUG
|
|
|
|
#include "logger.h"
|
|
|
|
#endif
|
2020-05-29 19:25:05 +02:00
|
|
|
|
2023-01-10 18:14:22 +01:00
|
|
|
#define VERSION "v0.2.1"
|
2022-10-09 14:21:46 +02:00
|
|
|
|
2020-05-29 19:25:05 +02:00
|
|
|
WUMS_MODULE_EXPORT_NAME("homebrew_memorymapping");
|
2022-01-26 13:21:07 +01:00
|
|
|
WUMS_MODULE_SKIP_INIT_FINI();
|
2020-12-26 15:51:21 +01:00
|
|
|
WUMS_MODULE_INIT_BEFORE_RELOCATION_DONE_HOOK();
|
2023-01-10 18:14:08 +01:00
|
|
|
WUMS_DEPENDS_ON(homebrew_kernel);
|
|
|
|
WUMS_DEPENDS_ON(homebrew_functionpatcher);
|
2020-05-29 19:25:05 +02:00
|
|
|
|
2023-01-06 14:59:45 +01:00
|
|
|
// We can't use the functions from libfunctionpatcher. Defined in functionpatcher.def
|
|
|
|
extern "C" FunctionPatcherStatus FPAddFunctionPatch(function_replacement_data_t *function_data, PatchedFunctionHandle *outHandle, bool *outHasBeenPatched);
|
|
|
|
|
2021-09-24 16:51:11 +02:00
|
|
|
WUMS_INITIALIZE(args) {
|
2020-05-29 19:25:05 +02:00
|
|
|
static uint8_t ucSetupRequired = 1;
|
2020-06-03 18:36:02 +02:00
|
|
|
if (!ucSetupRequired) {
|
2020-05-29 19:25:05 +02:00
|
|
|
return;
|
|
|
|
}
|
2022-05-08 20:43:03 +02:00
|
|
|
|
2020-05-29 19:25:05 +02:00
|
|
|
ucSetupRequired = 0;
|
2020-06-03 18:51:24 +02:00
|
|
|
MemoryMapping_setupMemoryMapping();
|
|
|
|
MemoryMapping_CreateHeaps();
|
2020-06-06 22:39:25 +02:00
|
|
|
|
2023-01-06 14:59:45 +01:00
|
|
|
/* We can not use FunctionPatcher_InitLibrary here because OSDynLoadAcquire is not patched yet.
|
|
|
|
if (FunctionPatcher_InitLibrary() != FUNCTION_PATCHER_RESULT_SUCCESS) {
|
|
|
|
OSFatal("homebrew_memorymapping: FunctionPatcher_InitLibrary failed");
|
|
|
|
}*/
|
|
|
|
|
2022-05-08 20:43:03 +02:00
|
|
|
for (uint32_t i = 0; i < function_replacements_size; i++) {
|
2023-01-06 14:59:45 +01:00
|
|
|
bool wasPatched = false;
|
|
|
|
// We don't need to save the handles because we never restore them anyway.
|
|
|
|
if (FPAddFunctionPatch(&function_replacements[i], nullptr, &wasPatched) != FUNCTION_PATCHER_RESULT_SUCCESS || !wasPatched) {
|
2022-05-08 20:43:03 +02:00
|
|
|
OSFatal("homebrew_memorymapping: Failed to patch function");
|
|
|
|
}
|
|
|
|
}
|
2020-05-29 19:25:05 +02:00
|
|
|
}
|
|
|
|
|
2022-01-26 13:24:56 +01:00
|
|
|
WUMS_APPLICATION_STARTS() {
|
2022-10-09 14:21:46 +02:00
|
|
|
OSReport("Running MemoryMappingModule " VERSION VERSION_EXTRA "\n");
|
|
|
|
#ifdef DEBUG
|
2022-01-26 13:24:56 +01:00
|
|
|
initLogging();
|
2022-10-09 14:21:46 +02:00
|
|
|
#endif
|
2022-01-26 13:24:56 +01:00
|
|
|
}
|
|
|
|
|
2022-10-09 14:21:46 +02:00
|
|
|
#ifdef DEBUG
|
2022-01-26 13:24:56 +01:00
|
|
|
WUMS_APPLICATION_REQUESTS_EXIT() {
|
|
|
|
deinitLogging();
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2020-06-03 18:36:02 +02:00
|
|
|
void MemoryMappingFree(void *ptr) {
|
2020-06-03 18:51:24 +02:00
|
|
|
//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) {
|
2020-06-03 18:51:24 +02:00
|
|
|
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) {
|
2020-06-03 18:51:24 +02:00
|
|
|
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) {
|
2020-06-03 18:51:24 +02:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2021-09-28 17:58:20 +02:00
|
|
|
void *MemoryMappingAllocEx(uint32_t size, int32_t align) {
|
2020-06-03 18:51:24 +02:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2021-09-28 17:58:20 +02:00
|
|
|
void *MemoryMappingAllocForGX2Ex(uint32_t size, int32_t align) {
|
2020-06-27 11:17:38 +02:00
|
|
|
void *res = MemoryMapping_allocVideoMemory(size, align);
|
|
|
|
//DEBUG_FUNCTION_LINE("[res %08X] allocEX %d %d ", res, size, align);
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2022-02-03 15:51:47 +01:00
|
|
|
uint32_t MEMAllocFromMappedMemory __attribute__((__section__(".data"))) = (uint32_t) MemoryMappingAlloc;
|
|
|
|
uint32_t MEMAllocFromMappedMemoryEx __attribute__((__section__(".data"))) = (uint32_t) MemoryMappingAllocEx;
|
2022-02-02 18:34:27 +01:00
|
|
|
uint32_t MEMAllocFromMappedMemoryForGX2Ex __attribute__((__section__(".data"))) = (uint32_t) MemoryMappingAllocForGX2Ex;
|
2022-02-03 15:51:47 +01:00
|
|
|
uint32_t MEMFreeToMappedMemory __attribute__((__section__(".data"))) = (uint32_t) MemoryMappingFree;
|
2020-05-30 21:47:44 +02:00
|
|
|
|
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);
|