sm64/lib/asm/__osExceptionPreamble.s

1184 lines
25 KiB
ArmAsm
Raw Normal View History

2021-07-12 23:17:54 -04:00
.set noat // allow manual use of $at
.set noreorder // don't insert nops after branches
2019-08-25 00:46:40 -04:00
2021-07-12 23:17:54 -04:00
#include "macros.inc"
2019-08-25 00:46:40 -04:00
2023-08-17 08:56:02 -04:00
#include <PR/R4300.h>
#include <PR/rcp.h>
#include <PR/ique.h>
#if defined(VERSION_EU) || defined(VERSION_SH)
#define VERSION_EU_SH
#endif
#if defined(VERSION_EU) || defined(VERSION_SH) || defined(VERSION_CN)
#define VERSION_EU_SH_CN
#endif
2019-08-25 00:46:40 -04:00
.section .text, "ax"
2021-07-12 23:17:54 -04:00
#ifdef AVOID_UB
2023-08-17 08:56:02 -04:00
.set __osThreadTail, __osThreadTail_fix
2021-07-12 23:17:54 -04:00
#endif
2020-04-03 14:57:26 -04:00
2019-08-25 00:46:40 -04:00
glabel __osExceptionPreamble
2023-08-17 08:56:02 -04:00
la $k0, __osException
2019-08-25 00:46:40 -04:00
jr $k0
nop
glabel __osException
2023-08-17 08:56:02 -04:00
la $k0, __osThreadSave
2019-08-25 00:46:40 -04:00
sd $at, 0x20($k0)
mfc0 $k1, $12
sw $k1, 0x118($k0)
li $at, -4
and $k1, $k1, $at
mtc0 $k1, $12
sd $t0, 0x58($k0)
sd $t1, 0x60($k0)
sd $t2, 0x68($k0)
sw $zero, 0x18($k0)
mfc0 $t0, $13
2023-08-17 08:56:02 -04:00
#ifndef VERSION_EU_SH_CN
2019-08-25 00:46:40 -04:00
andi $t1, $t0, 0x7c
li $t2, 0
bne $t1, $t2, .L80326750
nop
and $t1, $k1, $t0
andi $t2, $t1, 0x4000
beqz $t2, .L80326734
nop
li $t1, 1
2020-06-02 12:44:34 -04:00
lui $at, %hi(D_80334934)
2019-08-25 00:46:40 -04:00
b .L80326794
sw $t1, %lo(D_80334934)($at)
.L80326734:
andi $t2, $t1, 0x2000
beqz $t2, .L80326750
nop
li $t1, 1
2020-06-02 12:44:34 -04:00
lui $at, %hi(D_80334938)
2019-08-25 00:46:40 -04:00
b .L80326794
sw $t1, %lo(D_80334938)($at)
.L80326750:
2020-06-02 12:44:34 -04:00
lui $at, %hi(D_80334934)
2019-08-25 00:46:40 -04:00
sw $zero, %lo(D_80334934)($at)
2020-06-02 12:44:34 -04:00
lui $at, %hi(D_80334938)
2021-07-12 23:17:54 -04:00
#endif
2019-08-25 00:46:40 -04:00
move $t0, $k0
2023-08-17 08:56:02 -04:00
#ifndef VERSION_EU_SH_CN
2019-08-25 00:46:40 -04:00
sw $zero, %lo(D_80334938)($at)
2021-07-12 23:17:54 -04:00
#endif
2023-08-17 08:56:02 -04:00
lui $k0, %hi(__osThreadTail + 0x10)
lw $k0, %lo(__osThreadTail + 0x10)($k0)
2019-08-25 00:46:40 -04:00
ld $t1, 0x20($t0)
sd $t1, 0x20($k0)
ld $t1, 0x118($t0)
sd $t1, 0x118($k0)
ld $t1, 0x58($t0)
sd $t1, 0x58($k0)
ld $t1, 0x60($t0)
sd $t1, 0x60($k0)
ld $t1, 0x68($t0)
sd $t1, 0x68($k0)
2023-08-17 08:56:02 -04:00
#ifdef VERSION_EU_SH
2020-06-02 12:44:34 -04:00
lw $k1, 0x118($k0)
2021-07-12 23:17:54 -04:00
#else
2019-08-25 00:46:40 -04:00
.L80326794:
2021-07-12 23:17:54 -04:00
#endif
2023-08-17 08:56:02 -04:00
#ifndef VERSION_CN
2019-08-25 00:46:40 -04:00
mflo $t0
sd $t0, 0x108($k0)
mfhi $t0
2023-08-17 08:56:02 -04:00
#endif
#ifdef VERSION_EU_SH
2020-06-02 12:44:34 -04:00
andi $t1, $k1, 0xff00
2021-07-12 23:17:54 -04:00
#endif
2019-08-25 00:46:40 -04:00
sd $v0, 0x28($k0)
sd $v1, 0x30($k0)
sd $a0, 0x38($k0)
sd $a1, 0x40($k0)
sd $a2, 0x48($k0)
sd $a3, 0x50($k0)
sd $t3, 0x70($k0)
sd $t4, 0x78($k0)
sd $t5, 0x80($k0)
sd $t6, 0x88($k0)
sd $t7, 0x90($k0)
sd $s0, 0x98($k0)
sd $s1, 0xa0($k0)
sd $s2, 0xa8($k0)
sd $s3, 0xb0($k0)
sd $s4, 0xb8($k0)
sd $s5, 0xc0($k0)
sd $s6, 0xc8($k0)
sd $s7, 0xd0($k0)
sd $t8, 0xd8($k0)
sd $t9, 0xe0($k0)
sd $gp, 0xe8($k0)
sd $sp, 0xf0($k0)
sd $fp, 0xf8($k0)
sd $ra, 0x100($k0)
2023-08-17 08:56:02 -04:00
#ifdef VERSION_EU_SH_CN
#ifdef VERSION_CN
mflo $t0
sd $t0, 0x108($k0)
mfhi $t0
sd $t0, 0x110($k0)
lw $k1, 0x118($k0)
andi $t1, $k1, SR_IMASK
beqz $t1, savercp
nop
la $t0, __OSGlobalIntMask
lw $t0, ($t0)
lui $at, (0xFFFFFFFF >> 16)
ori $at, (0xFFFFFFFF & 0xFFFF)
xor $t2, $t0, $at
andi $t2, $t2, SR_IMASK
or $t4, $t1, $t2
lui $at, (~SR_IMASK >> 16) & 0xFFFF
ori $at, (~SR_IMASK & 0xFFFF)
and $t3, $k1, $at
or $t3, $t3, $t4
sw $t3, 0x118($k0)
andi $t0, $t0, SR_IMASK
and $t1, $t1, $t0
lui $at, (~SR_IMASK >> 16) & 0xFFFF
ori $at, (~SR_IMASK & 0xFFFF)
and $k1, $k1, $at
or $k1, $k1, $t1
#else
beqz $t1, savercp
2020-06-02 12:44:34 -04:00
sd $t0, 0x110($k0)
2023-08-17 08:56:02 -04:00
la $t0, __OSGlobalIntMask
2020-02-03 00:51:26 -05:00
lw $t0, ($t0)
li $at, -1
2021-07-12 23:17:54 -04:00
#ifdef VERSION_EU
2020-02-03 00:51:26 -05:00
xor $t0, $t0, $at
2021-07-12 23:17:54 -04:00
#else
2020-12-03 14:26:38 -05:00
xor $t2, $t0, $at
2021-07-12 23:17:54 -04:00
#endif
2023-08-17 08:56:02 -04:00
lui $at, (~SR_IMASK >> 16) & 0xFFFF
2021-07-12 23:17:54 -04:00
#ifdef VERSION_EU
2023-08-17 08:56:02 -04:00
andi $t0, $t0, SR_IMASK
2021-07-12 23:17:54 -04:00
#else
2023-08-17 08:56:02 -04:00
andi $t2, $t2, SR_IMASK
2021-07-12 23:17:54 -04:00
#endif
2023-08-17 08:56:02 -04:00
ori $at, (~SR_IMASK & 0xFFFF)
2021-07-12 23:17:54 -04:00
#ifdef VERSION_EU
2020-02-03 00:51:26 -05:00
or $t1, $t1, $t0
and $k1, $k1, $at
or $k1, $k1, $t1
sw $k1, 0x118($k0)
2021-07-12 23:17:54 -04:00
#else
2020-12-03 14:26:38 -05:00
or $t4, $t1, $t2
and $t3, $k1, $at
2023-08-17 08:56:02 -04:00
andi $t0, $t0, SR_IMASK
2020-12-03 14:26:38 -05:00
or $t3, $t3, $t4
and $t1, $t1, $t0
and $k1, $k1, $at
sw $t3, 0x118($k0)
or $k1, $k1, $t1
2021-07-12 23:17:54 -04:00
#endif
2023-08-17 08:56:02 -04:00
#endif
2020-12-03 14:26:38 -05:00
2023-08-17 08:56:02 -04:00
savercp:
lui $t1, %hi(PHYS_TO_K1(MI_INTR_MASK_REG))
lw $t1, %lo(PHYS_TO_K1(MI_INTR_MASK_REG))($t1)
beqz $t1, endrcp
2020-06-02 12:44:34 -04:00
nop
2023-08-17 08:56:02 -04:00
la $t0, __OSGlobalIntMask
2020-02-03 00:51:26 -05:00
lw $t0, ($t0)
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
srl $t0, $t0, 0x10
li $at, 0xFFFFFFFF
#else
2020-02-03 00:51:26 -05:00
lw $t4, 0x128($k0)
2023-08-17 08:56:02 -04:00
li $at, 0xFFFFFFFF
2020-02-03 00:51:26 -05:00
srl $t0, $t0, 0x10
2023-08-17 08:56:02 -04:00
#endif
2020-02-03 00:51:26 -05:00
xor $t0, $t0, $at
andi $t0, $t0, 0x3f
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
lw $t4, 0x128($k0)
#endif
2020-02-03 00:51:26 -05:00
and $t0, $t0, $t4
or $t1, $t1, $t0
2023-08-17 08:56:02 -04:00
endrcp:
2020-02-03 00:51:26 -05:00
sw $t1, 0x128($k0)
2021-07-12 23:17:54 -04:00
#else
2020-06-02 12:44:34 -04:00
sd $t0, 0x110($k0)
2021-07-12 23:17:54 -04:00
#endif
2023-08-17 08:56:02 -04:00
mfc0 $t0, C0_EPC
2019-08-25 00:46:40 -04:00
sw $t0, 0x11c($k0)
lw $t0, 0x18($k0)
beqz $t0, .L80326868
nop
cfc1 $t0, $31
nop
sw $t0, 0x12c($k0)
sdc1 $f0, 0x130($k0)
sdc1 $f2, 0x138($k0)
sdc1 $f4, 0x140($k0)
sdc1 $f6, 0x148($k0)
sdc1 $f8, 0x150($k0)
sdc1 $f10, 0x158($k0)
sdc1 $f12, 0x160($k0)
sdc1 $f14, 0x168($k0)
sdc1 $f16, 0x170($k0)
sdc1 $f18, 0x178($k0)
sdc1 $f20, 0x180($k0)
sdc1 $f22, 0x188($k0)
sdc1 $f24, 0x190($k0)
sdc1 $f26, 0x198($k0)
sdc1 $f28, 0x1a0($k0)
sdc1 $f30, 0x1a8($k0)
.L80326868:
2023-08-17 08:56:02 -04:00
mfc0 $t0, C0_CAUSE
2019-08-25 00:46:40 -04:00
sw $t0, 0x120($k0)
2023-08-17 08:56:02 -04:00
#ifndef VERSION_EU_SH_CN
lui $t1, %hi(PHYS_TO_K1(MI_INTR_MASK_REG))
lw $t1, %lo(PHYS_TO_K1(MI_INTR_MASK_REG))($t1)
2019-08-25 00:46:40 -04:00
sw $t1, 0x128($k0)
2021-07-12 23:17:54 -04:00
#endif
2019-08-25 00:46:40 -04:00
li $t1, 2
sh $t1, 0x10($k0)
2023-08-17 08:56:02 -04:00
#ifndef VERSION_EU_SH_CN
2020-06-02 12:44:34 -04:00
lui $t1, %hi(D_80334934)
2019-08-25 00:46:40 -04:00
lw $t1, %lo(D_80334934)($t1)
beqz $t1, .L803268B4
nop
2020-06-02 12:44:34 -04:00
lui $t2, %hi(D_C0000008)
2019-08-25 00:46:40 -04:00
sw $zero, %lo(D_C0000008)($t2)
lui $a0, %hi(D_C0000000)
2020-06-02 12:44:34 -04:00
addiu $t2, %lo(D_C0000008)
2019-08-25 00:46:40 -04:00
jal kdebugserver
lw $a0, %lo(D_C0000000)($a0)
b .L80326E08
nop
.L803268B4:
2020-06-02 12:44:34 -04:00
lui $t1, %hi(D_80334938)
2019-08-25 00:46:40 -04:00
lw $t1, %lo(D_80334938)($t1)
beqz $t1, .L80326900
nop
2020-06-02 12:44:34 -04:00
lui $t2, %hi(D_C000000C)
2019-08-25 00:46:40 -04:00
sw $zero, %lo(D_C000000C)($t2)
2023-08-17 08:56:02 -04:00
lui $t1, %hi(__osRdbSendMessage)
lw $t1, %lo(__osRdbSendMessage)($t1)
2020-06-02 12:44:34 -04:00
addiu $t2, %lo(D_C000000C)
2019-08-25 00:46:40 -04:00
beqz $t1, .L803268E8
nop
jal send_mesg
li $a0, 120
.L803268E8:
2023-08-17 08:56:02 -04:00
lui $t1, %hi(__osRdbWriteOK)
lw $t1, %lo(__osRdbWriteOK)($t1)
lui $at, %hi(__osRdbWriteOK)
2019-08-25 00:46:40 -04:00
addi $t1, $t1, 1
b .L80326E08
2023-08-17 08:56:02 -04:00
sw $t1, %lo(__osRdbWriteOK)($at)
2019-08-25 00:46:40 -04:00
.L80326900:
2021-07-12 23:17:54 -04:00
#endif
2023-08-17 08:56:02 -04:00
andi $t1, $t0, CAUSE_EXCMASK
li $t2, EXC_BREAK
beq $t1, $t2, handle_break
2019-08-25 00:46:40 -04:00
nop
2023-08-17 08:56:02 -04:00
li $t2, EXC_CPU
beq $t1, $t2, handle_CpU
2019-08-25 00:46:40 -04:00
nop
2023-08-17 08:56:02 -04:00
li $t2, EXC_INT
bne $t1, $t2, panic
2019-08-25 00:46:40 -04:00
nop
and $s0, $k1, $t0
2023-08-17 08:56:02 -04:00
next_interrupt:
andi $t1, $s0, SR_IMASK
2019-08-25 00:46:40 -04:00
srl $t2, $t1, 0xc
bnez $t2, .L80326944
nop
srl $t2, $t1, 8
addi $t2, $t2, 0x10
.L80326944:
2023-08-17 08:56:02 -04:00
// TODO: Get rid of noat
.set at
lbu $t2, __osIntOffTable($t2)
lw $t2, __osIntTable($t2)
.set noat
2019-08-25 00:46:40 -04:00
jr $t2
nop
2023-08-17 08:56:02 -04:00
#ifdef VERSION_EU_SH_CN
glabel IP6_Hdlr
li $at, ~CAUSE_IP6
b next_interrupt
2020-06-02 12:44:34 -04:00
and $s0, $s0, $at
2023-08-17 08:56:02 -04:00
glabel IP7_Hdlr
li $at, ~CAUSE_IP7
b next_interrupt
2020-06-02 12:44:34 -04:00
and $s0, $s0, $at
2021-07-12 23:17:54 -04:00
#endif
2023-08-17 08:56:02 -04:00
glabel counter
mfc0 $t1, C0_COMPARE
mtc0 $t1, C0_COMPARE
#ifdef VERSION_CN
li $a0, 24
jal send_mesg
nop
#else
2019-08-25 00:46:40 -04:00
jal send_mesg
li $a0, 24
2023-08-17 08:56:02 -04:00
#endif
lui $at, (~CAUSE_IP8 >> 16) & 0xFFFF
ori $at, (~CAUSE_IP8 & 0xFFFF)
b next_interrupt
2019-08-25 00:46:40 -04:00
and $s0, $s0, $at
2023-08-17 08:56:02 -04:00
glabel cart
#ifdef VERSION_EU_SH_CN
li $at, ~CAUSE_IP4
2020-06-02 12:44:34 -04:00
and $s0, $s0, $at
2021-07-12 23:17:54 -04:00
#endif
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
la $t1, __osHwIntTable
addi $t1, $t1, 4 * 2
lw $t2, ($t1)
beqz $t2, .L80307480
nop
jalr $t2
lw $sp, 4($t1)
beqz $v0, .L80307480
nop
b redispatch
nop
.L80307480:
lui $s1, %hi(PHYS_TO_K1(MI_HW_INTR_REG))
lw $s1, %lo(PHYS_TO_K1(MI_HW_INTR_REG))($s1)
andi $t1, $s1, 0x40
beqz $t1, .L803074AC
nop
andi $s1, $s1, 0x3F80
li $t1, 0
lui $at, %hi(PHYS_TO_K1(PI_CARD_ADDR_REG))
sw $t1, %lo(PHYS_TO_K1(PI_CARD_ADDR_REG))($at)
jal send_mesg
li $a0, 184
.L803074AC:
andi $t1, $s1, 0x2000
beqz $t1, .L803074D0
nop
andi $s1, $s1, 0x1FC0
li $t1, 0x2000
lui $at, %hi(PHYS_TO_K1(MI_HW_INTR_REG))
sw $t1, %lo(PHYS_TO_K1(MI_HW_INTR_REG))($at)
jal send_mesg
li $a0, 240
.L803074D0:
andi $t1, $s1, 0x80
beqz $t1, .L803074F4
nop
andi $s1, $s1, 0x3F40
li $t1, 0x4000
lui $at, %hi(PHYS_TO_K1(MI_HW_INTR_MASK_REG))
sw $t1, %lo(PHYS_TO_K1(MI_HW_INTR_MASK_REG))($at)
jal send_mesg
li $a0, 192
.L803074F4:
andi $t1, $s1, 0x100
beqz $t1, .L80307518
nop
andi $s1, $s1, 0x3EC0
lui $t1, 1
lui $at, %hi(PHYS_TO_K1(MI_HW_INTR_MASK_REG))
sw $t1, %lo(PHYS_TO_K1(MI_HW_INTR_MASK_REG))($at)
jal send_mesg
li $a0, 200
.L80307518:
andi $t1, $s1, 0x200
beqz $t1, .L8030753C
nop
andi $s1, $s1, 0x3DC0
lui $t1, 4
lui $at, %hi(PHYS_TO_K1(MI_HW_INTR_MASK_REG))
sw $t1, %lo(PHYS_TO_K1(MI_HW_INTR_MASK_REG))($at)
jal send_mesg
li $a0, 208
.L8030753C:
andi $t1, $s1, 0x400
beqz $t1, .L80307560
nop
andi $s1, $s1, 0x3BC0
lui $t1, 0x10
lui $at, %hi(PHYS_TO_K1(MI_HW_INTR_MASK_REG))
sw $t1, %lo(PHYS_TO_K1(MI_HW_INTR_MASK_REG))($at)
jal send_mesg
li $a0, 216
.L80307560:
andi $t1, $s1, 0x800
beqz $t1, .L80307584
nop
andi $s1, $s1, 0x37C0
lui $t1, 0x40
lui $at, %hi(PHYS_TO_K1(MI_HW_INTR_MASK_REG))
sw $t1, %lo(PHYS_TO_K1(MI_HW_INTR_MASK_REG))($at)
jal send_mesg
li $a0, 224
.L80307584:
b next_interrupt
nop
#else
2019-08-25 00:46:40 -04:00
li $t2, 4
2023-08-17 08:56:02 -04:00
lui $at, %hi(__osHwIntTable)
2019-08-25 00:46:40 -04:00
addu $at, $at, $t2
2023-08-17 08:56:02 -04:00
lw $t2, %lo(__osHwIntTable)($at)
#ifdef VERSION_EU_SH
la $sp, leoDiskStack
2020-06-02 12:44:34 -04:00
li $a0, 16
beqz $t2, .L803269A4
addiu $sp, $sp, 0xff0
2021-07-12 23:17:54 -04:00
#else
2019-08-25 00:46:40 -04:00
beqz $t2, .L803269A4
nop
2021-07-12 23:17:54 -04:00
#endif
2019-08-25 00:46:40 -04:00
jalr $t2
2023-08-17 08:56:02 -04:00
nop
#ifdef VERSION_EU_SH
2020-06-02 12:44:34 -04:00
beqz $v0, .L803269A4
2021-07-12 23:17:54 -04:00
#ifdef VERSION_SH
2020-12-03 14:26:38 -05:00
li $a0, 0x10
2021-07-12 23:17:54 -04:00
#else
2020-06-02 12:44:34 -04:00
nop
2021-07-12 23:17:54 -04:00
#endif
2023-08-17 08:56:02 -04:00
b redispatch
2020-06-02 12:44:34 -04:00
nop
2021-07-12 23:17:54 -04:00
#endif
2019-08-25 00:46:40 -04:00
.L803269A4:
jal send_mesg
2023-08-17 08:56:02 -04:00
#ifdef VERSION_EU_SH
2020-06-02 12:44:34 -04:00
nop
2023-08-17 08:56:02 -04:00
b next_interrupt
2020-06-02 12:44:34 -04:00
nop
2021-07-12 23:17:54 -04:00
#else
2019-08-25 00:46:40 -04:00
li $a0, 16
li $at, -2049
2023-08-17 08:56:02 -04:00
b next_interrupt
2019-08-25 00:46:40 -04:00
and $s0, $s0, $at
2021-07-12 23:17:54 -04:00
#endif
2023-08-17 08:56:02 -04:00
#endif
glabel rcp
#ifdef VERSION_EU_SH
la $t0, __OSGlobalIntMask
2020-06-02 12:44:34 -04:00
lw $t0, ($t0)
2021-07-12 23:17:54 -04:00
#endif
2023-08-17 08:56:02 -04:00
lui $s1, %hi(PHYS_TO_K1(MI_INTR_REG))
lw $s1, %lo(PHYS_TO_K1(MI_INTR_REG))($s1)
#ifdef VERSION_CN
la $t0, __OSGlobalIntMask
lw $t0, ($t0)
#endif
#ifdef VERSION_EU_SH_CN
2020-06-02 12:44:34 -04:00
srl $t0, $t0, 0x10
and $s1, $s1, $t0
2021-07-12 23:17:54 -04:00
#else
2019-08-25 00:46:40 -04:00
andi $s1, $s1, 0x3f
2021-07-12 23:17:54 -04:00
#endif
2023-08-17 08:56:02 -04:00
andi $t1, $s1, MI_INTR_SP
beqz $t1, vi
nop
#ifdef VERSION_CN
andi $s1, $s1, 0x3e
#endif
lui $t4, %hi(PHYS_TO_K1(SP_STATUS_REG))
lw $t4, %lo(PHYS_TO_K1(SP_STATUS_REG))($t4)
#ifdef VERSION_CN
li $t1, SP_CLR_INTR | SP_CLR_SIG3
#else
li $t1, SP_CLR_INTR
#endif
lui $at, %hi(PHYS_TO_K1(SP_STATUS_REG))
#ifdef VERSION_CN
sw $t1, %lo(PHYS_TO_K1(SP_STATUS_REG))($at)
andi $t4, $t4, 0x300
beqz $t4, sp_other_break
2019-08-25 00:46:40 -04:00
nop
2023-08-17 08:56:02 -04:00
#else
2019-08-25 00:46:40 -04:00
andi $t4, $t4, 0x300
andi $s1, $s1, 0x3e
2023-08-17 08:56:02 -04:00
beqz $t4, sp_other_break
sw $t1, %lo(PHYS_TO_K1(SP_STATUS_REG))($at)
#endif
2019-08-25 00:46:40 -04:00
jal send_mesg
li $a0, 32
2023-08-17 08:56:02 -04:00
beqz $s1, no_more_rcp_ints
2019-08-25 00:46:40 -04:00
nop
2023-08-17 08:56:02 -04:00
b vi
2019-08-25 00:46:40 -04:00
nop
2023-08-17 08:56:02 -04:00
sp_other_break:
2019-08-25 00:46:40 -04:00
jal send_mesg
li $a0, 88
2023-08-17 08:56:02 -04:00
beqz $s1, no_more_rcp_ints
2019-08-25 00:46:40 -04:00
nop
2023-08-17 08:56:02 -04:00
vi:
2019-08-25 00:46:40 -04:00
andi $t1, $s1, 8
2023-08-17 08:56:02 -04:00
beqz $t1, ai
#ifdef VERSION_CN
nop
andi $s1, $s1, 0x37
lui $at, %hi(PHYS_TO_K1(VI_CURRENT_REG))
#else
lui $at, %hi(PHYS_TO_K1(VI_CURRENT_REG))
2019-08-25 00:46:40 -04:00
andi $s1, $s1, 0x37
2023-08-17 08:56:02 -04:00
#endif
sw $zero, %lo(PHYS_TO_K1(VI_CURRENT_REG))($at)
2019-08-25 00:46:40 -04:00
jal send_mesg
li $a0, 56
2023-08-17 08:56:02 -04:00
beqz $s1, no_more_rcp_ints
2019-08-25 00:46:40 -04:00
nop
2023-08-17 08:56:02 -04:00
ai:
2019-08-25 00:46:40 -04:00
andi $t1, $s1, 4
2023-08-17 08:56:02 -04:00
beqz $t1, si
2019-08-25 00:46:40 -04:00
nop
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
andi $s1, $s1, 0x3b
#endif
2019-08-25 00:46:40 -04:00
li $t1, 1
2023-08-17 08:56:02 -04:00
lui $at, %hi(PHYS_TO_K1(AI_STATUS_REG))
#ifndef VERSION_CN
2019-08-25 00:46:40 -04:00
andi $s1, $s1, 0x3b
2023-08-17 08:56:02 -04:00
#endif
sw $t1, %lo(PHYS_TO_K1(AI_STATUS_REG))($at)
2019-08-25 00:46:40 -04:00
jal send_mesg
li $a0, 48
2023-08-17 08:56:02 -04:00
beqz $s1, no_more_rcp_ints
2019-08-25 00:46:40 -04:00
nop
2023-08-17 08:56:02 -04:00
si:
2019-08-25 00:46:40 -04:00
andi $t1, $s1, 2
2023-08-17 08:56:02 -04:00
beqz $t1, pi
#ifdef VERSION_CN
nop
#else
lui $at, %hi(PHYS_TO_K1(SI_STATUS_REG))
#endif
2019-08-25 00:46:40 -04:00
andi $s1, $s1, 0x3d
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
lui $at, %hi(PHYS_TO_K1(SI_STATUS_REG))
#endif
sw $zero, %lo(PHYS_TO_K1(SI_STATUS_REG))($at)
2019-08-25 00:46:40 -04:00
jal send_mesg
li $a0, 40
2023-08-17 08:56:02 -04:00
beqz $s1, no_more_rcp_ints
2019-08-25 00:46:40 -04:00
nop
2023-08-17 08:56:02 -04:00
pi:
2019-08-25 00:46:40 -04:00
andi $t1, $s1, 0x10
2023-08-17 08:56:02 -04:00
beqz $t1, dp
2019-08-25 00:46:40 -04:00
nop
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
andi $s1, $s1, 0x2f
li $t1, 2
lui $at, %hi(PHYS_TO_K1(PI_STATUS_REG))
sw $t1, %lo(PHYS_TO_K1(PI_STATUS_REG))($at)
la $t1, D_CN_80319658
lw $t2, ($t1)
beqz $t2, .L803076C0
nop
lw $sp, 4($t1)
jalr $t2
move $a0, $v0
bnez $v0, .L803076C8
nop
.L803076C0:
#else
2019-08-25 00:46:40 -04:00
li $t1, 2
2023-08-17 08:56:02 -04:00
lui $at, %hi(PHYS_TO_K1(PI_STATUS_REG))
2019-08-25 00:46:40 -04:00
andi $s1, $s1, 0x2f
2023-08-17 08:56:02 -04:00
sw $t1, %lo(PHYS_TO_K1(PI_STATUS_REG))($at)
#endif
2019-08-25 00:46:40 -04:00
jal send_mesg
li $a0, 64
2023-08-17 08:56:02 -04:00
.L803076C8:
beqz $s1, no_more_rcp_ints
2019-08-25 00:46:40 -04:00
nop
2023-08-17 08:56:02 -04:00
dp:
2019-08-25 00:46:40 -04:00
andi $t1, $s1, 0x20
2023-08-17 08:56:02 -04:00
beqz $t1, no_more_rcp_ints
2019-08-25 00:46:40 -04:00
nop
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
andi $s1, $s1, 0x1f
#endif
li $t1, MI_CLR_DP_INTR
lui $at, %hi(PHYS_TO_K1(MI_MODE_REG))
#ifndef VERSION_CN
2019-08-25 00:46:40 -04:00
andi $s1, $s1, 0x1f
2023-08-17 08:56:02 -04:00
#endif
sw $t1, %lo(PHYS_TO_K1(MI_MODE_REG))($at)
2019-08-25 00:46:40 -04:00
jal send_mesg
li $a0, 72
2023-08-17 08:56:02 -04:00
no_more_rcp_ints:
2019-08-25 00:46:40 -04:00
li $at, -1025
2023-08-17 08:56:02 -04:00
b next_interrupt
2019-08-25 00:46:40 -04:00
and $s0, $s0, $at
2023-08-17 08:56:02 -04:00
glabel prenmi
2019-08-25 00:46:40 -04:00
lw $k1, 0x118($k0)
li $at, -4097
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
and $k1, $k1, $at
sw $k1, 0x118($k0)
la $t1, __osShutdown
#else
lui $t1, %hi(__osShutdown)
2019-08-25 00:46:40 -04:00
and $k1, $k1, $at
sw $k1, 0x118($k0)
2023-08-17 08:56:02 -04:00
addiu $t1, %lo(__osShutdown)
#endif
2019-08-25 00:46:40 -04:00
lw $t2, ($t1)
2023-08-17 08:56:02 -04:00
beqz $t2, firstnmi
#ifdef VERSION_CN
nop
#endif
2019-08-25 00:46:40 -04:00
li $at, -4097
2023-08-17 08:56:02 -04:00
b redispatch
2019-08-25 00:46:40 -04:00
and $s0, $s0, $at
2023-08-17 08:56:02 -04:00
firstnmi:
2019-08-25 00:46:40 -04:00
li $t2, 1
sw $t2, ($t1)
jal send_mesg
li $a0, 112
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
li $at, -4097
and $s0, $s0, $at
#endif
lui $t2, %hi(__osThreadTail + 0x8)
lw $t2, %lo(__osThreadTail + 0x8)($t2)
#ifndef VERSION_CN
2019-08-25 00:46:40 -04:00
li $at, -4097
and $s0, $s0, $at
2023-08-17 08:56:02 -04:00
#endif
2019-08-25 00:46:40 -04:00
lw $k1, 0x118($t2)
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
li $at, -4097
#endif
2019-08-25 00:46:40 -04:00
and $k1, $k1, $at
2023-08-17 08:56:02 -04:00
b redispatch
2019-08-25 00:46:40 -04:00
sw $k1, 0x118($t2)
2023-08-17 08:56:02 -04:00
glabel sw2
2019-08-25 00:46:40 -04:00
li $at, -513
and $t0, $t0, $at
mtc0 $t0, $13
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
li $a0, 8
jal send_mesg
nop
#else
2019-08-25 00:46:40 -04:00
jal send_mesg
li $a0, 8
2023-08-17 08:56:02 -04:00
#endif
2019-08-25 00:46:40 -04:00
li $at, -513
2023-08-17 08:56:02 -04:00
b next_interrupt
2019-08-25 00:46:40 -04:00
and $s0, $s0, $at
2023-08-17 08:56:02 -04:00
glabel sw1
2019-08-25 00:46:40 -04:00
li $at, -257
and $t0, $t0, $at
mtc0 $t0, $13
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
li $a0, 0
jal send_mesg
nop
#else
2019-08-25 00:46:40 -04:00
jal send_mesg
li $a0, 0
2023-08-17 08:56:02 -04:00
#endif
2019-08-25 00:46:40 -04:00
li $at, -257
2023-08-17 08:56:02 -04:00
b next_interrupt
2019-08-25 00:46:40 -04:00
and $s0, $s0, $at
2023-08-17 08:56:02 -04:00
handle_break:
2019-08-25 00:46:40 -04:00
li $t1, 1
sh $t1, 0x12($k0)
jal send_mesg
li $a0, 80
2023-08-17 08:56:02 -04:00
b redispatch
2019-08-25 00:46:40 -04:00
nop
2020-06-02 12:44:34 -04:00
2023-08-17 08:56:02 -04:00
glabel redispatch
#ifdef VERSION_CN
lw $t1, 4($k0)
lui $t2, %hi(__osThreadTail + 0x8)
lw $t2, %lo(__osThreadTail + 0x8)($t2)
lw $t3, 4($t2)
slt $at, $t1, $t3
beqz $at, enqueue_running
nop
move $a1, $k0
la $a0, __osThreadTail + 0x8
jal __osEnqueueThread
nop
#else
lui $t2, %hi(__osThreadTail + 0x8)
lw $t2, %lo(__osThreadTail + 0x8)($t2)
2019-08-25 00:46:40 -04:00
lw $t1, 4($k0)
lw $t3, 4($t2)
slt $at, $t1, $t3
2023-08-17 08:56:02 -04:00
beqz $at, enqueue_running
2019-08-25 00:46:40 -04:00
nop
2023-08-17 08:56:02 -04:00
lui $a0, %hi(__osThreadTail + 0x8)
2019-08-25 00:46:40 -04:00
move $a1, $k0
jal __osEnqueueThread
2023-08-17 08:56:02 -04:00
addiu $a0, %lo(__osThreadTail + 0x8)
#endif
2019-08-25 00:46:40 -04:00
j __osDispatchThread
nop
2023-08-17 08:56:02 -04:00
enqueue_running:
la $t1, __osThreadTail + 0x8
2019-08-25 00:46:40 -04:00
lw $t2, ($t1)
sw $t2, ($k0)
j __osDispatchThread
sw $k0, ($t1)
2023-08-17 08:56:02 -04:00
glabel panic
lui $at, %hi(__osThreadTail + 0x14)
sw $k0, %lo(__osThreadTail + 0x14)($at)
2019-08-25 00:46:40 -04:00
li $t1, 1
sh $t1, 0x10($k0)
li $t1, 2
sh $t1, 0x12($k0)
mfc0 $t2, $8
sw $t2, 0x124($k0)
jal send_mesg
li $a0, 96
j __osDispatchThread
nop
glabel send_mesg
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
move $s2, $ra
#endif
la $t2, __osEventStateTab
2019-08-25 00:46:40 -04:00
addu $t2, $t2, $a0
lw $t1, ($t2)
2023-08-17 08:56:02 -04:00
#ifndef VERSION_CN
2019-08-25 00:46:40 -04:00
move $s2, $ra
2023-08-17 08:56:02 -04:00
#endif
2019-08-25 00:46:40 -04:00
beqz $t1, .L80326CC4
nop
lw $t3, 8($t1)
lw $t4, 0x10($t1)
slt $at, $t3, $t4
beqz $at, .L80326CC4
nop
lw $t5, 0xc($t1)
addu $t5, $t5, $t3
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
bnez $t4, .L80326C60
div $zero, $t5, $t4
#else
2019-08-25 00:46:40 -04:00
div $zero, $t5, $t4
bnez $t4, .L80326C60
nop
2023-08-17 08:56:02 -04:00
#endif
2019-08-25 00:46:40 -04:00
break 7
.L80326C60:
li $at, -1
bne $t4, $at, .L80326C78
lui $at, 0x8000
bne $t5, $at, .L80326C78
nop
break 6
.L80326C78:
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
mfhi $t5
lw $t4, 0x14($t1)
li $at, 4
mult $t5, $at
mflo $t5
#else
2019-08-25 00:46:40 -04:00
lw $t4, 0x14($t1)
mfhi $t5
sll $t5, $t5, 2
2023-08-17 08:56:02 -04:00
#endif
2019-08-25 00:46:40 -04:00
addu $t4, $t4, $t5
lw $t5, 4($t2)
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
sw $t5, ($t4)
addiu $t2, $t3, 1
#else
2019-08-25 00:46:40 -04:00
addiu $t2, $t3, 1
sw $t5, ($t4)
2023-08-17 08:56:02 -04:00
#endif
2019-08-25 00:46:40 -04:00
sw $t2, 8($t1)
lw $t2, ($t1)
lw $t3, ($t2)
beqz $t3, .L80326CC4
nop
jal __osPopThread
move $a0, $t1
move $t2, $v0
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
move $a1, $t2
la $a0, __osThreadTail + 0x8
jal __osEnqueueThread
nop
#else
lui $a0, %hi(__osThreadTail + 0x8)
2019-08-25 00:46:40 -04:00
move $a1, $t2
jal __osEnqueueThread
2023-08-17 08:56:02 -04:00
addiu $a0, %lo(__osThreadTail + 0x8)
#endif
2019-08-25 00:46:40 -04:00
.L80326CC4:
jr $s2
nop
2023-08-17 08:56:02 -04:00
handle_CpU: // coprocessor error
2019-08-25 00:46:40 -04:00
lui $at, 0x3000
and $t1, $t0, $at
srl $t1, $t1, 0x1c
li $t2, 1
2023-08-17 08:56:02 -04:00
bne $t1, $t2, panic
2019-08-25 00:46:40 -04:00
nop
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
li $t1, 1
sw $t1, 0x18($k0)
lw $k1, 0x118($k0)
lui $at, 0x2000
or $k1, $k1, $at
#else
2019-08-25 00:46:40 -04:00
lw $k1, 0x118($k0)
lui $at, 0x2000
li $t1, 1
or $k1, $k1, $at
sw $t1, 0x18($k0)
2023-08-17 08:56:02 -04:00
#endif
b enqueue_running
2019-08-25 00:46:40 -04:00
sw $k1, 0x118($k0)
glabel __osEnqueueAndYield
2023-08-17 08:56:02 -04:00
lui $a1, %hi(__osThreadTail + 0x10)
lw $a1, %lo(__osThreadTail + 0x10)($a1)
2019-08-25 00:46:40 -04:00
mfc0 $t0, $12
2023-08-17 08:56:02 -04:00
#ifndef VERSION_CN
2019-08-25 00:46:40 -04:00
lw $k1, 0x18($a1)
2023-08-17 08:56:02 -04:00
#endif
2019-08-25 00:46:40 -04:00
ori $t0, $t0, 2
sw $t0, 0x118($a1)
sd $s0, 0x98($a1)
sd $s1, 0xa0($a1)
sd $s2, 0xa8($a1)
sd $s3, 0xb0($a1)
sd $s4, 0xb8($a1)
sd $s5, 0xc0($a1)
sd $s6, 0xc8($a1)
sd $s7, 0xd0($a1)
sd $gp, 0xe8($a1)
sd $sp, 0xf0($a1)
sd $fp, 0xf8($a1)
sd $ra, 0x100($a1)
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
sw $ra, 0x11c($a1)
lw $k1, 0x18($a1)
beqz $k1, .L80326D70
nop
cfc1 $k1, $31
sw $k1, 0x12c($a1)
#else
2019-08-25 00:46:40 -04:00
beqz $k1, .L80326D70
sw $ra, 0x11c($a1)
cfc1 $k1, $31
2023-08-17 08:56:02 -04:00
#endif
2019-08-25 00:46:40 -04:00
sdc1 $f20, 0x180($a1)
sdc1 $f22, 0x188($a1)
sdc1 $f24, 0x190($a1)
sdc1 $f26, 0x198($a1)
sdc1 $f28, 0x1a0($a1)
sdc1 $f30, 0x1a8($a1)
2023-08-17 08:56:02 -04:00
#ifndef VERSION_CN
2019-08-25 00:46:40 -04:00
sw $k1, 0x12c($a1)
2023-08-17 08:56:02 -04:00
#endif
2020-02-03 00:51:26 -05:00
2020-06-02 12:44:34 -04:00
.L80326D70:
2023-08-17 08:56:02 -04:00
#ifdef VERSION_EU_SH_CN
2020-06-02 12:44:34 -04:00
lw $k1, 0x118($a1)
andi $t1, $k1, 0xff00
beqz $t1, .L802F3FBC
nop
2023-08-17 08:56:02 -04:00
la $t0, __OSGlobalIntMask
2020-06-02 12:44:34 -04:00
lw $t0, ($t0)
2023-08-17 08:56:02 -04:00
li $at, 0xFFFFFFFF
2020-06-02 12:44:34 -04:00
xor $t0, $t0, $at
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
andi $t0, $t0, SR_IMASK
2020-06-02 12:44:34 -04:00
or $t1, $t1, $t0
2023-08-17 08:56:02 -04:00
li $at, ~SR_IMASK
#else
lui $at, (~SR_IMASK >> 16) & 0xFFFF
andi $t0, $t0, SR_IMASK
ori $at, (~SR_IMASK & 0xFFFF)
or $t1, $t1, $t0
#endif
2020-06-02 12:44:34 -04:00
and $k1, $k1, $at
or $k1, $k1, $t1
sw $k1, 0x118($a1)
2020-02-03 00:51:26 -05:00
.L802F3FBC:
2021-07-12 23:17:54 -04:00
#endif
2023-08-17 08:56:02 -04:00
lui $k1, %hi(PHYS_TO_K1(MI_INTR_MASK_REG))
lw $k1, %lo(PHYS_TO_K1(MI_INTR_MASK_REG))($k1)
#ifdef VERSION_EU_SH_CN
2020-06-02 12:44:34 -04:00
beqz $k1, .L802F3FF4
nop
2023-08-17 08:56:02 -04:00
la $k0, __OSGlobalIntMask
2020-06-02 12:44:34 -04:00
lw $k0, ($k0)
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
srl $k0, $k0, 0x10
li $at, 0xFFFFFFFF
xor $k0, $k0, $at
andi $k0, $k0, 0x3f
2020-06-02 12:44:34 -04:00
lw $t0, 0x128($a1)
2023-08-17 08:56:02 -04:00
#else
lw $t0, 0x128($a1)
li $at, 0xFFFFFFFF
2020-06-02 12:44:34 -04:00
srl $k0, $k0, 0x10
xor $k0, $k0, $at
andi $k0, $k0, 0x3f
2023-08-17 08:56:02 -04:00
#endif
2020-06-02 12:44:34 -04:00
and $k0, $k0, $t0
or $k1, $k1, $k0
.L802F3FF4:
2021-07-12 23:17:54 -04:00
#endif
2019-08-25 00:46:40 -04:00
beqz $a0, .L80326D88
sw $k1, 0x128($a1)
jal __osEnqueueThread
nop
.L80326D88:
j __osDispatchThread
nop
2021-07-12 23:17:54 -04:00
// enqueue and pop look like compiled functions? but there's no easy way to extract them
2019-08-25 00:46:40 -04:00
glabel __osEnqueueThread
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
move $t9, $a0
#endif
2019-08-25 00:46:40 -04:00
lw $t8, ($a0)
lw $t7, 4($a1)
2023-08-17 08:56:02 -04:00
#ifndef VERSION_CN
2019-08-25 00:46:40 -04:00
move $t9, $a0
2023-08-17 08:56:02 -04:00
#endif
2019-08-25 00:46:40 -04:00
lw $t6, 4($t8)
slt $at, $t6, $t7
bnez $at, .L80326DC4
nop
.L80326DAC:
move $t9, $t8
lw $t8, ($t8)
lw $t6, 4($t8)
slt $at, $t6, $t7
beqz $at, .L80326DAC
nop
.L80326DC4:
lw $t8, ($t9)
sw $t8, ($a1)
sw $a1, ($t9)
jr $ra
sw $a0, 8($a1)
glabel __osPopThread
lw $v0, ($a0)
lw $t9, ($v0)
jr $ra
sw $t9, ($a0)
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
func_unused:
jr $ra
nop
#endif
2019-08-25 00:46:40 -04:00
glabel __osDispatchThread
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
la $a0, __osThreadTail + 0x8
2019-08-25 00:46:40 -04:00
jal __osPopThread
2023-08-17 08:56:02 -04:00
nop
#else
lui $a0, %hi(__osThreadTail + 0x8)
jal __osPopThread
addiu $a0, %lo(__osThreadTail + 0x8)
#endif
lui $at, %hi(__osThreadTail + 0x10)
sw $v0, %lo(__osThreadTail + 0x10)($at)
2019-08-25 00:46:40 -04:00
li $t0, 4
sh $t0, 0x10($v0)
move $k0, $v0
2023-08-17 08:56:02 -04:00
#ifdef VERSION_EU_SH_CN
#ifdef VERSION_CN
lw $k1, 0x118($k0)
la $t0, __OSGlobalIntMask
lw $t0, ($t0)
andi $t0, $t0, SR_IMASK
andi $t1, $k1, SR_IMASK
and $t1, $t1, $t0
li $at, ~SR_IMASK
#else
2020-12-03 14:26:38 -05:00
lui $t0, %hi(__OSGlobalIntMask)
2020-06-02 12:44:34 -04:00
lw $k1, 0x118($k0)
2020-12-03 14:26:38 -05:00
addiu $t0, %lo(__OSGlobalIntMask)
2020-06-02 12:44:34 -04:00
lw $t0, ($t0)
2023-08-17 08:56:02 -04:00
lui $at, (~SR_IMASK >> 16) & 0xFFFF
andi $t1, $k1, SR_IMASK
ori $at, (~SR_IMASK & 0xFFFF)
andi $t0, $t0, SR_IMASK
2020-06-02 12:44:34 -04:00
and $t1, $t1, $t0
2023-08-17 08:56:02 -04:00
#endif
2020-06-02 12:44:34 -04:00
and $k1, $k1, $at
or $k1, $k1, $t1
mtc0 $k1, $12
2021-07-12 23:17:54 -04:00
#endif
2019-08-25 00:46:40 -04:00
.L80326E08:
2023-08-17 08:56:02 -04:00
#ifndef VERSION_CN
2019-08-25 00:46:40 -04:00
ld $k1, 0x108($k0)
2023-08-17 08:56:02 -04:00
#endif
2019-08-25 00:46:40 -04:00
ld $at, 0x20($k0)
ld $v0, 0x28($k0)
2023-08-17 08:56:02 -04:00
#ifndef VERSION_CN
2019-08-25 00:46:40 -04:00
mtlo $k1
ld $k1, 0x110($k0)
2023-08-17 08:56:02 -04:00
#endif
2019-08-25 00:46:40 -04:00
ld $v1, 0x30($k0)
ld $a0, 0x38($k0)
ld $a1, 0x40($k0)
ld $a2, 0x48($k0)
ld $a3, 0x50($k0)
ld $t0, 0x58($k0)
ld $t1, 0x60($k0)
ld $t2, 0x68($k0)
ld $t3, 0x70($k0)
ld $t4, 0x78($k0)
ld $t5, 0x80($k0)
ld $t6, 0x88($k0)
ld $t7, 0x90($k0)
ld $s0, 0x98($k0)
ld $s1, 0xa0($k0)
ld $s2, 0xa8($k0)
ld $s3, 0xb0($k0)
ld $s4, 0xb8($k0)
ld $s5, 0xc0($k0)
ld $s6, 0xc8($k0)
ld $s7, 0xd0($k0)
ld $t8, 0xd8($k0)
ld $t9, 0xe0($k0)
ld $gp, 0xe8($k0)
2023-08-17 08:56:02 -04:00
#ifndef VERSION_CN
2019-08-25 00:46:40 -04:00
mthi $k1
2023-08-17 08:56:02 -04:00
#endif
2019-08-25 00:46:40 -04:00
ld $sp, 0xf0($k0)
ld $fp, 0xf8($k0)
ld $ra, 0x100($k0)
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
ld $k1, 0x108($k0)
mtlo $k1
ld $k1, 0x110($k0)
mthi $k1
#endif
2019-08-25 00:46:40 -04:00
lw $k1, 0x11c($k0)
mtc0 $k1, $14
2023-08-17 08:56:02 -04:00
#ifndef VERSION_EU_SH_CN
2019-08-25 00:46:40 -04:00
lw $k1, 0x118($k0)
mtc0 $k1, $12
2021-07-12 23:17:54 -04:00
#endif
2019-08-25 00:46:40 -04:00
lw $k1, 0x18($k0)
beqz $k1, .L80326EF0
nop
lw $k1, 0x12c($k0)
ctc1 $k1, $31
ldc1 $f0, 0x130($k0)
ldc1 $f2, 0x138($k0)
ldc1 $f4, 0x140($k0)
ldc1 $f6, 0x148($k0)
ldc1 $f8, 0x150($k0)
ldc1 $f10, 0x158($k0)
ldc1 $f12, 0x160($k0)
ldc1 $f14, 0x168($k0)
ldc1 $f16, 0x170($k0)
ldc1 $f18, 0x178($k0)
ldc1 $f20, 0x180($k0)
ldc1 $f22, 0x188($k0)
ldc1 $f24, 0x190($k0)
ldc1 $f26, 0x198($k0)
ldc1 $f28, 0x1a0($k0)
ldc1 $f30, 0x1a8($k0)
.L80326EF0:
lw $k1, 0x128($k0)
2023-08-17 08:56:02 -04:00
#ifdef VERSION_EU_SH_CN
la $k0, __OSGlobalIntMask
2020-06-02 12:44:34 -04:00
lw $k0, ($k0)
srl $k0, $k0, 0x10
and $k1, $k1, $k0
2021-07-12 23:17:54 -04:00
#endif
2019-08-25 00:46:40 -04:00
sll $k1, $k1, 1
2023-08-17 08:56:02 -04:00
la $k0, __osRcpImTable
2019-08-25 00:46:40 -04:00
addu $k1, $k1, $k0
lhu $k1, ($k1)
2023-08-17 08:56:02 -04:00
#ifdef VERSION_CN
li $k0, PHYS_TO_K1(MI_INTR_MASK_REG)
#else
// TODO: is this an la?
lui $k0, %hi(PHYS_TO_K1(MI_INTR_MASK_REG))
addiu $k0, %lo(PHYS_TO_K1(MI_INTR_MASK_REG))
#endif
2019-08-25 00:46:40 -04:00
sw $k1, ($k0)
nop
nop
nop
nop
eret
glabel __osCleanupThread
jal osDestroyThread
move $a0, $zero
.section .data
2023-08-17 08:56:02 -04:00
glabel __osHwIntTable
.word 0
.word 0
.word 0
.word 0
.word 0
#ifdef VERSION_CN
// CN: table is now 2 words per entry (handler, sp)
2019-08-25 00:46:40 -04:00
.word 0
.word 0
.word 0
.word 0
.word 0
2023-08-17 08:56:02 -04:00
// Is this part of __osHwIntTable?
glabel D_CN_80319658
.word 0
#endif
#ifndef VERSION_EU_SH_CN
2019-08-25 00:46:40 -04:00
glabel D_80334934
.word 0
glabel D_80334938
.word 0
.word 0
2023-08-17 08:56:02 -04:00
#endif
2019-08-25 00:46:40 -04:00
.section .rodata
2023-08-17 08:56:02 -04:00
glabel __osIntOffTable
2019-08-25 00:46:40 -04:00
.byte 0x00,0x14,0x18,0x18,0x1C,0x1C,0x1C,0x1C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x04,0x08,0x08,0x0C,0x0C,0x0C,0x0C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10
2023-08-17 08:56:02 -04:00
glabel __osIntTable
.word redispatch
.word sw1
.word sw2
.word rcp
.word cart
.word prenmi
#ifdef VERSION_EU_SH_CN
.word IP6_Hdlr
.word IP7_Hdlr
2021-07-12 23:17:54 -04:00
#else
2023-08-17 08:56:02 -04:00
.word panic
.word panic
2021-07-12 23:17:54 -04:00
#endif
2023-08-17 08:56:02 -04:00
.word counter
2019-08-25 00:46:40 -04:00
.word 0
.word 0
.word 0