From 123c1e4bee2b7d1e1cde13d8893398e0657e160c Mon Sep 17 00:00:00 2001 From: Elliot Nunn Date: Fri, 23 Mar 2018 17:23:06 +0800 Subject: [PATCH] Work on the scheduler and interrupt handling code --- Internal/EmulatorPublic.a | 2 +- Internal/InfoRecords.a | 6 +- Internal/NKOpaque.a | 52 ++- Internal/NKPublic.a | 37 +- NanoKernel/NKConsoleLog.s | 4 +- NanoKernel/NKInit.s | 22 +- NanoKernel/NKInterrupts.s | 699 ++++++++++++++++-------------- NanoKernel/NKMPCalls.s | 179 ++++---- NanoKernel/NKMacros.s | 12 +- NanoKernel/NKPaging.s | 2 +- NanoKernel/NKPrimaryIntHandlers.s | 98 +++-- NanoKernel/NKScheduler.s | 252 ++++++----- NanoKernel/NKSleep.s | 2 +- NanoKernel/NKSync.s | 30 +- NanoKernel/NKTasks.s | 53 +-- NanoKernel/NKThud.s | 2 +- NanoKernel/NKTimers.s | 34 +- NanoKernel/NKTranslation.s | 6 +- NanoKernel/NKVMCalls.s | 48 +- 19 files changed, 866 insertions(+), 674 deletions(-) diff --git a/Internal/EmulatorPublic.a b/Internal/EmulatorPublic.a index d5c6f94..8d58b8a 100644 --- a/Internal/EmulatorPublic.a +++ b/Internal/EmulatorPublic.a @@ -88,7 +88,7 @@ MSR ds.l 1 ; 0a4 ; (SPAC) copied from kdp by CreateTask org 0xc4 MQ ds.l 1 ; 0c4 ; 601 only EDPOffsetSWIRelated ds.l 1 ; 0c8 -PriorityShifty ds.l 1 ; 0cc ; if low nybble is empty, InitRDYQs sets this to 2 +PriorityShifty ds.l 1 ; 0cc ; if low nybble is empty, SchInit sets this to 2 SWIEventGroupID ds.l 1 ; 0d0 ; what? XER ds.l 1 ; 0d4 VectorSaveArea ds.l 1 ; 0d8 ; AltiVec hack: vector registers don't fit in CB! diff --git a/Internal/InfoRecords.a b/Internal/InfoRecords.a index 8644f07..46cd980 100644 --- a/Internal/InfoRecords.a +++ b/Internal/InfoRecords.a @@ -328,7 +328,7 @@ VMDispatchCountTblPtr ds.l 1 ; 128, kdp+ee8 ds.l 1 ds.l 1 MPDispatchCountTblPtr ds.l 1 ; 134, kdp+ef4 ; ??????? -AddrSpcSetCtr ds.l 1 ; 138, kdp+ef8 ; incremented by SetSpaceSRsAndBATs +AddrSpcSetCtr ds.l 1 ; 138, kdp+ef8 ; incremented by SchSwitchSpace IDCtr ds.l 1 ; 13c, kdp+efc org 0x160 @@ -399,9 +399,7 @@ ProcessorFlags ds.l 1 ; 048, kdp+f68 ; flags to specify processor features org 0x05e SetToZero ds.w 1 ; 05e, kdp+f7e ; by same code that sets below -CpuClockRateHzCopy ds.l 1 ; 060, kdp+f80 ; copies by Init.s -BusClockRateHzCopy ds.l 1 ; 064, kdp+f84 ; copies by Init.s -DecClockRateHzCopy ds.l 1 ; 068, kdp+f88 ; copies by Init.s +ClockRates ds.b 16*4 ; 060:0a0, kdp:f80:fc0 ; 16b blks of cpu/bus/dec/?? speeds (Hz) endr diff --git a/Internal/NKOpaque.a b/Internal/NKOpaque.a index 91b0a07..8cd9e9a 100644 --- a/Internal/NKOpaque.a +++ b/Internal/NKOpaque.a @@ -139,13 +139,13 @@ kFlag17 equ 17 kFlag18 equ 18 kFlag19 equ 19 kFlag20 equ 20 -kFlag21 equ 21 +kFlagPMF equ 21 ; set by MPMarkPMFTask, means perf monitor kFlag22 equ 22 kFlag23 equ 23 kFlag24 equ 24 kFlag25 equ 25 ; set for idle1, idle2 kFlag26 equ 26 ; set for blue -kFlag27 equ 27 ; set on SWI +kFlag68kInterrupt equ 27 ; set on SWI (meaning 68k, or 68k interrupt?) kFlag28 equ 28 ; set for blue kFlag29 equ 29 kFlag30 equ 30 @@ -164,11 +164,7 @@ VectorSaveArea ds.l 1 ; 08c ds.l 1 ; 094 ds.l 1 ; 098 NotificationPtr ds.l 1 ; 09c -SemaphoreLLL ds.l 4 ; 0a0:0b0 -Zero ds.l 1 ; 0b0 -One ds.l 1 ; 0b4 - ds.l 1 ; 0b8 - ds.l 1 ; 0bc +Semaphore ds.b 32 ; 0a0:0c0 ; Zero and One were fields Zero1 ds.l 1 ; 0c0 Zero2 ds.l 1 ; 0c4 CreateTime1 ds.d 1 ; 0c8 @@ -178,7 +174,7 @@ CreateTime2 ds.d 1 ; 0d0 Zero3 ds.l 1 ; 0e0 Zero4 ds.l 1 ; 0e4 Zero5 ds.l 1 ; 0e8 - ds.l 1 ; 0ec +SomeLabelField ds.l 1 ; 0ec YellowVecTblPtr ds.l 1 ; 0f0 ExceptionHandlerID ds.l 1 ; 0f4 ; a queue ErrToReturnIfIDie ds.l 1 ; 0f8 @@ -275,7 +271,7 @@ Size equ * ReadyQueue record 0,INCR LLL ds.l 4 ; 00:10 ; nothing fancy, freeform contains priority flag -Counter ds.l 1 ; 10 ; InitRDYQs sets, TaskReadyAsNext bumps, major_0x13e4c decs +Counter ds.l 1 ; 10 ; SchInit sets, SchRdyTaskLater bumps, major_0x13e4c decs TotalWeight ds.l 1 ; 14 ; divide available time by these Timecake ds.d 1 ; 18 ; period of ~1ms, 8ms, 64ms, 512ms @@ -386,12 +382,46 @@ kSignature equ 'CPU ' ID ds.l 1 ; 00 Signature ds.l 1 ; 04 LLL ds.l 4 ; 08:18 ; member of CGRP -Eff ds.l 1 ; 18 ; contains 0x0000000f ; cannot delete if this field & 9 +Flags ds.l 1 ; 18 ; contains 0x0000000f ; cannot delete if this field & 9 IdleTaskPtr ds.l 1 ; 1c EWABase ds.b 800 ; negative-indexed parts of EWA EWA ds.b 128 ; positive-indexed parts of EWA +kFlag0 equ 0 +kFlag1 equ 1 +kFlag2 equ 2 +kFlag3 equ 3 +kFlag4 equ 4 +kFlag5 equ 5 +kFlag6 equ 6 +kFlag7 equ 7 +kFlag8 equ 8 +kFlag9 equ 9 +kFlag10 equ 10 +kFlag11 equ 11 +kFlag12 equ 12 +kFlag13 equ 13 +kFlag14 equ 14 +kFlag15 equ 15 +kFlag16 equ 16 +kFlag17 equ 17 +kFlag18 equ 18 +kFlag19 equ 19 +kFlag20 equ 20 +kFlag21 equ 21 +kFlag22 equ 22 +kFlag23 equ 23 +kFlag24 equ 24 +kFlag25 equ 25 +kFlag26 equ 26 +kFlag27 equ 27 +kFlagScheduled equ 28 +kFlag29 equ 29 +kFlag30 equ 30 +kFlag31 equ 31 + + Size equ * endr @@ -555,7 +585,7 @@ LogicalBase ds.l 1 ; 24 LogicalEnd ds.l 1 ; 28 ; the last valid address in the area Length ds.l 1 ; 2c ; in actual bytes! LogicalSeparation ds.l 1 ; 30 ; min logical distance to any other area - ds.l 1 ; 34 +Counter ds.l 1 ; 34 BytesMapped ds.l 1 ; 38 ; total size of pages actually mapped to me FaultCtrArrayPtr ds.l 1 ; 3c ; in paged areas, tracks how many times pages are added to HTAB PageMapArrayPtr ds.l 1 ; 40 ; in paged areas, stores PTE template for each page diff --git a/Internal/NKPublic.a b/Internal/NKPublic.a index ffbc659..3abfd63 100644 --- a/Internal/NKPublic.a +++ b/Internal/NKPublic.a @@ -396,7 +396,7 @@ SIGPCallR10 ds.l 1 ; -21c, cpu+124 SchEvalFlag ds.b 1 ; -118, cpu+228 TaskPriority ds.b 1 ; -117, cpu+229 CPUIndex ds.w 1 ; -116, cpu+22a - ds.l 1 ; -114, cpu+22c +WeMightClear ds.l 1 ; -114, cpu+22c ; still boots if not cleared ds.l 1 ; -110, cpu+230 ds.l 1 ; -10c, cpu+234 ds.l 1 ; -108, cpu+238 @@ -408,7 +408,7 @@ CPUIndex ds.w 1 ; -116, cpu+22a ds.l 1 ; -0f0, cpu+250 ds.l 1 ; -0ec, cpu+254 ds.l 1 ; -0e8, cpu+258 - ds.l 1 ; -0e4, cpu+25c +SpecialAreaPtr ds.l 1 ; -0e4, cpu+25c ds.l 1 ; -0e0, cpu+260 ds.l 1 ; -0dc, cpu+264 ds.l 1 ; -0d8, cpu+268 @@ -504,6 +504,39 @@ r31 ds.l 1 ; 07c, cpu+3bc ; Fun fact: offsets past here contain the main kernel globals ; ("Kernel Data Page"), but only on CPU-0. +kFlag0 equ 0 +kFlag1 equ 1 +kFlag2 equ 2 +kFlag3 equ 3 +kFlag4 equ 4 +kFlag5 equ 5 +kFlag6 equ 6 +kFlag7 equ 7 +kFlag8 equ 8 +kFlag9 equ 9 +kFlagBlue equ 10 ; could mean "currently in interrupt mode" +kFlag11 equ 11 +kFlag12 equ 12 +kFlag13 equ 13 +kFlag14 equ 14 +kFlag15 equ 15 +kFlag16 equ 16 +kFlag17 equ 17 +kFlag18 equ 18 +kFlag19 equ 19 +kFlag20 equ 20 +kFlag21 equ 21 +kFlag22 equ 22 +kFlag23 equ 23 +kFlag24 equ 24 +kFlag25 equ 25 +kFlag26 equ 26 +kFlag27 equ 27 +kFlag28 equ 28 +kFlag29 equ 29 +kFlag30 equ 30 +kFlag31 equ 31 + endr diff --git a/NanoKernel/NKConsoleLog.s b/NanoKernel/NKConsoleLog.s index 6295c9a..24b28a0 100644 --- a/NanoKernel/NKConsoleLog.s +++ b/NanoKernel/NKConsoleLog.s @@ -33,7 +33,7 @@ ; major_0x12b94 ; InitTMRQs ; StartTimeslicing -; InitRDYQs +; SchInit ; major_0x14bcc ; panic ; major_0x18040 @@ -360,7 +360,7 @@ printd_0x120 ; createarea ; ExtendPool ; major_0x12b94 -; InitRDYQs +; SchInit ; major_0x14bcc ; panic ; print_xpt_info diff --git a/NanoKernel/NKInit.s b/NanoKernel/NKInit.s index c83bc8e..ee31577 100644 --- a/NanoKernel/NKInit.s +++ b/NanoKernel/NKInit.s @@ -175,13 +175,13 @@ FinishInitBuiltin ; Copy some choice values out of KDP's copy of NKProcessorInfo lwz r9, KDP.ProcessorInfo + NKProcessorInfo.DecClockRateHz(r1) - stw r9, KDP.ProcessorInfo + NKProcessorInfo.DecClockRateHzCopy(r1) + stw r9, KDP.ProcessorInfo + NKProcessorInfo.ClockRates + 8(r1) lwz r9, KDP.ProcessorInfo + NKProcessorInfo.BusClockRateHz(r1) - stw r9, KDP.ProcessorInfo + NKProcessorInfo.BusClockRateHzCopy(r1) + stw r9, KDP.ProcessorInfo + NKProcessorInfo.ClockRates + 4(r1) lwz r9, KDP.ProcessorInfo + NKProcessorInfo.CpuClockRateHz(r1) - stw r9, KDP.ProcessorInfo + NKProcessorInfo.CpuClockRateHzCopy(r1) + stw r9, KDP.ProcessorInfo + NKProcessorInfo.ClockRates + 0(r1) li r9, 0 sth r9, KDP.ProcessorInfo + NKProcessorInfo.SetToZero(r1) @@ -873,7 +873,7 @@ SetProcessorFlags ; Actually populate something useful (still have one unused long) lisori r8, 15 - stw r8, CPU.Eff(r31) + stw r8, CPU.Flags(r31) ; Matches code in KCCreateCpuStruct very closely @@ -1094,7 +1094,7 @@ SetProcessorFlags ; One ready for each task priority (critical, etc) - bl InitRDYQs + bl SchInit @@ -1102,7 +1102,7 @@ SetProcessorFlags lwz r8, EWA.PA_CurAddressSpace(r1) li r9, 0 - bl SetSpaceSRsAndBATs + bl SchSwitchSpace @@ -1192,14 +1192,14 @@ SetProcessorFlags ; CLOB r16, r17, r18 mr r8, r31 - bl TaskReadyAsPrev + bl SchRdyTaskNow bl CalculateTimeslice ; Do some things I do not understand - bl major_0x14af8_0xa0 + bl FlagSchEval bl StartTimeslicing @@ -1255,7 +1255,7 @@ av set PSA.AVFeatureBit ; Point task ECB at the idle loop within the nanokernel code lwz r8, KDP.PA_NanoKernelCode(r1) - llabel r26, IdleCode + llabel r26, SchIdleTask add r8, r8, r26 stw r8, Task.ContextBlock + ContextBlock.CodePtr(r31) @@ -1283,7 +1283,7 @@ av set PSA.AVFeatureBit ; CLOB r16, r17, r18 mr r8, r31 - bl TaskReadyAsPrev + bl SchRdyTaskNow bl CalculateTimeslice @@ -1865,7 +1865,7 @@ ReconcileMemory mfsprg r8, 0 mtxer r9 - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 b kcPrioritizeInterrupts diff --git a/NanoKernel/NKInterrupts.s b/NanoKernel/NKInterrupts.s index 2af49d7..7ad49b7 100644 --- a/NanoKernel/NKInterrupts.s +++ b/NanoKernel/NKInterrupts.s @@ -1,14 +1,36 @@ +ecNoException equ 0 +ecSystemCall equ 1 +ecTrapInstr equ 2 +ecFloatException equ 3 +ecInvalidInstr equ 4 +ecPrivilegedInstr equ 5 +ecMachineCheck equ 7 +ecInstTrace equ 8 +ecInstInvalidAddress equ 10 +ecInstHardwareFault equ 11 +ecInstPageFault equ 12 +ecInstSupAccessViolation equ 14 +ecDataInvalidAccess equ 18 +ecDataHardwareFault equ 19 +ecDataPageFault equ 20 +ecDataWriteViolation equ 21 +ecDataSupAccessViolation equ 22 +ecDataSupWriteViolation equ 23 +ecUnknown24 equ 24 + + + Local_Panic set * b panic -; major_0x02964 +; IntLocalBlockMPCall ; Xrefs: ; major_0x02ccc -major_0x02964 ; OUTSIDE REFERER +IntLocalBlockMPCall ; OUTSIDE REFERER b BlockMPCall @@ -73,10 +95,10 @@ major_0x02980 ; OUTSIDE REFERER stw r8, 0x016c(r6) cmpwi cr1, r9, 0x14 blt- cr4, major_0x04a20_0x18 - bne- cr2, major_0x02ccc_0x310 + bne- cr2, TaskApproachTwo blt- major_0x02980_0xa8 bne- cr1, major_0x02980_0x178 - b major_0x02ccc_0x310 + b TaskApproachTwo major_0x02980_0xa8 mfsprg r1, 0 @@ -95,11 +117,11 @@ major_0x02980_0xa8 lwz r3, 0x0654(r1) blt- cr2, major_0x02980_0xec lwz r3, 0x05b4(r1) - rlwinm r11, r11, 0, 17, 15 + _bclr r11, r11, 16 major_0x02980_0xec lwz r12, 0x0648(r1) - bsol- cr6, major_0x02980_0x114 + bsol- cr6, PreferRegistersFromEWASavingContextBlock rlwinm r7, r7, 0, 29, 16 rlwimi r11, r7, 0, 20, 23 b IntReturn @@ -111,48 +133,57 @@ major_0x02980_0x100 lwz r5, 0x0014(r1) blr -major_0x02980_0x114 ; OUTSIDE REFERER +PreferRegistersFromEWASavingContextBlock ; OUTSIDE REFERER mfsprg r8, 0 stw r17, 0x0064(r6) stw r20, 0x0068(r6) stw r21, 0x006c(r6) stw r19, 0x0074(r6) stw r18, 0x007c(r6) - lmw r14, 0x0038(r8) + lmw r14, EWA.r14(r8) blr + + + + + major_0x02980_0x134 ; OUTSIDE REFERER mfsprg r1, 0 - mtcrf 0x3f, r7 + mtcrf 0x3f, r7 lwz r9, EWA.Enables(r1) - lwz r1, -0x0004(r1) - rlwnm. r9, r9, r8, 0x00, 0x00 + lwz r1, EWA.PA_KDP(r1) + rlwnm. r9, r9, r8, 0, 0 rlwimi r7, r8, 24, 0, 7 - slwi r8, r8, 2 + + slwi r8, r8, 2 add r8, r8, r1 - lwz r9, 0x0dc0(r8) - addi r9, r9, 0x01 - stw r9, 0x0dc0(r8) + lwz r9, KDP.NanoKernelInfo + NKNanoKernelInfo.ExceptionCauseCounts(r8) + addi r9, r9, 1 + stw r9, KDP.NanoKernelInfo + NKNanoKernelInfo.ExceptionCauseCounts(r8) + srwi r9, r7, 24 - blt- cr4, major_0x04a20_0x18 - bne- cr2, major_0x02ccc_0x2a4 - cmpwi cr1, r9, 0x0c - blt+ major_0x02980_0xa8 - beq- cr1, major_0x02ccc_0x2a4 + + bc BO_IF, EWA.kFlag16, major_0x04a20_0x18 + bc BO_IF_NOT, EWA.kFlagBlue, TaskApproachOne + cmpwi cr1, r9, ecInstPageFault + blt+ major_0x02980_0xa8 ; when Enables[cause] is set! + beq- cr1, TaskApproachOne major_0x02980_0x178 ; OUTSIDE REFERER - lwz r1, -0x0004(r1) + lwz r1, EWA.PA_KDP(r1) lwz r9, KDP.PA_ECB(r1) - addi r8, r1, 0x360 + addi r8, r1, KDP.YellowVecBase mtsprg 3, r8 - bltl- cr2, BlueException + + bcl BO_IF, 8, SuspendBlueTask ; does not return major_0x02980_0x18c ; OUTSIDE REFERER mfsprg r1, 0 lwz r8, EWA.Enables(r1) stw r7, ContextBlock.Flags(r6) stw r8, ContextBlock.Enables(r6) - bns- cr6, major_0x02980_0x1b8 + bc BO_IF_NOT, 27, major_0x02980_0x1b8 stw r17, 0x0024(r6) stw r20, 0x0028(r6) stw r21, 0x002c(r6) @@ -168,7 +199,7 @@ major_0x02980_0x1b8 mfctr r8 stw r10, 0x00fc(r6) stw r8, 0x00f4(r6) - ble- cr3, major_0x02980_0x1e8 + bc BO_IF_NOT, 13, major_0x02980_0x1e8 lwz r8, 0x00c4(r9) mfspr r12, mq mtspr mq, r8 @@ -203,10 +234,11 @@ major_0x02980_0x1e8 stw r30, 0x01f4(r6) stw r31, 0x01fc(r6) bnel- major_0x03e18_0xb4 - bge- cr3, major_0x02980_0x260 - bl Save_v0_v31 + bc BO_IF_NOT, 12, major_0x02980_0x260 + bl Save_v0_v31 major_0x02980_0x260 + stw r11, 0x00a4(r6) lwz r8, 0x0000(r9) stw r9, -0x0014(r1) @@ -264,68 +296,52 @@ major_0x02980_0x2d0 -; IntReturn +; Almost always goes straight through to SchReturn. Zeros a word in EWA. -; Called when a Gary reset trap is called. When else? - -; Xrefs: -; major_0x02980 -; IntDecrementer -; IntISI -; IntMachineCheck -; major_0x03be0 -; IntPerfMonitor -; IntThermalEvent -; kcRunAlternateContext -; kcResetSystem -; IntProgram -; IntExternalYellow -; kcVMDispatch -; major_0x09e28 -; major_0x0a600 -; kcRTASDispatch -; kcCacheDispatch -; CommonMPCallReturnPath -; CommonPIHPath +; ARG flags_to_set r7 IntReturn ; OUTSIDE REFERER - andi. r8, r7, 0x30 + + andi. r8, r7, (1 << (31 - 26)) | (1 << (31 - 27)) mfsprg r1, 0 - bnel- major_0x02ccc - li r8, 0x00 + bnel- major_0x02ccc ; my counters say almost never called! + li r8, 0 stw r7, EWA.Flags(r1) - stw r8, -0x0114(r1) - b ReturnToAnyTask + stw r8, EWA.WeMightClear(r1) + b SchReturn -; major_0x02ccc - -; Xrefs: -; major_0x02980 -; IntReturn +; Almost never called (by above func) major_0x02ccc ; OUTSIDE REFERER + mtcrf 0x3f, r7 - bc BO_IF_NOT, 27, major_0x02ccc_0x18 - rlwinm r7, r7, 0, 28, 26 + + bc BO_IF_NOT, 27, @major_0x02ccc_0x18 + _bclr r7, r7, 27 + bc BO_IF, 31, major_0x02ccc_0x30 - rlwinm r7, r7, 0, 27, 25 - b major_0x02ccc_0x2c + _bclr r7, r7, 26 + + b @return +@major_0x02ccc_0x18 + + bc BO_IF_NOT, 26, @return + _bclr r7, r7, 26 -major_0x02ccc_0x18 - bne- cr6, major_0x02ccc_0x2c - rlwinm r7, r7, 0, 27, 25 stw r7, EWA.Flags(r1) - li r8, 0x08 + li r8, ecInstTrace b major_0x02980_0x134 +@return -major_0x02ccc_0x2c blr major_0x02ccc_0x30 + ; according to my counter, this point is never reached + rlwinm. r8, r7, 0, 8, 8 - beq- BlueException + beq- SuspendBlueTask stw r7, EWA.Flags(r1) lwz r8, 0x0104(r6) stw r8, 0x0000(r1) @@ -354,7 +370,7 @@ major_0x02ccc_0x30 lwz r21, 0x002c(r9) lwz r19, 0x0034(r9) lwz r18, 0x003c(r9) - rlwinm r16, r7, 0, 28, 26 + _bclr r16, r7, 27 lwz r25, 0x0650(r8) rlwinm. r22, r17, 31, 27, 31 add r19, r19, r22 @@ -381,8 +397,8 @@ major_0x02ccc_0x30 -BlueException - bl Save_r14_r31 ; r8 := EWA +SuspendBlueTask + bl SchSaveStartingAtR14 ; r8 := EWA lwz r31, EWA.PA_CurTask(r8) lwz r8, Task.ExceptionHandlerID(r31) @@ -433,7 +449,7 @@ BlueException mr r8, r28 bl EnqueueMessage ; Message *r8, Queue *r31 - b RescheduleAndReturn + b SchEval @no_exception_handler @no_memory_reserved_for_exception_messages @@ -452,45 +468,54 @@ BlueException -major_0x02ccc_0x2a4 ; OUTSIDE REFERER - bsol+ cr6, Local_Panic +TaskApproachOne ; OUTSIDE REFERER -; r6 = ewa - bl Save_r14_r31 -; r8 = sprg0 (not used by me) + bcl BO_IF, 27, Local_Panic + bl SchSaveStartingAtR14 mr r30, r10 - lwz r29, 0x0018(r8) - lwz r31, -0x0008(r8) - stw r29, 0x0134(r6) - stw r30, 0x0074(r6) - stw r7, 0x0040(r6) - lwz r1, -0x0004(r1) + lwz r29, EWA.r6(r8) + lwz r31, EWA.PA_CurTask(r8) + stw r29, ContextBlock.r6(r6) + stw r30, 0x0074(r6) ; ContextBlock.srr0? + stw r7, 0x0040(r6) ; ContextBlock.savedFlags? + lwz r1, EWA.PA_KDP(r1) + + ; get task in r31, globals in r1 _Lock PSA.SchLock, scratch1=r28, scratch2=r29 mr r8, r31 - bl TaskUnready - lwz r16, 0x0064(r31) + bl SchTaskUnrdy + + lwz r16, Task.Flags(r31) srwi r8, r7, 24 - rlwinm. r16, r16, 0, 9, 9 - cmpwi cr1, r8, 0x0c - bne- major_0x02ccc_0x524 - bne- cr1, major_0x02ccc_0x524 - lwz r8, 0x00e0(r31) - addi r8, r8, 0x01 - stw r8, 0x00e0(r31) - b major_0x02ccc_0x380 + rlwinm. r16, r16, 0, Task.kFlag9, Task.kFlag9 + cmpwi cr1, r8, ecInstPageFault + bne- TaskNotSuitableForWhatWeWantToDo + bne- cr1, TaskNotSuitableForWhatWeWantToDo + ; what is special about the upper 8 Flags? Are they Task-related? -major_0x02ccc_0x310 ; OUTSIDE REFERER - bnsl+ cr6, Local_Panic - bl major_0x02980_0x114 - stw r10, 0x0084(r6) - rlwinm r7, r7, 0, 28, 26 + lwz r8, Task.Zero3(r31) + addi r8, r8, 1 + stw r8, Task.Zero3(r31) -; r6 = ewa - bl Save_r14_r31 -; r8 = sprg0 (not used by me) + b CommonPathBetweenTaskIntFuncs + + + +TaskApproachTwo ; OUTSIDE REFERER + + bcl BO_IF_NOT, 27, Local_Panic + + bl PreferRegistersFromEWASavingContextBlock + + stw r10, ContextBlock.LA_EmulatorEntry(r6) + + _bclr r7, r7, EWA.kFlag27 + + + bl SchSaveStartingAtR14 lwz r30, 0x0074(r6) lwz r29, 0x0018(r8) @@ -499,100 +524,116 @@ major_0x02ccc_0x310 ; OUTSIDE REFERER stw r7, 0x0040(r6) lwz r1, -0x0004(r1) + _Lock PSA.SchLock, scratch1=r28, scratch2=r29 mr r8, r31 - bl TaskUnready - lwz r16, 0x0064(r31) - srwi r8, r7, 24 - rlwinm. r16, r16, 0, 9, 9 - cmpwi cr1, r8, 0x14 - bne- major_0x02ccc_0x524 - bne- cr1, major_0x02ccc_0x524 - lwz r8, 0x00e4(r31) - addi r8, r8, 0x01 - stw r8, 0x00e4(r31) + bl SchTaskUnrdy + + lwz r16, Task.Flags(r31) + srwi r8, r7, 24 + rlwinm. r16, r16, 0, Task.kFlag9, Task.kFlag9 + cmpwi cr1, r8, 0x14 + bne- TaskNotSuitableForWhatWeWantToDo + bne- cr1, TaskNotSuitableForWhatWeWantToDo + + lwz r8, Task.Zero4(r31) + addi r8, r8, 1 + stw r8, Task.Zero4(r31) + + + + +CommonPathBetweenTaskIntFuncs -major_0x02ccc_0x380 mfsprg r14, 0 - rlwinm r7, r7, 0, 27, 25 - rlwinm r7, r7, 0, 0, 30 - lwz r29, -0x00e4(r14) - lis r17, 0x4152 - ori r17, r17, 0x4541 - lwz r16, 0x0004(r29) + + _bclr r7, r7, EWA.kFlag26 + _bclr r7, r7, EWA.kFlag31 + + lwz r29, EWA.SpecialAreaPtr(r14) + lisori r17, Area.kSignature + lwz r16, Area.Signature(r29) cmplw r16, r17 bnel+ Local_Panic - lwz r17, 0x0034(r29) - addi r17, r17, 0x01 - stw r17, 0x0034(r29) - lwz r8, 0x0018(r29) -; r8 = id + lwz r17, Area.Counter(r29) + addi r17, r17, 1 + stw r17, Area.Counter(r29) + + lwz r8, Area.BackingProviderID(r29) ; this is a notification? ugh... bl LookupID -; r8 = something not sure what -; r9 = 0:inval, 1:proc, 2:task, 3:timer, 4:q, 5:sema, 6:cr, 7:cpu, 8:addrspc, 9:evtg, 10:cohg, 11:area, 12:not, 13:log - lwz r16, 0x06b4(r1) - cmpwi r9, 0x0c - cmpwi cr1, r16, 0x00 + lwz r16, KDP.VMMaxVirtualPages(r1) + cmpwi cr0, r9, ecInstPageFault + cmpwi cr1, r16, 0 mr r26, r8 - bne- major_0x02ccc_0x430 - beq- cr1, major_0x02ccc_0x3d4 - beq- cr2, major_0x02ccc_0x430 + bne- cr0, CanSendMessage + beq- cr1, CantSendMessage + beq- cr2, CanSendMessage -major_0x02ccc_0x3d4 - lwz r16, 0x0064(r31) - addi r17, r31, 0x08 - addi r18, r31, 160 - stw r18, 0x0000(r17) +CantSendMessage + lwz r16, Task.Flags(r31) + addi r17, r31, Task.QueueMember + addi r18, r31, Task.Semaphore + + stw r18, LLL.Freeform(r17) InsertAsPrev r17, r18, scratch=r19 - li r17, 0x01 - ori r16, r16, 0x2000 - stw r17, 0x00b0(r31) - stw r16, 0x0064(r31) + + li r17, 1 + _bset r16, r16, Task.kFlag18 + stw r17, Task.Semaphore + Semaphore.Value(r31) + stw r16, Task.Flags(r31) + rlwinm r30, r30, 0, 0, 19 + lwz r27, 0x0000(r29) lwz r28, 0x0000(r31) stw r30, 0x0010(r26) stw r27, 0x0014(r26) stw r28, 0x0018(r26) + mr r30, r26 bl CauseNotification - cmpwi r8, 0x00 - beq+ major_0x02964 -major_0x02ccc_0x430 + cmpwi r8, 0 + beq+ IntLocalBlockMPCall ; jump if no error? + +CanSendMessage mfcr r28 - li r8, 0x1c + li r8, Message.Size beq- cr2, major_0x02ccc_0x4a8 bl PoolAlloc mr. r26, r8 - beq- major_0x02ccc_0x50c - addi r17, r31, 0x08 - addi r18, r31, 160 - stw r18, 0x0000(r17) - InsertAsPrev r17, r18, scratch=r19 - li r17, 0x01 - stw r17, 0x00b0(r31) - lwz r27, 0x0000(r29) - lis r8, 0x6e6f - ori r8, r8, 0x7465 - lwz r29, 0x00a0(r31) - stw r27, 0x0010(r26) - stw r29, 0x0014(r26) - stw r8, 0x0004(r26) - stw r30, 0x0018(r26) + beq- major_0x02ccc_PoolAllocFailed + + addi r17, r31, Task.QueueMember + addi r18, r31, Task.Semaphore + stw r18, LLL.Freeform(r17) + InsertAsPrev r17, r18, scratch=r19 ; make this task wait on its own semaphore + + li r17, 1 + stw r17, Task.Semaphore + Semaphore.Value(r31) + + ; message = area ID, semaphore ID, address (page aligned?) + lwz r27, Area.ID(r29) + lisori r8, Message.kSignature + lwz r29, Task.Semaphore + Semaphore.BlockedTasks + LLL.Freeform(r31) + stw r27, Message.Word1(r26) + stw r29, Message.Word2(r26) + stw r8, Message.LLL + LLL.Signature(r26) + stw r30, Message.Word3(r26) + mr r8, r26 - addi r31, r1, -0xa24 + addi r31, r1, PSA.PageQueue bl EnqueueMessage ; Message *r8, Queue *r31 - lwz r8, -0x0410(r1) + lwz r8, PSA.BlueSpinningOn(r1) bl UnblockBlueIfCouldBePolling b BlockMPCall major_0x02ccc_0x4a8 mr r8, r31 - bl TaskReadyAsPrev + bl SchRdyTaskNow _AssertAndRelease PSA.SchLock, scratch=r31 mtcr r28 bns- cr6, major_0x02ccc_0x504 @@ -606,22 +647,22 @@ major_0x02ccc_0x4a8 stw r9, 0x0034(r6) lwz r8, 0x007c(r6) stw r8, 0x003c(r6) - crclr cr6_so + crclr EWA.kFlag27 major_0x02ccc_0x504 ; r6 = ewa - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 b major_0x02980_0x178 -major_0x02ccc_0x50c - li r16, 0x02 - stb r16, 0x0019(r31) +major_0x02ccc_PoolAllocFailed + li r16, Task.kNominalPriority + stb r16, Task.Priority(r31) mr r8, r31 - bl TaskReadyAsPrev - bl major_0x14af8_0xa0 + bl SchRdyTaskNow + bl FlagSchEval b BlockMPCall -major_0x02ccc_0x524 +TaskNotSuitableForWhatWeWantToDo b FuncExportedFromTasks @@ -659,7 +700,7 @@ IntDecrementer ; OUTSIDE REFERER stw r18, ContextBlock.r18(r6) stw r25, ContextBlock.r25(r6) - bl major_0x14a98 + bl SchFiddlePriorityShifty ble- IntDecrementer_0x48 lwz r8, PSA.CriticalReadyQ + ReadyQueue.Timecake + 4(r1) @@ -677,7 +718,7 @@ IntDecrementer_0x48 IntDecrementer_0x54 ; r6 = ewa - bl Save_r14_r31 + bl SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) @@ -689,7 +730,7 @@ IntDecrementer_0x54 bl TimerDispatch _AssertAndRelease PSA.SchLock, scratch=r8 - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 b IntReturn @@ -957,7 +998,7 @@ major_0x03548_0x20 ; OUTSIDE REFERER mr r19, r18 rlwimi r17, r27, 7, 31, 31 xori r17, r17, 0x01 - li r8, 0x18 + li r8, ecUnknown24 b major_0x02980 @@ -1066,9 +1107,9 @@ IntDSIOtherOther_0x100 IntDSIOtherOther_0x144 andi. r28, r31, 0x03 - li r8, 0x16 + li r8, ecDataSupAccessViolation beq+ major_0x02980 - li r8, 0x15 + li r8, ecDataWriteViolation b major_0x02980 IntDSIOtherOther_0x158 @@ -1086,7 +1127,7 @@ IntDSIOtherOther_0x158 lwz r8, -0x00e0(r30) mfspr r29, srr1 mfsprg r28, 2 - rlwinm r29, r29, 0, 18, 16 + _bclr r29, r29, 17 mtlr r28 mtspr srr1, r29 @@ -1108,9 +1149,9 @@ IntDSIOtherOther_0x1c8 mfsprg r28, 2 mtlr r28 beq+ IntDSIOtherOther_0x19c - li r8, 0x12 + li r8, ecDataInvalidAccess bge+ major_0x02980 - li r8, 0x14 + li r8, ecDataPageFault b major_0x02980 @@ -1179,12 +1220,12 @@ IntMachineCheckMemRetry_0x124 IntMachineCheckMemRetry_0x14c ; OUTSIDE REFERER cmplw r10, r19 - li r8, 0x13 + li r8, ecDataHardwareFault bne+ major_0x02980 mfsprg r1, 0 mtsprg 3, r24 lmw r14, 0x0038(r1) - li r8, 0x0b + li r8, ecInstHardwareFault b major_0x02980_0x134 @@ -1250,16 +1291,16 @@ IntISI ; OUTSIDE REFERER major_0x039dc ; OUTSIDE REFERER lmw r14, 0x0038(r8) - li r8, 0x0c + li r8, ecInstPageFault blt+ major_0x02980_0x134 - li r8, 0x0a + li r8, ecInstInvalidAddress b major_0x02980_0x134 major_0x039dc_0x14 ; OUTSIDE REFERER andis. r8, r11, 0x800 - li r8, 0x0e + li r8, ecInstSupAccessViolation bne+ major_0x02980_0x134 - li r8, 0x0b + li r8, ecInstHardwareFault b major_0x02980_0x134 @@ -1309,7 +1350,7 @@ IntMachineCheck ; OUTSIDE REFERER b IntReturn @not_L1_data_cache_error - li r8, 0x07 + li r8, ecMachineCheck b major_0x02980_0x134 @@ -1331,7 +1372,7 @@ MaskedInterruptTaken ; OUTSIDE REFERER _log '^n' lis r10, -0x4523 ori r10, r10, 0xcb00 - li r8, 0x07 + li r8, ecMachineCheck b major_0x02980_0x134 @@ -1378,12 +1419,12 @@ IntDSIOther ; OUTSIDE REFERER ; dead code? - dc.l 0x81610e40 - dc.l 0x7d8a6378 - dc.l 0x396b0001 - dc.l 0x91610e40 - dc.l 0x7d7b02a6 - dc.l 0x50e7deb4 + lwz r11, KDP.NanoKernelInfo + NKNanoKernelInfo.NanoKernelCallCounts(r1) + mr r10, r12 + addi r11, r11, 1 + stw r11, KDP.NanoKernelInfo + NKNanoKernelInfo.NanoKernelCallCounts(r1) + mfsrr1 r11 + rlwimi r7, r7, 27, 26, 26 kcReturnFromException ; OUTSIDE REFERER ori r11, r11, 0x8000 @@ -1400,7 +1441,7 @@ kcReturnFromException ; OUTSIDE REFERER mfsprg r1, 0 rlwimi r7, r3, 24, 0, 7 blt- major_0x03be0_0xe8 - li r8, 0x02 + li r8, ecTrapInstr b major_0x02980_0x134 major_0x03be0_0x58 @@ -1447,7 +1488,7 @@ major_0x03be0_0xe8 beq+ cr2, major_0x02980_0x178 crclr cr6_so mfspr r10, srr0 - li r8, 0x02 + li r8, ecTrapInstr b major_0x02980_0x134 @@ -1483,7 +1524,7 @@ save_all_registers ; OUTSIDE REFERER lwz r1, -0x0004(r1) ; r6 = ewa - b Save_r14_r31 + b SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) @@ -1521,7 +1562,7 @@ save_all_registers ; OUTSIDE REFERER ; r13 CR ContextBlock ; ; -; Can be followed up by a call to Save_r14_r31, +; Can be followed up by a call to SchSaveStartingAtR14, ; (which will put them in the ContextBlock too). align 5 @@ -1674,7 +1715,7 @@ major_0x03e18_0xb4 ; OUTSIDE REFERER ori r8, r8, 0x2000 mtmsr r8 isync - rlwinm r11, r11, 0, 19, 17 + _bclr r11, r11, 18 stfd f0, 0x0200(r6) stfd f1, 0x0208(r6) stfd f2, 0x0210(r6) @@ -1804,7 +1845,7 @@ major_0x04180_0x9c ; r12 = sprg2 ; r13 = cr - li r8, 0x04 + li r8, ecInvalidInstr b major_0x02980_0x134 @@ -1856,7 +1897,7 @@ IntPerfMonitor_0x88 _AssertAndRelease PSA.SchLock, scratch=r8 ; r6 = ewa - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 b IntReturn @@ -1886,7 +1927,7 @@ IntThermalEvent ; OUTSIDE REFERER @no_thermal_handler _AssertAndRelease PSA.SchLock, scratch=r8 - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 b IntReturn @@ -1899,10 +1940,13 @@ IntThermalEvent ; OUTSIDE REFERER align kIntAlign kcRunAlternateContext ; OUTSIDE REFERER - mtcrf 0x3f, r7 - bnel+ cr2, IntReturn + + mtcrf 0x3f, r7 + + bcl BO_IF_NOT, 10, IntReturn + and. r8, r4, r13 - lwz r9, 0x0340(r1) + lwz r9, KDP.MinusOne1(r1) rlwinm r8, r3, 0, 0, 25 cmpw cr1, r8, r9 bne+ IntReturn @@ -2001,7 +2045,7 @@ major_0x043a0_0x154 mfsprg r1, 0 lmw r14, 0x0038(r1) lwz r1, -0x0004(r1) - li r8, 0x02 + li r8, ecTrapInstr b major_0x02980_0x134 @@ -2034,7 +2078,7 @@ wordfill ; OUTSIDE REFERER kcResetSystem ; OUTSIDE REFERER ; r6 = ewa - bl Save_r14_r31 + bl SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) ; Check for 601 (rtc vs timebase) @@ -2119,7 +2163,7 @@ NonGaryReset stw r9, 0x0664(r8) ; r6 = ewa - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 subi r10, r10, 4 lwz r1, -0x0004(r1) @@ -2131,7 +2175,7 @@ NonGaryReset ; r11 = new srr1 ; r12 = lr restore ; r13 = cr restore - b ReturnFromInterrupt + b SchExitInterrupt @@ -2207,7 +2251,7 @@ major_0x046d0 ; OUTSIDE REFERER ; r12 = sprg2 ; r13 = cr - li r8, 0x02 + li r8, ecTrapInstr b major_0x02980_0x134 @@ -2236,144 +2280,166 @@ IntExternalOrange ; OUTSIDE REFERER mtcrf 0x3f, r7 bnel+ cr2, Local_Panic - li r8, 0x00 + li r8, ecNoException b major_0x02980_0x134 -; IntProgram - -; Xrefs: -; "vec" - align kIntAlign -IntProgram ; OUTSIDE REFERER -; r6 = saved at *(ewa + 0x18) -; sprg1 = saved at *(ewa + 4) -; rN (0,7,8,9,10,11,12,13, not r1) = saved at *(*(ewa - 0x14) + 0x104 + 8*N) - bl int_prepare -; r0 = 0 -; r1 = *(ewa - 4) -; r6 = kdp -; r7 = *(ewa - 0x10) # flags? -; r8 = ewa -; r10 = srr0 -; r11 = srr1 -; r12 = sprg2 -; r13 = cr +IntProgram - lwz r8, 0x0648(r1) - mtcr r11 + bl int_prepare + + lwz r8, KDP.LA_EmulatorKernelTrapTable(r1) + mtcr r11 ; UNUSUAL to have SRR1 in condition register xor r8, r10, r8 - bne- cr3, IntProgram_0x144 - cmplwi r8, 0x00 - cmplwi cr1, r8, 0x20 - beq- IntProgram_0x120 - beq- cr1, IntProgram_0x120 - cmplwi r8, 0x0c - cmplwi cr1, r8, 0x40 - beq- IntProgram_0x120 - blt- cr1, IntProgram_0x110 - bne- cr6, IntProgram_0x58 - stw r14, 0x0174(r6) + bc BO_IF_NOT, 14, @not_trap + + + ; Program interrupt caused by a trap instruction + + + ; From the table of twis in the emulator code image? Then return will be to LR. + + cmplwi cr0, r8, NanoKernelCallTable.ReturnFromException + cmplwi cr1, r8, NanoKernelCallTable.MPDispatch + beq- cr0, @emutrap_0_return_from_exception + beq- cr1, @emutrap_8_mpdispatch + cmplwi cr0, r8, NanoKernelCallTable.VMDispatch + cmplwi cr1, r8, NanoKernelCallTable.Size + beq- cr0, @emutrap_3_vmdispatch + blt- cr1, @emutrap_other + + + ; Not from the emulator image? Return will be to next instruction, + ; and we will read the trap instruction from memory + + ; If !MSR[IR], turn on MSR[DR] for just a moment + bc BO_IF_NOT, 26, @_IntProgram_0x58 + stw r14, ContextBlock.r14(r6) mfsprg r14, 3 - addi r8, r1, -0x750 + addi r8, r1, PSA.BlueVecBase mfmsr r9 mtsprg 3, r8 - ori r8, r9, 0x10 + _bset r8, r9, 27 ; turn on data paging (MSR[DR]) for just a sec mtmsr r8 isync +@_IntProgram_0x58 -IntProgram_0x58 - lwz r8, 0x0000(r10) - bne- cr6, IntProgram_0x74 + ; Get the offending instruction! + lwz r8, 0(r10) + + ; If !MSR[IR], restore MSR + bc BO_IF_NOT, 26, @_IntProgram_0x74 isync mtmsr r9 isync mtsprg 3, r14 - lwz r14, 0x0174(r6) + lwz r14, ContextBlock.r14(r6) +@_IntProgram_0x74 + + + ; Switch from SRR1-in-CR to Flags-in-CR -IntProgram_0x74 mtcr r7 - xoris r8, r8, 0xfff - cmplwi r8, 0x10 - cmplwi cr1, r8, 0x00 - bge- IntProgram_0x150 - cmplwi cr7, r8, 0x08 - cmplwi r8, 0x03 - slwi r8, r8, 2 - beq- cr1, IntProgram_0xac - beq- cr7, IntProgram_0xd0 - beq- IntProgram_0xac - blt- cr4, IntProgram_0x150 - blt- cr2, IntProgram_0xac - ble- cr2, IntProgram_0x150 -IntProgram_0xac + + ; Read the bottom half of the non-emu-image trap instruction, getting trapnum*8 in r8 + xoris r8, r8, 0xfff + cmplwi cr0, r8, NanoKernelCallTable.Size / 4 + cmplwi cr1, r8, NanoKernelCallTable.ReturnFromException / 4 + bge- cr0, @trap_too_high + cmplwi cr7, r8, NanoKernelCallTable.MPDispatch / 4 + cmplwi cr0, r8, NanoKernelCallTable.VMDispatch / 4 + slwi r8, r8, 2 + beq- cr1, @nonemu_return_from_exception + beq- cr7, @nonemu_mpdispatch + beq- cr0, @nonemu_vmdispatch + + ; Fall through to some hard truths + bc BO_IF, 16, @_IntProgram_0x150 + bc BO_IF, 8, @_IntProgram_0xac + bc BO_IF_NOT, 9, @_IntProgram_0x150 + +@nonemu_return_from_exception +@nonemu_vmdispatch +@_IntProgram_0xac add r8, r8, r1 lwz r9, KDP.NanoKernelInfo + NKNanoKernelInfo.NanoKernelCallCounts(r8) - addi r9, r9, 0x01 + addi r9, r9, 1 stw r9, KDP.NanoKernelInfo + NKNanoKernelInfo.NanoKernelCallCounts(r8) -IntProgram_0xbc +@nonemu_go lwz r8, KDP.NanoKernelCallTable(r8) mtlr r8 - addi r10, r10, 0x04 - rlwimi r7, r7, 27, 26, 26 + addi r10, r10, 4 + rlwimi r7, r7, 27, 26, 26 ; copy EWA.kFlag22 into EWA.kFlag26 blr -IntProgram_0xd0 - lwz r9, 0x0104(r6) +@nonemu_mpdispatch + lwz r9, ContextBlock.r0(r6) add r8, r8, r1 - cmpwi r9, -0x01 + cmpwi r9, -1 lwz r9, KDP.NanoKernelInfo + NKNanoKernelInfo.NanoKernelCallCounts(r8) - addi r9, r9, 0x01 + addi r9, r9, 1 stw r9, KDP.NanoKernelInfo + NKNanoKernelInfo.NanoKernelCallCounts(r8) - bne+ IntProgram_0xbc - addi r10, r10, 0x04 - rlwimi r7, r7, 27, 26, 26 + bne+ @nonemu_go + + ; Non-emu MPDispatch trap with r0 == -1: muck around a bit? + addi r10, r10, 4 + rlwimi r7, r7, 27, 26, 26 ; copy EWA.kFlag22 into EWA.kFlag26 mfsprg r8, 0 - rlwimi r13, r7, 8, 2, 2 - lwz r9, -0x0008(r8) + rlwimi r13, r7, 8, 2, 2 + lwz r9, EWA.PA_CurTask(r8) xoris r13, r13, 0x2000 - lwz r8, 0x00ec(r9) - stw r8, 0x0104(r6) + lwz r8, Task.SomeLabelField(r9) + stw r8, ContextBlock.r0(r6) b IntReturn -IntProgram_0x110 - mtcr r7 - blt- cr4, IntProgram_0x150 - blt- cr2, IntProgram_0x120 - ble- cr2, IntProgram_0x150 -IntProgram_0x120 +@emutrap_other +@_IntProgram_0x110 + mtcr r7 + bc BO_IF, 16, @_IntProgram_0x150 + bc BO_IF, 8, @_IntProgram_0x120 + bc BO_IF_NOT, 9, @_IntProgram_0x150 + +@emutrap_0_return_from_exception +@emutrap_8_mpdispatch +@emutrap_3_vmdispatch +@_IntProgram_0x120 add r8, r8, r1 lwz r9, KDP.NanoKernelInfo + NKNanoKernelInfo.NanoKernelCallCounts(r8) lwz r10, KDP.NanoKernelCallTable(r8) - addi r9, r9, 0x01 + addi r9, r9, 1 stw r9, KDP.NanoKernelInfo + NKNanoKernelInfo.NanoKernelCallCounts(r8) mtlr r10 - mr r10, r12 + mr r10, r12 ; return to whatever the emulator left in the PPC link register rlwimi r7, r7, 27, 26, 26 blr -IntProgram_0x144 - blt+ cr3, FDP_1214 - bgt- cr3, FDP_1214 - bso- cr2, IntProgram_0x160 -IntProgram_0x150 - rlwinm r8, r11, 17, 28, 29 + ; Program interrupt not caused by a trap instruction: consult SRR1 bits 11-13 + +@not_trap + bc BO_IF+1, 12, FDPEmulateInstruction ; illegal instruction exception + bc BO_IF, 13, FDPEmulateInstruction ; privileged instruction exception + bc BO_IF, 11, @floating_point_exception ; floating point exception + +@trap_too_high +@_IntProgram_0x150 + rlwinm r8, r11, 17, 28, 29 ; whoa addi r8, r8, 0x4b3 - rlwnm r8, r8, r8, 0x1c, 0x1f + rlwnm r8, r8, r8, 28, 31 b major_0x02980_0x134 -IntProgram_0x160 - li r8, 0x03 - bso+ cr3, major_0x02980_0x134 - addi r10, r10, 0x04 - rlwimi r7, r7, 27, 26, 26 +@floating_point_exception + li r8, ecFloatException + + bc BO_IF, 15, major_0x02980_0x134 ; if SRR0 points to subsequent instr + addi r10, r10, 4 ; if SRR0 points to offending instr + rlwimi r7, r7, 27, 26, 26 ; copy EWA.kFlag22 into EWA.kFlag26 b major_0x02980_0x134 @@ -2418,31 +2484,30 @@ IntExternalYellow ; OUTSIDE REFERER blt+ kcPrioritizeInterrupts - ; Multiprocessor machine: signal another CPU? + ; Check with the CPU plugin whether this is an interprocessor interrupt + ; (i.e. an alert to flag a scheduler evaluation) - bl Save_r14_r31 + bl SchSaveStartingAtR14 li r9, kSIGP9 stw r9, EWA.SIGPSelector(r8) - - li r8, 1 ; args in EWA + li r8, 1 ; args are in EWA bl SIGP + bl SchRestoreStartingAtR14 - bl Restore_r14_r31 + cmpwi cr0, r8, -29278 ; real external interrupt + cmpwi cr1, r8, -29277 ; ignore + cmpwi cr2, r8, -29279 ; interprocessor interrupt! + ; else: real external interrupt - ; These do not match any public Apple error codes? - cmpwi r8, -0x725e - cmpwi cr1, r8, -0x725d - cmpwi cr2, r8, -0x725f - - beq+ kcPrioritizeInterrupts + beq+ cr0, kcPrioritizeInterrupts beq+ cr1, IntReturn bne+ cr2, kcPrioritizeInterrupts - mfsprg r9, 0 - li r8, 0x01 + mfsprg r9, 0 ; "alert" => run scheduler evaluation + li r8, 1 stb r8, EWA.SchEvalFlag(r9) - b IntReturn + b IntReturn ; goes to SchReturn @@ -2514,7 +2579,7 @@ SIGP lwz r8, CoherenceGroup.CpuPluginSpacePtr(r22) cmpw r9, r8 beq- @noNeedToSwitchSpace - bl SetSpaceSRsAndBATs + bl SchSwitchSpace @noNeedToSwitchSpace ; Save user registers to ContextBlock (odd way to do this). @@ -2618,7 +2683,7 @@ major_0x04a20_0x30 lwz r9, -0x001c(r23) cmpw r9, r8 beq- major_0x04a20_0x44 - bl SetSpaceSRsAndBATs + bl SchSwitchSpace major_0x04a20_0x44 lwz r10, -0x02d0(r23) @@ -2666,7 +2731,7 @@ IntSyscall ; OUTSIDE REFERER ; unset MSR_PR bit mfspr r1, srr1 rlwinm. r0, r1, 26, 26, 27 ; nonsense code? - rlwinm r1, r1, 0, 18, 16 + _bclr r1, r1, 17 blt- @dont_unset_pr ; r0 should never have bit 0 set mtspr srr1, r1 @dont_unset_pr @@ -2764,7 +2829,7 @@ IntTrace ; OUTSIDE REFERER ; r12 = sprg2 ; r13 = cr - li r8, 0x08 + li r8, ecInstTrace b major_0x02980_0x134 diff --git a/NanoKernel/NKMPCalls.s b/NanoKernel/NKMPCalls.s index 097763d..8c71ab5 100644 --- a/NanoKernel/NKMPCalls.s +++ b/NanoKernel/NKMPCalls.s @@ -86,7 +86,7 @@ MaxMPCallCount equ 134 kcMPDispatch ; reached by `sc`, or `twi *, *, 8` - bl Save_r14_r31 + bl SchSaveStartingAtR14 lwz r8, EWA.r6(r8) ; clobbers our EWA pointer :( lwz r14, KDP.PA_NanoKernelCode(r1) ; but r14... @@ -670,7 +670,7 @@ ReleaseAndReturnMPCall ; OUTSIDE REFERER ; BlockMPCall ; KCGetCpuCount ; MPCall_6 -; KCYieldWithHint +; MPYieldWithHint ; KCCpuPlugin ; NKPrintHex ; NKPrintDecimal @@ -699,15 +699,15 @@ TrulyCommonMPCallReturnPath ; OUTSIDE REFERER bc BO_IF_NOT, 10, @block ;return immediately - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 b IntReturn @block - b RescheduleAndReturn + b SchEval -; MPCall_0 +; Called after MPLibrary creates a new structure DeclareMPCall 0, MPCall_0 @@ -716,8 +716,10 @@ MPCall_0 ; OUTSIDE REFERER mr r30, r7 mr r29, r6 bne+ ReturnMPCallOOM + + ; Fail if this page is outside of the PAR rlwinm. r4, r3, 20, 12, 31 - lwz r9, 0x06a8(r1) + lwz r9, KDP.PrimaryAddrRangePages(r1) beq+ ReturnMPCallOOM cmplw r4, r9 bge+ ReturnMPCallOOM @@ -909,17 +911,14 @@ MPRegisterCpuPlugin -; KCGetCpuCount - ; Called by MPProcessors and MPProcessorsScheduled -; > r3 = 0:all, 1:scheduled +; ARG bool r3 scheduled_only +; RET int r3 -; < r3 = cpu_count + DeclareMPCall 3, MPProcessors - DeclareMPCall 3, KCGetCpuCount - -KCGetCpuCount ; OUTSIDE REFERER +MPProcessors mfsprg r15, 0 lwz r14, EWA.CPUBase + CPU.LLL + LLL.Freeform(r15) @@ -936,9 +935,9 @@ KCGetCpuCount ; OUTSIDE REFERER ; ARG AddressSpaceID r3 ; RET AddressSpaceID r3, ??? r4, ProcessStructID r5 - DeclareMPCall 4, KCCreateProcess + DeclareMPCall 4, MPCreateProcess -KCCreateProcess ; OUTSIDE REFERER +MPCreateProcess _Lock PSA.SchLock, scratch1=r16, scratch2=r17 @@ -991,9 +990,9 @@ KCCreateProcess ; OUTSIDE REFERER - DeclareMPCall 5, MPCall_5 + DeclareMPCall 5, MPTerminateProcess -MPCall_5 ; OUTSIDE REFERER +MPTerminateProcess _Lock PSA.SchLock, scratch1=r16, scratch2=r17 @@ -1069,12 +1068,12 @@ MPCall_6_0xb4 mr r8, r31 - bl TaskUnready + bl SchTaskUnrdy li r16, Task.kNominalPriority stb r16, Task.Priority(r31) - bl TaskReadyAsPrev + bl SchRdyTaskNow mr r8, r31 bl FlagSchEvaluationIfTaskRequires @@ -1083,44 +1082,51 @@ MPCall_6_0xb4 -; KCYieldWithHint +; Implements MPYield (null argument) +; Caller gets its priority set to nominal - DeclareMPCall 13, KCYieldWithHint +; ARG TaskID r3 (null for MPYield) +; RET OSStatus r3 -KCYieldWithHint ; OUTSIDE REFERER + DeclareMPCall 13, MPYieldWithHint + +MPYieldWithHint _Lock PSA.SchLock, scratch1=r16, scratch2=r17 mfsprg r16, 0 rlwinm. r8, r7, 0, 10, 10 lwz r17, KDP.PA_ECB(r1) - lwz r31, -0x0008(r16) - beq- KCYieldWithHint_0x68 - clrlwi. r8, r3, 0x1f + lwz r31, EWA.PA_CurTask(r16) + beq- @i_am_important ; not 68k mode? + + clrlwi. r8, r3, 31 lwz r8, ContextBlock.PriorityShifty(r17) rlwinm r8, r8, 0, 24, 21 oris r8, r8, 0x8000 stw r8, ContextBlock.PriorityShifty(r17) - beq- KCYieldWithHint_0x68 - lbz r16, 0x0019(r31) - cmpwi r16, 0x02 - bge- KCYieldWithHint_0x7c - mr r8, r31 - bl TaskUnready - li r16, 0x02 - stb r16, 0x0019(r31) - bl TaskReadyAsNext - b KCYieldWithHint_0x7c + beq- @i_am_important ; MPYield call -KCYieldWithHint_0x68 + ; If this task is + lbz r16, Task.Priority(r31) + cmpwi r16, Task.kNominalPriority + bge- @return mr r8, r31 - bl TaskUnready - li r16, 0x02 - stb r16, 0x0019(r31) - bl TaskReadyAsPrev + bl SchTaskUnrdy + li r16, Task.kNominalPriority + stb r16, Task.Priority(r31) + bl SchRdyTaskLater + b @return -KCYieldWithHint_0x7c +@i_am_important + mr r8, r31 + bl SchTaskUnrdy + li r16, Task.kNominalPriority + stb r16, Task.Priority(r31) + bl SchRdyTaskNow + +@return mr r8, r31 bl FlagSchEvaluationIfTaskRequires _AssertAndRelease PSA.SchLock + Lock.Count, scratch=r16 @@ -1128,32 +1134,35 @@ KCYieldWithHint_0x7c - DeclareMPCall 33, MPCall_33 +; ARG AbsoluteTime r3/r4 +; RET OSStatus r3 -MPCall_33 ; OUTSIDE REFERER - rlwinm. r8, r7, 0, 10, 10 ; Contains CpuFlags + DeclareMPCall 33, MPDelayUntil + +MPDelayUntil + + rlwinm. r8, r7, 0, EWA.kFlagBlue, EWA.kFlagBlue bne+ ReturnMPCallBlueBlocking - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - b MPCall_55_0x60 + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + b _MPDelayUntilCommon +; This version is allowed while the blue task is running -; MPCall_55 +; ARG AbsoluteTime r3/r4 +; RET OSStatus r3 -; Xrefs: -; kcMPDispatch -; MPCall_33 + DeclareMPCall 55, MPDelayUntilSys - DeclareMPCall 55, MPCall_55 +MPDelayUntilSys -MPCall_55 ; OUTSIDE REFERER - rlwinm. r8, r7, 0, 10, 10 + rlwinm. r8, r7, 0, EWA.kFlagBlue, EWA.kFlagBlue lwz r16, KDP.NanoKernelInfo + NKNanoKernelInfo.ExternalIntCount(r1) - beq- MPCall_55_0x60 + beq- _MPDelayUntilCommon + ; Why the hell are we counting interrupts? lwz r17, PSA.OtherSystemContextPtr(r1) lwz r18, KDP.PA_ECB(r1) cmpw r16, r17 @@ -1165,18 +1174,19 @@ MPCall_55 ; OUTSIDE REFERER oris r8, r8, 0x8000 stw r8, ContextBlock.PriorityShifty(r18) - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 lwz r16, PSA.BlueSpinningOn(r1) cmpwi r16, -1 li r16, 0 - bne- MPCall_55_0x60 + bne- _MPDelayUntilCommon stw r16, PSA.BlueSpinningOn(r1) b ReleaseAndReturnZeroFromMPCall -MPCall_55_0x60 ; OUTSIDE REFERER +_MPDelayUntilCommon + mfsprg r16, 0 li r17, 1 @@ -1196,7 +1206,7 @@ MPCall_55_0x60 ; OUTSIDE REFERER bl EnqueueTimer mr r8, r31 - bl TaskUnready + bl SchTaskUnrdy addi r16, r1, PSA.DelayQueue addi r17, r31, Timer.QueueLLL @@ -1559,7 +1569,7 @@ KCCreateCpuStruct_0x68 lisori r8, 11 lisori r8, 6 - stw r8, CPU.Eff(r31) + stw r8, CPU.Flags(r31) @@ -1622,7 +1632,7 @@ MPDeleteProcessor mr r31, r8 bne+ ReleaseAndReturnMPCallInvalidIDErr - lwz r16, CPU.Eff(r31) + lwz r16, CPU.Flags(r31) lisori r17, 9 and. r17, r17, r16 bne+ ReleaseAndReturnMPCallOOM @@ -1666,7 +1676,7 @@ KCStartCPU ; OUTSIDE REFERER bne+ ReleaseAndReturnMPCallInvalidIDErr mr r30, r8 - lwz r16, CPU.Eff(r30) + lwz r16, CPU.Flags(r30) rlwinm. r8, r16, 0, 28, 28 bne+ ReleaseAndReturnZeroFromMPCall @@ -1727,7 +1737,7 @@ KCStartCPU ; OUTSIDE REFERER lwz r8, KDP.PA_NanoKernelCode(r1) - llabel r26, IdleCode + llabel r26, SchIdleTask add r8, r8, r26 stw r8, Task.ContextBlock + ContextBlock.CodePtr(r31) @@ -1822,16 +1832,16 @@ KCStopScheduling ; OUTSIDE REFERER oris r17, r17, 0x80 stw r17, 0x0064(r31) mr r8, r31 - bl TaskUnready + bl SchTaskUnrdy li r17, 0x00 stb r17, 0x0019(r31) mr r8, r31 - bl TaskReadyAsNext + bl SchRdyTaskLater bl CalculateTimeslice mr r8, r31 - bl major_0x14af8_0xa0 + bl FlagSchEval lwz r8, 0x064c(r1) - llabel r9, StopProcessor + llabel r9, SchIdleTaskStopper add r8, r8, r9 stw r8, 0x01fc(r31) @@ -1853,7 +1863,7 @@ MPCpuPlugin ; Arguments in registers li r8, 0 - ; Hopefully returns via kcReturnFromInterrupt? Geez... + ; Hopefully returns via kcSchExitInterrupt? Geez... bl SIGP mr r3, r8 @@ -2045,13 +2055,13 @@ KCMarkPMFTask ; OUTSIDE REFERER ; Insert bit 31 of r4 into bit 21 of these flags lwz r17, Task.Flags(r31) - rlwimi r17, r4, 10, 21, 21 + rlwimi r17, r4, 10, Task.kFlagPMF, Task.kFlagPMF stw r17, Task.Flags(r31) ; Don't know what this does! mr r8, r31 - bl major_0x14af8_0xa0 + bl FlagSchEval b ReleaseAndReturnZeroFromMPCall @@ -2129,18 +2139,28 @@ NKLocateInfoRecord - DeclareMPCall 108, MPCall_108 + ; ARG int r3 stop + ; long r4 CpuClockRateHz + ; long r5 BusClockRateHz + ; long r6 DecClockRateHz + ; RET OSStatus r3 -MPCall_108 ; OUTSIDE REFERER - cmplwi r3, 0x02 + DeclareMPCall 108, NKSetPrInfoClockRates + +NKSetPrInfoClockRates + + cmplwi r3, 2 bge+ ReturnParamErrFromMPCall - mulli r17, r3, 0x10 - addi r18, r1, 0xf80 + + mulli r17, r3, 16 + addi r18, r1, KDP.ProcessorInfo + NKProcessorInfo.ClockRates add r18, r17, r18 - lwz r16, 0x0134(r6) - stw r4, 0x0000(r18) - stw r5, 0x0004(r18) - stw r16, 0x0008(r18) + + lwz r16, ContextBlock.r6(r6) + stw r4, 0(r18) + stw r5, 4(r18) + stw r16, 8(r18) + _log 'Clock rates for step ' mr r8, r3 bl Printd @@ -2154,6 +2174,7 @@ MPCall_108 ; OUTSIDE REFERER mr r8, r16 bl Printd _log 'Hz^n' + b ReturnZeroFromMPCall diff --git a/NanoKernel/NKMacros.s b/NanoKernel/NKMacros.s index d5f575f..b3b0c73 100644 --- a/NanoKernel/NKMacros.s +++ b/NanoKernel/NKMacros.s @@ -189,7 +189,17 @@ HalfLoadedReg set (®) MACRO _bclr &dest, &src, &bit - rlwinm&dot &dest, &src, 0, (&bit)+1, (&bit)-1 +_bclr_rbit set &bit+1 + if _bclr_rbit > 31 +_bclr_rbit set 0 + endif + +_bclr_lbit set &bit-1 + if _bclr_lbit < 0 +_bclr_lbit set 31 + endif + + rlwinm&dot &dest, &src, 0, _bclr_rbit, _bclr_lbit ENDM diff --git a/NanoKernel/NKPaging.s b/NanoKernel/NKPaging.s index 7694d9b..8a06a39 100644 --- a/NanoKernel/NKPaging.s +++ b/NanoKernel/NKPaging.s @@ -59,7 +59,7 @@ PagingFunc1 ; OUTSIDE REFERER lwz r8, -0x001c(r30) bl FindAreaAbove mr r31, r8 - stw r8, -0x00e4(r30) + stw r8, EWA.SpecialAreaPtr(r30) stw r27, -0x00e8(r30) lwz r16, 0x0024(r31) lwz r17, 0x0020(r31) diff --git a/NanoKernel/NKPrimaryIntHandlers.s b/NanoKernel/NKPrimaryIntHandlers.s index 029d0cf..d2ff86a 100644 --- a/NanoKernel/NKPrimaryIntHandlers.s +++ b/NanoKernel/NKPrimaryIntHandlers.s @@ -89,11 +89,12 @@ CommonPIHPath_0xc ; OUTSIDE REFERER lwz r29, KDP.ClearIntMaskInit(r1) bne- @noperf - bne- cr1, CommonPIHPath_0x78 + bne- cr1, @CommonPIHPath_0x78 @noperf rlwinm. r8, r7, 0, 10, 10 - beq- CommonPIHPath_0x14c + beq- @actual_meat + sth r28, 0x0000(r23) or r13, r13, r31 bgt- cr7, @negative @@ -101,10 +102,10 @@ CommonPIHPath_0xc ; OUTSIDE REFERER @negative _AssertAndRelease PSA.PIHLock, scratch=r8 - bl Restore_r20_r31 + bl SchRestoreStartingAtR20 b IntReturn -CommonPIHPath_0x78 +@CommonPIHPath_0x78 _AssertAndRelease PSA.PIHLock, scratch=r8 bl Save_r14_r19 @@ -122,7 +123,7 @@ CommonPIHPath_0x78 bl CauseNotification _AssertAndRelease PSA.SchLock, scratch=r8 - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 b IntReturn @no_handler_notification @@ -136,7 +137,13 @@ CommonPIHPath_0x78 b CommonPIHPath_0xc -CommonPIHPath_0x14c + + + + + +@actual_meat + _AssertAndRelease PSA.PIHLock, scratch=r8 bl Save_r14_r19 @@ -145,55 +152,56 @@ CommonPIHPath_0x14c lwz r30, PSA.MCR(r1) or r31, r31, r30 stw r31, PSA.MCR(r1) - sth r28, -0x043c(r1) + + sth r28, PSA.Int(r1) + lwz r31, PSA.PA_BlueTask(r1) mfsprg r30, 0 - lwz r28, 0x0064(r31) - lbz r29, 0x0018(r31) - ori r28, r28, 0x10 - stw r28, 0x0064(r31) - cmpwi r29, 0x00 - lhz r16, 0x001a(r31) - beq- CommonPIHPath_0x1dc + lwz r28, Task.Flags(r31) + lbz r29, Task.State(r31) + _bset r28, r28, Task.kFlag68kInterrupt + stw r28, Task.Flags(r31) + + cmpwi r29, 0 + lhz r16, Task.CPUIndex(r31) + beq- @task_not_running lhz r17, EWA.CPUIndex(r30) cmpw cr1, r16, r17 - rlwinm. r8, r28, 0, 26, 26 - beq- cr1, CommonPIHPath_0x1d0 - bne- CommonPIHPath_0x230 + rlwinm. r8, r28, 0, Task.kFlag26, Task.kFlag26 + beq- cr1, @running_on_this_cpu + bne- @flag_and_run -CommonPIHPath_0x1d0 +@running_on_this_cpu mr r8, r31 - bl TaskUnready - b CommonPIHPath_0x218 + bl SchTaskUnrdy + b @now_reschedule_task -CommonPIHPath_0x1dc - addi r16, r31, 0x08 +@task_not_running + addi r16, r31, Task.QueueMember RemoveFromList r16, scratch1=r17, scratch2=r18 - lbz r17, 0x0037(r31) - cmpwi r17, 0x01 - bne- CommonPIHPath_0x210 - addi r8, r31, 0x20 + lbz r17, Task.Timer + Timer.Byte3(r31) + cmpwi r17, 1 + bne- @task_timer_not_in_use + addi r8, r31, Task.Timer bl DequeueTimer - -CommonPIHPath_0x210 - lwz r16, 0x0e80(r1) +@task_timer_not_in_use + lwz r16, KDP.NanoKernelInfo + NKNanoKernelInfo.ExternalIntCount(r1) stw r16, PSA.OtherSystemContextPtr(r1) -CommonPIHPath_0x218 - li r16, 0x00 - stb r16, 0x0019(r31) +@now_reschedule_task + li r16, Task.kCriticalPriority + stb r16, Task.Priority(r31) mr r8, r31 - bl TaskReadyAsNext + bl SchRdyTaskLater mr r8, r31 bl CalculateTimeslice -CommonPIHPath_0x230 +@flag_and_run mr r8, r31 bl FlagSchEvaluationIfTaskRequires _AssertAndRelease PSA.SchLock, scratch=r16 -; r6 = ewa - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 b IntReturn @@ -297,7 +305,7 @@ PDM_PIH _Lock PSA.PIHLock, scratch1=r8, scratch2=r9 - bl Save_r20_r31 + bl SchSaveStartingAtR20 addi r9, r1, PSA.BlueVecBase andis. r8, r11, 0x8000 >> 14 ; SRR1 mystery bit @@ -375,7 +383,7 @@ PBX_PIH _Lock PSA.PIHLock, scratch1=r8, scratch2=r9 ; r6 = ewa - bl Save_r20_r31 + bl SchSaveStartingAtR20 ; r8 = sprg0 (not used by me) addi r9, r1, -0x750 @@ -439,7 +447,7 @@ GazellePIH _Lock PSA.PIHLock, scratch1=r8, scratch2=r9 ; r6 = ewa - bl Save_r20_r31 + bl SchSaveStartingAtR20 ; r8 = sprg0 (not used by me) addi r9, r1, -0x750 @@ -527,7 +535,7 @@ TNT_PIH _Lock PSA.PIHLock, scratch1=r8, scratch2=r9 ; r6 = ewa - bl Save_r20_r31 + bl SchSaveStartingAtR20 ; r8 = sprg0 (not used by me) addi r9, r1, -0x750 @@ -603,7 +611,7 @@ GossamerPIH _Lock PSA.PIHLock, scratch1=r8, scratch2=r9 ; r6 = ewa - bl Save_r20_r31 + bl SchSaveStartingAtR20 ; r8 = sprg0 (not used by me) addi r9, r1, -0x750 @@ -696,7 +704,7 @@ NewWorldPowerBookPIH _Lock PSA.PIHLock, scratch1=r8, scratch2=r9 ; r6 = ewa - bl Save_r20_r31 + bl SchSaveStartingAtR20 ; r8 = sprg0 (not used by me) addi r9, r1, -0x750 @@ -773,7 +781,7 @@ CordycepsPIH _Lock PSA.PIHLock, scratch1=r8, scratch2=r9 ; r6 = ewa - bl Save_r20_r31 + bl SchSaveStartingAtR20 ; r8 = sprg0 (not used by me) addi r9, r1, -0x750 @@ -837,7 +845,7 @@ NewWorldPIH _Lock PSA.PIHLock, scratch1=r8, scratch2=r9 ; r6 = ewa - bl Save_r20_r31 + bl SchSaveStartingAtR20 ; r8 = sprg0 (not used by me) addi r9, r1, -0x750 @@ -1025,7 +1033,7 @@ UnknownPIH _Lock PSA.PIHLock, scratch1=r8, scratch2=r9 ; r6 = ewa - bl Save_r20_r31 + bl SchSaveStartingAtR20 ; r8 = sprg0 (not used by me) addi r9, r1, -0x750 diff --git a/NanoKernel/NKScheduler.s b/NanoKernel/NKScheduler.s index 1a12324..d3220ec 100644 --- a/NanoKernel/NKScheduler.s +++ b/NanoKernel/NKScheduler.s @@ -22,7 +22,7 @@ Local_Panic set * ; Each one has a "time cake" that gets divided among its tasks. ; For critical it is ~1ms, successively multiplying by 8. -InitRDYQs +SchInit li r16, 0 stw r16, KDP.NanoKernelInfo + NKNanoKernelInfo.TaskCount(r1) @@ -61,7 +61,7 @@ InitRDYQs ; Zero some shit li r8, 0 - stw r8, ReadyQueue.Counter(r9) ; incremented by TaskReadyAsPrev/Next + stw r8, ReadyQueue.Counter(r9) ; incremented by SchRdyTaskNow/Next stw r8, ReadyQueue.TotalWeight(r9) ; 1ms for critical, successively 8x for other queues @@ -97,6 +97,10 @@ InitRDYQs addi r9, r9, 32 ;ReadyQueue.Size blt+ @loop + + + ; DO SOMETHING ELSE: + ; If the low nybble is empty, set ContextBlock.PriorityShifty to 2. lwz r16, KDP.PA_ECB(r1) lwz r17, ContextBlock.PriorityShifty(r16) @@ -120,13 +124,13 @@ InitRDYQs ; ...to (ECB *)r6 ; (and also copy SPRG0 to r8) -Save_r14_r31 +SchSaveStartingAtR14 li r8, ContextBlock.r16 & -32 dcbtst r8, r6 stw r14, ContextBlock.r14(r6) stw r15, ContextBlock.r15(r6) -Save_r16_r31 +SchSaveStartingAtR16 li r8, ContextBlock.r20 & -32 stw r16, ContextBlock.r16(r6) dcbtst r8, r6 @@ -134,7 +138,7 @@ Save_r16_r31 stw r18, ContextBlock.r18(r6) stw r19, ContextBlock.r19(r6) -Save_r20_r31 +SchSaveStartingAtR20 li r8, ContextBlock.r24 & -32 stw r20, ContextBlock.r20(r6) dcbtst r8, r6 @@ -142,7 +146,7 @@ Save_r20_r31 stw r22, ContextBlock.r22(r6) stw r23, ContextBlock.r23(r6) -Save_r24_r31 +SchSaveStartingAtR24 li r8, ContextBlock.r28 & -32 stw r24, ContextBlock.r24(r6) dcbtst r8, r6 @@ -169,13 +173,13 @@ Save_r24_r31 ; ...from (ECB *)r6 -Restore_r14_r31 +SchRestoreStartingAtR14 li r31, ContextBlock.r16 & -32 dcbt r31, r6 lwz r14, ContextBlock.r14(r6) lwz r15, ContextBlock.r15(r6) -Restore_r16_r31 +SchRestoreStartingAtR16 li r31, ContextBlock.r20 & -32 lwz r16, ContextBlock.r16(r6) dcbt r31, r6 @@ -183,7 +187,7 @@ Restore_r16_r31 lwz r18, ContextBlock.r18(r6) lwz r19, ContextBlock.r19(r6) -Restore_r20_r31 +SchRestoreStartingAtR20 li r31, ContextBlock.r24 & -32 lwz r20, ContextBlock.r20(r6) dcbt r31, r6 @@ -191,7 +195,7 @@ Restore_r20_r31 lwz r22, ContextBlock.r22(r6) lwz r23, ContextBlock.r23(r6) -Restore_r24_r31 +SchRestoreStartingAtR24 li r31, ContextBlock.r28 & -32 lwz r24, ContextBlock.r24(r6) dcbt r31, r6 @@ -699,7 +703,7 @@ Save_v0_v31_0x1b8 ; ARG Task *r8 ; CLOB r16, r17, r18 -TaskUnready +SchTaskUnrdy lwz r17, Task.QueueMember + LLL.Next( r8) lbz r18, Task.State( r8) @@ -762,14 +766,12 @@ TaskUnready ; ARG Task *r8 ; CLOB r16, r17, r18 -TaskReadyAsNext +SchRdyTaskLater crclr cr1_eq - b TaskReadyCommonPath - -TaskReadyAsPrev + b _SchRdyTaskCommon +SchRdyTaskNow ; not much point in doing this unless you then flag a scheduler evaluation crset cr1_eq - -TaskReadyCommonPath +_SchRdyTaskCommon lwz r16, Task.QueueMember + LLL.Next(r8) lis r17, 0x8000 ; ...0000 @@ -842,7 +844,7 @@ TaskReadyCommonPath ; ARG AddressSpace *r8, AddressSpace *r9 (can be zero?) -SetSpaceSRsAndBATs +SchSwitchSpace ; This is the only function that hits this counter lwz r17, KDP.NanoKernelInfo + NKNanoKernelInfo.AddrSpcSetCtr(r1) @@ -1130,49 +1132,40 @@ SetAddrSpcRegisters_0x314: -######## ######## ######## ## ### ## ## ## ## -## ## ## ## ## ## ## ### ## ## ## -## ## ## ## ## ## ## #### ## #### -######## ###### ## ## ## ## ## ## ## ## -## ## ## ## ## ######### ## #### ## -## ## ## ## ## ## ## ## ### ## -## ## ######## ## ## ## ## ## ## ## +; Always and only jumped to by IntReturn + +SchReturn -ReturnToAnyTask ; OUTSIDE REFERER lbz r8, EWA.SchEvalFlag(r1) rlwinm. r9, r7, 0, 16, 16 lwz r1, EWA.PA_KDP(r1) - cmpwi cr1, r8, 0x00 + cmpwi cr1, r8, 0 - bne- ReturnFromInterrupt - beq+ cr1, ReturnFromInterrupt + bne- SchExitInterrupt + beq+ cr1, SchExitInterrupt - bl Save_r14_r31 + bl SchSaveStartingAtR14 _Lock PSA.SchLock, scratch1=r27, scratch2=r28 +; Either fallen through from SchReturn, or jumped to by +; TrulyCommonMPCallReturnPath when it wants to block the caller -######## ######## ######## ## ####### ######## ## ## ######## ######## -## ## ## ## ## ## ## ## ## ## ## ## ## -## ## ## ## ## ## ## ## ## ## ## ## ## -######## ###### ## ## ## ## ## ######### ###### ######## -## ## ## ## ## ## ## ## ## ## ## ## ## -## ## ## ## ## ## ## ## ## ## ## ## ## -## ## ######## ## ## ####### ## ## ## ######## ## ## - -RescheduleAndReturn ; OUTSIDE REFERER +SchEval mfsprg r14, 0 - li r8, 0x00 + + li r8, 0 stb r8, EWA.SchEvalFlag(r14) - lwz r31, -0x0008(r14) - lwz r1, -0x0004(r14) + + lwz r31, EWA.PA_CurTask(r14) + lwz r1, EWA.PA_KDP(r14) lwz r9, KDP.NanoKernelInfo + NKNanoKernelInfo.SchEvalCount(r1) addi r9, r9, 1 stw r9, KDP.NanoKernelInfo + NKNanoKernelInfo.SchEvalCount(r1) - bl major_0x14a98 + bl SchFiddlePriorityShifty lbz r27, 0x0019(r31) blt- major_0x142dc_0x58 li r26, 0x01 @@ -1183,12 +1176,13 @@ major_0x142dc_0x38 cmpw r27, r26 mr r8, r31 beq- major_0x142dc_0x58 - bl TaskUnready + bl SchTaskUnrdy stb r26, 0x0019(r31) mr r8, r31 - bl TaskReadyAsPrev + bl SchRdyTaskNow bl CalculateTimeslice + major_0x142dc_0x58 ; OUTSIDE REFERER lwz r27, -0x0970(r1) @@ -1290,7 +1284,7 @@ major_0x142dc_0x1bc _AssertAndRelease PSA.SchLock, scratch=r27 ; r6 = ewa - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 @@ -1302,7 +1296,7 @@ major_0x142dc_0x1bc ## ## ## ## ## ## ## #### -; ReturnFromInterrupt +; SchExitInterrupt ; All MPCalls get here? ; r0,7,8,9,10,11,12,13 restored from r6 area @@ -1314,8 +1308,8 @@ major_0x142dc_0x1bc ; Xrefs: ; non_skeleton_reset_trap -; ReturnToAnyTask -; RescheduleAndReturn +; SchReturn +; SchEval ; major_0x14548 ; > sprg0 = for r1 and r6 @@ -1327,20 +1321,20 @@ major_0x142dc_0x1bc ; > r12 = lr restore ; > r13 = cr restore -ReturnFromInterrupt ; OUTSIDE REFERER +SchExitInterrupt ; OUTSIDE REFERER lwz r8, 0x0edc(r1) mfsprg r1, 0 mtlr r12 mtspr srr0, r10 mtspr srr1, r11 rlwinm. r8, r8, 0, 27, 27 - beq- ReturnFromInterrupt_0x2c + beq- SchExitInterrupt_0x2c mfxer r8 rlwinm r8, r8, 0, 23, 21 rlwimi r8, r7, 19, 23, 23 mtxer r8 -ReturnFromInterrupt_0x2c +SchExitInterrupt_0x2c mtcr r13 lwz r10, 0x0154(r6) lwz r11, 0x015c(r6) @@ -1361,7 +1355,7 @@ ReturnFromInterrupt_0x2c ; major_0x14548 ; Xrefs: -; RescheduleAndReturn +; SchEval major_0x14548 ; OUTSIDE REFERER lwz r16, 0x0064(r31) @@ -1418,7 +1412,7 @@ major_0x14548_0x58 beq- major_0x14548_0xd4 cmpwi r16, 0x00 mr r8, r31 - beql+ TaskReadyAsPrev + beql+ SchRdyTaskNow major_0x14548_0xd4 mfsprg r19, 0 @@ -1449,7 +1443,7 @@ major_0x14548_0xd4 cmpw r18, r9 beq- major_0x14548_0x148 mr r8, r18 - bl SetSpaceSRsAndBATs + bl SchSwitchSpace major_0x14548_0x148 mfsprg r19, 0 @@ -1616,14 +1610,14 @@ major_0x14548_0x380 ; r11 = new srr1 ; r12 = lr restore ; r13 = cr restore - b ReturnFromInterrupt + b SchExitInterrupt ; major_0x148ec ; Xrefs: -; RescheduleAndReturn +; SchEval ; major_0x14548 major_0x148ec ; OUTSIDE REFERER @@ -1694,7 +1688,7 @@ major_0x148ec_0xc8 mtxer r20 li r16, 0x01 stb r16, -0x0309(r21) - b AdjustDecForTMRQGivenCurTime + b SetTimesliceFromCurTime @@ -1709,7 +1703,7 @@ major_0x148ec_0xc8 ; SetEvent ; MPCall_8 ; major_0x130f0 -; RescheduleAndReturn +; SchEval ; major_0x14bcc ; CommonPIHPath @@ -1814,14 +1808,15 @@ clear_cr0_lt ; OUTSIDE REFERER -; major_0x14a98 +; SchFiddlePriorityShifty ; Xrefs: ; IntDecrementer -; RescheduleAndReturn +; SchEval -major_0x14a98 ; OUTSIDE REFERER - rlwinm r8, r7, 10, 0, 0 +SchFiddlePriorityShifty ; OUTSIDE REFERER + + rlwinm r8, r7, EWA.kFlagBlue, 0, 0 lwz r18, KDP.PA_ECB(r1) nand. r8, r8, r8 lwz r17, ContextBlock.PriorityShifty(r18) @@ -1829,24 +1824,26 @@ major_0x14a98 ; OUTSIDE REFERER cmpwi r17, 0 rlwinm r9, r17, 0, 22, 22 - blt- major_0x14a98_0x54 + blt- @pshifty_high_bit_set + cmpwi r9, 0x200 lwz r16, ContextBlock.r25(r18) - beq- major_0x14a98_0x48 + beq- @pshifty_bit_22_set + clrlwi r8, r16, 29 clrlwi r9, r17, 28 cmpwi r8, 6 - bgt- major_0x14a98_0x48 + bgt- @pshifty_bit_22_set cmpw r8, r9 bltlr- cmpw r8, r8 -major_0x14a98_0x48 +@pshifty_bit_22_set ori r17, r17, 0x100 stw r17, ContextBlock.PriorityShifty(r18) blr -major_0x14a98_0x54 +@pshifty_high_bit_set clrlwi r17, r17, 1 stw r17, ContextBlock.PriorityShifty(r18) blr @@ -1864,71 +1861,109 @@ major_0x14a98_0x54 ; ARG Task *r8 FlagSchEvaluationIfTaskRequires ; OUTSIDE REFERER + lwz r16, Task.Flags(r8) mfsprg r15, 0 - rlwinm. r16, r16, 0, Task.kFlag25, Task.kFlag26 - bne- major_0x14af8_0xa0 + + rlwinm. r16, r16, 0, Task.kFlag25, Task.kFlag26 + bne- FlagSchEval addi r16, r15, EWA.CPUBase - lbz r17, 0x0019(r8) + lbz r17, Task.Priority(r8) lwz r19, CPU.LLL + LLL.Freeform(r16) + + + ; Uniprocessor systems: + ; Flag a reevaluation on this, the only CPU + lwz r14, CoherenceGroup.ScheduledCpuCount(r19) cmpwi r14, 2 - blt- major_0x14af8_0xa0 + blt- FlagSchEval + + + ; Multiprocessor systems: + ; Find the best CPU to flag a -;multiprocessor lwz r14, CoherenceGroup.CpuCount(r19) mr r18, r16 b @loopentry -@34 - lwz r16, 0x0008(r19) + ; r19 = motherboard coherence group + ; r14 = loop counter + ; r16 = current CPU pointer -@38 - addi r16, r16, -0x08 +@loop_hit_the_coherence_group + lwz r16, CoherenceGroup.CPUList + LLL.Next(r19) +@loop + subi r16, r16, CPU.LLL @loopentry - addi r14, r14, -0x01 - lbz r20, 0x0229(r16) - lwz r21, 0x0018(r16) + subi r14, r14, 1 + + lbz r20, CPU.EWA + EWA.TaskPriority(r16) + lwz r21, CPU.Flags(r16) + cmpw cr1, r17, r20 - rlwinm. r21, r21, 0, 28, 28 - bge- cr1, @60 - beq- @60 + rlwinm. r21, r21, 0, CPU.kFlagScheduled, CPU.kFlagScheduled + + bge- cr1, @cpu_not_best_for_task + beq- @cpu_not_best_for_task + mr r17, r20 mr r18, r16 +@cpu_not_best_for_task -@60 - lwz r16, 0x0010(r16) - cmpwi cr1, r14, 0x00 + lwz r16, CPU.LLL + LLL.Next(r16) ; next element + + cmpwi cr1, r14, 0 cmpw r16, r19 - ble- cr1, @78 - beq+ @34 - b @38 -@78 - lbz r16, 0x0019(r8) + ble- cr1, @exit_loop + beq+ @loop_hit_the_coherence_group ; skip the owner of the linked list + + b @loop +@exit_loop + + ; r17 = least-important priority being executed on any CPU + ; r18 = pointer to that CPU + + ; No suitable CPU found (all running important-er tasks) + lbz r16, Task.Priority(r8) cmpw r17, r16 blelr- + + ; Was this CPU the most suitable? lhz r17, EWA.CPUIndex(r15) lhz r18, CPU.EWA + EWA.CPUIndex(r18) cmpw r18, r17 - bne- DoInterprocessorAlert + bne- AlertSchEvalOnOtherCPU + ; otherwise fall through to FlagSchEvalOnThisCPU -NINETYFOUR - li r16, 0x01 + + ; RETURN PATHS + + ; To force a scheduler evaluation to run on *this* CPU when returning from + ; *this* interrupt, just raise a flag. + +FlagSchEvalOnThisCPU + li r16, 1 stb r16, EWA.SchEvalFlag(r15) blr -major_0x14af8_0xa0 + ; Public function! Can go to FlagSchEvalOnThisCPU or AlertSchEvalOnOtherCPU + +FlagSchEval mfsprg r15, 0 lhz r18, Task.CPUIndex(r8) lhz r17, EWA.CPUIndex(r15) cmpw r17, r18 - beq+ NINETYFOUR + beq+ FlagSchEvalOnThisCPU -DoInterprocessorAlert + + ; To force a scheduler evaluation to run on *another* CPU, we interrupt it + +AlertSchEvalOnOtherCPU lwz r9, KDP.NanoKernelInfo + NKNanoKernelInfo.AlertCount(r1) addi r9, r9, 1 stw r9, KDP.NanoKernelInfo + NKNanoKernelInfo.AlertCount(r1) @@ -1938,7 +1973,7 @@ DoInterprocessorAlert stw r18, EWA.SIGPCallR4(r15) li r8, 2 - b SIGP + b SIGP ; returns to link register @@ -2051,7 +2086,7 @@ NewCpuEntryPoint lwz r8, Task.AddressSpacePtr(r31) li r9, 0 - bl SetSpaceSRsAndBATs + bl SchSwitchSpace _log 'Adding idle task 0x' mr r8, r31 @@ -2059,11 +2094,11 @@ NewCpuEntryPoint _log 'to the ready queue^n' mr r8, r31 - bl TaskReadyAsPrev + bl SchRdyTaskNow bl CalculateTimeslice - lwz r16, CPU.Eff(r3) + lwz r16, CPU.Flags(r3) ori r16, r16, 8 - stw r16, CPU.Eff(r3) + stw r16, CPU.Flags(r3) lwz r17, Task.QueueMember + LLL.Freeform(r3) lwz r16, 0x0024(r17) @@ -2082,11 +2117,14 @@ NewCpuEntryPoint mr r30, r31 b major_0x142dc_0xd8 + + b major_0x142dc_0x58 -IdleCode +SchIdleTask + li r31, 0 lisori r20, 'idle' lisori r21, 'task' @@ -2164,7 +2202,7 @@ IdleCode -StopProcessor +SchIdleTaskStopper mfmsr r30 andi. r29, r30, 0x7fff mtmsr r29 @@ -2185,7 +2223,7 @@ StopProcessor lwz r8, 0x001c(r31) li r9, 0x00 stw r9, 0x001c(r31) - bl TaskUnready + bl SchTaskUnrdy addi r16, r1, -0xa44 addi r17, r8, 0x08 stw r16, 0x0000(r17) @@ -2201,7 +2239,7 @@ StopProcessor twi 31, r31, 8 _log 'Stop didn''t work - going to sleep.^n' -StopProcessor_0x10c +SchIdleTaskStopper_0x10c lis r5, 0x7fff ori r5, r5, 0xffff mtdec r5 @@ -2209,4 +2247,4 @@ StopProcessor_0x10c li r3, 6 li r4, 0 twi 31, r31, 5 - b StopProcessor_0x10c \ No newline at end of file + b SchIdleTaskStopper_0x10c diff --git a/NanoKernel/NKSleep.s b/NanoKernel/NKSleep.s index eef528b..095d3f9 100644 --- a/NanoKernel/NKSleep.s +++ b/NanoKernel/NKSleep.s @@ -374,7 +374,7 @@ RestoreKernelState_0x144 mfsprg r15, 0 lwz r8, -0x001c(r15) li r9, 0x00 - bl SetSpaceSRsAndBATs + bl SchSwitchSpace isync mfsprg r15, 0 diff --git a/NanoKernel/NKSync.s b/NanoKernel/NKSync.s index e1f7a0e..e052f37 100644 --- a/NanoKernel/NKSync.s +++ b/NanoKernel/NKSync.s @@ -155,7 +155,7 @@ MPDeleteQueue ; Put RDYQ subi r8, r16, Task.QueueMember - bl TaskReadyAsPrev + bl SchRdyTaskNow bl FlagSchEvaluationIfTaskRequires @@ -392,7 +392,7 @@ EnqueueMessage li r17, Task.kLatencyProtectPriority stb r17, Task.Priority(r8) - bl TaskReadyAsPrev + bl SchRdyTaskNow bl CalculateTimeslice bl FlagSchEvaluationIfTaskRequires @@ -491,7 +491,7 @@ MPWaitOnQueue ; Remove from ready queue mr r8, r19 - bl TaskUnready + bl SchTaskUnrdy ; Add to this queue lwz r19, EWA.PA_CurTask(r30) @@ -711,7 +711,7 @@ MPWaitOnSemaphore ;committed to blocking the calling task ; Remove from ready queue - bl TaskUnready + bl SchTaskUnrdy ; Add to this queue addi r16, r31, Semaphore.BlockedTasks @@ -861,7 +861,7 @@ SignalSemaphore_0x30 addi r8, r16, -0x08 li r17, 0x01 stb r17, 0x0019(r8) - bl TaskReadyAsPrev + bl SchRdyTaskNow bl CalculateTimeslice bl FlagSchEvaluationIfTaskRequires mtlr r27 @@ -924,7 +924,7 @@ MPCall_21_0x68 lwz r16, 0x0008(r31) RemoveFromList r16, scratch1=r17, scratch2=r18 addi r8, r16, -0x08 - bl TaskReadyAsPrev + bl SchRdyTaskNow bl FlagSchEvaluationIfTaskRequires b MPCall_21_0x34 @@ -1089,7 +1089,7 @@ MPCall_27_0x78 MPCall_27_0xb4 mr r8, r30 - bl TaskUnready + bl SchTaskUnrdy lis r16, 0x7fff addi r18, r30, 0x08 ori r16, r16, 0xffff @@ -1236,7 +1236,7 @@ MPCall_28_0x94 stw r18, 0x00fc(r17) li r17, 0x01 stb r17, 0x0019(r8) - bl TaskReadyAsPrev + bl SchRdyTaskNow bl CalculateTimeslice bl FlagSchEvaluationIfTaskRequires @@ -1289,7 +1289,7 @@ MPCall_26_0x68 lwz r16, 0x0008(r31) RemoveFromList r16, scratch1=r17, scratch2=r18 addi r8, r16, -0x08 - bl TaskReadyAsPrev + bl SchRdyTaskNow bl FlagSchEvaluationIfTaskRequires b MPCall_26_0x34 @@ -1442,7 +1442,7 @@ MPDeleteEvent_0x68 lwz r16, 0x0008(r31) RemoveFromList r16, scratch1=r17, scratch2=r18 addi r8, r16, -0x08 - bl TaskReadyAsPrev + bl SchRdyTaskNow bl FlagSchEvaluationIfTaskRequires b MPDeleteEvent_0x34 @@ -1543,7 +1543,7 @@ SetEvent li r17, Task.kLatencyProtectPriority stb r17, Task.Priority(r8) - bl TaskReadyAsPrev + bl SchRdyTaskNow bl CalculateTimeslice bl FlagSchEvaluationIfTaskRequires @@ -1608,7 +1608,7 @@ SetEvent lwz r16, Task.Flags(r26) lbz r19, Task.State(r26) - ori r16, r16, (1 << (31 - Task.kFlag27)) + ori r16, r16, (1 << (31 - Task.kFlag68kInterrupt)) stw r16, Task.Flags(r26) ; But what *is* MCR? @@ -1636,7 +1636,7 @@ SetEvent li r16, Task.kCriticalPriority stb r16, Task.Priority(r26) mr r8, r26 - bl TaskReadyAsNext + bl SchRdyTaskLater mr r8, r26 bl CalculateTimeslice @task_already_running @@ -1749,7 +1749,7 @@ MPWaitForEvent_field_10_was_zero ; MOVE TASK OUT OF QUEUE AND INTO EVENT GROUP mr r8, r19 - bl TaskUnready + bl SchTaskUnrdy lwz r19, EWA.PA_CurTask(r30) addi r16, r31, EventGroup.LLL @@ -2610,7 +2610,7 @@ major_0x0dce8_0x60 li r16, 0x01 stb r16, 0x0019(r19) lwz r8, PSA.PA_BlueTask(r1) - bl TaskReadyAsPrev + bl SchRdyTaskNow major_0x0dce8_0x70 lwz r8, PSA.PA_BlueTask(r1) diff --git a/NanoKernel/NKTasks.s b/NanoKernel/NKTasks.s index 1352596..9ecd3df 100644 --- a/NanoKernel/NKTasks.s +++ b/NanoKernel/NKTasks.s @@ -131,34 +131,25 @@ CreateTask ; Create a semaphore struct inside the task -; (NOT a semaphore queue) - addi r16, r28, Task.SemaphoreLLL - _lstart r17, 'SEMA' - stw r16, LLL.Next(r16) + addi r16, r28, Task.Semaphore + _lstart r17, Semaphore.kSignature + stw r16, Semaphore.BlockedTasks + LLL.Next(r16) _lfinish - stw r16, LLL.Prev(r16) - stw r17, LLL.Signature(r16) - - - -; Might be part of the SEMA? + stw r16, Semaphore.BlockedTasks + LLL.Prev(r16) + stw r17, Semaphore.BlockedTasks + LLL.Signature(r16) li r16, 1 - stw r16, Task.One(r28) + stw r16, Task.Semaphore + Semaphore.MaxValue(r28) li r16, 0 - stw r16, Task.Zero(r28) + stw r16, Task.Semaphore + Semaphore.Value(r28) - - -; Allocate an ID for the SEMA - - addi r8, r28, Task.SemaphoreLLL + addi r8, r28, Task.Semaphore li r9, Semaphore.kIDClass bl MakeID cmpwi r8, 0 beq- @fail_semq_no_id - stw r8, Task.SemaphoreLLL + LLL.Freeform(r28) + stw r8, Task.Semaphore + Semaphore.BlockedTasks + LLL.Freeform(r28) @@ -356,7 +347,7 @@ MPCall_8 ; OUTSIDE REFERER addi r16, r31, 0x08 RemoveFromList r16, scratch1=r17, scratch2=r18 mr r8, r31 - bl TaskReadyAsPrev + bl SchRdyTaskNow bl CalculateTimeslice bl FlagSchEvaluationIfTaskRequires @@ -403,7 +394,7 @@ MPCall_9 ; OUTSIDE REFERER li r17, 0x01 stb r17, 0x0019(r31) mr r8, r31 - bl major_0x14af8_0xa0 + bl FlagSchEval _AssertAndRelease PSA.SchLock, scratch=r16 subi r10, r10, 4 b MPCall_6_0x78 @@ -428,7 +419,7 @@ MPCall_9_0xe0 ori r16, r16, 0x02 stw r16, 0x0064(r31) mr r8, r31 - bl TaskUnready + bl SchTaskUnrdy MPCall_9_0xf0 lwz r17, 0x009c(r31) @@ -597,7 +588,7 @@ MPCall_14 ; OUTSIDE REFERER stw r18, 0x0014(r16) beq- MPCall_14_0x70 mr r8, r31 - bl major_0x14af8_0xa0 + bl FlagSchEval MPCall_14_0x70 stw r4, 0x001c(r31) @@ -697,7 +688,7 @@ KCThrowException_0x70 stw r4, 0x00f8(r31) stw r16, 0x0064(r31) mr r8, r31 - bl TaskUnready + bl SchTaskUnrdy addi r16, r1, -0xa34 addi r17, r31, 0x08 stw r16, 0x0000(r17) @@ -712,7 +703,7 @@ KCThrowException_0xb8 li r17, 0x01 stb r17, 0x0019(r31) mr r8, r31 - bl major_0x14af8_0xa0 + bl FlagSchEval _AssertAndRelease PSA.SchLock, scratch=r16 subi r10, r10, 4 b MPCall_6_0x78 @@ -790,7 +781,7 @@ MPCall_58_0xb4 addi r16, r31, 0x08 RemoveFromList r16, scratch1=r17, scratch2=r18 mr r8, r31 - bl TaskReadyAsPrev + bl SchRdyTaskNow bl FlagSchEvaluationIfTaskRequires MPCall_58_0xe0 @@ -800,9 +791,9 @@ MPCall_58_0xe0 FuncExportedFromTasks ; OUTSIDE REFERER - addi r16, r1, -0xa34 - addi r17, r31, 0x08 - stw r16, 0x0000(r17) + addi r16, r1, PSA.DbugQueue + addi r17, r31, Task.QueueMember + stw r16, LLL.Freeform(r17) InsertAsPrev r17, r16, scratch=r18 li r8, 0x1c bl PoolAlloc @@ -886,6 +877,8 @@ LoadSomeData ; OUTSIDE REFERER +; Used to extract task state. This will be tricky. + DeclareMPCall 59, MPCall_59 MPCall_59 ; OUTSIDE REFERER @@ -1505,8 +1498,8 @@ MPCall_114 ; OUTSIDE REFERER rlwinm. r8, r16, 0, 26, 26 mr r8, r31 bne- MPCall_114_0x90 - bl TaskUnready - bl TaskReadyAsPrev + bl SchTaskUnrdy + bl SchRdyTaskNow MPCall_114_0x90 bl FlagSchEvaluationIfTaskRequires diff --git a/NanoKernel/NKThud.s b/NanoKernel/NKThud.s index 5696820..a640303 100644 --- a/NanoKernel/NKThud.s +++ b/NanoKernel/NKThud.s @@ -68,7 +68,7 @@ ; major_0x129cc ; Local_Panic ; Local_Panic -; RescheduleAndReturn +; SchEval ; major_0x14548 ; Local_Panic ; CommonPIHPath diff --git a/NanoKernel/NKTimers.s b/NanoKernel/NKTimers.s index 02a9bf6..65e682d 100644 --- a/NanoKernel/NKTimers.s +++ b/NanoKernel/NKTimers.s @@ -239,7 +239,7 @@ TimerDispatch_0x180: TimerDispatch_0x188 lwz r19, EWA.TimerDispatchLR(r18) mtlr r19 - b AdjustDecForTMRQGivenCurTimeAndTripTime + b SetTimesliceFromCurTimeAndTripTime @@ -255,8 +255,8 @@ StartTimeslicing ; OUTSIDE REFERER stb r8, EWA.GlobalTimeIsValid(r19) li r8, 0 - stw r8, -0x02e8(r19) - stw r8, -0x02e4(r19) + stw r8, EWA.GlobalTime(r19) + stw r8, EWA.GlobalTime + 4(r19) mflr r19 _log 'Starting timeslicing^n' @@ -267,7 +267,7 @@ StartTimeslicing ; OUTSIDE REFERER ; CLOB r8/r9, r16-r21 -AdjustDecForTMRQ +SetTimeslice mflr r19 bl GetTime @@ -279,7 +279,7 @@ AdjustDecForTMRQ ; ARG TimeBase r8/r9 curTime ; CLOB r16-r21 -AdjustDecForTMRQGivenCurTime +SetTimesliceFromCurTime ; This should get the most distant time??? lwz r18, PSA.TimerQueue + LLL.Next(r1) @@ -292,7 +292,7 @@ AdjustDecForTMRQGivenCurTime ; ARG TimeBase r8/r9 curTime, TimeBase r16/r17 TripTime ; CLOB r18-r21 -AdjustDecForTMRQGivenCurTimeAndTripTime +SetTimesliceFromCurTimeAndTripTime mfxer r20 mfsprg r19, 0 @@ -372,7 +372,7 @@ TimerFire1 ; OUTSIDE REFERER RemoveFromList r16, scratch1=r17, scratch2=r19 li r17, 0x01 stb r17, 0x0019(r8) - bl TaskReadyAsPrev + bl SchRdyTaskNow bl CalculateTimeslice bl FlagSchEvaluationIfTaskRequires b TimerDispatch_0x144 @@ -442,7 +442,7 @@ TimerFire2_0x98 lwz r8, 0x0018(r30) addi r16, r8, 0x08 RemoveFromList r16, scratch1=r17, scratch2=r18 - bl TaskReadyAsPrev + bl SchRdyTaskNow @@ -539,7 +539,7 @@ TimerFire4_0x10 ; OUTSIDE REFERER mfsprg r28, 0 lwz r29, -0x0008(r28) mr r8, r29 - bl TaskUnready + bl SchTaskUnrdy lbz r17, 0x0019(r29) cmpwi r17, 0x02 bge- TimerFire4_0x64 @@ -549,7 +549,7 @@ TimerFire4_0x10 ; OUTSIDE REFERER bl clear_cr0_lt bge- TimerFire4_0x50 mr r8, r29 - bl TaskReadyAsPrev + bl SchRdyTaskNow bl CalculateTimeslice b TimerFire5_0x8 @@ -557,7 +557,7 @@ TimerFire4_0x50 li r18, 0x02 stb r18, 0x0019(r29) mr r8, r29 - bl TaskReadyAsPrev + bl SchRdyTaskNow b TimerFire5_0x8 TimerFire4_0x64 @@ -572,7 +572,7 @@ TimerFire4_0x64 ; TimerFire4 TimerFire5 ; OUTSIDE REFERER - bl TaskReadyAsPrev + bl SchRdyTaskNow bl major_0x149d4 TimerFire5_0x8 ; OUTSIDE REFERER @@ -844,7 +844,7 @@ EnqueueTimer ; OUTSIDE REFERER stw r8, LLL.Next(r20) ; next of considered = me stw r19, LLL.Freeform(r8) ; my freeform = my original freeform - b AdjustDecForTMRQ + b SetTimeslice @insert_further_ahead lwz r20, PSA.TimerQueue + TimerQueueStruct.LLL + LLL.Prev(r1) @@ -898,7 +898,7 @@ DequeueTimer cmpw r18, r8 stb r16, Timer.Byte3(r8) - beq+ AdjustDecForTMRQ + beq+ SetTimeslice blr @@ -912,7 +912,7 @@ DequeueTimer ; MPCall_27 ; MPCall_52 ; MPCall_31 -; InitRDYQs +; SchInit ; Get the number of timebase ticks in a specified period @@ -958,8 +958,8 @@ TimebaseTicksPerPeriod ; MPCall_32 ; CreateTask ; InitTMRQs -; AdjustDecForTMRQ -; RescheduleAndReturn +; SetTimeslice +; SchEval ; major_0x14548 ; RET long r8 tbu, long r9 tbl diff --git a/NanoKernel/NKTranslation.s b/NanoKernel/NKTranslation.s index 50e7b95..58ed1b7 100644 --- a/NanoKernel/NKTranslation.s +++ b/NanoKernel/NKTranslation.s @@ -2253,12 +2253,8 @@ ProbePerfMonitor_0x188 -; FDP_1214 +FDPEmulateInstruction -; Xrefs: -; IntProgram - -FDP_1214 ; OUTSIDE REFERER mfsprg r1, 0 lwz r8, 0x0104(r6) stw r8, 0x0000(r1) diff --git a/NanoKernel/NKVMCalls.s b/NanoKernel/NKVMCalls.s index 5cdb6af..4f2fb37 100644 --- a/NanoKernel/NKVMCalls.s +++ b/NanoKernel/NKVMCalls.s @@ -462,7 +462,7 @@ VMInit_0x29c mfsprg r9, 0 lwz r6, EWA.PA_ContextBlock(r9) - bl Save_r14_r31 ; need some registers + bl SchSaveStartingAtR14 ; need some registers lwz r8, EWA.PA_CurAddressSpace(r9) li r9, 0 @@ -495,7 +495,7 @@ VMInit_0x29c bl printw _log '^n' - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 b VMReturn0 @@ -562,7 +562,7 @@ VMGetPhysicalPage ; OUTSIDE REFERER lwz r6, -0x0014(r9) ; r6 = ewa - bl Save_r14_r31 + bl SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) slwi r29, r4, 12 @@ -574,7 +574,7 @@ VMGetPhysicalPage ; OUTSIDE REFERER VMGetPhysicalPage_0x28 ; r6 = ewa - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 lwz r9, KDP.PrimaryAddrRangePages(r1) VMGetPhysicalPage_0x30 @@ -595,7 +595,7 @@ getPTEntryGivenPage ; OUTSIDE REFERER lwz r6, -0x0014(r9) ; r6 = ewa - bl Save_r14_r31 + bl SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) slwi r29, r4, 12 @@ -617,7 +617,7 @@ getPTEntryGivenPage_0x3c getPTEntryGivenPage_0x48 ; r6 = ewa - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 lwz r9, KDP.PrimaryAddrRangePages(r1) getPTEntryGivenPage_0x50 @@ -698,12 +698,12 @@ major_0x08d88_0x8c major_0x08d88_0xa8 ; OUTSIDE REFERER ; r6 = ewa - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 b VMReturnMinus1 major_0x08d88_0xb0 ; OUTSIDE REFERER ; r6 = ewa - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 b VMReturn @@ -730,7 +730,7 @@ VMIsResident ; OUTSIDE REFERER lwz r6, -0x0014(r9) ; r6 = ewa - bl Save_r14_r31 + bl SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) slwi r29, r4, 12 @@ -742,7 +742,7 @@ VMIsResident ; OUTSIDE REFERER VMIsResident_0x28 ; r6 = ewa - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 lwz r9, KDP.PrimaryAddrRangePages(r1) VMIsResident_0x30 @@ -875,13 +875,13 @@ VMMakePageCacheable_0x40 lwz r6, -0x0014(r6) ; r6 = ewa - bl Save_r14_r31 + bl SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) bl major_0x08f14 ; r6 = ewa - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 lwz r5, 0x000c(r15) andi. r6, r5, 0xe01 cmpwi r6, 0xa01 @@ -950,13 +950,13 @@ VMMakePageWriteThrough_0x3c lwz r6, -0x0014(r6) ; r6 = ewa - bl Save_r14_r31 + bl SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) bl major_0x08f14 ; r6 = ewa - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 lwz r5, 0x000c(r15) andi. r6, r5, 0xe01 cmpwi r6, 0xa01 @@ -1119,13 +1119,13 @@ VMMakePageNonCacheable_0x78 lwz r6, -0x0014(r6) ; r6 = ewa - bl Save_r14_r31 + bl SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) bl major_0x08f14 ; r6 = ewa - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 lwz r5, 0x0004(r15) srwi r6, r5, 12 cmpw r6, r4 @@ -1172,7 +1172,7 @@ VMMarkBacking ; OUTSIDE REFERER lwz r6, -0x0014(r9) ; r6 = ewa - bl Save_r14_r31 + bl SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) slwi r29, r4, 12 @@ -1196,7 +1196,7 @@ VMMarkBacking_0x30 VMMarkBacking_0x50 ; r6 = ewa - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 lwz r9, KDP.PrimaryAddrRangePages(r1) VMMarkBacking_0x58 @@ -1277,7 +1277,7 @@ VMMarkResident ; OUTSIDE REFERER lwz r6, -0x0014(r9) ; r6 = ewa - bl Save_r14_r31 + bl SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) slwi r29, r4, 12 @@ -1299,7 +1299,7 @@ VMMarkResident ; OUTSIDE REFERER VMMarkResident_0x50 ; r6 = ewa - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 lwz r9, KDP.PrimaryAddrRangePages(r1) VMMarkResident_0x58 @@ -1348,7 +1348,7 @@ setPTEntryGivenPage ; OUTSIDE REFERER lwz r6, -0x0014(r9) ; r6 = ewa - bl Save_r14_r31 + bl SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) mr r26, r4 @@ -1375,7 +1375,7 @@ setPTEntryGivenPage_0x34 setPTEntryGivenPage_0x5c ; r6 = ewa - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 lwz r9, KDP.PrimaryAddrRangePages(r1) setPTEntryGivenPage_0x64 @@ -1562,7 +1562,7 @@ VMAllocateMemory_0x1a4 lwz r6, -0x0014(r6) ; r6 = ewa - bl Save_r14_r31 + bl SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) mr r30, r14 @@ -1631,7 +1631,7 @@ VMAllocateMemory_0x1a4 VMAllocateMemory_0x2e0 ; r6 = ewa - bl Restore_r14_r31 + bl SchRestoreStartingAtR14 b VMReturn1 VMAllocateMemory_0x2e8