preliminary work on handling specific exceptions

This commit is contained in:
Connor Olding 2018-08-19 13:46:11 +02:00
parent 8847354089
commit 6d56e1fe42
2 changed files with 110 additions and 18 deletions

View file

@ -43,7 +43,7 @@ macro KMaybeDumpString(str) {
+
}
macro KString(name, str) {
macro KS(name, str) {
align(16)
{name}:
db {str}, 0
@ -51,7 +51,7 @@ macro KString(name, str) {
{name}X:
}
macro KStringLine(name, str) {
macro KSL(name, str) {
align(16)
{name}:
db {str}, 10, 0

View file

@ -48,8 +48,10 @@ Start:
// SP should always be 8-byte aligned
// so that SD and LD instructions don't fail on it.
// we also need 4 empty words for storing
// the 32-bit values of the callee's arguments.
// the 32-bit values of the callee's argument registers.
subiu sp, sp, 0x10
sd r0, 0(sp)
sd r0, 8(sp)
// TODO: just wipe a portion of RAM?
// or just DMA in the IH and our defaults from ROM...
@ -86,7 +88,7 @@ Drive64Confirmed:
Drive64CheckConsole:
// NOTE: we only check at boot, so disconnecting the console
// while running will cause a ton of lag (timeouts) until reset.
KDumpString(KConsoleConfirmed)
KDumpString(KSConsoleConfirmed)
lli t0, 1
beqzl v0, Drive64Done
sw t0, K_CONSOLE_AVAILABLE(gp)
@ -100,8 +102,9 @@ Drive64Done:
nop
nop
// // try out an interrupt:
// //sw r0, 0(r0)
// try out an interrupt:
// sw r0, 0(r0)
// nop
// mfc0 t1, CP0_Status
// ori t1, 2
// mtc0 t1, CP0_Status
@ -194,7 +197,7 @@ InterruptHandler:
sd at, K_DUMP+0x08(k0)
// disable interrupts, clear exception and error level bits:
// disable interrupts
mfc0 k1, CP0_Status
addiu at, r0, ~CP0_STATUS_IE
sw k1, K_STATUS(k0)
@ -266,8 +269,8 @@ if K_DEBUG {
ori sp, k0, K_STACK
IHMain: // free to modify any GPR from here to IHExit
KMaybeDumpString(KNewline)
KMaybeDumpString(KString0)
KMaybeDumpString(KSNewline)
KMaybeDumpString(KSHandling)
ori a0, k0, K_DUMP + 0x80 * 0
lli a1, 0x80
@ -275,7 +278,7 @@ IHMain: // free to modify any GPR from here to IHExit
jal DumpAndWrite
lli a3, 0x80 * 4
KMaybeDumpString(KNewline)
KMaybeDumpString(KSNewline)
ori a0, k0, K_DUMP + 0x80 * 1
lli a1, 0x80
@ -283,7 +286,7 @@ IHMain: // free to modify any GPR from here to IHExit
jal DumpAndWrite
lli a3, 0x80 * 4
KMaybeDumpString(KNewline)
KMaybeDumpString(KSNewline)
// currently just 0x10 in size: LO and HI registers.
ori a0, k0, K_DUMP + 0x80 * 2
@ -292,8 +295,8 @@ IHMain: // free to modify any GPR from here to IHExit
jal DumpAndWrite
lli a3, 0x10 * 4
KMaybeDumpString(KNewline)
KMaybeDumpString(KString1)
KMaybeDumpString(KSNewline)
KMaybeDumpString(KSStates)
ori a0, k0, K_DUMP + 0x80 * 4
lli a1, 0x80
@ -301,7 +304,19 @@ IHMain: // free to modify any GPR from here to IHExit
jal DumpAndWrite
lli a3, 0x80 * 4
KMaybeDumpString(KNewline)
KMaybeDumpString(KSNewline)
KMaybeDumpString(KSCode)
// switch-case on the cause code:
// conveniently, the ExcCode in Cause is already shifted left by 2.
lw t4, K_CAUSE(k0)
la t3, KCodes
andi t4, CP0_CAUSE_CODE
addu t3, t4
lw t4, 0(t3)
jr t4
nop
KCodeDone:
IHExit:
sw r0, K_IN_MAIN(k0)
@ -374,10 +389,87 @@ ReturnFromInterrupt:
include "debug.asm"
KString(KNewline, 10)
KStringLine(KConsoleConfirmed, "USB debug console detected")
KStringLine(KString0, " ~~ Interrupt Handled ~~")
KStringLine(KString1, " Interrupt States:")
KCode0:; KMaybeDumpString(KSCode0); j KCodeDone; nop
KCode1:; KMaybeDumpString(KSCode1); j KCodeDone; nop
KCode2:; KMaybeDumpString(KSCode2); j KCodeDone; nop
KCode3:; KMaybeDumpString(KSCode3); j KCodeDone; nop
KCode4:; KMaybeDumpString(KSCode4); j KCodeDone; nop
KCode5:; KMaybeDumpString(KSCode5); j KCodeDone; nop
KCode6:; KMaybeDumpString(KSCode6); j KCodeDone; nop
KCode7:; KMaybeDumpString(KSCode7); j KCodeDone; nop
KCode8:; KMaybeDumpString(KSCode8); j KCodeDone; nop
KCode9:; KMaybeDumpString(KSCode9); j KCodeDone; nop
KCode10:; KMaybeDumpString(KSCode10); j KCodeDone; nop
KCode11:; KMaybeDumpString(KSCode11); j KCodeDone; nop
KCode12:; KMaybeDumpString(KSCode12); j KCodeDone; nop
KCode13:; KMaybeDumpString(KSCode13); j KCodeDone; nop
KCode14:; KMaybeDumpString(KSCode14); j KCodeDone; nop
KCode15:; KMaybeDumpString(KSCode15); j KCodeDone; nop
KCode16:; KMaybeDumpString(KSCode16); j KCodeDone; nop
KCode17:; KMaybeDumpString(KSCode17); j KCodeDone; nop
KCode18:; KMaybeDumpString(KSCode18); j KCodeDone; nop
KCode19:; KMaybeDumpString(KSCode19); j KCodeDone; nop
KCode20:; KMaybeDumpString(KSCode20); j KCodeDone; nop
KCode21:; KMaybeDumpString(KSCode21); j KCodeDone; nop
KCode22:; KMaybeDumpString(KSCode22); j KCodeDone; nop
KCode23:; KMaybeDumpString(KSCode23); j KCodeDone; nop
KCode24:; KMaybeDumpString(KSCode24); j KCodeDone; nop
KCode25:; KMaybeDumpString(KSCode25); j KCodeDone; nop
KCode26:; KMaybeDumpString(KSCode26); j KCodeDone; nop
KCode27:; KMaybeDumpString(KSCode27); j KCodeDone; nop
KCode28:; KMaybeDumpString(KSCode28); j KCodeDone; nop
KCode29:; KMaybeDumpString(KSCode29); j KCodeDone; nop
KCode30:; KMaybeDumpString(KSCode30); j KCodeDone; nop
KCode31:; KMaybeDumpString(KSCode31); j KCodeDone; nop
KCodes:
dw KCode0, KCode1, KCode2, KCode3
dw KCode4, KCode5, KCode6, KCode7
dw KCode8, KCode9, KCode10, KCode11
dw KCode12, KCode13, KCode14, KCode15
dw KCode16, KCode17, KCode18, KCode19
dw KCode20, KCode21, KCode22, KCode23
dw KCode24, KCode25, KCode26, KCode27
dw KCode28, KCode29, KCode30, KCode31
KS(KSNewline, 10)
KSL(KSConsoleConfirmed, "USB debug console detected")
KSL(KSHandling, " ~~ Handling Interrupt ~~")
KSL(KSStates, " Interrupt States:")
KS(KSCode, " Interrupt Type: ")
KSL(KSCode0, "Regular Interrupt")
KSL(KSCode1, "TLB Modification Exception")
KSL(KSCode2, "TLB Exception (Load/Fetch)")
KSL(KSCode3, "TLB Exception (Store)")
KSL(KSCode4, "Address Error Exception (Load/Fetch)")
KSL(KSCode5, "Address Error Exception (Store)")
KSL(KSCode6, "Bus Error Exception (Fetch)")
KSL(KSCode7, "Bus Error Exception (Load/Store)")
KSL(KSCode8, "SysCall Exception")
KSL(KSCode9, "Breakpoint Exception")
KSL(KSCode10, "Reserved Instruction Exception")
KSL(KSCode11, "Coprocessor Unusable Exception")
KSL(KSCode12, "Arithmetic Overflow Exception")
KSL(KSCode13, "Trap Exception")
KSL(KSCode14, "RESERVED 14")
KSL(KSCode15, "Floating Point Exception")
KSL(KSCode16, "RESERVED 16")
KSL(KSCode17, "RESERVED 17")
KSL(KSCode18, "RESERVED 18")
KSL(KSCode19, "RESERVED 19")
KSL(KSCode20, "RESERVED 20")
KSL(KSCode21, "RESERVED 21")
KSL(KSCode22, "RESERVED 22")
KSL(KSCode23, "Watch")
KSL(KSCode24, "RESERVED 24")
KSL(KSCode25, "RESERVED 25")
KSL(KSCode26, "RESERVED 26")
KSL(KSCode27, "RESERVED 27")
KSL(KSCode28, "RESERVED 28")
KSL(KSCode29, "RESERVED 29")
KSL(KSCode30, "RESERVED 30")
KSL(KSCode31, "RESERVED 31")
align(4)
nops((K_BASE << 16) + 0x10000)