handle basic exceptions in kernel
This commit is contained in:
parent
7ceff73194
commit
49780dbed7
1 changed files with 35 additions and 22 deletions
57
kernel.asm
57
kernel.asm
|
@ -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")
|
||||||
|
|
Loading…
Add table
Reference in a new issue