]> Chaos Git - corbenik/corbenik.git/commitdiff
Split text/data/ro loading in @Wolfvak's code
authorchaoskagami <chaos.kagami@gmail.com>
Sun, 12 Jun 2016 22:26:37 +0000 (18:26 -0400)
committerchaoskagami <chaos.kagami@gmail.com>
Sun, 12 Jun 2016 22:26:44 +0000 (18:26 -0400)
external/loader/source/exheader.h
external/loader/source/loader.c
external/loader/source/patcher.c
external/loader/source/patcher.h
host/bytecode_asm.py
patch/mset_str.pco
source/config.c
source/patch_format.h

index 2892ecb0937619f2c758f7b14b1072ac01048169..c1bf9be07d34051458264a597be553f1def417b0 100644 (file)
@@ -3,6 +3,17 @@
 
 #include <3ds/types.h>
 
+typedef struct
+{
+    u32 text_addr;
+    u32 text_size;
+    u32 ro_addr;
+    u32 ro_size;
+    u32 data_addr;
+    u32 data_size;
+    u32 total_size;
+} prog_addrs_t;
+
 typedef struct
 {
     u8 reserved[5];
index db01ae0d54fe8684dde5b21f4e4f0d31028eb238..db6c9e9d83b2ff259e3db207b92787c3e2cd3c29 100644 (file)
 
 const char CODE_PATH[] = { 0x01, 0x00, 0x00, 0x00, 0x2E, 0x63, 0x6F, 0x64, 0x65, 0x00, 0x00, 0x00 };
 
-typedef struct
-{
-    u32 text_addr;
-    u32 text_size;
-    u32 ro_addr;
-    u32 ro_size;
-    u32 data_addr;
-    u32 data_size;
-    u32 total_size;
-} prog_addrs_t;
-
 static Handle g_handles[MAX_SESSIONS + 2];
 static int g_active_handles;
 static u64 g_cached_prog_handle;
@@ -94,8 +83,8 @@ load_code(u64 progid, u16 progver, prog_addrs_t *shared, prog_addrs_t *original,
         lzss_decompress((u8 *)shared->text_addr + size);
     }
 
-    // Load/Dump code section
-    sd_code(progid, (u8 *)shared->text_addr, shared->total_size << 12);
+    // Load/Dump code sections
+    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,
index a98e7c56aa282c4abc7b3a7f665cdb063d45ff90..3818db870ad5228a2286b96d4fc606eae207677d 100644 (file)
@@ -1,5 +1,6 @@
 #include <3ds.h>
 #include "patcher.h"
+#include "exheader.h"
 #include "fsldr.h"
 #include "internal.h"
 #include "memory.h"
@@ -13,7 +14,9 @@
 #endif
 #include "../../../source/config.h"
 
-#define CODE_PATH PATH_EXEFS "/0000000000000000"
+#define TEXT_PATH PATH_EXEFS_TEXT "/0000000000000000"
+#define DATA_PATH PATH_EXEFS_DATA "/0000000000000000"
+#define RO_PATH PATH_EXEFS_RO "/0000000000000000"
 #define LANG_PATH PATH_LOCEMU "/0000000000000000"
 
 const char hexDigits[] = "0123456789ABCDEF";
@@ -382,7 +385,7 @@ overlay_patch(u64 progId, u8 *code, u32 size)
 }
 
 void
