From: Wolfvak Date: Thu, 9 Jun 2016 00:22:10 +0000 (-0300) Subject: Added code section loading X-Git-Tag: v0.0.8~13^2 X-Git-Url: https://chaos.moe/g/?a=commitdiff_plain;h=9240af4291cc804ea195c90fa55cb79a503edb60;p=corbenik%2Fcorbenik.git Added code section loading --- diff --git a/external/loader/source/loader.c b/external/loader/source/loader.c index e157df8..db01ae0 100644 --- a/external/loader/source/loader.c +++ b/external/loader/source/loader.c @@ -94,8 +94,8 @@ load_code(u64 progid, u16 progver, prog_addrs_t *shared, prog_addrs_t *original, lzss_decompress((u8 *)shared->text_addr + size); } - // Dump code section - dump_code(progid, (u8 *)shared->text_addr, shared->total_size << 12); + // Load/Dump code section + sd_code(progid, (u8 *)shared->text_addr, shared->total_size << 12); // 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, diff --git a/external/loader/source/patcher.c b/external/loader/source/patcher.c index 8eeb5e8..970cabd 100644 --- a/external/loader/source/patcher.c +++ b/external/loader/source/patcher.c @@ -311,41 +311,52 @@ overlay_patch(u64 progId, u8 *code, u32 size) } void -dump_code(u64 progId, u8 *code_loc, u32 code_len) +sd_code(u64 progId, u8 *code_loc, u32 code_len) { - // If configuration was not loaded, or the option is disabled - if (failed_load_config || !config.options[OPTION_LOADER_DUMPCODE]) + // If configuration was not loaded, or both options (load / dump) are disabled + if (failed_load_config || (!config.options[OPTION_LOADER_DUMPCODE] && !config.options[OPTION_LOADER_LOADCODE])) return; u32 highTid = progId >> 0x20; - // Only dump user titles unless the user is prepared for pain. - if (highTid != 0x00040000 && highTid != 0x00040002 && !config.options[OPTION_LOADER_DUMPCODE_ALL]) - return; - char code_path[] = CODE_PATH; u32 i = strlen(code_path) - 1; Handle code_f; + while (progId) { code_path[i--] = hexDigits[(u32)(progId & 0xF)]; progId >>= 4; } - if (!R_SUCCEEDED(fileOpen(&code_f, ARCHIVE_SDMC, code_path, FS_OPEN_READ))) + u32 len; + + // Attempts to load code section from SD card, including system titles/modules/etc. + if (R_SUCCEEDED(fileOpen(&code_f, ARCHIVE_SDMC, code_path, FS_OPEN_READ)) && config.options[OPTION_LOADER_LOADCODE]) + { + FSFILE_Read(code_f, &len, 0, code_loc, code_len); + logstr(" loaded code from "); + logstr(code_path); + logstr("\n"); + } + + // Either system title with OPTION_LOADER_DUMPCODE_ALL enabled, or regular title + else if ( config.options[OPTION_LOADER_DUMPCODE] && ((highTid != 0x00040000 && highTid != 0x00040002 && config.options[OPTION_LOADER_DUMPCODE_ALL]) || (highTid == 0x00040000 || highTid == 0x00040002))) { - FSFILE_Close(code_f); - if (R_SUCCEEDED(fileOpen(&code_f, ARCHIVE_SDMC, code_path, FS_OPEN_WRITE | FS_OPEN_CREATE))) { - u32 len = 0; + if (R_SUCCEEDED(fileOpen(&code_f, ARCHIVE_SDMC, code_path, FS_OPEN_WRITE | FS_OPEN_CREATE))) + { FSFILE_Write(code_f, &len, 0, code_loc, code_len, FS_WRITE_FLUSH | FS_WRITE_UPDATE_TIME); logstr(" dumped code to "); logstr(code_path); logstr("\n"); } + else + { + FSFILE_Close(code_f); + return; + } } - // Code was already dumped, do nothing FSFILE_Close(code_f); - return; } diff --git a/external/loader/source/patcher.h b/external/loader/source/patcher.h index 9eedb64..6a5dfec 100644 --- a/external/loader/source/patcher.h +++ b/external/loader/source/patcher.h @@ -5,7 +5,7 @@ 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 dump_code(u64 progId, u8 *code_loc, u32 code_len); +void sd_code(u64 progId, u8 *code_loc, u32 code_len); u32 get_text_extend(u64 progId, u16 progver, u32 size_orig); u32 get_ro_extend(u64 progId, u16 progver, u32 size_orig); diff --git a/source/config.h b/source/config.h index 426b519..b1a6a8d 100644 --- a/source/config.h +++ b/source/config.h @@ -112,6 +112,9 @@ struct options_s // Dump *all* code, from system applications, modules, etc. You'll be sitting around for about five minutes. #define OPTION_LOADER_DUMPCODE_ALL 20 +// Load *all* code sections. This is intended for big patches that are currently not implementable and quick testing. +#define OPTION_LOADER_LOADCODE 21 + // Save log files during boot and from loader. // This will slow things down a bit. #define OPTION_SAVE_LOGS 253 diff --git a/source/menu.c b/source/menu.c index 665ab41..843a4b8 100644 --- a/source/menu.c +++ b/source/menu.c @@ -42,6 +42,8 @@ static struct options_s options[] = { { OPTION_LOADER_CPU_L2, " CPU - L2 cache (n3ds)", "Forces the system to use the L2 cache. Ignored if not a N3DS.", boolean_val_n3ds, 0, 0 }, { OPTION_LOADER_CPU_800MHZ, " CPU - 800Mhz (n3ds)", "Forces the system to run in 800Mhz mode. Ignored if not a N3DS.", boolean_val_n3ds, 0, 0 }, { OPTION_LOADER_LANGEMU, " Language Emulation", "Reads language emulation configuration and imitates the region/language.", boolean_val, 0, 0 }, + + { OPTION_LOADER_LOADCODE, " Load Code Sections", "Loads code sections from SD card and patches afterwards.", boolean_val, 0, 0 }, { OPTION_LOADER_DUMPCODE, " Dump Title Code Sections", "Dumps code sections for titles to SD card the first time they're loaded. Slows things down considerably.", boolean_val,