From f72dffd3a9908573be663286b01ca9935454bf68 Mon Sep 17 00:00:00 2001 From: Ryan Myers Date: Mon, 11 Oct 2021 17:06:25 -0400 Subject: [PATCH] Match __scSchedule --- lib/asm/non_matchings/sched/__scSchedule.s | 146 --------------------- lib/src/mips1/sc/sched.c | 113 +++++++++++++++- lib/src/mips1/sc/sched.h | 5 +- 3 files changed, 113 insertions(+), 151 deletions(-) delete mode 100644 lib/asm/non_matchings/sched/__scSchedule.s diff --git a/lib/asm/non_matchings/sched/__scSchedule.s b/lib/asm/non_matchings/sched/__scSchedule.s deleted file mode 100644 index ec4d8aeb..00000000 --- a/lib/asm/non_matchings/sched/__scSchedule.s +++ /dev/null @@ -1,146 +0,0 @@ -.late_rodata -glabel jpt_800E7970 -.word L8007A2A4, L8007A248, L8007A1BC, L8007A2A4, L8007A2A4, L8007A248, L8007A248 - -.text -glabel __scSchedule -/* 07ACD4 8007A0D4 27BDFFD8 */ addiu $sp, $sp, -0x28 -/* 07ACD8 8007A0D8 AFB10018 */ sw $s1, 0x18($sp) -/* 07ACDC 8007A0DC 00808825 */ move $s1, $a0 -/* 07ACE0 8007A0E0 AFBF001C */ sw $ra, 0x1c($sp) -/* 07ACE4 8007A0E4 AFB00014 */ sw $s0, 0x14($sp) -/* 07ACE8 8007A0E8 2408FFFD */ li $t0, -3 -.L8007A0EC: -/* 07ACEC 8007A0EC 8E2E0284 */ lw $t6, 0x284($s1) -/* 07ACF0 8007A0F0 8E300268 */ lw $s0, 0x268($s1) -/* 07ACF4 8007A0F4 8E220264 */ lw $v0, 0x264($s1) -/* 07ACF8 8007A0F8 11C00016 */ beqz $t6, .L8007A154 -/* 07ACFC 8007A0FC 00E01825 */ move $v1, $a3 -/* 07AD00 8007A100 30EF0002 */ andi $t7, $a3, 2 -/* 07AD04 8007A104 11E00014 */ beqz $t7, .L8007A158 -/* 07AD08 8007A108 02002025 */ move $a0, $s0 -/* 07AD0C 8007A10C 12000008 */ beqz $s0, .L8007A130 -/* 07AD10 8007A110 00000000 */ nop -/* 07AD14 8007A114 8E180008 */ lw $t8, 8($s0) -/* 07AD18 8007A118 00E81824 */ and $v1, $a3, $t0 -/* 07AD1C 8007A11C 33190010 */ andi $t9, $t8, 0x10 -/* 07AD20 8007A120 13200003 */ beqz $t9, .L8007A130 -/* 07AD24 8007A124 00000000 */ nop -/* 07AD28 8007A128 1000005E */ b .L8007A2A4 -/* 07AD2C 8007A12C ACB00000 */ sw $s0, ($a1) -.L8007A130: -/* 07AD30 8007A130 ACA20000 */ sw $v0, ($a1) -/* 07AD34 8007A134 8E2A0264 */ lw $t2, 0x264($s1) -/* 07AD38 8007A138 AE200284 */ sw $zero, 0x284($s1) -/* 07AD3C 8007A13C 8D4B0000 */ lw $t3, ($t2) -/* 07AD40 8007A140 00E81824 */ and $v1, $a3, $t0 -/* 07AD44 8007A144 15600057 */ bnez $t3, .L8007A2A4 -/* 07AD48 8007A148 AE2B0264 */ sw $t3, 0x264($s1) -/* 07AD4C 8007A14C 10000055 */ b .L8007A2A4 -/* 07AD50 8007A150 AE20026C */ sw $zero, 0x26c($s1) -.L8007A154: -/* 07AD54 8007A154 02002025 */ move $a0, $s0 -.L8007A158: -/* 07AD58 8007A158 AFA30024 */ sw $v1, 0x24($sp) -/* 07AD5C 8007A15C AFA5002C */ sw $a1, 0x2c($sp) -/* 07AD60 8007A160 AFA60030 */ sw $a2, 0x30($sp) -/* 07AD64 8007A164 0C01E77A */ jal __scTaskReady -/* 07AD68 8007A168 AFA70034 */ sw $a3, 0x34($sp) -/* 07AD6C 8007A16C 8FA30024 */ lw $v1, 0x24($sp) -/* 07AD70 8007A170 8FA5002C */ lw $a1, 0x2c($sp) -/* 07AD74 8007A174 8FA60030 */ lw $a2, 0x30($sp) -/* 07AD78 8007A178 8FA70034 */ lw $a3, 0x34($sp) -/* 07AD7C 8007A17C 2408FFFD */ li $t0, -3 -/* 07AD80 8007A180 10400048 */ beqz $v0, .L8007A2A4 -/* 07AD84 8007A184 2409FFFE */ li $t1, -2 -/* 07AD88 8007A188 8E0D0008 */ lw $t5, 8($s0) -/* 07AD8C 8007A18C 00000000 */ nop -/* 07AD90 8007A190 31AE0007 */ andi $t6, $t5, 7 -/* 07AD94 8007A194 25CFFFFF */ addiu $t7, $t6, -1 -/* 07AD98 8007A198 2DE10007 */ sltiu $at, $t7, 7 -/* 07AD9C 8007A19C 10200041 */ beqz $at, .L8007A2A4 -/* 07ADA0 8007A1A0 000F7880 */ sll $t7, $t7, 2 -/* 07ADA4 8007A1A4 3C01800E */ lui $at, %hi(jpt_800E7970) # $at, 0x800e -/* 07ADA8 8007A1A8 002F0821 */ addu $at, $at, $t7 -/* 07ADAC 8007A1AC 8C2F7970 */ lw $t7, %lo(jpt_800E7970)($at) -/* 07ADB0 8007A1B0 00000000 */ nop -/* 07ADB4 8007A1B4 01E00008 */ jr $t7 -/* 07ADB8 8007A1B8 00000000 */ nop -glabel L8007A1BC -/* 07ADBC 8007A1BC 8E180004 */ lw $t8, 4($s0) -/* 07ADC0 8007A1C0 30EA0002 */ andi $t2, $a3, 2 -/* 07ADC4 8007A1C4 33190020 */ andi $t9, $t8, 0x20 -/* 07ADC8 8007A1C8 13200013 */ beqz $t9, .L8007A218 -/* 07ADCC 8007A1CC 24010003 */ li $at, 3 -/* 07ADD0 8007A1D0 11400034 */ beqz $t2, .L8007A2A4 -/* 07ADD4 8007A1D4 00000000 */ nop -/* 07ADD8 8007A1D8 ACB00000 */ sw $s0, ($a1) -/* 07ADDC 8007A1DC 8E0B0004 */ lw $t3, 4($s0) -/* 07ADE0 8007A1E0 00E81824 */ and $v1, $a3, $t0 -/* 07ADE4 8007A1E4 316C0001 */ andi $t4, $t3, 1 -/* 07ADE8 8007A1E8 11800003 */ beqz $t4, .L8007A1F8 -/* 07ADEC 8007A1EC 00000000 */ nop -/* 07ADF0 8007A1F0 ACD00000 */ sw $s0, ($a2) -/* 07ADF4 8007A1F4 00691824 */ and $v1, $v1, $t1 -.L8007A1F8: -/* 07ADF8 8007A1F8 8E2D0268 */ lw $t5, 0x268($s1) -/* 07ADFC 8007A1FC 00000000 */ nop -/* 07AE00 8007A200 8DAE0000 */ lw $t6, ($t5) -/* 07AE04 8007A204 00000000 */ nop -/* 07AE08 8007A208 15C00026 */ bnez $t6, .L8007A2A4 -/* 07AE0C 8007A20C AE2E0268 */ sw $t6, 0x268($s1) -/* 07AE10 8007A210 10000024 */ b .L8007A2A4 -/* 07AE14 8007A214 AE200270 */ sw $zero, 0x270($s1) -.L8007A218: -/* 07AE18 8007A218 14E10022 */ bne $a3, $at, .L8007A2A4 -/* 07AE1C 8007A21C 00000000 */ nop -/* 07AE20 8007A220 ACD00000 */ sw $s0, ($a2) -/* 07AE24 8007A224 ACB00000 */ sw $s0, ($a1) -/* 07AE28 8007A228 8E380268 */ lw $t8, 0x268($s1) -/* 07AE2C 8007A22C 2401FFFC */ li $at, -4 -/* 07AE30 8007A230 8F190000 */ lw $t9, ($t8) -/* 07AE34 8007A234 00E11824 */ and $v1, $a3, $at -/* 07AE38 8007A238 1720001A */ bnez $t9, .L8007A2A4 -/* 07AE3C 8007A23C AE390268 */ sw $t9, 0x268($s1) -/* 07AE40 8007A240 10000018 */ b .L8007A2A4 -/* 07AE44 8007A244 AE200270 */ sw $zero, 0x270($s1) -glabel L8007A248 -/* 07AE48 8007A248 8E020004 */ lw $v0, 4($s0) -/* 07AE4C 8007A24C 30EC0002 */ andi $t4, $a3, 2 -/* 07AE50 8007A250 304B0002 */ andi $t3, $v0, 2 -/* 07AE54 8007A254 11600007 */ beqz $t3, .L8007A274 -/* 07AE58 8007A258 304D0001 */ andi $t5, $v0, 1 -/* 07AE5C 8007A25C 11800005 */ beqz $t4, .L8007A274 -/* 07AE60 8007A260 304D0001 */ andi $t5, $v0, 1 -/* 07AE64 8007A264 ACB00000 */ sw $s0, ($a1) -/* 07AE68 8007A268 8E020004 */ lw $v0, 4($s0) -/* 07AE6C 8007A26C 00E81824 */ and $v1, $a3, $t0 -/* 07AE70 8007A270 304D0001 */ andi $t5, $v0, 1 -.L8007A274: -/* 07AE74 8007A274 11A0000B */ beqz $t5, .L8007A2A4 -/* 07AE78 8007A278 306E0001 */ andi $t6, $v1, 1 -/* 07AE7C 8007A27C 11C00009 */ beqz $t6, .L8007A2A4 -/* 07AE80 8007A280 00000000 */ nop -/* 07AE84 8007A284 ACD00000 */ sw $s0, ($a2) -/* 07AE88 8007A288 8E2F0268 */ lw $t7, 0x268($s1) -/* 07AE8C 8007A28C 00691824 */ and $v1, $v1, $t1 -/* 07AE90 8007A290 8DF80000 */ lw $t8, ($t7) -/* 07AE94 8007A294 00000000 */ nop -/* 07AE98 8007A298 17000002 */ bnez $t8, .L8007A2A4 -/* 07AE9C 8007A29C AE380268 */ sw $t8, 0x268($s1) -/* 07AEA0 8007A2A0 AE200270 */ sw $zero, 0x270($s1) -.L8007A2A4: -glabel L8007A2A4 -/* 07AEA4 8007A2A4 10670004 */ beq $v1, $a3, .L8007A2B8 -/* 07AEA8 8007A2A8 8FBF001C */ lw $ra, 0x1c($sp) -/* 07AEAC 8007A2AC 1000FF8F */ b .L8007A0EC -/* 07AEB0 8007A2B0 00603825 */ move $a3, $v1 -/* 07AEB4 8007A2B4 8FBF001C */ lw $ra, 0x1c($sp) -.L8007A2B8: -/* 07AEB8 8007A2B8 8FB00014 */ lw $s0, 0x14($sp) -/* 07AEBC 8007A2BC 8FB10018 */ lw $s1, 0x18($sp) -/* 07AEC0 8007A2C0 27BD0028 */ addiu $sp, $sp, 0x28 -/* 07AEC4 8007A2C4 03E00008 */ jr $ra -/* 07AEC8 8007A2C8 00601025 */ move $v0, $v1 - -/* 07AECC 8007A2CC 00000000 */ nop diff --git a/lib/src/mips1/sc/sched.c b/lib/src/mips1/sc/sched.c index 8223c9ef..d3c577fd 100644 --- a/lib/src/mips1/sc/sched.c +++ b/lib/src/mips1/sc/sched.c @@ -159,7 +159,9 @@ static void __scMain(void *arg) { OSScTask *dp = 0; while (1) { + osRecvMesg(&sc->interruptQ, (OSMesg *)&msg, OS_MESG_BLOCK); + switch ((int) msg) { case (VIDEO_MSG): __scHandleRetrace(sc); @@ -501,4 +503,113 @@ void __scYield(OSSched *sc) { } } -GLOBAL_ASM("lib/asm/non_matchings/sched/__scSchedule.s") +/* + * Schedules the tasks to be run on the RCP + */ +s32 __scSchedule(OSSched *sc, OSScTask **sp, OSScTask **dp, s32 availRCP) { + s32 avail = availRCP; + OSScTask *gfx = sc->gfxListHead; + OSScTask *audio = sc->audioListHead; + +#ifdef SC_LOGGING + osLogEvent(l, 517, 3, *sp, *dp, availRCP); +#endif + + if (sc->doAudio && (avail & OS_SC_SP)) { + + if (gfx && (gfx->flags & OS_SC_PARALLEL_TASK)) { + *sp = gfx; + avail &= ~OS_SC_SP; + } else { + *sp = audio; + avail &= ~OS_SC_SP; + sc->doAudio = 0; + sc->audioListHead = sc->audioListHead->next; + if (sc->audioListHead == NULL) + sc->audioListTail = NULL; + } + } else { +#ifdef SC_LOGGING + osLogEvent(l, 520, 1, gfx); +#endif + if (__scTaskReady(gfx)) { + +#ifdef SC_LOGGING + osLogEvent(l, 522, 3, gfx, gfx->state, gfx->flags); +#endif + switch (gfx->flags & OS_SC_TYPE_MASK) { + case (OS_SC_XBUS): + if (gfx->state & OS_SC_YIELDED) { +#ifdef SC_LOGGING + osLogEvent(l, 518, 0); +#endif + /* can hit this if RDP finishes at yield req */ + /* assert(gfx->state & OS_SC_DP); */ + + if (avail & OS_SC_SP) { /* if SP is available */ +#ifdef SC_LOGGING + osLogEvent(l, 519, 0); +#endif + *sp = gfx; + avail &= ~OS_SC_SP; + + if (gfx->state & OS_SC_DP) { /* if it needs DP */ + *dp = gfx; + avail &= ~OS_SC_DP; + + if (avail & OS_SC_DP == 0) + assert(sc->curRDPTask == gfx); + + } + + sc->gfxListHead = sc->gfxListHead->next; + if (sc->gfxListHead == NULL) + sc->gfxListTail = NULL; + + } + } else { + if (avail == (OS_SC_SP | OS_SC_DP)) { + *sp = *dp = gfx; + avail &= ~(OS_SC_SP | OS_SC_DP); + sc->gfxListHead = sc->gfxListHead->next; + if (sc->gfxListHead == NULL) + sc->gfxListTail = NULL; + } + } + + break; + + case (OS_SC_DRAM): + case (OS_SC_DP_DRAM): + case (OS_SC_DP_XBUS): + if (gfx->state & OS_SC_SP) { /* if needs SP */ + if (avail & OS_SC_SP) { /* if SP is available */ + *sp = gfx; + avail &= ~OS_SC_SP; + } + } + //This is else if in libreultra, and it's the only difference + if (gfx->state & OS_SC_DP) { /* if needs DP */ + if (avail & OS_SC_DP) { /* if DP available */ + *dp = gfx; + avail &= ~OS_SC_DP; + sc->gfxListHead = sc->gfxListHead->next; + if (sc->gfxListHead == NULL) + sc->gfxListTail = NULL; + } + } + break; + + case (OS_SC_SP_DRAM): + case (OS_SC_SP_XBUS): + default: + break; + } + } + } + + if (avail != availRCP) + avail = __scSchedule(sc, sp, dp, avail); + + return avail; +} diff --git a/lib/src/mips1/sc/sched.h b/lib/src/mips1/sc/sched.h index 77d0735b..74f51d5d 100644 --- a/lib/src/mips1/sc/sched.h +++ b/lib/src/mips1/sc/sched.h @@ -99,11 +99,7 @@ extern OSViMode osViModeTable[]; /*******************************/ void __scYield(OSSched *sc); -#if 1 static void __scMain(void *arg); -#else -void __scMain(void *arg); -#endif void __scExec(OSSched *sc, OSScTask *sp, OSScTask *dp); void osCreateScheduler(OSSched *sc, void *stack, OSPri priority, u8 mode, u8 numFields); void osScAddClient(OSSched *sc, OSScClient *c, OSMesgQueue *msgQ, u8 arg3); @@ -119,5 +115,6 @@ s32 __scTaskComplete(OSSched *sc, OSScTask *t); void __scAppendList(OSSched *sc, OSScTask *t); void __scExec(OSSched *sc, OSScTask *sp, OSScTask *dp); void __scHandleRetrace(OSSched *sc); +static s32 __scSchedule(OSSched *sc, OSScTask **sp, OSScTask **dp, s32 availRCP); #endif