-sd_code(u64 progId, u8 *code_loc, u32 code_len)
+code_handler(u64 progId, prog_addrs_t *shared)
 {
     // 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]))
@@ -390,37 +393,79 @@ sd_code(u64 progId, u8 *code_loc, u32 code_len)
 
     u32 highTid = progId >> 0x20;
 
-    static char code_path[] = CODE_PATH;
+    if ((highTid == 0x00040000 || highTid == 0x00040002) && !config.options[OPTION_LOADER_DUMPCODE_ALL])
+        return;
+
+    static char text_path[] = TEXT_PATH;
+    static char data_path[] = DATA_PATH;
+    static char ro_path[] = RO_PATH;
     Handle code_f;
 
-    hexdump_titleid(progId, code_path);
+    hexdump_titleid(progId, text_path);
+    hexdump_titleid(progId, data_path);
+    hexdump_titleid(progId, ro_path);
 
     u32 len;
 
+       // Text section.
+
     // 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);
+    if (R_SUCCEEDED(fileOpen(&code_f, ARCHIVE_SDMC, text_path, FS_OPEN_READ)) && config.options[OPTION_LOADER_LOADCODE]) {
+        FSFILE_Read(code_f, &len, 0, (void*)shared->text_addr, shared->text_size << 12);
+        logstr("  loaded text from ");
+        logstr(text_path);
         logstr("\n");
     }
     // Either system title with OPTION_LOADER_DUMPCODE_ALL enabled, or regular title
     else if (config.options[OPTION_LOADER_DUMPCODE]) {
-        if ((highTid == 0x00040000 || highTid == 0x00040002) && !config.options[OPTION_LOADER_DUMPCODE_ALL])
-            goto return_close;
+        if (R_SUCCEEDED(fileOpen(&code_f, ARCHIVE_SDMC, text_path, FS_OPEN_WRITE | FS_OPEN_CREATE))) {
+            FSFILE_Write(code_f, &len, 0, (void*)shared->text_addr, shared->text_size << 12, FS_WRITE_FLUSH | FS_WRITE_UPDATE_TIME);
+            logstr("  dumped text to ");
+            logstr(text_path);
+            logstr("\n");
+        }
+    }
+    FSFILE_Close(code_f);
+
+       // Data section.
 
-        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);
+    // Attempts to load code section from SD card, including system titles/modules/etc.
+    if (R_SUCCEEDED(fileOpen(&code_f, ARCHIVE_SDMC, data_path, FS_OPEN_READ)) && config.options[OPTION_LOADER_LOADCODE]) {
+        FSFILE_Read(code_f, &len, 0, (void*)shared->data_addr, shared->data_size << 12);
+        logstr("  loaded data from ");
+        logstr(data_path);
+        logstr("\n");
+    }
+    // Either system title with OPTION_LOADER_DUMPCODE_ALL enabled, or regular title
+    else if (config.options[OPTION_LOADER_DUMPCODE]) {
+        if (R_SUCCEEDED(fileOpen(&code_f, ARCHIVE_SDMC, data_path, FS_OPEN_WRITE | FS_OPEN_CREATE))) {
+            FSFILE_Write(code_f, &len, 0, (void*)shared->data_addr, shared->data_size << 12, FS_WRITE_FLUSH | FS_WRITE_UPDATE_TIME);
+            logstr("  dumped data to ");
+            logstr(data_path);
             logstr("\n");
         }
     }
+    FSFILE_Close(code_f);
 
-return_close:
+       // RO Section.
 
+    // Attempts to load code section from SD card, including system titles/modules/etc.
+    if (R_SUCCEEDED(fileOpen(&code_f, ARCHIVE_SDMC, ro_path, FS_OPEN_READ)) && config.options[OPTION_LOADER_LOADCODE]) {
+        FSFILE_Read(code_f, &len, 0, (void*)shared->ro_addr, shared->ro_size << 12);
+        logstr("  loaded ro from ");
+        logstr(ro_path);
+        logstr("\n");
+    }
+    // Either system title with OPTION_LOADER_DUMPCODE_ALL enabled, or regular title
+    else if (config.options[OPTION_LOADER_DUMPCODE]) {
+        if (R_SUCCEEDED(fileOpen(&code_f, ARCHIVE_SDMC, ro_path, FS_OPEN_WRITE | FS_OPEN_CREATE))) {
+            FSFILE_Write(code_f, &len, 0, (void*)shared->ro_addr, shared->ro_size << 12, FS_WRITE_FLUSH | FS_WRITE_UPDATE_TIME);
+            logstr("  dumped ro to ");
+            logstr(ro_path);
+            logstr("\n");
+        }
+    }
     FSFILE_Close(code_f);
