diff --git a/exceptions/arm11/source/handlers.h b/exceptions/arm11/source/handlers.h index 912672c..270723b 100644 --- a/exceptions/arm11/source/handlers.h +++ b/exceptions/arm11/source/handlers.h @@ -24,15 +24,6 @@ #include "types.h" -void __attribute__((noreturn)) mcuReboot(void); -void cleanInvalidateDCacheAndDMB(void); -bool cannotAccessVA(const void *address); - -void FIQHandler(void); -void undefinedInstructionHandler(void); -void dataAbortHandler(void); -void prefetchAbortHandler(void); - typedef struct __attribute__((packed)) { u32 magic[2]; @@ -46,4 +37,13 @@ typedef struct __attribute__((packed)) u32 codeDumpSize; u32 stackDumpSize; u32 additionalDataSize; -} ExceptionDumpHeader; \ No newline at end of file +} ExceptionDumpHeader; + +void __attribute__((noreturn)) mcuReboot(void); +void cleanInvalidateDCacheAndDMB(void); +bool cannotAccessVA(const void *address); + +void FIQHandler(void); +void undefinedInstructionHandler(void); +void dataAbortHandler(void); +void prefetchAbortHandler(void); \ No newline at end of file diff --git a/exceptions/arm11/source/handlers.s b/exceptions/arm11/source/handlers.s index 3094e60..7ee51c5 100644 --- a/exceptions/arm11/source/handlers.s +++ b/exceptions/arm11/source/handlers.s @@ -42,7 +42,7 @@ _commonHandler: mrs r2, spsr mov r6, sp mrs r3, cpsr - + tst r2, #0x20 bne noFPUInitNorSvcBreak sub r0, lr, #4 @@ -54,7 +54,7 @@ _commonHandler: ldr r4, [lr, #-4] cmp r1, #1 bne noFPUInit - + lsl r4, #4 sub r4, #0xc0000000 cmp r4, #0x30000000 @@ -62,7 +62,7 @@ _commonHandler: fmrx r0, fpexc tst r0, #0x40000000 bne noFPUInitNorSvcBreak - + sub lr, #4 srsfd sp!, #0x13 ldmfd sp!, {r0-r7} @ restore context @@ -99,7 +99,7 @@ _commonHandler: stmfd r6!, {r8-lr} msr cpsr_c, r3 @ restore processor mode mov sp, r6 - + stmfd sp!, {r2,lr} mrc p15,0,r4,c5,c0,0 @ dfsr @@ -108,13 +108,13 @@ _commonHandler: fmrx r7, fpexc fmrx r8, fpinst fmrx r9, fpinst2 - + stmfd sp!, {r4-r9} @ it's a bit of a mess, but we will fix that later @ order of saved regs now: dfsr, ifsr, far, fpexc, fpinst, fpinst2, cpsr, pc + (2/4/8), r8-r14, r0-r7 - + bic r3, #(1<<31) fmxr fpexc, r3 @ clear the VFP11 exception flag (if it's set) - + mov r0, sp mrc p15,0,r2,c0,c0,5 @ CPU ID register @@ -129,7 +129,7 @@ GEN_HANDLER dataAbortHandler .type mcuReboot, %function mcuReboot: b . @ will be replaced - + .global cleanInvalidateDCacheAndDMB .type cleanInvalidateDCacheAndDMB, %function cleanInvalidateDCacheAndDMB: diff --git a/exceptions/arm11/source/start.s b/exceptions/arm11/source/start.s index b4dfe81..3d32006 100644 --- a/exceptions/arm11/source/start.s +++ b/exceptions/arm11/source/start.s @@ -23,7 +23,7 @@ .global _start _start: add pc, r0, #(handlers - .) @ Dummy instruction to prevent compiler optimizations - + handlers: .word FIQHandler .word undefinedInstructionHandler diff --git a/exceptions/arm9/source/handlers.h b/exceptions/arm9/source/handlers.h index 21473e6..2319c02 100644 --- a/exceptions/arm9/source/handlers.h +++ b/exceptions/arm9/source/handlers.h @@ -21,25 +21,26 @@ */ #pragma once -#include "types.h" -u32 readMPUConfig(u32 regionSettings[8]); -void FIQHandler(void); -void undefinedInstructionHandler(void); -void dataAbortHandler(void); -void prefetchAbortHandler(void); +#include "types.h" typedef struct __attribute__((packed)) { u32 magic[2]; u16 versionMinor, versionMajor; - + u16 processor, core; u32 type; - + u32 totalSize; u32 registerDumpSize; u32 codeDumpSize; u32 stackDumpSize; u32 additionalDataSize; -} ExceptionDumpHeader; \ No newline at end of file +} ExceptionDumpHeader; + +u32 readMPUConfig(u32 regionSettings[8]); +void FIQHandler(void); +void undefinedInstructionHandler(void); +void dataAbortHandler(void); +void prefetchAbortHandler(void); \ No newline at end of file diff --git a/exceptions/arm9/source/handlers.s b/exceptions/arm9/source/handlers.s index 940a438..fe73d65 100644 --- a/exceptions/arm9/source/handlers.s +++ b/exceptions/arm9/source/handlers.s @@ -24,7 +24,7 @@ \name: ldr sp, =#0x02000000 @ We make the (full descending) stack point to the end of ITCM for our exception handlers. @ It doesn't matter if we're overwriting stuff here, since we're going to reboot. - + stmfd sp!, {r0-r7} @ FIQ has its own r8-r14 regs ldr r1, =\@ @ macro expansion counter b _commonHandler @@ -78,12 +78,12 @@ _commonHandler: stmfd r6!, {r8-lr} msr cpsr_c, r3 @ restore processor mode mov sp, r6 - + stmfd sp!, {r2,lr} @ it's a bit of a mess, but we will fix that later @ order of saved regs now: cpsr, pc + (2/4/8), r8-r14, r0-r7 - + mov r0, sp - + b mainHandler GEN_HANDLER FIQHandler diff --git a/exceptions/arm9/source/mainHandler.c b/exceptions/arm9/source/mainHandler.c index 8316ca6..895e5a6 100644 --- a/exceptions/arm9/source/mainHandler.c +++ b/exceptions/arm9/source/mainHandler.c @@ -68,19 +68,19 @@ static u32 __attribute__((noinline)) copyMemory(void *dst, const void *src, u32 void __attribute__((noreturn)) mainHandler(u32 regs[REG_DUMP_SIZE / 4], u32 type) { ExceptionDumpHeader dumpHeader; - + u32 registerDump[REG_DUMP_SIZE / 4]; u8 codeDump[CODE_DUMP_SIZE]; - + dumpHeader.magic[0] = 0xDEADC0DE; dumpHeader.magic[1] = 0xDEADCAFE; dumpHeader.versionMajor = 1; dumpHeader.versionMinor = 2; - + dumpHeader.processor = 9; dumpHeader.core = 0; dumpHeader.type = type; - + dumpHeader.registerDumpSize = REG_DUMP_SIZE; dumpHeader.codeDumpSize = CODE_DUMP_SIZE; dumpHeader.additionalDataSize = 0; @@ -94,16 +94,16 @@ void __attribute__((noreturn)) mainHandler(u32 regs[REG_DUMP_SIZE / 4], u32 type registerDump[16] = cpsr; for(u32 i = 0; i < 7; i++) registerDump[8 + i] = regs[2 + i]; for(u32 i = 0; i < 8; i++) registerDump[i] = regs[9 + i]; - + //Dump code u8 *instr = (u8 *)pc + ((cpsr & 0x20) ? 2 : 4) - dumpHeader.codeDumpSize; //Doesn't work well on 32-bit Thumb instructions, but it isn't much of a problem dumpHeader.codeDumpSize = copyMemory(codeDump, instr, dumpHeader.codeDumpSize, ((cpsr & 0x20) != 0) ? 2 : 4); - + //Copy register dump and code dump u8 *final = (u8 *)(FINAL_BUFFER + sizeof(ExceptionDumpHeader)); final += copyMemory(final, registerDump, dumpHeader.registerDumpSize, 1); final += copyMemory(final, codeDump, dumpHeader.codeDumpSize, 1); - + //Dump stack in place dumpHeader.stackDumpSize = copyMemory(final, (const void *)registerDump[13], 0x1000 - (registerDump[13] & 0xFFF), 1); diff --git a/exceptions/arm9/source/start.s b/exceptions/arm9/source/start.s index cefe3e4..3d32006 100644 --- a/exceptions/arm9/source/start.s +++ b/exceptions/arm9/source/start.s @@ -23,10 +23,9 @@ .global _start _start: add pc, r0, #(handlers - .) @ Dummy instruction to prevent compiler optimizations - + handlers: .word FIQHandler .word undefinedInstructionHandler .word prefetchAbortHandler .word dataAbortHandler - \ No newline at end of file diff --git a/injector/source/patcher.c b/injector/source/patcher.c index 8df1cd1..5ecdce2 100644 --- a/injector/source/patcher.c +++ b/injector/source/patcher.c @@ -537,7 +537,7 @@ void patchCode(u64 progId, u8 *code, u32 size) break; } - + case 0x0004003000008A02LL: // ErrDisp { if(CONFIG_DEVOPTIONS == 0) @@ -568,6 +568,7 @@ void patchCode(u64 progId, u8 *code, u32 size) sizeof(unitinfoCheckPatch), 3 ); } + break; } diff --git a/loader/source/main.c b/loader/source/main.c index f6d9cae..b902b9d 100644 --- a/loader/source/main.c +++ b/loader/source/main.c @@ -29,9 +29,9 @@ void main(void) { void *payloadAddress = (void *)0x23F00000; - memcpy(payloadAddress, (void*)0x24F00000, payloadSize); + memcpy(payloadAddress, (void *)0x24F00000, payloadSize); flushCaches(); - + ((void (*)())payloadAddress)(); } \ No newline at end of file