Misc exception handlers fixes

Biggest one is they actually work now
This commit is contained in:
Wolfvak 2017-08-16 19:43:08 -03:00
parent 06318455c1
commit cfa26c2a2d
8 changed files with 38 additions and 39 deletions

View File

@ -21,9 +21,9 @@ ifeq ($(SAFEMODE),1)
export TARGET := SafeMode9 export TARGET := SafeMode9
endif endif
BUILD := build BUILD := build
SOURCES := source source/common source/filesys source/crypto source/fatfs source/nand source/virtual source/game source/gamecart source/quicklz SOURCES := source source/common source/filesys source/crypto source/fatfs source/nand source/virtual source/game source/gamecart source/quicklz source/system
DATA := data DATA := data
INCLUDES := common source source/common source/font source/filesys source/crypto source/fatfs source/nand source/virtual source/game source/gamecart source/quicklz INCLUDES := common source source/common source/font source/filesys source/crypto source/fatfs source/nand source/virtual source/game source/gamecart source/quicklz source/system
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
# options for code generation # options for code generation

View File

@ -9,7 +9,7 @@
.global _start .global _start
_start: _start:
@ Switch to supervisor mode and disable interrupts @ Switch to supervisor mode and disable interrupts
msr cpsr_c, #(SR_SVC_MODE | SR_IRQ | SR_FIQ) msr cpsr_c, #(SR_SYS_MODE | SR_IRQ | SR_FIQ)
@ Short delay (not always necessary, just in case) @ Short delay (not always necessary, just in case)
mov r3, #0x40000 mov r3, #0x40000
@ -136,7 +136,7 @@ _start_gm:
bl main bl main
__mpu_regions: __mpu_regions:
.word 0xFFFF001F @ ffff0000 64k | bootrom (unprotected / protected) .word 0xFFFF001F @ FFFF0000 64k | bootrom (unprotected / protected)
.word 0x3000801B @ 30008000 16k | dtcm .word 0x3000801B @ 30008000 16k | dtcm
.word 0x00000035 @ 00000000 128M | itcm .word 0x00000035 @ 00000000 128M | itcm
.word 0x08000029 @ 08000000 2M | arm9 mem (O3DS / N3DS) .word 0x08000029 @ 08000000 2M | arm9 mem (O3DS / N3DS)

View File

@ -10,8 +10,8 @@
#include <arm.h> #include <arm.h>
/* Code will be dumped from PC-PC_DUMPRAD to PC+PC_DUMPRAD */ #define PC_DUMPRAD (0x30)
#define PC_DUMPRAD (0x20) #define SP_DUMPLEN (0x60)
#define XRQ_DUMPDATAFUNC(type, size) \ #define XRQ_DUMPDATAFUNC(type, size) \
int XRQ_DumpData_##type(char *b, u32 s, u32 e) \ int XRQ_DumpData_##type(char *b, u32 s, u32 e) \
@ -33,10 +33,9 @@ XRQ_DUMPDATAFUNC(u16, 4)
XRQ_DUMPDATAFUNC(u32, 8) XRQ_DUMPDATAFUNC(u32, 8)
// Last 3 should never happen
const char *XRQ_Name[] = { const char *XRQ_Name[] = {
"Reset", "Undefined", "SWI", "Prefetch Abort", "Reset", "Undefined", "SWI", "Prefetch Abort",
"Data Abort", "", "", "" "Data Abort", "Reserved", "IRQ", "FIQ"
}; };
extern char __stack_top; extern char __stack_top;
@ -45,43 +44,44 @@ void XRQ_DumpRegisters(u32 xrq, u32 *regs)
{ {
int y; int y;
u32 sp, st, pc; u32 sp, st, pc;
char *wstr = (char*)TEMP_BUFFER, *dumpstr = wstr; char dumpstr[2048], *wstr = dumpstr;
ClearScreen(MAIN_SCREEN, COLOR_BLACK); ClearScreen(MAIN_SCREEN, COLOR_BLACK);
wstr += sprintf(wstr, "Exception: %s (%lu)\n", XRQ_Name[xrq&7], xrq);
/* Print registers on screen */
wstr += sprintf(wstr, "Exception: %s (%lu)\n", XRQ_Name[xrq&7], xrq);
for (int i = 0; i < 8; i++) { for (int i = 0; i < 8; i++) {
int i_ = i*2; int i_ = i*2;
wstr += sprintf(wstr, wstr += sprintf(wstr,
"R%02d: %08lX | R%02d: %08lX\n", i_, regs[i_], i_+1, regs[i_+1]); "R%02d: %08lX | R%02d: %08lX\n", i_, regs[i_], i_+1, regs[i_+1]);
} }
wstr += sprintf(wstr, "CPSR: %08lX\n", regs[16]); wstr += sprintf(wstr, "CPSR: %08lX\n", regs[16]);
DrawStringF(MAIN_SCREEN, 10, 0, COLOR_WHITE, COLOR_BLACK, DrawStringF(MAIN_SCREEN, 10, 0, COLOR_WHITE, COLOR_BLACK, dumpstr);
dumpstr);
/* Reinitialize SD */
y = GetDrawStringHeight(dumpstr); y = GetDrawStringHeight(dumpstr);
DrawStringF(MAIN_SCREEN, 10, y, COLOR_WHITE, COLOR_BLACK, DrawString(MAIN_SCREEN, "Reinitializing SD subsystem...", 10, y,
"Reinitializing SD subsystem..."); COLOR_WHITE, COLOR_BLACK);
y+=FONT_HEIGHT_EXT; y+=FONT_HEIGHT_EXT;
while(!InitSDCardFS()) { while(!InitSDCardFS()) {
DeinitSDCardFS(); DeinitSDCardFS();
} }
DrawString(MAIN_SCREEN, "Done", 10, y, COLOR_WHITE, COLOR_BLACK);
DrawStringF(MAIN_SCREEN, 10, y, COLOR_WHITE, COLOR_BLACK,
"Done");
y+=FONT_HEIGHT_EXT; y+=FONT_HEIGHT_EXT;
/* Dump STACK */
sp = regs[13] & ~0xF; sp = regs[13] & ~0xF;
st = (u32)&__stack_top; st = (u32)&__stack_top;
if (sp >= 0x20000000 && sp <= st) { wstr += sprintf(wstr, "\nStack dump:\n\n");
wstr += sprintf(wstr, "\nStack dump:\n\n"); wstr += XRQ_DumpData_u8(wstr, sp, min(sp+SP_DUMPLEN, st));
wstr += XRQ_DumpData_u8(wstr, sp, st);
}
pc = regs[15];
/* Dump TEXT */
pc = regs[15] & ~0xF;
wstr += sprintf(wstr, "\nCode dump:\n\n"); wstr += sprintf(wstr, "\nCode dump:\n\n");
if (regs[16] & SR_THUMB) { if (regs[16] & SR_THUMB) {
wstr += XRQ_DumpData_u16(wstr, pc-PC_DUMPRAD, pc+PC_DUMPRAD); wstr += XRQ_DumpData_u16(wstr, pc-PC_DUMPRAD, pc+PC_DUMPRAD);
@ -89,12 +89,15 @@ void XRQ_DumpRegisters(u32 xrq, u32 *regs)
wstr += XRQ_DumpData_u32(wstr, pc-PC_DUMPRAD, pc+PC_DUMPRAD); wstr += XRQ_DumpData_u32(wstr, pc-PC_DUMPRAD, pc+PC_DUMPRAD);
} }
DrawStringF(MAIN_SCREEN, 10, y, COLOR_WHITE, COLOR_BLACK,
"Dumping state to SD..."); /* Dump to SD */
DrawString(MAIN_SCREEN, "Dumping state to SD...", 10, y,
COLOR_WHITE, COLOR_BLACK);
y+=FONT_HEIGHT_EXT; y+=FONT_HEIGHT_EXT;
FileSetData(OUTPUT_PATH"/dump.txt", dumpstr, wstr - dumpstr, 0, true); FileSetData(OUTPUT_PATH"/exception_dump.txt", dumpstr, wstr - dumpstr, 0, true);
DrawStringF(MAIN_SCREEN, 10, y, COLOR_WHITE, COLOR_BLACK, DrawString(MAIN_SCREEN, "Done", 10, y, COLOR_WHITE, COLOR_BLACK);
"Done");
DeinitSDCardFS();
return; return;
} }