-    return;
 }
 
 // This is only for the .code segment.
index 3bcf32fec65147e3cd95d8790bc3325887887504..cf3b70bb30a9cdbaf492fad33d52617e55682158 100644 (file)
@@ -2,10 +2,11 @@
 #define __PATCHER_H
 
 #include <3ds/types.h>
+#include "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 sd_code(u64 progId, u8 *code_loc, u32 code_len);
+void code_handler(u64 progId, prog_addrs_t* shared);
 
 u32 get_text_extend(u64 progId, u16 progver, u32 size_orig);
 u32 get_ro_extend(u64 progId, u16 progver, u32 size_orig);
index 18463ce4f4b4652cffbaaa879331470b2f11ad3b..d623aeebfab9604018d383ee047a131e48a6b555 100755 (executable)
@@ -310,7 +310,6 @@ def parse_op(token_list, instr_offs):
                        return bytearray.fromhex("87") + pad_zero_r(val, 2)
        elif token_list[0] == "n3ds": # Sets the eq flag if this is an n3ds.
                return bytearray.fromhex("10")
-
        elif token_list[0] == "abort":
                return bytearray.fromhex("18")
        elif token_list[0] == "aborteq":
index e0b051c4ec14d7084943c71aa4d06aadfa0eadd1..b2dd3714ca0873dc180062b1b8972cb1f8193bee 100644 (file)
@@ -6,12 +6,8 @@
 
 rel exe_text
 
-# Status: needs loader
-
-# u"Ver."
 find u"Ver."
 
 abortnf
 
-# u".hax"
-set  u".hax"
+set  u".hack//%d%d%d:%d%ls"
index 50e22fd3524d454e449781408f306491ff9263ab..60d76840d58c4714657085817b644f4d75376dc0 100644 (file)
@@ -33,6 +33,9 @@ mk_structure()
     f_mkdir(PATH_SVC);
     f_mkdir(PATH_KEYS);
     f_mkdir(PATH_EXEFS);
+    f_mkdir(PATH_EXEFS_TEXT);
+    f_mkdir(PATH_EXEFS_DATA);
+    f_mkdir(PATH_EXEFS_RO);
     f_mkdir(PATH_TEMP);
     f_mkdir(PATH_LOADER_CACHE);
 }
index dc1b0771f12bbeecaf0b0c689bfbc8ac601a6a2a..d217a0d0726b07506daa1be10b00559d1d989852 100644 (file)
 #define PATH_KEYS PATH_CFW "/keys" // Keyfiles will be loaded from this dir, and
                                    // additionally the root if not found.
 
-#define PATH_EXEFS PATH_CFW "/exe" // ExeFS overrides/dumps, named by titleid
+#define PATH_EXEFS PATH_CFW "/exe"         // ExeFS overrides/dumps, named by titleid
+#define PATH_EXEFS_TEXT PATH_EXEFS "/text" // Text segment overrides/dumps, named by titleid
+#define PATH_EXEFS_RO PATH_EXEFS "/ro"     // RO segment overrides/dumps, named by titleid
+#define PATH_EXEFS_DATA PATH_EXEFS "/data" // Data segment overrides/dumps, named by titleid
 
 #define PATH_BITS PATH_CFW "/bits" // Path to misc bits we need (emunand code, reboot code, etc)
 
@@ -87,8 +90,11 @@ struct system_patch
     char magic[4];   // "AIDA" for shits and giggles and because we like .hack.
     uint8_t version; // Version of the patch itself.
 
-    char name[64];  // User-readable name for patch in menu.
-    char desc[256]; // User-readable description for patch in menu.
+       // NOTE - This metadata stuff is temporary, I eventually plan to move it down
+    // to the same 'variable' width section as tids.
+    char name[64];   // User-readable name for patch in menu.
+    char desc[256];  // User-readable description for patch in menu.
+
     uint64_t uuid;  // Unique ID for patch. Each unique patch should provide
                     // a unique ID.