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;
}
}
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
}
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;
}
}
-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)
{
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]) {
// 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.
#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);
uint8_t *memory;
uint32_t size;
};
+
struct mode modes[21];
int init_bytecode = 0;
#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
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");