View File

@ -32,7 +32,6 @@ XRQ_Registers:
.space (17*4) .space (17*4)
XRQ_Reset: XRQ_Reset:
msr cpsr_c, #(SR_ABT_MODE | SR_IRQ | SR_FIQ)
XRQ_FATAL 0 XRQ_FATAL 0
XRQ_Undefined: XRQ_Undefined:
@ -52,10 +51,6 @@ XRQ_MainHandler:
mrs r9, spsr mrs r9, spsr
mov r8, lr mov r8, lr
@ Disable interrupts
orr r0, r0, #(SR_IRQ | SR_FIQ)
msr cpsr, r0
@ Disable mpu / caches @ Disable mpu / caches
ldr r4, =BRF_WB_INV_DCACHE ldr r4, =BRF_WB_INV_DCACHE
ldr r5, =BRF_INVALIDATE_ICACHE ldr r5, =BRF_INVALIDATE_ICACHE
@ -67,23 +62,23 @@ XRQ_MainHandler:
@ Retrieve banked registers @ Retrieve banked registers
and r0, r9, #(SR_PMODE_MASK) and r0, r9, #(SR_PMODE_MASK)
cmp r0, #(SR_USR_MODE) cmp r0, #(SR_USR_MODE)
orreq r0, r9, #(SR_SYS_MODE) orreq r0, #(SR_SYS_MODE)
orr r0, #(SR_IRQ | SR_FIQ) orr r0, #(SR_IRQ | SR_FIQ)
msr cpsr_c, r0 @ Switch to previous mode msr cpsr_c, r0 @ Switch to previous mode
mov r0, sp mov r0, sp
mov r1, lr mov r1, lr
msr cpsr, r10 @ Return to abort msr cpsr_c, r10 @ Return to abort
stmia sp!, {r0,r1,r8,r9} stmia sp!, {r0,r1,r8,r9}
ldr sp, =__stack_abt ldr sp, =0x8000
ldr r2, =XRQ_DumpRegisters ldr r2, =XRQ_DumpRegisters @ void XRQ_DumpRegisters(u32 xrq_id, u32 *regs)
adr r1, XRQ_Registers adr r1, XRQ_Registers
mov r0, r11 mov r0, r11
blx r2 blx r2
msr cpsr_c, #(SR_SVC_MODE | SR_IRQ | SR_FIQ) msr cpsr, #(SR_SVC_MODE | SR_IRQ | SR_FIQ)
mov r0, #0 mov r0, #0
.LXRQ_WFI: .LXRQ_WFI:
mcr p15, 0, r0, c7, c0, 4 mcr p15, 0, r0, c7, c0, 4
@ -93,3 +88,4 @@ XRQ_MainHandler:
.global XRQ_End .global XRQ_End
XRQ_End: XRQ_End:
.word 0