handle basic exceptions in kernel

This commit is contained in:
Connor Olding 2018-08-21 04:37:48 +02:00
parent 7ceff73194
commit 49780dbed7

View File

@ -17,8 +17,8 @@ Start:
sd t4, 8(t0) sd t4, 8(t0)
cache 0x19, 0(t0) // tell data cache to write itself out cache 0x19, 0(t0) // tell data cache to write itself out
cache 0x10, 0(t0) // tell instruction cache it needs to reload cache 0x10, 0(t0) // tell instruction cache it needs to reload
// an instruction cache line is 2 rows, and a data cache line is 1 row, so // an instruction cache line is 2 rows, and a data cache line is 1 row,
// i'm hoping just poking at the start of each row is enough to flush them. // so poking at the start of each row is enough to flush them both.
bne t1, t2,- bne t1, t2,-
addiu t0, t0, 0x10 addiu t0, t0, 0x10
@ -35,9 +35,7 @@ Start:
// enable even more interrupts. // enable even more interrupts.
lui t2, MI_BASE lui t2, MI_BASE
ori t2, t2, MI_INTR_MASK ori t2, t2, MI_INTR_MASK
// lli t0, MI_INTR_MASK_ALL lli t0, MI_INTR_MASK_ALL
// i don't have code to handle all the interrupts. in the meantime...
lli t0, MI_INTR_MASK_SP
sw t0, 0(t2) sw t0, 0(t2)
// set BSD DOM1 stuff, whatever that is. // set BSD DOM1 stuff, whatever that is.
@ -334,7 +332,7 @@ if K_DEBUG {
KMaybeDumpString(KSNewline) KMaybeDumpString(KSNewline)
KMaybeDumpString(KSStates) KMaybeDumpString(KSStates)
ori a0, k0, K_DUMP + 0x80 * 4 ori a0, k0, K_REASON
lli a1, 0x80 lli a1, 0x80
ori a2, k0, K_XXD ori a2, k0, K_XXD
jal DumpAndWrite jal DumpAndWrite
@ -424,17 +422,13 @@ ReturnFromInterrupt:
eret eret
// no branch delay for eret // no branch delay for eret
include "debug.asm"
KCode0: KCode0:
KMaybeDumpString(KSCode0) KMaybeDumpString(KSCode0)
lui a0, MI_BASE
lw t0, MI_INTR(a0)
lw t1, MI_INTR_MASK(a0)
and s0, t0, t1 // if we don't care about an interrupt, get rid of it
KMILoop: KMILoop:
lui a0, MI_BASE
lw s0, MI_INTR(a0)
beqz s0,+ beqz s0,+
andi t3, s0, MI_INTR_SP // delay slot andi t3, s0, MI_INTR_SP // delay slot
@ -457,9 +451,6 @@ KMILoop:
nop nop
+ +
// can't do this apparently:
// lui a0, MI_BASE
// sw s0, MI_INTR(a0)
j KCodeDone j KCodeDone
nop nop
@ -467,40 +458,60 @@ KMILoop:
KMISP: KMISP:
KMaybeDumpString(KSMISP) KMaybeDumpString(KSMISP)
lli t0, CLR_SG3 | CLR_INT // delay slot
lui a1, SP_BASE lui a1, SP_BASE
lw t1, SP_STATUS(a1)
andi t2, t1, RSP_BRK
beqz t2,+
li t0, CLR_SG3 | CLR_INT // delay slot
sw t0, SP_STATUS(a1) sw t0, SP_STATUS(a1)
+
// then check andi t1, SG1 | SG2 ?
j KMILoop j KMILoop
andi s0, ~MI_INTR_SP andi s0, ~MI_INTR_SP
KMISI: KMISI:
KMaybeDumpString(KSMISI) KMaybeDumpString(KSMISI)
lui a1, SI_BASE
sw r0, SI_STATUS(a1)
j KMILoop j KMILoop
andi s0, ~MI_INTR_SI andi s0, ~MI_INTR_SI
KMIAI: KMIAI:
KMaybeDumpString(KSMIAI) KMaybeDumpString(KSMIAI)
lli t0, 0x01
lui a1, AI_BASE
sw t0, AI_STATUS(a1)
j KMILoop j KMILoop
andi s0, ~MI_INTR_AI andi s0, ~MI_INTR_AI
KMIVI: KMIVI:
KMaybeDumpString(KSMIVI) KMaybeDumpString(KSMIVI)
lui a1, VI_BASE
sw r0, VI_V_CURRENT_LINE(a1)
j KMILoop j KMILoop
andi s0, ~MI_INTR_VI andi s0, ~MI_INTR_VI
KMIPI: KMIPI:
KMaybeDumpString(KSMIPI) KMaybeDumpString(KSMIPI)
lli t0, 0x02
lui a1, PI_BASE
sw t0, PI_STATUS(a1)
j KMILoop j KMILoop
andi s0, ~MI_INTR_PI andi s0, ~MI_INTR_PI
KMIDP: KMIDP:
KMaybeDumpString(KSMIDP) KMaybeDumpString(KSMIDP)
lli t0, 0x800
lui a1, MI_BASE
sw t0, MI_INIT_MODE(a1)
j KMILoop j KMILoop
andi s0, ~MI_INTR_DP andi s0, ~MI_INTR_DP
@ -546,6 +557,8 @@ dw KCode20, KCode21, KCode22, KCode23
dw KCode24, KCode25, KCode26, KCode27 dw KCode24, KCode25, KCode26, KCode27
dw KCode28, KCode29, KCode30, KCode31 dw KCode28, KCode29, KCode30, KCode31
include "debug.asm"
if K_DEBUG { if K_DEBUG {
KS(KSNewline, 10) KS(KSNewline, 10)
KSL(KSConsoleConfirmed, "USB debug console detected") KSL(KSConsoleConfirmed, "USB debug console detected")