From 6a8c58b29b7c143c39afaa35af472b98b4026e35 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Tue, 26 Jan 2021 22:44:10 +1000 Subject: [PATCH] Decompile osDestroyThread --- Makefile | 1 + src/game/data/data_003dc0.c | 2 +- src/include/game/data/data_000000.h | 2 +- src/lib/ultra/os/destroythread.c | 117 ++++++++++------------------ src/lib/ultra/os/exceptasm.c | 2 +- 5 files changed, 43 insertions(+), 81 deletions(-) diff --git a/Makefile b/Makefile index 58ba56576..b8a37071b 100644 --- a/Makefile +++ b/Makefile @@ -73,6 +73,7 @@ $(B_DIR)/lib/ultra/io/vi.o: OPT_LVL := -O1 $(B_DIR)/lib/ultra/io/vigetcurrframebuf.o: OPT_LVL := -O1 $(B_DIR)/lib/ultra/io/vigetnextframebuf.o: OPT_LVL := -O1 $(B_DIR)/lib/ultra/io/visetevent.o: OPT_LVL := -O1 +$(B_DIR)/lib/ultra/os/destroythread.o: OPT_LVL := -O1 CFLAGS = -DVERSION=$(VERSION) \ -DNTSC=$(NTSC) \ diff --git a/src/game/data/data_003dc0.c b/src/game/data/data_003dc0.c index fbb4c424f..926e136c0 100644 --- a/src/game/data/data_003dc0.c +++ b/src/game/data/data_003dc0.c @@ -2290,7 +2290,7 @@ u32 var8006092c = 0x00000000; u32 __osThreadTail = 0x00000000; u32 var80060934 = 0xffffffff; u32 __osRunQueue = (u32) &__osThreadTail; -u32 __osActiveQueue = (u32) &__osThreadTail; +OSThread *__osActiveQueue = (OSThread *)&__osThreadTail; OSThread *__osRunningThread = NULL; u32 var80060944 = 0x00000000; u32 var80060948 = 0x00000000; diff --git a/src/include/game/data/data_000000.h b/src/include/game/data/data_000000.h index 3fcf76853..ba431cd4f 100644 --- a/src/include/game/data/data_000000.h +++ b/src/include/game/data/data_000000.h @@ -185,7 +185,7 @@ extern __OSViContext *__osViNext; extern u32 __osPiAccessQueueEnabled; extern u32 __osThreadTail; extern u32 __osRunQueue; -extern u32 __osActiveQueue; +extern OSThread *__osActiveQueue; extern OSThread *__osRunningThread; extern u32 var80060970; extern u32 var800609a0; diff --git a/src/lib/ultra/os/destroythread.c b/src/lib/ultra/os/destroythread.c index a94a4e64e..f736337c7 100644 --- a/src/lib/ultra/os/destroythread.c +++ b/src/lib/ultra/os/destroythread.c @@ -1,80 +1,41 @@ #include +#include "game/data/data_000000.h" -GLOBAL_ASM( -glabel __osDestroyThread -/* 4a250: 27bdffc8 */ addiu $sp,$sp,-56 -/* 4a254: afbf0024 */ sw $ra,0x24($sp) -/* 4a258: afa40038 */ sw $a0,0x38($sp) -/* 4a25c: afb20020 */ sw $s2,0x20($sp) -/* 4a260: afb1001c */ sw $s1,0x1c($sp) -/* 4a264: 0c01256c */ jal __osDisableInt -/* 4a268: afb00018 */ sw $s0,0x18($sp) -/* 4a26c: 8fae0038 */ lw $t6,0x38($sp) -/* 4a270: 00408025 */ or $s0,$v0,$zero -/* 4a274: 15c00005 */ bnez $t6,.L0004a28c -/* 4a278: 00000000 */ nop -/* 4a27c: 3c0f8006 */ lui $t7,%hi(__osRunningThread) -/* 4a280: 8def0940 */ lw $t7,%lo(__osRunningThread)($t7) -/* 4a284: 10000009 */ b .L0004a2ac -/* 4a288: afaf0038 */ sw $t7,0x38($sp) -.L0004a28c: -/* 4a28c: 8fb80038 */ lw $t8,0x38($sp) -/* 4a290: 24010001 */ addiu $at,$zero,0x1 -/* 4a294: 97190010 */ lhu $t9,0x10($t8) -/* 4a298: 13210004 */ beq $t9,$at,.L0004a2ac -/* 4a29c: 00000000 */ nop -/* 4a2a0: 8f040008 */ lw $a0,0x8($t8) -/* 4a2a4: 0c012884 */ jal __osDequeueThread -/* 4a2a8: 03002825 */ or $a1,$t8,$zero -.L0004a2ac: -/* 4a2ac: 3c088006 */ lui $t0,%hi(__osActiveQueue) -/* 4a2b0: 8d08093c */ lw $t0,%lo(__osActiveQueue)($t0) -/* 4a2b4: 8fa90038 */ lw $t1,0x38($sp) -/* 4a2b8: 15090005 */ bne $t0,$t1,.L0004a2d0 -/* 4a2bc: 00000000 */ nop -/* 4a2c0: 8d0a000c */ lw $t2,0xc($t0) -/* 4a2c4: 3c018006 */ lui $at,%hi(__osActiveQueue) -/* 4a2c8: 10000013 */ b .L0004a318 -/* 4a2cc: ac2a093c */ sw $t2,%lo(__osActiveQueue)($at) -.L0004a2d0: -/* 4a2d0: 3c118006 */ lui $s1,%hi(__osActiveQueue) -/* 4a2d4: 8e31093c */ lw $s1,%lo(__osActiveQueue)($s1) -/* 4a2d8: 2401ffff */ addiu $at,$zero,-1 -/* 4a2dc: 8e2b0004 */ lw $t3,0x4($s1) -/* 4a2e0: 1161000d */ beq $t3,$at,.L0004a318 -/* 4a2e4: 00000000 */ nop -.L0004a2e8: -/* 4a2e8: 8e32000c */ lw $s2,0xc($s1) -/* 4a2ec: 8fac0038 */ lw $t4,0x38($sp) -/* 4a2f0: 164c0004 */ bne $s2,$t4,.L0004a304 -/* 4a2f4: 00000000 */ nop -/* 4a2f8: 8d8d000c */ lw $t5,0xc($t4) -/* 4a2fc: 10000006 */ b .L0004a318 -/* 4a300: ae2d000c */ sw $t5,0xc($s1) -.L0004a304: -/* 4a304: 02408825 */ or $s1,$s2,$zero -/* 4a308: 8e2e0004 */ lw $t6,0x4($s1) -/* 4a30c: 2401ffff */ addiu $at,$zero,-1 -/* 4a310: 15c1fff5 */ bne $t6,$at,.L0004a2e8 -/* 4a314: 00000000 */ nop -.L0004a318: -/* 4a318: 3c198006 */ lui $t9,%hi(__osRunningThread) -/* 4a31c: 8f390940 */ lw $t9,%lo(__osRunningThread)($t9) -/* 4a320: 8faf0038 */ lw $t7,0x38($sp) -/* 4a324: 15f90003 */ bne $t7,$t9,.L0004a334 -/* 4a328: 00000000 */ nop -/* 4a32c: 0c000f44 */ jal __osDispatchThread -/* 4a330: 00000000 */ nop -.L0004a334: -/* 4a334: 0c012588 */ jal __osRestoreInt -/* 4a338: 02002025 */ or $a0,$s0,$zero -/* 4a33c: 8fbf0024 */ lw $ra,0x24($sp) -/* 4a340: 8fb00018 */ lw $s0,0x18($sp) -/* 4a344: 8fb1001c */ lw $s1,0x1c($sp) -/* 4a348: 8fb20020 */ lw $s2,0x20($sp) -/* 4a34c: 03e00008 */ jr $ra -/* 4a350: 27bd0038 */ addiu $sp,$sp,0x38 -/* 4a354: 00000000 */ nop -/* 4a358: 00000000 */ nop -/* 4a35c: 00000000 */ nop -); +void osDestroyThread(OSThread *t) +{ + register u32 saveMask; + register OSThread *pred; + register OSThread *succ; + saveMask = __osDisableInt(); + + if (t == NULL) { + t = __osRunningThread; + } else { + if (t->state != OS_STATE_STOPPED) { + __osDequeueThread(t->queue, t); + } + } + + if (__osActiveQueue == t) { + __osActiveQueue = __osActiveQueue->tlnext; + } else { + pred = __osActiveQueue; + + while (pred->priority != -1) { + succ = pred->tlnext; + + if (succ == t) { + pred->tlnext = t->tlnext; + break; + } + + pred = succ; + } + } + + if (t == __osRunningThread) { + __osDispatchThread(); + } + + __osRestoreInt(saveMask); +} diff --git a/src/lib/ultra/os/exceptasm.c b/src/lib/ultra/os/exceptasm.c index bb265277d..dedf8558b 100644 --- a/src/lib/ultra/os/exceptasm.c +++ b/src/lib/ultra/os/exceptasm.c @@ -718,7 +718,7 @@ glabel __osDispatchThread GLOBAL_ASM( glabel __osCleanupThread -/* 3ecc: 0c012894 */ jal __osDestroyThread +/* 3ecc: 0c012894 */ jal osDestroyThread /* 3ed0: 00002025 */ or $a0,$zero,$zero /* 3ed4: 00000000 */ nop /* 3ed8: 00000000 */ nop