From 2bc159e518ae804bdb1b9ad468b30feef7e5fc2e Mon Sep 17 00:00:00 2001 From: Derek Hensley Date: Wed, 31 Jan 2024 16:26:31 -0800 Subject: [PATCH] Irqmgr and Sched Retail OK (#1678) * irqmgr OK * sched OK * PR review renames --- src/code/irqmgr.c | 7 ++- src/code/sched.c | 128 +++++++++++++++++++++------------------------- 2 files changed, 64 insertions(+), 71 deletions(-) diff --git a/src/code/irqmgr.c b/src/code/irqmgr.c index b258bc9652..71eaeb4ddb 100644 --- a/src/code/irqmgr.c +++ b/src/code/irqmgr.c @@ -253,31 +253,36 @@ void IrqMgr_ThreadEntry(void* arg) { case IRQ_RETRACE_MSG: IrqMgr_HandleRetrace(irqMgr); break; + case IRQ_PRENMI_MSG: PRINTF("PRE_NMI_MSG\n"); // "Scheduler: Receives PRE_NMI message" PRINTF("スケジューラ:PRE_NMIメッセージを受信\n"); IrqMgr_HandlePreNMI(irqMgr); break; + case IRQ_PRENMI450_MSG: PRINTF("PRENMI450_MSG\n"); // "Scheduler: Receives PRENMI450 message" PRINTF("スケジューラ:PRENMI450メッセージを受信\n"); IrqMgr_HandlePreNMI450(irqMgr); break; + case IRQ_PRENMI480_MSG: PRINTF("PRENMI480_MSG\n"); // "Scheduler: Receives PRENMI480 message" PRINTF("スケジューラ:PRENMI480メッセージを受信\n"); IrqMgr_HandlePreNMI480(irqMgr); break; + case IRQ_PRENMI500_MSG: PRINTF("PRENMI500_MSG\n"); // "Scheduler: Receives PRENMI500 message" PRINTF("スケジューラ:PRENMI500メッセージを受信\n"); - exit = true; IrqMgr_HandlePreNMI500(irqMgr); + exit = true; break; + default: // "Unexpected message received" PRINTF("irqmgr.c:予期しないメッセージを受け取りました(%08x)\n", msg); diff --git a/src/code/sched.c b/src/code/sched.c index 444e01e96f..7f9efa076a 100644 --- a/src/code/sched.c +++ b/src/code/sched.c @@ -45,34 +45,44 @@ #define RDP_DONE_MSG 668 #define NOTIFY_MSG 670 // original name: ENTRY_MSG -vs32 sLogScheduler = false; +vs32 sSchedDebugPrintfEnabled = false; OSTime sRSPGfxTimeStart; OSTime sRSPAudioTimeStart; OSTime sRSPOtherTimeStart; OSTime sRDPTimeStart; +#if OOT_DEBUG +#define SCHED_DEBUG_PRINTF \ + if (sSchedDebugPrintfEnabled) \ + PRINTF +#elif defined(__sgi) +// See comment about PRINTF in macros.h +#define SCHED_DEBUG_PRINTF(args) (void)0 +#else +#define SCHED_DEBUG_PRINTF(format, ...) (void)0 +#endif + /** * Set the current framebuffer to the swapbuffer pointed to by the provided cfb */ void Sched_SwapFrameBufferImpl(CfbInfo* cfbInfo) { - u16 width; - LOG_UTILS_CHECK_VALID_POINTER("cfbinfo->swapbuffer", cfbInfo->swapBuffer, "../sched.c", 340); if (cfbInfo->swapBuffer != NULL) { // Register the swapbuffer to display on next VI osViSwapBuffer(cfbInfo->swapBuffer); cfbInfo->updateTimer = cfbInfo->updateRate; + SCHED_DEBUG_PRINTF("osViSwapBuffer %08x %08x %08x\n", osViGetCurrentFramebuffer(), osViGetNextFramebuffer(), + (cfbInfo != NULL) ? cfbInfo->swapBuffer : NULL); - if (sLogScheduler) { - PRINTF("osViSwapBuffer %08x %08x %08x\n", osViGetCurrentFramebuffer(), osViGetNextFramebuffer(), - (cfbInfo != NULL) ? cfbInfo->swapBuffer : NULL); + { + u16 width = (cfbInfo->viMode != NULL) ? cfbInfo->viMode->comRegs.width : (u32)gScreenWidth; + + Fault_SetFrameBuffer(cfbInfo->swapBuffer, width, 16); } - width = (cfbInfo->viMode != NULL) ? cfbInfo->viMode->comRegs.width : (u32)gScreenWidth; - Fault_SetFrameBuffer(cfbInfo->swapBuffer, width, 16); - +#if OOT_DEBUG if (R_HREG_MODE == HREG_MODE_SCHED && R_SCHED_INIT != HREG_MODE_SCHED) { R_SCHED_TOGGLE_SPECIAL_FEATURES = 0; R_SCHED_GAMMA_ON = 0; @@ -100,6 +110,7 @@ void Sched_SwapFrameBufferImpl(CfbInfo* cfbInfo) { osViSetSpecialFeatures(R_SCHED_GAMMA_DITHER_ON ? OS_VI_GAMMA_DITHER_ON : OS_VI_GAMMA_DITHER_OFF); osViSetSpecialFeatures(R_SCHED_DIVOT_ON ? OS_VI_DIVOT_ON : OS_VI_DIVOT_OFF); } +#endif } cfbInfo->unk_10 = 0; @@ -117,6 +128,7 @@ void Sched_SwapFrameBuffer(Scheduler* sc, CfbInfo* cfbInfo) { } void Sched_HandlePreNMI(Scheduler* sc) { +#if OOT_DEBUG OSTime now; if (sc->curRSPTask != NULL) { @@ -143,6 +155,7 @@ void Sched_HandlePreNMI(Scheduler* sc) { } } } +#endif } void Sched_HandleNMI(Scheduler* sc) { @@ -161,10 +174,9 @@ void Sched_QueueTask(Scheduler* sc, OSScTask* task) { 463); if (type == M_AUDTASK) { - if (sLogScheduler) { - // "You have entered an audio task" - PRINTF("オーディオタスクをエントリしました\n"); - } + // "You have entered an audio task" + SCHED_DEBUG_PRINTF("オーディオタスクをエントリしました\n"); + // Add to audio queue if (sc->audioListTail != NULL) { sc->audioListTail->next = task; @@ -176,10 +188,10 @@ void Sched_QueueTask(Scheduler* sc, OSScTask* task) { // Set audio flag sc->doAudio = true; } else { - if (sLogScheduler) { - // "Entered graph task" - PRINTF("グラフタスクをエントリしました\n"); - } + + // "Entered graph task" + SCHED_DEBUG_PRINTF("グラフタスクをエントリしました\n"); + // Add to graphics queue if (sc->gfxListTail != NULL) { sc->gfxListTail->next = task; @@ -202,9 +214,7 @@ void Sched_Yield(Scheduler* sc) { // Send yield request osSpTaskYield(); - if (sLogScheduler) { - PRINTF("%08d:osSpTaskYield\n", (u32)(OS_CYCLES_TO_USEC(osGetTime()))); - } + SCHED_DEBUG_PRINTF("%08d:osSpTaskYield\n", (u32)(OS_CYCLES_TO_USEC(osGetTime()))); } } @@ -405,11 +415,9 @@ void Sched_RunTask(Scheduler* sc, OSScTask* spTask, OSScTask* dpTask) { // Run RSP osSpTaskStartGo(&spTask->list); - if (sLogScheduler) { - PRINTF( - "%08d:osSpTaskStartGo(%08x) %s\n", (u32)OS_CYCLES_TO_USEC(osGetTime()), &spTask->list, - (spTask->list.t.type == M_AUDTASK ? "AUDIO" : (spTask->list.t.type == M_GFXTASK ? "GRAPH" : "OTHER"))); - } + SCHED_DEBUG_PRINTF( + "%08d:osSpTaskStartGo(%08x) %s\n", (u32)OS_CYCLES_TO_USEC(osGetTime()), &spTask->list, + (spTask->list.t.type == M_AUDTASK ? "AUDIO" : (spTask->list.t.type == M_GFXTASK ? "GRAPH" : "OTHER"))); // Set currently running RSP task sc->curRSPTask = spTask; @@ -442,9 +450,8 @@ void Sched_HandleNotification(Scheduler* sc) { // signal to the currently running task to yield the RSP so that the audio task may // be ran as soon as possible. if (sc->doAudio && sc->curRSPTask != NULL) { - if (sLogScheduler) { - PRINTF("[YIELD B]"); - } + SCHED_DEBUG_PRINTF("[YIELD B]"); + Sched_Yield(sc); return; } @@ -454,15 +461,12 @@ void Sched_HandleNotification(Scheduler* sc) { if (Sched_Schedule(sc, &nextRSP, &nextRDP, state) != state) { Sched_RunTask(sc, nextRSP, nextRDP); } - if (sLogScheduler) { - PRINTF("EN sc:%08x sp:%08x dp:%08x state:%x\n", sc, nextRSP, nextRDP, state); - } + SCHED_DEBUG_PRINTF("EN sc:%08x sp:%08x dp:%08x state:%x\n", sc, nextRSP, nextRDP, state); } void Sched_HandleRetrace(Scheduler* sc) { - if (sLogScheduler) { - PRINTF("%08d:scHandleRetrace %08x\n", (u32)OS_CYCLES_TO_USEC(osGetTime()), osViGetCurrentFramebuffer()); - } + SCHED_DEBUG_PRINTF("%08d:scHandleRetrace %08x\n", (u32)OS_CYCLES_TO_USEC(osGetTime()), osViGetCurrentFramebuffer()); + ViConfig_UpdateBlack(); sc->retraceCount++; @@ -490,11 +494,9 @@ void Sched_HandleRetrace(Scheduler* sc) { } } - if (sLogScheduler) { - PRINTF("%08x %08x %08x %d\n", osViGetCurrentFramebuffer(), osViGetNextFramebuffer(), - (sc->pendingSwapBuf1 != NULL) ? sc->pendingSwapBuf1->swapBuffer : NULL, - (sc->curBuf != NULL) ? sc->curBuf->updateTimer : 0); - } + SCHED_DEBUG_PRINTF("%08x %08x %08x %d\n", osViGetCurrentFramebuffer(), osViGetNextFramebuffer(), + (sc->pendingSwapBuf1 != NULL) ? sc->pendingSwapBuf1->swapBuffer : NULL, + (sc->curBuf != NULL) ? sc->curBuf->updateTimer : 0); // Run the notification handler to enqueue any waiting tasks and possibly run one Sched_HandleNotification(sc); @@ -524,14 +526,11 @@ void Sched_HandleRSPDone(Scheduler* sc) { curRSPTask = sc->curRSPTask; sc->curRSPTask = NULL; - if (sLogScheduler) { - PRINTF("RSP DONE %d %d", curRSPTask->state & OS_SC_YIELD, osSpTaskYielded(&curRSPTask->list)); - } + SCHED_DEBUG_PRINTF("RSP DONE %d %d", curRSPTask->state & OS_SC_YIELD, osSpTaskYielded(&curRSPTask->list)); if ((curRSPTask->state & OS_SC_YIELD) && osSpTaskYielded(&curRSPTask->list)) { - if (sLogScheduler) { - PRINTF("[YIELDED]\n"); - } + SCHED_DEBUG_PRINTF("[YIELDED]\n"); + // Task yielded, set yielded state curRSPTask->state |= OS_SC_YIELDED; // Add it to the front of the queue @@ -541,9 +540,7 @@ void Sched_HandleRSPDone(Scheduler* sc) { sc->gfxListTail = curRSPTask; } } else { - if (sLogScheduler) { - PRINTF("[NOT YIELDED]\n"); - } + SCHED_DEBUG_PRINTF("[NOT YIELDED]\n"); // Task has completed on the RSP, unset RSP flag and check if the task is fully complete curRSPTask->state &= ~OS_SC_SP; Sched_TaskComplete(sc, curRSPTask); @@ -554,9 +551,7 @@ void Sched_HandleRSPDone(Scheduler* sc) { if (Sched_Schedule(sc, &nextRSP, &nextRDP, state) != state) { Sched_RunTask(sc, nextRSP, nextRDP); } - if (sLogScheduler) { - PRINTF("SP sc:%08x sp:%08x dp:%08x state:%x\n", sc, nextRSP, nextRDP, state); - } + SCHED_DEBUG_PRINTF("SP sc:%08x sp:%08x dp:%08x state:%x\n", sc, nextRSP, nextRDP, state); } /** @@ -588,9 +583,7 @@ void Sched_HandleRDPDone(Scheduler* sc) { if (Sched_Schedule(sc, &nextRSP, &nextRDP, state) != state) { Sched_RunTask(sc, nextRSP, nextRDP); } - if (sLogScheduler) { - PRINTF("DP sc:%08x sp:%08x dp:%08x state:%x\n", sc, nextRSP, nextRDP, state); - } + SCHED_DEBUG_PRINTF("DP sc:%08x sp:%08x dp:%08x state:%x\n", sc, nextRSP, nextRDP, state); } /** @@ -601,9 +594,7 @@ void Sched_HandleRDPDone(Scheduler* sc) { * Original name: osScKickEntryMsg */ void Sched_Notify(Scheduler* sc) { - if (sLogScheduler) { - PRINTF("osScKickEntryMsg\n"); - } + SCHED_DEBUG_PRINTF("osScKickEntryMsg\n"); osSendMesg(&sc->interruptQueue, (OSMesg)NOTIFY_MSG, OS_MESG_BLOCK); } @@ -613,41 +604,38 @@ void Sched_ThreadEntry(void* arg) { Scheduler* sc = (Scheduler*)arg; while (true) { - if (sLogScheduler) { - // "%08d: standby" - PRINTF("%08d:待機中\n", (u32)OS_CYCLES_TO_USEC(osGetTime())); - } + // "%08d: standby" + SCHED_DEBUG_PRINTF("%08d:待機中\n", (u32)OS_CYCLES_TO_USEC(osGetTime())); // Await interrupt messages, either from the OS, IrqMgr, or another thread osRecvMesg(&sc->interruptQueue, &msg, OS_MESG_BLOCK); switch ((s32)msg) { case NOTIFY_MSG: - if (sLogScheduler) { - PRINTF("%08d:ENTRY_MSG\n", (u32)OS_CYCLES_TO_USEC(osGetTime())); - } + SCHED_DEBUG_PRINTF("%08d:ENTRY_MSG\n", (u32)OS_CYCLES_TO_USEC(osGetTime())); Sched_HandleNotification(sc); continue; + case RSP_DONE_MSG: - if (sLogScheduler) { - PRINTF("%08d:RSP_DONE_MSG\n", (u32)OS_CYCLES_TO_USEC(osGetTime())); - } + SCHED_DEBUG_PRINTF("%08d:RSP_DONE_MSG\n", (u32)OS_CYCLES_TO_USEC(osGetTime())); Sched_HandleRSPDone(sc); continue; + case RDP_DONE_MSG: - if (sLogScheduler) { - PRINTF("%08d:RDP_DONE_MSG\n", (u32)OS_CYCLES_TO_USEC(osGetTime())); - } + SCHED_DEBUG_PRINTF("%08d:RDP_DONE_MSG\n", (u32)OS_CYCLES_TO_USEC(osGetTime())); Sched_HandleRDPDone(sc); continue; } + switch (((OSScMsg*)msg)->type) { case OS_SC_RETRACE_MSG: Sched_HandleRetrace(sc); continue; + case OS_SC_PRE_NMI_MSG: Sched_HandlePreNMI(sc); continue; + case OS_SC_NMI_MSG: Sched_HandleNMI(sc); continue;