]> Chaos Git - corbenik/corbenik.git/commitdiff
Refactor some more for patching entire codebin
authorchaoskagami <chaos.kagami@gmail.com>
Tue, 27 Dec 2016 00:19:13 +0000 (19:19 -0500)
committerchaoskagami <chaos.kagami@gmail.com>
Tue, 27 Dec 2016 00:19:13 +0000 (19:19 -0500)
external/loader/source/loader.c
external/loader/source/patcher.c
external/loader/source/patcher.h
host/bytecode_asm.py
source/interpreter.c

index dfd864015655839c417b181591d495993d2c711f..10b24126fed6f6e43f7fa12f1d52d7e1ff6e4cf3 100644 (file)
@@ -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;
 }
index eb161868e7047cbaebb289a447e6486eee17f54b..af746c02983b0838a7e805b871d675587e3c6107 100644 (file)
@@ -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.
index 8013352695bd21b9ea9420b040bdf1556f94f337..fc7578f6d56555c6d4a3587f7aa9aefcec972ce2 100644 (file)
@@ -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);
 
index efcb2cada028440234048a81af55eb5b74c30635..e9b071d2d183574456818d74d411588d93585800 100755 (executable)
@@ -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"
index 2e2fd6426f5ac206aa1987bdebf10606e0b13099..397ef09f7bc5fa1fefdde07759e0f31cf707e06a 100644 (file)
@@ -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");