From 5dd2fe5c6cd905d6c0f149753b524d714a0b4cbe Mon Sep 17 00:00:00 2001 From: chaoskagami Date: Mon, 26 Dec 2016 19:19:13 -0500 Subject: [PATCH] Refactor some more for patching entire codebin --- external/loader/source/loader.c | 3 +-- external/loader/source/patcher.c | 29 +++++++++++++---------------- external/loader/source/patcher.h | 3 ++- host/bytecode_asm.py | 7 ++++--- source/interpreter.c | 19 ++++++++++++------- 5 files changed, 32 insertions(+), 29 deletions(-) diff --git a/external/loader/source/loader.c b/external/loader/source/loader.c index dfd8640..10b2412 100644 --- a/external/loader/source/loader.c +++ b/external/loader/source/loader.c @@ -82,8 +82,7 @@ load_code(u64 progid, u16 progver, EXHEADER_prog_addrs *shared, EXHEADER_prog_ad code_handler(progid, shared); // Patch segments - patch_exe(progid, progver, (u8 *)shared->text_addr, shared->text_size << 12, original->text_size << 12, (u8 *)shared->data_addr, shared->data_size << 12, - original->data_size << 12, (u8 *)shared->ro_addr, shared->ro_size << 12, original->ro_size << 12); + patch_exe(progid, progver, shared, original); return 0; } diff --git a/external/loader/source/patcher.c b/external/loader/source/patcher.c index eb16186..af746c0 100644 --- a/external/loader/source/patcher.c +++ b/external/loader/source/patcher.c @@ -291,8 +291,11 @@ patchCfgGetRegion(u8 *code, u32 size, u8 regionId, u32 CFGUHandleOffset) } static void -adjust_cpu_settings(_UNUSED u64 progId, u8 *code, u32 size) +adjust_cpu_settings(_UNUSED u64 progId, EXHEADER_prog_addrs *shared) { + u8* code = shared->text_addr; + u32 size = shared->text_size << 12; + if (!failed_load_config) { u32 cpuSetting = 0; // L2 @@ -319,8 +322,11 @@ adjust_cpu_settings(_UNUSED u64 progId, u8 *code, u32 size) } void -language_emu(u64 progId, u8 *code, u32 size) +language_emu(u64 progId, EXHEADER_prog_addrs *shared) { + u8* code = shared->text_addr; + u32 size = shared->text_size << 12; + if (!failed_load_config && config.options[OPTION_LOADER_LANGEMU]) { u32 tidHigh = (progId & 0xFFFFFFF000000000LL) >> 0x24; @@ -344,15 +350,6 @@ language_emu(u64 progId, u8 *code, u32 size) } } -void -overlay_patch(_UNUSED u64 progId, _UNUSED u8 *code, _UNUSED u32 size) -{ - // TODO - Implement. Needs some thought. This should allow usage of files off SD rather than RomFS. - - // FUTURE NOTE - Luma has this halfway w/ Romfs redirection. Their method consists of overwriting - // a known unused SDK function (possibly?) which is a clever workaround for lack of code expansion. -} - void code_handler(u64 progId, EXHEADER_prog_addrs *shared) { @@ -373,7 +370,7 @@ code_handler(u64 progId, EXHEADER_prog_addrs *shared) u32 len; - u32 size = (shared->text_size + shared->ro_size + shared->data_size) << 12; + u32 size = shared->total_size << 12; // Attempts to load code section from SD card, including system titles/modules/etc. if (R_SUCCEEDED(fileOpen(&code_f, ARCHIVE_SDMC, merge_path, FS_OPEN_READ)) && config.options[OPTION_LOADER_LOADCODE]) { @@ -468,14 +465,14 @@ code_handler(u64 progId, EXHEADER_prog_addrs *shared) // This is only for the .code segment. void -patch_exe(u64 progId, u16 progver, u8 *text, _UNUSED u32 text_size, u32 orig_text, u8 *data, _UNUSED u32 data_size, u32 orig_data, u8 *ro, _UNUSED u32 ro_size, u32 orig_ro) +patch_exe(u64 progId, u16 progver, EXHEADER_prog_addrs* shared, EXHEADER_prog_addrs* original) { if (progId == 0x0004013000008002LL) - adjust_cpu_settings(progId, text, orig_text); + adjust_cpu_settings(progId, shared); - execb(progId, progver, text, orig_text, data, orig_data, ro, orig_ro); + execb(progId, progver, shared); - language_emu(progId, text, orig_text); + language_emu(progId, shared); } // Gets how many bytes .text must be extended by for patches to fit. diff --git a/external/loader/source/patcher.h b/external/loader/source/patcher.h index 8013352..fc7578f 100644 --- a/external/loader/source/patcher.h +++ b/external/loader/source/patcher.h @@ -4,7 +4,8 @@ #include <3ds/types.h> #include <3ds/exheader.h> -void patch_exe(u64 progId, u16 progver, u8 *text, u32 text_size, u32 orig_text, u8 *data, u32 data_size, u32 orig_data, u8 *ro, u32 ro_size, u32 orig_ro); +void code_handler(u64 progId, EXHEADER_prog_addrs* shared); +void patch_exe(u64 progId, u16 progver, EXHEADER_prog_addrs* shared, EXHEADER_prog_addrs* original); void code_handler(u64 progId, EXHEADER_prog_addrs* shared); diff --git a/host/bytecode_asm.py b/host/bytecode_asm.py index efcb2ca..e9b071d 100755 --- a/host/bytecode_asm.py +++ b/host/bytecode_asm.py @@ -33,9 +33,10 @@ def rel_name(x): 'section2' : "03", 'section3' : "04", - 'exe_text' : "00", - 'exe_data' : "01", - 'exe_ro' : "02", + 'exe' : '00', + 'exe_text' : "01", + 'exe_data' : "02", + 'exe_ro' : "03", }.get(x, "-1") name = "NO NAME" diff --git a/source/interpreter.c b/source/interpreter.c index 2e2fd64..397ef09 100644 --- a/source/interpreter.c +++ b/source/interpreter.c @@ -63,6 +63,7 @@ struct mode uint8_t *memory; uint32_t size; }; + struct mode modes[21]; int init_bytecode = 0; @@ -495,7 +496,7 @@ exec_bytecode(uint8_t *bytecode, uint32_t len, uint16_t ver, int debug) #ifdef LOADER int -execb(uint64_t tid, uint16_t ver, uint8_t *text_mem, uint32_t text_len, uint8_t *data_mem, uint32_t data_len, uint8_t *ro_mem, uint32_t ro_len) +execb(uint64_t tid, uint16_t ver, EXHEADER_prog_addrs* shared) { #else int @@ -552,16 +553,20 @@ execb(uint64_t tid, firm_h* firm_patch) FSFILE_Close(file); // Done reading in. // Set memory. - modes[0].memory = text_mem; - modes[0].size = text_len; + modes[0].memory = shared->text_addr; + modes[0].size = shared->total_size << 12; + + // Set memory. + modes[1].memory = shared->text_addr; + modes[1].size = shared->text_size << 12; // Set memory. - modes[1].memory = data_mem; - modes[1].size = data_len; + modes[1].memory = shared->data_addr; + modes[1].size = shared->data_size << 12; // Set memory. - modes[2].memory = ro_mem; - modes[2].size = ro_len; + modes[1].memory = shared->ro_addr; + modes[1].size = shared->ro_size << 12; log(" exec\n"); -- 2.39.5