From 1cb566c3b67c207ed172de539793dfe49ef031b9 Mon Sep 17 00:00:00 2001 From: chaoskagami Date: Tue, 10 Jan 2017 08:21:23 -0500 Subject: [PATCH] Cleanup, fixes Brought langemu up to the assembly hacks in use in Luma3DS. Currently going through and figuring out how to go and clean up the codebase more. --- external/loader/source/interp.c | 2 +- external/loader/source/logger.c | 2 +- external/loader/source/memory.c | 2 +- external/loader/source/patcher.c | 41 +++++++++++------------- include/common.h | 2 +- include/{patch_format.h => structures.h} | 0 6 files changed, 23 insertions(+), 26 deletions(-) rename include/{patch_format.h => structures.h} (100%) diff --git a/external/loader/source/interp.c b/external/loader/source/interp.c index b715649..bf30558 100644 --- a/external/loader/source/interp.c +++ b/external/loader/source/interp.c @@ -13,7 +13,7 @@ #define _MAX_LFN 255 #endif #include -#include +#include // Yes, we're including a C file. Problem? #include "../../../source/interpreter.c" diff --git a/external/loader/source/logger.c b/external/loader/source/logger.c index 6bc3896..14c6d8a 100644 --- a/external/loader/source/logger.c +++ b/external/loader/source/logger.c @@ -10,7 +10,7 @@ #define _MAX_LFN 255 #endif #include -#include +#include Handle log_file_hdl; int logger_is_initd = 0; diff --git a/external/loader/source/memory.c b/external/loader/source/memory.c index a6dcccd..2434af6 100644 --- a/external/loader/source/memory.c +++ b/external/loader/source/memory.c @@ -8,7 +8,7 @@ #define _MAX_LFN 255 #endif #include -#include +#include // Quick Search algorithm, adapted from // http://igm.univ-mlv.fr/~lecroq/string/node19.html#SECTION00190 diff --git a/external/loader/source/patcher.c b/external/loader/source/patcher.c index 37abb03..4032f22 100644 --- a/external/loader/source/patcher.c +++ b/external/loader/source/patcher.c @@ -6,7 +6,7 @@ #include #include "memory.h" #include "logger.h" -#include +#include #include #include "interp.h" @@ -195,6 +195,9 @@ getCfgOffsets(uint8_t *code, uint32_t size, uint32_t *CFGUHandleOffset) } } + if(!n) + return NULL; + for (uint8_t *CFGU_GetConfigInfoBlk2_endPos = code; CFGU_GetConfigInfoBlk2_endPos < code + size - 8; CFGU_GetConfigInfoBlk2_endPos += 4) { static const uint32_t CFGU_GetConfigInfoBlk2_endPattern[] = { 0xE8BD8010, 0x00010082 }; @@ -206,7 +209,7 @@ getCfgOffsets(uint8_t *code, uint32_t size, uint32_t *CFGUHandleOffset) *CFGUHandleOffset = *((uint32_t *)CFGU_GetConfigInfoBlk2_endPos + 2); for (uint32_t i = 0; i < n; i++) - if (possible[i] == *CFGUHandleOffset) + if (possible[i] == cmp[2]) return CFGU_GetConfigInfoBlk2_endPos; CFGU_GetConfigInfoBlk2_endPos += 4; @@ -242,24 +245,18 @@ patchCfgGetLanguage(uint8_t *code, uint32_t size, uint8_t languageId, uint8_t *C calledFunction += offset; - found = calledFunction >= CFGU_GetConfigInfoBlk2_startPos - 4 && calledFunction <= CFGU_GetConfigInfoBlk2_endPos; - i++; - } while (i < 2 && !found && calledFunction[3] == 0xEA); - - if (found) { - *((uint32_t *)instr - 1) = 0xE3A00000 | languageId; // mov r0, sp - // => mov r0, =languageId - *(uint32_t *)instr = 0xE5CD0000; // bl - // CFGU_GetConfigInfoBlk2 => - // strb r0, [sp] - *((uint32_t *)instr + 1) = 0xE3B00000; // (1 or 2 instructions) => movs - // r0, 0 (result code) + if(calledFunction >= CFGU_GetConfigInfoBlk2_startPos - 4 && calledFunction <= CFGU_GetConfigInfoBlk2_endPos) { + *((uint32_t *)instr - 1) = 0xE3A00000 | languageId; // mov r0, sp => mov r0, =languageId + *(uint32_t *)instr = 0xE5CD0000; // bl CFGU_GetConfigInfoBlk2 => strb r0, [sp] + *((uint32_t *)instr + 1) = 0xE3B00000; // (1 or 2 instructions) => movs r0, 0 (result code) - logstr(" patched cfggetlanguage\n"); + logstr(" patched cfggetlanguage\n"); - // We're done - return; - } + // We're done + return; + } + i++; + } while (i < 2 && !found && calledFunction[3] == 0xEA); } } } @@ -270,16 +267,16 @@ static void patchCfgGetRegion(uint8_t *code, uint32_t size, uint8_t regionId, uint32_t CFGUHandleOffset) { for (uint8_t *cmdPos = code; cmdPos < code + size - 28; cmdPos += 4) { - static const uint32_t cfgSecureInfoGetRegionCmdPattern[] = { 0xEE1D4F70, 0xE3A00802, 0xE5A40080 }; + static const uint32_t cfgSecureInfoGetRegionCmdPattern[] = { 0xEE1D4F70, 0xE3A00802 }; uint32_t *cmp = (uint32_t *)cmdPos; - if (cmp[0] == cfgSecureInfoGetRegionCmdPattern[0] && cmp[1] == cfgSecureInfoGetRegionCmdPattern[1] && cmp[2] == cfgSecureInfoGetRegionCmdPattern[2] && + if (cmp[0] == cfgSecureInfoGetRegionCmdPattern[0] && cmp[1] == cfgSecureInfoGetRegionCmdPattern[1] && *((uint16_t *)cmdPos + 7) == 0xE59F && *(uint32_t *)(cmdPos + 20 + *((uint16_t *)cmdPos + 6)) == CFGUHandleOffset) { + *((uint32_t *)cmdPos + 4) = 0xE3A00000 | regionId; // mov r0, =regionId *((uint32_t *)cmdPos + 5) = 0xE5C40008; // strb r0, [r4, 8] - *((uint32_t *)cmdPos + 6) = 0xE3B00000; // movs r0, 0 (result - // code) ('s' not needed but nvm) + *((uint32_t *)cmdPos + 6) = 0xE3A00000; // mov r0, 0 (result code) *((uint32_t *)cmdPos + 7) = 0xE5840004; // str r0, [r4, 4] // The remaining, not patched, function code will do the rest for us diff --git a/include/common.h b/include/common.h index 1b2940b..e698971 100644 --- a/include/common.h +++ b/include/common.h @@ -11,7 +11,7 @@ #include -#include +#include #include #include diff --git a/include/patch_format.h b/include/structures.h similarity index 100% rename from include/patch_format.h rename to include/structures.h -- 2.39.5