]> Chaos Git - corbenik/corbenik.git/commitdiff
Added code section loading 4/head
authorWolfvak <soherrera1@hotmail.com>
Thu, 9 Jun 2016 00:22:10 +0000 (21:22 -0300)
committerWolfvak <soherrera1@hotmail.com>
Thu, 9 Jun 2016 00:22:10 +0000 (21:22 -0300)
external/loader/source/loader.c
external/loader/source/patcher.c
external/loader/source/patcher.h
source/config.h
source/menu.c

index e157df84917e667b9614a2ba22d74627cf42a7c0..db01ae0d54fe8684dde5b21f4e4f0d31028eb238 100644 (file)
@@ -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,
index 8eeb5e8321b9b844db4a3f9f1b7cc656975adbfb..970cabd88f0054fb911d348b8d9d68e364ca6e17 100644 (file)
@@ -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;
 }
 
index 9eedb64df84882463b928d66b151d42056bcf6bb..6a5dfec1cadf276ff6e7e50b0d9dfa6e497ff5b9 100644 (file)
@@ -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);
index 426b51922fc180b7b5dcd2a9707ce0a0e09b2308..b1a6a8d515ff208062a8b2c8200c4a5cb7c91dd8 100644 (file)
@@ -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
index 665ab41bf1a193e3a766afc663358e37a7935500..843a4b89eebc01bc9dc52cbd5be8daf16e2ef5e6 100644 (file)
@@ -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,