diff --git a/Makefile b/Makefile index 04030124..395bbb7f 100755 --- a/Makefile +++ b/Makefile @@ -188,6 +188,7 @@ $(BUILD_DIR)/lib/src/osSendMesg.o : OPT_FLAGS := -O1 $(BUILD_DIR)/lib/src/osSetEventMesg.o: OPT_FLAGS := -O1 $(BUILD_DIR)/lib/src/osSetTime.o: OPT_FLAGS := -O1 $(BUILD_DIR)/lib/src/osSetTimer.o: OPT_FLAGS := -O1 +$(BUILD_DIR)/lib/src/osStartThread.o: OPT_FLAGS := -O1 $(BUILD_DIR)/lib/src/osStopThread.o: OPT_FLAGS := -O1 $(BUILD_DIR)/lib/src/osTimer.o: OPT_FLAGS := -O1 $(BUILD_DIR)/lib/src/osViBlack.o: OPT_FLAGS := -O1 diff --git a/data/dkr.data.s b/data/dkr.data.s index 142f9591..e621d950 100644 --- a/data/dkr.data.s +++ b/data/dkr.data.s @@ -9256,7 +9256,7 @@ glabel __osThreadTail .word 0x00000000 .word 0xFFFFFFFF -glabel D_800E4888 +glabel __RunQueue .word 0x800E4880 glabel __osActiveQueue diff --git a/lib/asm/exception/__osDispatchThread.s b/lib/asm/exception/__osDispatchThread.s index 814e9466..e66d875d 100644 --- a/lib/asm/exception/__osDispatchThread.s +++ b/lib/asm/exception/__osDispatchThread.s @@ -1,7 +1,7 @@ glabel __osDispatchThread -/* 0D4024 800D3424 3C04800E */ lui $a0, %hi(D_800E4888) # $a0, 0x800e +/* 0D4024 800D3424 3C04800E */ lui $a0, %hi(__RunQueue) # $a0, 0x800e /* 0D4028 800D3428 0C034D05 */ jal __osPopThread -/* 0D402C 800D342C 24844888 */ addiu $a0, %lo(D_800E4888) # addiu $a0, $a0, 0x4888 +/* 0D402C 800D342C 24844888 */ addiu $a0, %lo(__RunQueue) # addiu $a0, $a0, 0x4888 /* 0D4030 800D3430 3C01800E */ lui $at, %hi(__osRunningThread) # $at, 0x800e /* 0D4034 800D3434 AC224890 */ sw $v0, %lo(__osRunningThread)($at) /* 0D4038 800D3438 24080004 */ li $t0, 4 diff --git a/lib/asm/exception/__osException.s b/lib/asm/exception/__osException.s index 29841890..d3ead3e6 100644 --- a/lib/asm/exception/__osException.s +++ b/lib/asm/exception/__osException.s @@ -281,8 +281,8 @@ glabel __osException /* 0D3CE4 800D30E4 AD2A0000 */ sw $t2, ($t1) /* 0D3CE8 800D30E8 0C034C79 */ jal send_mesg /* 0D3CEC 800D30EC 24040070 */ li $a0, 112 -/* 0D3CF0 800D30F0 3C0A800E */ lui $t2, %hi(D_800E4888) # $t2, 0x800e -/* 0D3CF4 800D30F4 8D4A4888 */ lw $t2, %lo(D_800E4888)($t2) +/* 0D3CF0 800D30F0 3C0A800E */ lui $t2, %hi(__RunQueue) # $t2, 0x800e +/* 0D3CF4 800D30F4 8D4A4888 */ lw $t2, %lo(__RunQueue)($t2) /* 0D3CF8 800D30F8 2401EFFF */ li $at, -4097 /* 0D3CFC 800D30FC 02018024 */ and $s0, $s0, $at /* 0D3D00 800D3100 8D5B0118 */ lw $k1, 0x118($t2) @@ -313,23 +313,23 @@ glabel __osException /* 0D3D60 800D3160 10000001 */ b .L800D3168 /* 0D3D64 800D3164 00000000 */ nop .L800D3168: -/* 0D3D68 800D3168 3C0A800E */ lui $t2, %hi(D_800E4888) # $t2, 0x800e -/* 0D3D6C 800D316C 8D4A4888 */ lw $t2, %lo(D_800E4888)($t2) +/* 0D3D68 800D3168 3C0A800E */ lui $t2, %hi(__RunQueue) # $t2, 0x800e +/* 0D3D6C 800D316C 8D4A4888 */ lw $t2, %lo(__RunQueue)($t2) /* 0D3D70 800D3170 8F490004 */ lw $t1, 4($k0) /* 0D3D74 800D3174 8D4B0004 */ lw $t3, 4($t2) /* 0D3D78 800D3178 012B082A */ slt $at, $t1, $t3 /* 0D3D7C 800D317C 10200007 */ beqz $at, .L800D319C /* 0D3D80 800D3180 00000000 */ nop -/* 0D3D84 800D3184 3C04800E */ lui $a0, %hi(D_800E4888) # $a0, 0x800e +/* 0D3D84 800D3184 3C04800E */ lui $a0, %hi(__RunQueue) # $a0, 0x800e /* 0D3D88 800D3188 03402825 */ move $a1, $k0 /* 0D3D8C 800D318C 0C034CF3 */ jal __osEnqueueThread -/* 0D3D90 800D3190 24844888 */ addiu $a0, %lo(D_800E4888) # addiu $a0, $a0, 0x4888 +/* 0D3D90 800D3190 24844888 */ addiu $a0, %lo(__RunQueue) # addiu $a0, $a0, 0x4888 /* 0D3D94 800D3194 08034D09 */ j __osDispatchThread /* 0D3D98 800D3198 00000000 */ nop .L800D319C: -/* 0D3D9C 800D319C 3C09800E */ lui $t1, %hi(D_800E4888) # $t1, 0x800e -/* 0D3DA0 800D31A0 25294888 */ addiu $t1, %lo(D_800E4888) # addiu $t1, $t1, 0x4888 +/* 0D3D9C 800D319C 3C09800E */ lui $t1, %hi(__RunQueue) # $t1, 0x800e +/* 0D3DA0 800D31A0 25294888 */ addiu $t1, %lo(__RunQueue) # addiu $t1, $t1, 0x4888 /* 0D3DA4 800D31A4 8D2A0000 */ lw $t2, ($t1) /* 0D3DA8 800D31A8 AF4A0000 */ sw $t2, ($k0) /* 0D3DAC 800D31AC 08034D09 */ j __osDispatchThread diff --git a/lib/asm/exception/send_mesg.s b/lib/asm/exception/send_mesg.s index e410fb4c..24f4904f 100644 --- a/lib/asm/exception/send_mesg.s +++ b/lib/asm/exception/send_mesg.s @@ -40,10 +40,10 @@ glabel send_mesg /* 0D3E74 800D3274 0C034D05 */ jal __osPopThread /* 0D3E78 800D3278 01202025 */ move $a0, $t1 /* 0D3E7C 800D327C 00405025 */ move $t2, $v0 -/* 0D3E80 800D3280 3C04800E */ lui $a0, %hi(D_800E4888) # $a0, 0x800e +/* 0D3E80 800D3280 3C04800E */ lui $a0, %hi(__RunQueue) # $a0, 0x800e /* 0D3E84 800D3284 01402825 */ move $a1, $t2 /* 0D3E88 800D3288 0C034CF3 */ jal __osEnqueueThread -/* 0D3E8C 800D328C 24844888 */ addiu $a0, %lo(D_800E4888) # addiu $a0, $a0, 0x4888 +/* 0D3E8C 800D328C 24844888 */ addiu $a0, %lo(__RunQueue) # addiu $a0, $a0, 0x4888 .L800D3290: /* 0D3E90 800D3290 02400008 */ jr $s2 /* 0D3E94 800D3294 00000000 */ nop diff --git a/lib/asm/non_matchings/osStartThread_0C95A0/osStartThread.s b/lib/asm/non_matchings/osStartThread_0C95A0/osStartThread.s deleted file mode 100644 index 55ab7292..00000000 --- a/lib/asm/non_matchings/osStartThread_0C95A0/osStartThread.s +++ /dev/null @@ -1,92 +0,0 @@ -glabel osStartThread -/* 0C95A0 800C89A0 27BDFFD8 */ addiu $sp, $sp, -0x28 -/* 0C95A4 800C89A4 AFBF001C */ sw $ra, 0x1c($sp) -/* 0C95A8 800C89A8 AFA40028 */ sw $a0, 0x28($sp) -/* 0C95AC 800C89AC AFB10018 */ sw $s1, 0x18($sp) -/* 0C95B0 800C89B0 0C034958 */ jal __osDisableInt -/* 0C95B4 800C89B4 AFB00014 */ sw $s0, 0x14($sp) -/* 0C95B8 800C89B8 8FAE0028 */ lw $t6, 0x28($sp) -/* 0C95BC 800C89BC 24010001 */ li $at, 1 -/* 0C95C0 800C89C0 00408025 */ move $s0, $v0 -/* 0C95C4 800C89C4 95D10010 */ lhu $s1, 0x10($t6) -/* 0C95C8 800C89C8 1221000C */ beq $s1, $at, .L800C89FC -/* 0C95CC 800C89CC 24010008 */ li $at, 8 -/* 0C95D0 800C89D0 1621002A */ bne $s1, $at, .L800C8A7C -/* 0C95D4 800C89D4 00000000 */ nop -/* 0C95D8 800C89D8 8FB80028 */ lw $t8, 0x28($sp) -/* 0C95DC 800C89DC 240F0002 */ li $t7, 2 -/* 0C95E0 800C89E0 3C04800E */ lui $a0, %hi(D_800E4888) # $a0, 0x800e -/* 0C95E4 800C89E4 A70F0010 */ sh $t7, 0x10($t8) -/* 0C95E8 800C89E8 8FA50028 */ lw $a1, 0x28($sp) -/* 0C95EC 800C89EC 0C034CF3 */ jal __osEnqueueThread -/* 0C95F0 800C89F0 24844888 */ addiu $a0, %lo(D_800E4888) # addiu $a0, $a0, 0x4888 -/* 0C95F4 800C89F4 10000021 */ b .L800C8A7C -/* 0C95F8 800C89F8 00000000 */ nop -.L800C89FC: -/* 0C95FC 800C89FC 8FB90028 */ lw $t9, 0x28($sp) -/* 0C9600 800C8A00 8F280008 */ lw $t0, 8($t9) -/* 0C9604 800C8A04 11000005 */ beqz $t0, .L800C8A1C -/* 0C9608 800C8A08 00000000 */ nop -/* 0C960C 800C8A0C 3C09800E */ lui $t1, %hi(D_800E4888) # $t1, 0x800e -/* 0C9610 800C8A10 25294888 */ addiu $t1, %lo(D_800E4888) # addiu $t1, $t1, 0x4888 -/* 0C9614 800C8A14 1509000A */ bne $t0, $t1, .L800C8A40 -/* 0C9618 800C8A18 00000000 */ nop -.L800C8A1C: -/* 0C961C 800C8A1C 8FAB0028 */ lw $t3, 0x28($sp) -/* 0C9620 800C8A20 240A0002 */ li $t2, 2 -/* 0C9624 800C8A24 3C04800E */ lui $a0, %hi(D_800E4888) # $a0, 0x800e -/* 0C9628 800C8A28 A56A0010 */ sh $t2, 0x10($t3) -/* 0C962C 800C8A2C 8FA50028 */ lw $a1, 0x28($sp) -/* 0C9630 800C8A30 0C034CF3 */ jal __osEnqueueThread -/* 0C9634 800C8A34 24844888 */ addiu $a0, %lo(D_800E4888) # addiu $a0, $a0, 0x4888 -/* 0C9638 800C8A38 10000010 */ b .L800C8A7C -/* 0C963C 800C8A3C 00000000 */ nop -.L800C8A40: -/* 0C9640 800C8A40 8FAD0028 */ lw $t5, 0x28($sp) -/* 0C9644 800C8A44 240C0008 */ li $t4, 8 -/* 0C9648 800C8A48 A5AC0010 */ sh $t4, 0x10($t5) -/* 0C964C 800C8A4C 8FAE0028 */ lw $t6, 0x28($sp) -/* 0C9650 800C8A50 8DC40008 */ lw $a0, 8($t6) -/* 0C9654 800C8A54 0C034CF3 */ jal __osEnqueueThread -/* 0C9658 800C8A58 01C02825 */ move $a1, $t6 -/* 0C965C 800C8A5C 8FAF0028 */ lw $t7, 0x28($sp) -/* 0C9660 800C8A60 0C034D05 */ jal __osPopThread -/* 0C9664 800C8A64 8DE40008 */ lw $a0, 8($t7) -/* 0C9668 800C8A68 00408825 */ move $s1, $v0 -/* 0C966C 800C8A6C 3C04800E */ lui $a0, %hi(D_800E4888) # $a0, 0x800e -/* 0C9670 800C8A70 24844888 */ addiu $a0, %lo(D_800E4888) # addiu $a0, $a0, 0x4888 -/* 0C9674 800C8A74 0C034CF3 */ jal __osEnqueueThread -/* 0C9678 800C8A78 02202825 */ move $a1, $s1 -.L800C8A7C: -/* 0C967C 800C8A7C 3C18800E */ lui $t8, %hi(__osRunningThread) # $t8, 0x800e -/* 0C9680 800C8A80 8F184890 */ lw $t8, %lo(__osRunningThread)($t8) -/* 0C9684 800C8A84 17000005 */ bnez $t8, .L800C8A9C -/* 0C9688 800C8A88 00000000 */ nop -/* 0C968C 800C8A8C 0C034D09 */ jal __osDispatchThread -/* 0C9690 800C8A90 00000000 */ nop -/* 0C9694 800C8A94 1000000F */ b .L800C8AD4 -/* 0C9698 800C8A98 00000000 */ nop -.L800C8A9C: -/* 0C969C 800C8A9C 3C19800E */ lui $t9, %hi(__osRunningThread) # $t9, 0x800e -/* 0C96A0 800C8AA0 3C09800E */ lui $t1, %hi(D_800E4888) # $t1, 0x800e -/* 0C96A4 800C8AA4 8D294888 */ lw $t1, %lo(D_800E4888)($t1) -/* 0C96A8 800C8AA8 8F394890 */ lw $t9, %lo(__osRunningThread)($t9) -/* 0C96AC 800C8AAC 8D2A0004 */ lw $t2, 4($t1) -/* 0C96B0 800C8AB0 8F280004 */ lw $t0, 4($t9) -/* 0C96B4 800C8AB4 010A082A */ slt $at, $t0, $t2 -/* 0C96B8 800C8AB8 10200006 */ beqz $at, .L800C8AD4 -/* 0C96BC 800C8ABC 00000000 */ nop -/* 0C96C0 800C8AC0 240B0002 */ li $t3, 2 -/* 0C96C4 800C8AC4 3C04800E */ lui $a0, %hi(D_800E4888) # $a0, 0x800e -/* 0C96C8 800C8AC8 A72B0010 */ sh $t3, 0x10($t9) -/* 0C96CC 800C8ACC 0C034CB3 */ jal __osEnqueueAndYield -/* 0C96D0 800C8AD0 24844888 */ addiu $a0, %lo(D_800E4888) # addiu $a0, $a0, 0x4888 -.L800C8AD4: -/* 0C96D4 800C8AD4 0C034960 */ jal __osRestoreInt -/* 0C96D8 800C8AD8 02002025 */ move $a0, $s0 -/* 0C96DC 800C8ADC 8FBF001C */ lw $ra, 0x1c($sp) -/* 0C96E0 800C8AE0 8FB00014 */ lw $s0, 0x14($sp) -/* 0C96E4 800C8AE4 8FB10018 */ lw $s1, 0x18($sp) -/* 0C96E8 800C8AE8 03E00008 */ jr $ra -/* 0C96EC 800C8AEC 27BD0028 */ addiu $sp, $sp, 0x28 - diff --git a/lib/asm/non_matchings/unknown_0CCF90/osSetThreadPri.s b/lib/asm/non_matchings/unknown_0CCF90/osSetThreadPri.s index f628e67e..37d1296e 100644 --- a/lib/asm/non_matchings/unknown_0CCF90/osSetThreadPri.s +++ b/lib/asm/non_matchings/unknown_0CCF90/osSetThreadPri.s @@ -37,8 +37,8 @@ glabel osSetThreadPri /* 0CD4C8 800CC8C8 01802825 */ move $a1, $t4 .L800CC8CC: /* 0CD4CC 800CC8CC 3C0D800E */ lui $t5, %hi(__osRunningThread) # $t5, 0x800e -/* 0CD4D0 800CC8D0 3C0F800E */ lui $t7, %hi(D_800E4888) # $t7, 0x800e -/* 0CD4D4 800CC8D4 8DEF4888 */ lw $t7, %lo(D_800E4888)($t7) +/* 0CD4D0 800CC8D0 3C0F800E */ lui $t7, %hi(__RunQueue) # $t7, 0x800e +/* 0CD4D4 800CC8D4 8DEF4888 */ lw $t7, %lo(__RunQueue)($t7) /* 0CD4D8 800CC8D8 8DAD4890 */ lw $t5, %lo(__osRunningThread)($t5) /* 0CD4DC 800CC8DC 8DF90004 */ lw $t9, 4($t7) /* 0CD4E0 800CC8E0 8DAE0004 */ lw $t6, 4($t5) @@ -46,10 +46,10 @@ glabel osSetThreadPri /* 0CD4E8 800CC8E8 10200006 */ beqz $at, .L800CC904 /* 0CD4EC 800CC8EC 00000000 */ nop /* 0CD4F0 800CC8F0 24080002 */ li $t0, 2 -/* 0CD4F4 800CC8F4 3C04800E */ lui $a0, %hi(D_800E4888) # $a0, 0x800e +/* 0CD4F4 800CC8F4 3C04800E */ lui $a0, %hi(__RunQueue) # $a0, 0x800e /* 0CD4F8 800CC8F8 A5A80010 */ sh $t0, 0x10($t5) /* 0CD4FC 800CC8FC 0C034CB3 */ jal __osEnqueueAndYield -/* 0CD500 800CC900 24844888 */ addiu $a0, %lo(D_800E4888) # addiu $a0, $a0, 0x4888 +/* 0CD500 800CC900 24844888 */ addiu $a0, %lo(__RunQueue) # addiu $a0, $a0, 0x4888 .L800CC904: /* 0CD504 800CC904 0C034960 */ jal __osRestoreInt /* 0CD508 800CC908 02002025 */ move $a0, $s0 diff --git a/lib/asm/non_matchings/unknown_0D3020/func_800D65B0.s b/lib/asm/non_matchings/unknown_0D3020/func_800D65B0.s index 22f7ad3d..5fedf7f0 100644 --- a/lib/asm/non_matchings/unknown_0D3020/func_800D65B0.s +++ b/lib/asm/non_matchings/unknown_0D3020/func_800D65B0.s @@ -6,9 +6,9 @@ glabel func_800D65B0 /* 0D71C0 800D65C0 3C0F800E */ lui $t7, %hi(__osRunningThread) # $t7, 0x800e /* 0D71C4 800D65C4 8DEF4890 */ lw $t7, %lo(__osRunningThread)($t7) /* 0D71C8 800D65C8 240E0002 */ li $t6, 2 -/* 0D71CC 800D65CC 3C04800E */ lui $a0, %hi(D_800E4888) # $a0, 0x800e +/* 0D71CC 800D65CC 3C04800E */ lui $a0, %hi(__RunQueue) # $a0, 0x800e /* 0D71D0 800D65D0 00408025 */ move $s0, $v0 -/* 0D71D4 800D65D4 24844888 */ addiu $a0, %lo(D_800E4888) # addiu $a0, $a0, 0x4888 +/* 0D71D4 800D65D4 24844888 */ addiu $a0, %lo(__RunQueue) # addiu $a0, $a0, 0x4888 /* 0D71D8 800D65D8 0C034CB3 */ jal __osEnqueueAndYield /* 0D71DC 800D65DC A5EE0010 */ sh $t6, 0x10($t7) /* 0D71E0 800D65E0 0C034960 */ jal __osRestoreInt diff --git a/lib/src/osStartThread.c b/lib/src/osStartThread.c index 2e458661..8031692d 100644 --- a/lib/src/osStartThread.c +++ b/lib/src/osStartThread.c @@ -1,7 +1,45 @@ /* The comment below is needed for this file to be picked up by generate_ld */ /* RAM_POS: 0x800C89A0 */ -#include "types.h" -#include "macros.h" +#include "libultra_internal.h" -GLOBAL_ASM("lib/asm/non_matchings/osStartThread_0C95A0/osStartThread.s") +extern OSThread* __osRunningThread; +extern OSThread* __RunQueue; //__osRunQueue + +void osStartThread(OSThread *t) +{ + register u32 saveMask = __osDisableInt(); + switch (t->state) + { + case OS_STATE_WAITING: + t->state = OS_STATE_RUNNABLE; + __osEnqueueThread(&__RunQueue, t); + break; + case OS_STATE_STOPPED: + if (t->queue == NULL || t->queue == &__RunQueue) + { + t->state = OS_STATE_RUNNABLE; + __osEnqueueThread(&__RunQueue, t); + } + else + { + t->state = OS_STATE_WAITING; + __osEnqueueThread(t->queue, t); + __osEnqueueThread(&__RunQueue, __osPopThread(t->queue)); + } + break; + } + if (__osRunningThread == NULL) + { + __osDispatchThread(); + } + else + { + if (__osRunningThread->priority < __RunQueue->priority) + { + __osRunningThread->state = OS_STATE_RUNNABLE; + __osEnqueueAndYield(&__RunQueue); + } + } + __osRestoreInt(saveMask); +} \ No newline at end of file diff --git a/rename_sym.sh b/rename_sym.sh index 251a51e3..e74d7259 100755 --- a/rename_sym.sh +++ b/rename_sym.sh @@ -10,4 +10,6 @@ fi #echo "Replace $1 with $2?" #read -grep -rl "$1" asm/**/*.s src/**/*.{c,h} lib/**/*.{c,s} include/*.h data/dkr.data.s undefined_syms.txt | xargs sed -i "s/\b$1\b/$2/g" \ No newline at end of file +ofiles=$(grep -rl "$1" build/**/*.o) +rm -v $ofiles +grep -rl "$1" asm/**/*.s src/**/*.{c,h} lib/**/*.{c,s} include/*.h data/dkr.data.s undefined_syms.txt | xargs sed -i "s/\b$1\b/$2/g" diff --git a/undefined_syms.txt b/undefined_syms.txt index b924450b..fad1a856 100755 --- a/undefined_syms.txt +++ b/undefined_syms.txt @@ -786,7 +786,7 @@ D_800E4870 = 0x800E4870; D_800E4874 = 0x800E4874; D_800E4878 = 0x800E4878; __osThreadTail = 0x800E4880; -D_800E4888 = 0x800E4888; +__RunQueue = 0x800E4888; __osActiveQueue = 0x800E488C; __osRunningThread = 0x800E4890; D_800E4894 = 0x800E4894;