From 95f04ee3d0a94099c8ecc89dad52b2d6e5558336 Mon Sep 17 00:00:00 2001 From: Reisyukaku Date: Fri, 7 Aug 2015 03:01:42 -0400 Subject: [PATCH] Boot to sysnand if no emunand partition. --- source/firm.c | 39 +++++++++++++++++++++++---------------- source/firm.h | 1 + source/patches.h | 4 ++-- thread/source/_start.s | 1 - 4 files changed, 26 insertions(+), 19 deletions(-) diff --git a/source/firm.c b/source/firm.c index ac681aa9..e6226fba 100644 --- a/source/firm.c +++ b/source/firm.c @@ -13,6 +13,8 @@ firmHeader *firmLocation = (firmHeader *)0x24000000; const u32 firmSize = 0xF1000; firmSectionHeader *section; +u32 emuOffset = 0; +u32 emuHeader = 0; void loadFirm(void){ //Read FIRM from SD card and write to FCRAM @@ -21,31 +23,36 @@ void loadFirm(void){ } void loadSys(void){ - //stubbed + memcpy((u8*)mpuCode, mpu, sizeof(mpu)); } -void patchFirm(void){ - //Part1: Add emunand parsing code - u32 offset = 0; - u32 header = 0; - if(getEmunand(&offset, &header) == 1){ - fileRead((u8*)emuCode, "/rei/emunand/emunand.bin", 0); - u32 *pos_offset = memsearch((u8*)emuCode, "NAND", 0x218, 4); - u32 *pos_header = memsearch((u8*)emuCode, "NCSD", 0x218, 4); - memcpy((void *)pos_offset, (void *)offset, 4); - memcpy((void *)pos_header, (void *)header, 4); - } - //Part2: Add emunand hooks - memcpy((u8*)emuHook1, eh1, sizeof(eh1)); +void loadEmu(void){ + fileRead((u8*)emuCode, "/rei/emunand/emunand.bin", 0); + u32 *pos_offset = memsearch((u8*)emuCode, "NAND", 0x218, 4); + u32 *pos_header = memsearch((u8*)emuCode, "NCSD", 0x218, 4); + memcpy((void *)pos_offset, (void *)emuOffset, 4); + memcpy((void *)pos_header, (void *)emuHeader, 4); + + //Add emunand hooks + memcpy((u8*)mpuCode, mpu, sizeof(mpu)); memcpy((u8*)emuHook2, eh2, sizeof(eh2)); memcpy((u8*)emuHook3, eh3, sizeof(eh3)); memcpy((u8*)emuHook4, eh4, sizeof(eh4)); +} + +void patchFirm(void){ - //Part3: Disable signature checks + //Part1: Get Emunand + if(getEmunand(&emuOffset, &emuHeader) == 1) + loadEmu(); + else + loadSys(); + + //Part2: Disable signature checks memcpy((u8*)patch1, p1, sizeof(p1)); memcpy((u8*)patch2, p2, sizeof(p2)); - //Part4: Create arm9 thread + //Part3: Create arm9 thread fileRead((u8*)threadCode, "/rei/thread/arm9.bin", 0); memcpy((u8*)threadHook1, th1, sizeof(th1)); memcpy((u8*)threadHook2, th2, sizeof(th2)); diff --git a/source/firm.h b/source/firm.h index bdd91f80..5bce3bde 100644 --- a/source/firm.h +++ b/source/firm.h @@ -8,6 +8,7 @@ void loadSplash(void); void loadFirm(void); void loadSys(void); +void loadEmu(void); void patchFirm(void); void launchFirm(void); diff --git a/source/patches.h b/source/patches.h index 0a9c23eb..0afbed19 100644 --- a/source/patches.h +++ b/source/patches.h @@ -19,12 +19,12 @@ */ //Addresses to patch u32 emuCode = KERNEL9 + (0x0801A4C0 - K9_ADDR); -u32 emuHook1 = KERNEL9 + (0x0801B3D4 - K9_ADDR); +u32 mpuCode = KERNEL9 + (0x0801B3D4 - K9_ADDR); u32 emuHook2 = PROC9 + (0x080282F8 - P9_ADDR); u32 emuHook3 = PROC9 + (0x0807877E - P9_ADDR); u32 emuHook4 = PROC9 + (0x080787BE - P9_ADDR); //Patches -u8 eh1[0x2C] = { +u8 mpu[0x2C] = { //MPU shit 0x03, 0x00, 0x36, 0x00, 0x00, 0x00, 0x10, 0x10, 0x01, 0x00, 0x00, 0x01, 0x03, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x01, 0x01, 0x01, 0x03, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x01, 0x01, 0x01, 0x03, 0x06, 0x1C, 0x00, 0x00, 0x00, 0x02, 0x08 diff --git a/thread/source/_start.s b/thread/source/_start.s index 8955bccf..a991dcd3 100644 --- a/thread/source/_start.s +++ b/thread/source/_start.s @@ -1,5 +1,4 @@ .arm -.global thread .global _start _start: push {r0-r12 , lr}