Annotate exceptasm.s

This commit is contained in:
Ryan Dwyer committed 2023-05-20 16:43:48 +10:00
1 parent 21cda43806
commit b4355ab55f
2 files changed
+286 -256

No files matched your search

+1 -1
View File
@@ -492,7 +492,7 @@ glabel tlbHandleMiss
j .L00001268 j .L00001268
nop nop
.L0000162c: .L0000162c:
j L00003a88 j handle_fault
nop nop
glabel tlbUnmapRange glabel tlbUnmapRange
+285 -255
View File
@@ -1,9 +1,14 @@
#include "asm_helper.h" #include "asm_helper.h"
#include "macros.inc" #include "macros.inc"
#include "PR/os_exception.h"
#include "PR/os_message.h"
#include "PR/os_thread.h"
.set noat .set noat
.set noreorder .set noreorder
.set gp=64 .set gp=64
#define SIZEOF_OSEVENTSTATE 0x8
.data .data
glabel __osHwIntTable glabel __osHwIntTable
@@ -55,31 +60,29 @@ __osIntOffTable:
.byte CART .byte CART
__osIntTable: __osIntTable:
.word .L00003a3c .word .handle_intr_redispatch
.word .L000039c8 .word .handle_intr_sw1
.word .L000039a8 .word .handle_intr_sw2
.word .L0000380c .word .handle_intr_rcp
.word .L000037c8 .word .handle_intr_cart
.word .L0000394c .word .handle_intr_prenmi
.word .L00003790 .word .handle_intr_ip6
.word .L0000379c .word .handle_intr_ip7
.word .L000037a8 .word .handle_intr_counter
.text .text
glabel __osExceptionPreamble glabel __osExceptionPreamble
lui $k0, %hi(__osException) la $k0, __osException
addiu $k0, $k0, %lo(__osException)
jr $k0 jr $k0
nop nop
glabel __osException glabel __osException
lui $k0, %hi(__osThreadSave) la $k0, __osThreadSave
addiu $k0, $k0, %lo(__osThreadSave)
sd $at, 0x20($k0) sd $at, 0x20($k0)
mfc0 $k1, C0_SR mfc0 $k1, C0_SR
sw $k1, 0x118($k0) sw $k1, 0x118($k0)
li $at, -4 li $at, ~(SR_IE | SR_EXL)
and $k1, $k1, $at and $k1, $k1, $at
mtc0 $k1, C0_SR mtc0 $k1, C0_SR
sd $t0, 0x58($k0) sd $t0, 0x58($k0)
@@ -87,9 +90,11 @@ glabel __osException
sd $t2, 0x68($k0) sd $t2, 0x68($k0)
sw $zero, 0x18($k0) sw $zero, 0x18($k0)
mfc0 $t0, C0_CAUSE mfc0 $t0, C0_CAUSE
# Set t0 = &__osThreadSave
# Set k0 = __osRunningThread
move $t0, $k0 move $t0, $k0
lui $k0, %hi(__osRunningThread) lw $k0, __osRunningThread
lw $k0, %lo(__osRunningThread)($k0)
ld $t1, 0x20($t0) ld $t1, 0x20($t0)
sd $t1, 0x20($k0) sd $t1, 0x20($k0)
ld $t1, 0x118($t0) ld $t1, 0x118($t0)
@@ -104,7 +109,7 @@ glabel __osException
mflo $t0 mflo $t0
sd $t0, 0x108($k0) sd $t0, 0x108($k0)
mfhi $t0 mfhi $t0
andi $t1, $k1, 0xff00 andi $t1, $k1, SR_IMASK
sd $v0, 0x28($k0) sd $v0, 0x28($k0)
sd $v1, 0x30($k0) sd $v1, 0x30($k0)
sd $a0, 0x38($k0) sd $a0, 0x38($k0)
@@ -130,46 +135,49 @@ glabel __osException
sd $sp, 0xf0($k0) sd $sp, 0xf0($k0)
sd $s8, 0xf8($k0) sd $s8, 0xf8($k0)
sd $ra, 0x100($k0) sd $ra, 0x100($k0)
beqz $t1, .L00003628 beqz $t1, .after_interrupt_mask
sd $t0, 0x110($k0) sd $t0, 0x110($k0)
lui $t0, %hi(__osGlobalIntMask)
addiu $t0, $t0, %lo(__osGlobalIntMask) la $t0, __osGlobalIntMask
lw $t0, 0x0($t0) lw $t0, 0x0($t0)
li $at, -1 li $at, 0xffffffff
xor $t2, $t0, $at xor $t2, $t0, $at
lui $at, 0xffff lui $at, 0xffff
andi $t2, $t2, 0xff00 andi $t2, $t2, SR_IMASK
ori $at, $at, 0xff ori $at, $at, 0xff
or $t4, $t1, $t2 or $t4, $t1, $t2
and $t3, $k1, $at and $t3, $k1, $at
andi $t0, $t0, 0xff00 andi $t0, $t0, SR_IMASK
or $t3, $t3, $t4 or $t3, $t3, $t4
and $t1, $t1, $t0 and $t1, $t1, $t0
and $k1, $k1, $at and $k1, $k1, $at
sw $t3, 0x118($k0) sw $t3, 0x118($k0)
or $k1, $k1, $t1 or $k1, $k1, $t1
.L00003628:
lui $t1, 0xa430 .after_interrupt_mask:
lw $t1, 0xc($t1) lw $t1, PHYS_TO_K1(MI_INTR_MASK_REG)
beqzl $t1, .L00003664 beqzl $t1, .after_mi_interrupt_reg
sw $t1, 0x128($k0) sw $t1, 0x128($k0)
lui $t0, %hi(__osGlobalIntMask)
addiu $t0, $t0, %lo(__osGlobalIntMask) la $t0, __osGlobalIntMask
lw $t0, 0x0($t0) lw $t0, 0x0($t0)
lw $t4, 0x128($k0) lw $t4, 0x128($k0)
li $at, -1 li $at, 0xffffffff
srl $t0, $t0, 0x10 srl $t0, $t0, 0x10
xor $t0, $t0, $at xor $t0, $t0, $at
andi $t0, $t0, 0x3f andi $t0, $t0, 0x3f
and $t0, $t0, $t4 and $t0, $t0, $t4
or $t1, $t1, $t0 or $t1, $t1, $t0
sw $t1, 0x128($k0) sw $t1, 0x128($k0)
.L00003664:
.after_mi_interrupt_reg:
mfc0 $t0, C0_EPC mfc0 $t0, C0_EPC
sw $t0, 0x11c($k0) sw $t0, 0x11c($k0)
lw $t0, 0x18($k0) lw $t0, 0x18($k0)
beqz $t0, .L00003704 beqz $t0, .after_fp
nop nop
cfc1 $t0, $31 cfc1 $t0, $31
nop nop
sw $t0, 0x12c($k0) sw $t0, 0x12c($k0)
@@ -205,37 +213,48 @@ glabel __osException
sdc1 $f29, 0x218($k0) sdc1 $f29, 0x218($k0)
sdc1 $f30, 0x220($k0) sdc1 $f30, 0x220($k0)
sdc1 $f31, 0x228($k0) sdc1 $f31, 0x228($k0)
.L00003704:
.after_fp:
mfc0 $t0, C0_CAUSE mfc0 $t0, C0_CAUSE
sw $t0, 0x120($k0) sw $t0, 0x120($k0)
li $t1, 0x2
li $t1, OS_STATE_RUNNABLE
sh $t1, 0x10($k0) sh $t1, 0x10($k0)
andi $t1, $t0, 0x7c
li $t2, 0x8 andi $t1, $t0, CAUSE_EXCMASK
beq $t1, $t2, .L000039e8
li $t2, EXC_RMISS
beq $t1, $t2, .handle_rmiss
nop nop
li $t2, 0xc
beq $t1, $t2, .L000039f8 li $t2, EXC_WMISS
beq $t1, $t2, .handle_wmiss
nop nop
li $t2, 0x24
beql $t1, $t2, .L00003a04 li $t2, EXC_BREAK
li $t1, 0x1 beql $t1, $t2, .handle_break
li $t2, 0x2c li $t1, OS_FLAG_CPU_BREAK
beq $t1, $t2, .L00003b6c
li $t2, EXC_CPU
beq $t1, $t2, .handle_cpu
nop nop
li $t2, 0x0
bne $t1, $t2, L00003a88 li $t2, EXC_INT
bne $t1, $t2, handle_fault
nop nop
.handle_interrupt:
and $s0, $k1, $t0 and $s0, $k1, $t0
.L00003758:
andi $t1, $s0, 0xff00 .interrupt_loop_outer:
.L0000375c: andi $t1, $s0, CAUSE_IPMASK
.interrupt_loop_inner:
srl $t2, $t1, 0xc srl $t2, $t1, 0xc
bnez $t2, .L00003770 bnez $t2, .after_get_upper
nop nop
srl $t2, $t1, 0x8 srl $t2, $t1, 0x8
addi $t2, $t2, 0x10 addi $t2, $t2, 0x10
.L00003770: .after_get_upper:
lui $at, %hi(__osIntOffTable) lui $at, %hi(__osIntOffTable)
addu $at, $at, $t2 addu $at, $at, $t2
lbu $t2, %lo(__osIntOffTable)($at) lbu $t2, %lo(__osIntOffTable)($at)
@@ -244,247 +263,254 @@ glabel __osException
lw $t2, %lo(__osIntTable)($at) lw $t2, %lo(__osIntTable)($at)
jr $t2 jr $t2
nop nop
.L00003790:
li $at, -8193 .handle_intr_ip6:
b .L00003758 li $at, ~CAUSE_IP6
b .interrupt_loop_outer
and $s0, $s0, $at and $s0, $s0, $at
.L0000379c:
li $at, -16385 .handle_intr_ip7:
b .L00003758 li $at, ~CAUSE_IP7
b .interrupt_loop_outer
and $s0, $s0, $at and $s0, $s0, $at
.L000037a8:
.handle_intr_counter:
mfc0 $t1, C0_COMPARE mfc0 $t1, C0_COMPARE
mtc0 $t1, C0_COMPARE mtc0 $t1, C0_COMPARE
jal send_mesg jal send_mesg
li $a0, 0x18 li $a0, OS_EVENT_COUNTER * SIZEOF_OSEVENTSTATE
lui $at, 0xffff li $at, ~CAUSE_IP8
ori $at, $at, 0x7fff b .interrupt_loop_outer
b .L00003758
and $s0, $s0, $at and $s0, $s0, $at
.L000037c8:
lui $t1, %hi(__osHwIntTable) .handle_intr_cart:
addiu $t1, $t1, %lo(__osHwIntTable) la $t1, __osHwIntTable
lw $t2, 0x8($t1) lw $t2, 0x8($t1)
li $at, -2049 li $at, ~CAUSE_IP4
and $s0, $s0, $at and $s0, $s0, $at
beqz $t2, .L000037fc beqz $t2, .no_cart_override
addi $t1, $t1, 0x8 addi $t1, $t1, 0x8
jalr $t2 jalr $t2
lw $sp, 0x4($t1) lw $sp, 0x4($t1)
beqz $v0, .L000037fc beqz $v0, .no_cart_override
nop nop
b .L00003a3c b .dispatch_thread
nop nop
.L000037fc: .no_cart_override:
jal send_mesg jal send_mesg
li $a0, 0x10 li $a0, OS_EVENT_CART * SIZEOF_OSEVENTSTATE
b .L0000375c b .interrupt_loop_inner
andi $t1, $s0, 0xff00 andi $t1, $s0, CAUSE_IPMASK
.L0000380c:
lui $t0, %hi(__osGlobalIntMask) .handle_intr_rcp:
addiu $t0, $t0, %lo(__osGlobalIntMask) la $t0, __osGlobalIntMask
lw $t0, 0x0($t0) lw $t0, 0x0($t0)
lui $s1, 0xa430 lw $s1, PHYS_TO_K1(MI_INTR_REG)
lw $s1, 0x8($s1)
srl $t0, $t0, 0x10 srl $t0, $t0, 0x10
and $s1, $s1, $t0 and $s1, $s1, $t0
andi $t1, $s1, 0x1 andi $t1, $s1, 0x1
beqzl $t1, .L00003880 beqzl $t1, .after_sp_break
andi $t1, $s1, 0x8 andi $t1, $s1, 0x8
lui $t4, 0xa404 lw $t4, PHYS_TO_K1(SP_STATUS_REG)
lw $t4, 0x10($t4) li $t1, SP_CLR_INTR | SP_CLR_SIG3
dli $t1, 0x8008 lui $at, %hi(PHYS_TO_K1(SP_STATUS_REG))
lui $at, 0xa404 andi $t4, $t4, SP_STATUS_SIG1 | SP_STATUS_SIG2
andi $t4, $t4, 0x300
andi $s1, $s1, 0x3e andi $s1, $s1, 0x3e
beqz $t4, .L0000386c beqz $t4, .sp_break
sw $t1, 0x10($at) sw $t1, %lo(PHYS_TO_K1(SP_STATUS_REG))($at)
jal send_mesg jal send_mesg
li $a0, 0x20 li $a0, OS_EVENT_SP * SIZEOF_OSEVENTSTATE
beqzl $s1, .L00003944 beqzl $s1, .after_clear_all_interrupts
li $at, -1025 li $at, ~CAUSE_IP3
b .L00003880 b .after_sp_break
andi $t1, $s1, 0x8 andi $t1, $s1, 0x8
.L0000386c: .sp_break:
jal send_mesg jal send_mesg
li $a0, 0x58 li $a0, OS_EVENT_SP_BREAK * SIZEOF_OSEVENTSTATE
beqzl $s1, .L00003944 beqzl $s1, .after_clear_all_interrupts
li $at, -1025 li $at, ~CAUSE_IP3
andi $t1, $s1, 0x8 andi $t1, $s1, 0x8
.L00003880: .after_sp_break:
beqz $t1, .L000038a0 beqz $t1, .after_clear_vi_current
lui $at, 0xa440 lui $at, %hi(PHYS_TO_K1(VI_CURRENT_REG))
andi $s1, $s1, 0x37 andi $s1, $s1, 0x37
sw $zero, 0x10($at) sw $zero, %lo(PHYS_TO_K1(VI_CURRENT_REG))($at)
jal send_mesg jal send_mesg
li $a0, 0x38 li $a0, OS_EVENT_VI * SIZEOF_OSEVENTSTATE
beqzl $s1, .L00003944 beqzl $s1, .after_clear_all_interrupts
li $at, -1025 li $at, ~CAUSE_IP3
.L000038a0: .after_clear_vi_current:
andi $t1, $s1, 0x4 andi $t1, $s1, 0x4
beqzl $t1, .L000038d0 beqzl $t1, .after_clear_ai_interrupt
andi $t1, $s1, 0x2 andi $t1, $s1, 0x2
li $t1, 0x1 li $t1, 1
lui $at, 0xa450 lui $at, %hi(PHYS_TO_K1(AI_STATUS_REG))
andi $s1, $s1, 0x3b andi $s1, $s1, 0x3b
sw $t1, 0xc($at) sw $t1, %lo(PHYS_TO_K1(AI_STATUS_REG))($at)
jal send_mesg jal send_mesg
li $a0, 0x30 li $a0, OS_EVENT_AI * SIZEOF_OSEVENTSTATE
beqzl $s1, .L00003944 beqzl $s1, .after_clear_all_interrupts
li $at, -1025 li $at, ~CAUSE_IP3
andi $t1, $s1, 0x2 andi $t1, $s1, 0x2
.L000038d0: .after_clear_ai_interrupt:
beqz $t1, .L000038f0 beqz $t1, .after_clear_si_interrupt
lui $at, 0xa480 lui $at, %hi(PHYS_TO_K1(SI_STATUS_REG))
andi $s1, $s1, 0x3d andi $s1, $s1, 0x3d
sw $zero, 0x18($at) sw $zero, %lo(PHYS_TO_K1(SI_STATUS_REG))($at)
jal send_mesg jal send_mesg
li $a0, 0x28 li $a0, OS_EVENT_SI * SIZEOF_OSEVENTSTATE
beqzl $s1, .L00003944 beqzl $s1, .after_clear_all_interrupts
li $at, -1025 li $at, ~CAUSE_IP3
.L000038f0: .after_clear_si_interrupt:
andi $t1, $s1, 0x10 andi $t1, $s1, 0x10
beqzl $t1, .L00003920 beqzl $t1, .after_clear_pi_interrupt
andi $t1, $s1, 0x20 andi $t1, $s1, 0x20
li $t1, 0x2 li $t1, PI_STATUS_CLR_INTR
lui $at, 0xa460 lui $at, %hi(PHYS_TO_K1(PI_STATUS_REG))
andi $s1, $s1, 0x2f andi $s1, $s1, 0x2f
sw $t1, 0x10($at) sw $t1, %lo(PHYS_TO_K1(PI_STATUS_REG))($at)
jal send_mesg jal send_mesg
li $a0, 0x40 li $a0, OS_EVENT_PI * SIZEOF_OSEVENTSTATE
beqzl $s1, .L00003944 beqzl $s1, .after_clear_all_interrupts
li $at, -1025 li $at, ~CAUSE_IP3
andi $t1, $s1, 0x20 andi $t1, $s1, 0x20
.L00003920: .after_clear_pi_interrupt:
beqzl $t1, .L00003944 beqzl $t1, .after_clear_dp_interrupt
li $at, -1025 li $at, ~CAUSE_IP3
li $t1, 0x800 li $t1, MI_CLR_DP_INTR
lui $at, 0xa430 lui $at, %hi(PHYS_TO_K1(MI_MODE_REG))
andi $s1, $s1, 0x1f andi $s1, $s1, 0x1f
sw $t1, 0x0($at) sw $t1, %lo(PHYS_TO_K1(MI_MODE_REG))($at)
jal send_mesg jal send_mesg
li $a0, 0x48 li $a0, OS_EVENT_DP * SIZEOF_OSEVENTSTATE
li $at, -1025 li $at, ~CAUSE_IP3
.L00003944: .after_clear_dp_interrupt:
b .L00003758 .after_clear_all_interrupts:
b .interrupt_loop_outer
and $s0, $s0, $at and $s0, $s0, $at
.L0000394c:
.handle_intr_prenmi:
lw $k1, 0x118($k0) lw $k1, 0x118($k0)
li $at, -4097 li $at, ~CAUSE_IP5
lui $t1, %hi(_osShutdown) lui $t1, %hi(_osShutdown)
and $k1, $k1, $at and $k1, $k1, $at
sw $k1, 0x118($k0) sw $k1, 0x118($k0)
addiu $t1, $t1, %lo(_osShutdown) addiu $t1, $t1, %lo(_osShutdown)
lw $t2, 0x0($t1) lw $t2, 0x0($t1)
beqz $t2, .L00003978 beqz $t2, .not_shutting_down
li $at, -4097 li $at, ~CAUSE_IP5
b .L00003a3c b .dispatch_thread
and $s0, $s0, $at and $s0, $s0, $at
.L00003978: .not_shutting_down:
li $t2, 0x1 li $t2, 0x1
sw $t2, 0x0($t1) sw $t2, 0x0($t1)
jal send_mesg jal send_mesg
li $a0, 0x70 li $a0, OS_EVENT_PRENMI * SIZEOF_OSEVENTSTATE
lui $t2, %hi(__osRunQueue) lui $t2, %hi(__osRunQueue)
lw $t2, %lo(__osRunQueue)($t2) lw $t2, %lo(__osRunQueue)($t2)
li $at, -4097 li $at, ~CAUSE_IP5
and $s0, $s0, $at and $s0, $s0, $at
lw $k1, 0x118($t2) lw $k1, 0x118($t2)
and $k1, $k1, $at and $k1, $k1, $at
b .L00003a3c b .dispatch_thread
sw $k1, 0x118($t2) sw $k1, 0x118($t2)
.L000039a8:
li $at, -513 .handle_intr_sw2:
li $at, ~CAUSE_SW2
and $t0, $t0, $at and $t0, $t0, $at
mtc0 $t0, C0_CAUSE mtc0 $t0, C0_CAUSE
jal send_mesg jal send_mesg
li $a0, 0x8 li $a0, OS_EVENT_SW2 * SIZEOF_OSEVENTSTATE
li $at, -513 li $at, ~CAUSE_SW2
b .L00003758 b .interrupt_loop_outer
and $s0, $s0, $at and $s0, $s0, $at
.L000039c8:
li $at, -257 .handle_intr_sw1:
li $at, ~CAUSE_SW1
and $t0, $t0, $at and $t0, $t0, $at
mtc0 $t0, C0_CAUSE mtc0 $t0, C0_CAUSE
jal send_mesg jal send_mesg
li $a0, 0x0 li $a0, OS_EVENT_SW1 * SIZEOF_OSEVENTSTATE
li $at, -257 li $at, ~CAUSE_SW1
b .L00003758 b .interrupt_loop_outer
and $s0, $s0, $at and $s0, $s0, $at
.L000039e8:
.handle_rmiss:
jal tlbHandleMiss jal tlbHandleMiss
nop nop
b .L00003a3c b .dispatch_thread
nop nop
.L000039f8:
j L00003a88 .handle_wmiss:
j handle_fault
nop nop
li $t1, 0x1
.L00003a04: li $t1, OS_FLAG_CPU_BREAK
.handle_break:
sh $t1, 0x12($k0) sh $t1, 0x12($k0)
lw $t1, 0x11c($k0) lw $t1, 0x11c($k0)
li $at, 0x6 li $at, 0x6
lw $t1, 0x0($t1) lw $t1, 0x0($t1)
srl $t1, $t1, 0x10 srl $t1, $t1, 0x10
andi $t1, $t1, 0xff andi $t1, $t1, 0xff
beq $t1, $at, L00003a88 beq $t1, $at, handle_fault
li $at, 0x7 li $at, 0x7
beq $t1, $at, L00003a88 beq $t1, $at, handle_fault
nop nop
jal send_mesg jal send_mesg
li $a0, 0x50 li $a0, OS_EVENT_CPU_BREAK * SIZEOF_OSEVENTSTATE
b .L00003a3c b .dispatch_thread
nop nop
.L00003a3c:
lui $t2, %hi(__osRunQueue) .handle_intr_redispatch:
lw $t2, %lo(__osRunQueue)($t2) .dispatch_thread:
lw $t1, 0x4($k0) lw $t2, __osRunQueue
lw $t3, 0x4($t2) lw $t1, 0x4($k0) # t1 = __osRunningThread->priority
lw $t3, 0x4($t2) # t3 = __osRunQueue->priority
slt $at, $t1, $t3 slt $at, $t1, $t3
beqz $at, .L00003a70 beqz $at, .prepend_to_runqueue
nop nop
# The run queue has the higher priority thread -> queue the running thread
lui $a0, %hi(__osRunQueue) lui $a0, %hi(__osRunQueue)
move $a1, $k0 move $a1, $k0
jal __osEnqueueThread jal __osEnqueueThread
addiu $a0, $a0, %lo(__osRunQueue) addiu $a0, $a0, %lo(__osRunQueue)
j .L00003d10 j __osDispatchThread
nop nop
.L00003a70: .prepend_to_runqueue:
lui $t1, %hi(__osRunQueue) la $t1, __osRunQueue
addiu $t1, $t1, %lo(__osRunQueue)
lw $t2, 0x0($t1) lw $t2, 0x0($t1)
sw $t2, 0x0($k0) sw $t2, 0x0($k0)
j .L00003d10 j __osDispatchThread
sw $k0, 0x0($t1) sw $k0, 0x0($t1)
glabel L00003a88 glabel handle_fault
lui $at, %hi(__osFaultedThread) lui $at, %hi(__osFaultedThread)
sw $k0, %lo(__osFaultedThread)($at) sw $k0, %lo(__osFaultedThread)($at)
li $t1, 0x1 li $t1, OS_STATE_STOPPED
sh $t1, 0x10($k0) sh $t1, 0x10($k0)
li $t1, 0x2 li $t1, OS_FLAG_FAULT
sh $t1, 0x12($k0) sh $t1, 0x12($k0)
mfc0 $t2, C0_BADVADDR mfc0 $t2, C0_BADVADDR
sw $t2, 0x124($k0) sw $t2, 0x124($k0)
jal send_mesg jal send_mesg
li $a0, 0x60 li $a0, OS_EVENT_FAULT * SIZEOF_OSEVENTSTATE
j .L00003d10 j __osDispatchThread
nop nop
glabel send_mesg glabel send_mesg
lui $t2, %hi(__osEventStateTab) la $t2, __osEventStateTab
addiu $t2, $t2, %lo(__osEventStateTab) addu $t2, $t2, $a0 # t2 = __OSEventState
addu $t2, $t2, $a0 lw $t1, 0x0($t2) # t1 = message queue
lw $t1, 0x0($t2)
move $s2, $ra move $s2, $ra
beqz $t1, .L00003b64 beqz $t1, .send_mesg_return # No message queue
nop nop
lw $t3, 0x8($t1) lw $t3, 0x8($t1) # t3 = queue->validCount
lw $t4, 0x10($t1) lw $t4, 0x10($t1) # t4 = queue->msgCount
slt $at, $t3, $t4 slt $at, $t3, $t4
beqz $at, .L00003b64 beqz $at, .send_mesg_return # Queue is full
nop nop
lw $t5, 0xc($t1) lw $t5, 0xc($t1) # t5 = queue->first
addu $t5, $t5, $t3 addu $t5, $t5, $t3
div $zero, $t5, $t4 div $zero, $t5, $t4
bnez $t4, .L00003b00 bnez $t4, .L00003b00
@@ -493,22 +519,22 @@ glabel send_mesg
.L00003b00: .L00003b00:
li $at, -1 li $at, -1
bne $t4, $at, .L00003b18 bne $t4, $at, .L00003b18
lui $at, 0x8000 li $at, 0x80000000
bne $t5, $at, .L00003b18 bne $t5, $at, .L00003b18
nop nop
break 0x6 break 0x6
.L00003b18: .L00003b18:
lw $t4, 0x14($t1) lw $t4, 0x14($t1) # t4 = queue->msg
mfhi $t5 mfhi $t5
sll $t5, $t5, 0x2 sll $t5, $t5, 0x2
addu $t4, $t4, $t5 addu $t4, $t4, $t5
lw $t5, 0x4($t2) lw $t5, 0x4($t2) # t5 = eventstate->message
addiu $t2, $t3, 0x1 addiu $t2, $t3, 0x1
sw $t5, 0x0($t4) sw $t5, 0x0($t4)
sw $t2, 0x8($t1) sw $t2, 0x8($t1)
lw $t2, 0x0($t1) lw $t2, 0x0($t1)
lw $t3, 0x0($t2) lw $t3, 0x0($t2)
beqz $t3, .L00003b64 beqz $t3, .send_mesg_return
nop nop
jal __osPopThread jal __osPopThread
move $a0, $t1 move $a0, $t1
@@ -517,30 +543,30 @@ glabel send_mesg
move $a1, $t2 move $a1, $t2
jal __osEnqueueThread jal __osEnqueueThread
addiu $a0, $a0, %lo(__osRunQueue) addiu $a0, $a0, %lo(__osRunQueue)
.L00003b64: .send_mesg_return:
jr $s2 jr $s2
nop nop
.L00003b6c:
lui $at, 0x3000 .handle_cpu:
li $at, CAUSE_CEMASK
and $t1, $t0, $at and $t1, $t0, $at
srl $t1, $t1, 0x1c srl $t1, $t1, CAUSE_CESHIFT
li $t2, 0x1 li $t2, 1
bne $t1, $t2, L00003a88 bne $t1, $t2, handle_fault
nop nop
lw $k1, 0x118($k0) lw $k1, 0x118($k0)
lui $at, 0x2000 li $at, SR_CU1
li $t1, 0x1 li $t1, 1
or $k1, $k1, $at or $k1, $k1, $at
sw $t1, 0x18($k0) sw $t1, 0x18($k0) # Set __osRunningThread->fp = 1
b .L00003a70 b .prepend_to_runqueue
sw $k1, 0x118($k0) sw $k1, 0x118($k0) # Set __osRunningThread->sr
glabel __osEnqueueAndYield glabel __osEnqueueAndYield
lui $a1, %hi(__osRunningThread) lw $a1, __osRunningThread
lw $a1, %lo(__osRunningThread)($a1)
mfc0 $t0, C0_SR mfc0 $t0, C0_SR
lw $k1, 0x18($a1) lw $k1, 0x18($a1)
ori $t0, $t0, 0x2 ori $t0, $t0, SR_EXL
sw $t0, 0x118($a1) sw $t0, 0x118($a1)
sd $s0, 0x98($a1) sd $s0, 0x98($a1)
sd $s1, 0xa0($a1) sd $s1, 0xa0($a1)
@@ -554,7 +580,7 @@ glabel __osEnqueueAndYield
sd $sp, 0xf0($a1) sd $sp, 0xf0($a1)
sd $s8, 0xf8($a1) sd $s8, 0xf8($a1)
sd $ra, 0x100($a1) sd $ra, 0x100($a1)
beqz $k1, .L00003c28 beqz $k1, .after_store_fp
sw $ra, 0x11c($a1) sw $ra, 0x11c($a1)
cfc1 $k1, $31 cfc1 $k1, $31
sdc1 $f20, 0x1d0($a1) sdc1 $f20, 0x1d0($a1)
@@ -570,15 +596,14 @@ glabel __osEnqueueAndYield
sdc1 $f30, 0x220($a1) sdc1 $f30, 0x220($a1)
sdc1 $f31, 0x228($a1) sdc1 $f31, 0x228($a1)
sw $k1, 0x12c($a1) sw $k1, 0x12c($a1)
.L00003c28: .after_store_fp:
lw $k1, 0x118($a1) lw $k1, 0x118($a1)
andi $t1, $k1, 0xff00 andi $t1, $k1, SR_IMASK
beqzl $t1, .L00003c6c beqzl $t1, .after_store_imask
lui $k1, 0xa430 la $k1, PHYS_TO_K1(MI_MODE_REG)
lui $t0, %hi(__osGlobalIntMask) la $t0, __osGlobalIntMask
addiu $t0, $t0, %lo(__osGlobalIntMask)
lw $t0, 0x0($t0) lw $t0, 0x0($t0)
li $at, -1 li $at, 0xffffffff
xor $t0, $t0, $at xor $t0, $t0, $at
lui $at, 0xffff lui $at, 0xffff
andi $t0, $t0, 0xff00 andi $t0, $t0, 0xff00
@@ -587,66 +612,73 @@ glabel __osEnqueueAndYield
and $k1, $k1, $at and $k1, $k1, $at
or $k1, $k1, $t1 or $k1, $k1, $t1
sw $k1, 0x118($a1) sw $k1, 0x118($a1)
lui $k1, 0xa430 lui $k1, %hi(PHYS_TO_K1(MI_INTR_MASK_REG))
.L00003c6c: .after_store_imask:
lw $k1, 0xc($k1) lw $k1, %lo(PHYS_TO_K1(MI_INTR_MASK_REG))($k1)
beqz $k1, .L00003ca0 beqz $k1, .after_load_imask
nop nop
lui $k0, %hi(__osGlobalIntMask) la $k0, __osGlobalIntMask
addiu $k0, $k0, %lo(__osGlobalIntMask)
lw $k0, 0x0($k0) lw $k0, 0x0($k0)
lw $t0, 0x128($a1) lw $t0, 0x128($a1)
li $at, -1 li $at, 0xffffffff
srl $k0, $k0, 0x10 srl $k0, $k0, 0x10
xor $k0, $k0, $at xor $k0, $k0, $at
andi $k0, $k0, 0x3f andi $k0, $k0, 0x3f
and $k0, $k0, $t0 and $k0, $k0, $t0
or $k1, $k1, $k0 or $k1, $k1, $k0
.L00003ca0: .after_load_imask:
beqz $a0, .L00003cb0 beqz $a0, .after_enqueue
sw $k1, 0x128($a1) sw $k1, 0x128($a1)
jal __osEnqueueThread jal __osEnqueueThread
nop nop
.L00003cb0: .after_enqueue:
j .L00003d10 j __osDispatchThread
nop nop
/**
* a0 = OSThread **queue
* a1 = OSThread *thread
*/
glabel __osEnqueueThread glabel __osEnqueueThread
lw $t8, 0x0($a0) lw $t8, 0x0($a0) # t8 = queue->next
lw $t7, 0x4($a1) lw $t7, 0x4($a1) # t7 = thread->priority
move $t9, $a0 move $t9, $a0 # iter = queue
lw $t6, 0x4($t8) lw $t6, 0x4($t8) # t6 = queue->next->priority
slt $at, $t6, $t7 slt $at, $t6, $t7
bnezl $at, .L00003cf0 bnezl $at, .enqueue_here
lw $t8, 0x0($t9) lw $t8, 0x0($t9)
move $t9, $t8 move $t9, $t8
.L00003cd8: .enqueue_loop:
lw $t8, 0x0($t8) lw $t8, 0x0($t8)
lw $t6, 0x4($t8) lw $t6, 0x4($t8)
slt $at, $t6, $t7 slt $at, $t6, $t7
beqzl $at, .L00003cd8 beqzl $at, .enqueue_loop
move $t9, $t8 move $t9, $t8
lw $t8, 0x0($t9)
.L00003cf0:
sw $t8, 0x0($a1)
sw $a1, 0x0($t9)
jr $ra
sw $a0, 0x8($a1)
lw $t8, 0x0($t9)
.enqueue_here:
sw $t8, 0x0($a1) # thread->next = t8
sw $a1, 0x0($t9) # iter->next = thread
jr $ra
sw $a0, 0x8($a1) # thread->queue = queue
/**
* a0 = OSThread **queue
*/
glabel __osPopThread glabel __osPopThread
lw $v0, 0x0($a0) lw $v0, 0x0($a0) # v0 = *queue
lw $t9, 0x0($v0) lw $t9, 0x0($v0) # t9 = v0->next
jr $ra jr $ra
sw $t9, 0x0($a0) sw $t9, 0x0($a0) # *queue = t9
glabel __osDispatchThread glabel __osDispatchThread
.L00003d10:
lui $a0, %hi(__osRunQueue) lui $a0, %hi(__osRunQueue)
jal __osPopThread jal __osPopThread
addiu $a0, $a0, %lo(__osRunQueue) addiu $a0, $a0, %lo(__osRunQueue)
lui $at, %hi(__osRunningThread) lui $at, %hi(__osRunningThread)
sw $v0, %lo(__osRunningThread)($at) sw $v0, %lo(__osRunningThread)($at)
li $t0, 0x4 li $t0, OS_STATE_RUNNING
sh $t0, 0x10($v0) sh $t0, 0x10($v0)
move $k0, $v0 move $k0, $v0
lui $t0, %hi(__osGlobalIntMask) lui $t0, %hi(__osGlobalIntMask)
@@ -654,9 +686,9 @@ glabel __osDispatchThread
addiu $t0, $t0, %lo(__osGlobalIntMask) addiu $t0, $t0, %lo(__osGlobalIntMask)
lw $t0, 0x0($t0) lw $t0, 0x0($t0)
lui $at, 0xffff lui $at, 0xffff
andi $t1, $k1, 0xff00 andi $t1, $k1, SR_IMASK
ori $at, $at, 0xff ori $at, $at, 0xff
andi $t0, $t0, 0xff00 andi $t0, $t0, SR_IMASK
and $t1, $t1, $t0 and $t1, $t1, $t0
and $k1, $k1, $at and $k1, $k1, $at
or $k1, $k1, $t1 or $k1, $k1, $t1
@@ -697,7 +729,7 @@ glabel __osDispatchThread
lw $k1, 0x11c($k0) lw $k1, 0x11c($k0)
mtc0 $k1, C0_EPC mtc0 $k1, C0_EPC
lw $k1, 0x18($k0) lw $k1, 0x18($k0)
beqz $k1, .L00003e80 beqz $k1, .after_restore_fp
nop nop
lw $k1, 0x12c($k0) lw $k1, 0x12c($k0)
ctc1 $k1, $31 ctc1 $k1, $31
@@ -733,20 +765,18 @@ glabel __osDispatchThread
ldc1 $f29, 0x218($k0) ldc1 $f29, 0x218($k0)
ldc1 $f30, 0x220($k0) ldc1 $f30, 0x220($k0)
ldc1 $f31, 0x228($k0) ldc1 $f31, 0x228($k0)
.L00003e80: .after_restore_fp:
lw $k1, 0x128($k0) lw $k1, 0x128($k0)
lui $k0, %hi(__osGlobalIntMask) la $k0, __osGlobalIntMask
addiu $k0, $k0, %lo(__osGlobalIntMask)
lw $k0, 0x0($k0) lw $k0, 0x0($k0)
srl $k0, $k0, 0x10 srl $k0, $k0, 0x10
and $k1, $k1, $k0 and $k1, $k1, $k0
sll $k1, $k1, 0x1 sll $k1, $k1, 0x1
lui $k0, %hi(var70059e30) la $k0, var70059e30
addiu $k0, $k0, %lo(var70059e30)
addu $k1, $k1, $k0 addu $k1, $k1, $k0
lhu $k1, 0x0($k1) lhu $k1, 0x0($k1)
lui $k0, 0xa430 lui $k0, %hi(PHYS_TO_K1(MI_INTR_MASK_REG))
addiu $k0, $k0, 0xc addiu $k0, $k0, %lo(PHYS_TO_K1(MI_INTR_MASK_REG))
sw $k1, 0x0($k0) sw $k1, 0x0($k0)
nop nop
nop nop
@@ -755,5 +785,5 @@ glabel __osDispatchThread
eret eret
glabel __osCleanupThread glabel __osCleanupThread
jal osDestroyThread jal osDestroyThread
move $a0, $zero move $a0, $zero