Annotate exceptasm.s

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

View File

@ -492,7 +492,7 @@ glabel tlbHandleMiss
j .L00001268
nop
.L0000162c:
j L00003a88
j handle_fault
nop
glabel tlbUnmapRange

View File

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