mirror of
https://github.com/d0k3/GodMode9.git
synced 2025-06-26 21:52:48 +00:00
Misc exception handlers fixes
Biggest one is they actually work now
This commit is contained in:
parent
06318455c1
commit
cfa26c2a2d
4
Makefile
4
Makefile
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
}
|
}
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user