From f20a0216aa08ff21adae6857184936e02550f6ae Mon Sep 17 00:00:00 2001 From: DBJ314 <28739710+DBJ314@users.noreply.github.com> Date: Sun, 29 Apr 2018 18:39:50 -0400 Subject: [PATCH] Look at a bunch of Task code --- NanoKernel/NKMPCalls.s | 6 +- NanoKernel/NKTasks.s | 140 +++++++++++++++++++++-------------------- 2 files changed, 76 insertions(+), 70 deletions(-) diff --git a/NanoKernel/NKMPCalls.s b/NanoKernel/NKMPCalls.s index 549ec68..e578aa8 100644 --- a/NanoKernel/NKMPCalls.s +++ b/NanoKernel/NKMPCalls.s @@ -1610,12 +1610,12 @@ MPMarkPMFTask mr. r8, r3 lwz r31, EWA.PA_CurTask(r30) - beq @use_blue_task_instead + beq @use_this_task_instead bl LookupID cmpwi r9, Task.kIDClass mr r31, r8 bne ReleaseAndReturnMPCallInvalidIDErr -@use_blue_task_instead +@use_this_task_instead ; Insert bit 31 of r4 into bit 21 of these flags lwz r17, Task.Flags(r31) @@ -2035,7 +2035,7 @@ MPCall_133 ; OUTSIDE REFERER _Lock PSA.SchLock, scratch1=r16, scratch2=r17 cmpw r3, r0 - lwz r16, 0x0edc(r1) + lwz r16, KDP.NanoKernelInfo + NKNanoKernelInfo.ConfigFlags(r1) li r17, 0x0b blt MPCall_133_0x34 and r3, r3, r17 diff --git a/NanoKernel/NKTasks.s b/NanoKernel/NKTasks.s index fe69acc..7cfa976 100644 --- a/NanoKernel/NKTasks.s +++ b/NanoKernel/NKTasks.s @@ -522,19 +522,22 @@ TasksFuncThatIsNotAMPCall blr +; int MPIsTaskBlue(TaskID) +; Returns true if the Task ID is the same as the blue Task. +; If the Task ID sent is 0, it uses the calling Task's ID. - DeclareMPCall 11, MPCall_11 + DeclareMPCall 11, MPIsTaskBlue -MPCall_11 ; OUTSIDE REFERER +MPIsTaskBlue ; OUTSIDE REFERER mfsprg r16, 0 cmpwi r3, 0x00 lwz r17, PSA.PA_BlueTask(r1) - lwz r18, -0x0008(r16) - lwz r19, 0x0000(r17) - bne MPCall_11_0x1c - lwz r3, 0x0000(r18) + lwz r18, EWA.PA_CurTask(r16) + lwz r19, Task.ID(r17) + bne @ID_Provided + lwz r3, Task.ID(r18);if r3 is 0, use calling Task's ID -MPCall_11_0x1c +@ID_Provided cmpw r3, r19 li r3, 0x01 beq CommonMPCallReturnPath @@ -542,21 +545,24 @@ MPCall_11_0x1c b CommonMPCallReturnPath - +; returns the ID and SomeLabelField of the blue Task. +; Needs a name. MPGetBlueTaskIDAndSomeLabelField() isn't good enough DeclareMPCall 12, MPCall_12 MPCall_12 ; OUTSIDE REFERER mfsprg r14, 0 - lwz r15, -0x0008(r14) - lwz r3, 0x0000(r15) - lwz r4, 0x00ec(r15) + lwz r15, EWA.PA_CurTask(r14) + lwz r3, Task.ID(r15) + lwz r4, Task.SomeLabelField(r15) b CommonMPCallReturnPath +; OSStatus MPSetTaskWeight(TaskID, weight) +; sets the weight of a Task. Recalculates scheduler stuff if needed. +; Name is just a guess. Change it if you find out what this is really called. + DeclareMPCall 14, MPSetTaskWeight - DeclareMPCall 14, MPCall_14 - -MPCall_14 ; OUTSIDE REFERER +MPSetTaskWeight ; OUTSIDE REFERER cmpwi r4, 0x01 cmpwi cr1, r4, 10000 blt ReturnMPCallInvalidIDErr @@ -572,22 +578,22 @@ MPCall_14 ; OUTSIDE REFERER bne ReleaseAndReturnMPCallInvalidIDErr mr r31, r8 - lbz r16, 0x0018(r31) + lbz r16, Task.State(r31) cmpwi r16, 0x01 - bne MPCall_14_0x70 - lwz r16, 0x0008(r31) - lwz r17, 0x001c(r31) - lwz r18, 0x0014(r16) - subf r17, r17, r4 - add r18, r17, r18 + bne @Set_Weight;if task isn't running, you can change its weight freely + lwz r16, Task.QueueMember(r31) + lwz r17, Task.Weight(r31) + lwz r18, ReadyQueue.TotalWeight(r16) + subf r17, r17, r4 ;get the change in weight + add r18, r17, r18;add the change to ReadyQueue.TotalWeight cmpwi r17, 0x00 - stw r18, 0x0014(r16) - beq MPCall_14_0x70 + stw r18, ReadyQueue.TotalWeight(r16) + beq @Set_Weight;don't mess with scheduler if weight is unchanged mr r8, r31 bl FlagSchEval -MPCall_14_0x70 - stw r4, 0x001c(r31) +@Set_Weight + stw r4, Task.Weight(r31) ; r1 = kdp b ReleaseAndReturnZeroFromMPCall @@ -723,16 +729,15 @@ MPCall_58 ; OUTSIDE REFERER lwz r29, Task.Flags(r31) mtcr r29 - li r3, kMPTaskAbortedErr - bc BO_IF, 30, ReleaseAndReturnMPCall + bc BO_IF, Task.kFlagAborted, ReleaseAndReturnMPCall - bc BO_IF, 18, MPCall_58_0x44 - bc BO_IF_NOT, 22, ReleaseAndReturnMPCallOOM + bc BO_IF, Task.kFlagPageFaulted, MPCall_58_0x44 + bc BO_IF_NOT, Task.kFlagStopped, ReleaseAndReturnMPCallOOM MPCall_58_0x44 mtcr r4 - lwz r30, 0x0088(r31) + lwz r30, Task.ContextBlockPtr(r31) bc BO_IF_NOT, 31, MPCall_58_0x68 li r8, 0x1c bl PoolAlloc @@ -743,8 +748,8 @@ MPCall_58_0x44 MPCall_58_0x68 li r17, 0x3800 - rlwinm. r8, r29, 0, 18, 18 - andc r29, r29, r17 + rlwinm. r8, r29, 0, 18, 18;Task.kFlagPageFaulted, but empw complains when I call it that + andc r29, r29, r17 ;clear Task.kFlagPageFaulted, Task.kFlag19, and Task.kFlag20 li r17, 0x00 bne cr7, MPCall_58_0x80 ori r17, r17, 0x400 @@ -754,8 +759,8 @@ MPCall_58_0x80 ori r17, r17, 0x200 MPCall_58_0x88 - lwz r18, 0x00a4(r30) - rlwimi r18, r17, 0, 21, 22 + lwz r18, ContextBlock.MSR(r30) + rlwimi r18, r17, 0, MSR_SEbit, MSR_BEbit stw r18, 0x00a4(r30) li r19, 0x600 lwz r17, 0x0008(r31) @@ -913,13 +918,13 @@ MPCall_60 ; OUTSIDE REFERER mtcr r16 li r3, kMPTaskAbortedErr - bc BO_IF, 30, ReleaseAndReturnMPCall + bc BO_IF, Task.kFlagAborted, ReleaseAndReturnMPCall - bc BO_IF, 18, MPCall_60_0x4c - bc BO_IF_NOT, 22, ReleaseAndReturnMPCallOOM + bc BO_IF, Task.kFlagPageFaulted, MPCall_60_0x4c + bc BO_IF_NOT, Task.kFlagStopped, ReleaseAndReturnMPCallOOM MPCall_60_0x4c - lbz r16, 0x0018(r31) + lbz r16, Task.State(r31) cmpwi r16, 0x00 bne ReleaseAndReturnMPCallOOM cmpwi r4, 0x00 @@ -932,11 +937,11 @@ MPCall_60_0x4c beq cr1, MPCall_60_0x1c0 cmpwi r4, 0x04 bne ReleaseAndReturnMPCallOOM - lwz r16, 0x0088(r31) + lwz r16, Task.ContextBlockPtr(r31) li r17, 0x00 cmplwi r5, 0x00 cmplwi cr1, r5, 0x04 - beq MPCall_60_0xac + beq MPCall_60_0xac;gets ID of Area SRR0 is in beq cr1, MPCall_60_0xc0 cmplwi r5, 0x08 cmplwi cr1, r5, 0x0c @@ -945,41 +950,41 @@ MPCall_60_0x4c b ReleaseAndReturnMPCallOOM MPCall_60_0xac - lwz r8, 0x0070(r31) - lwz r9, 0x0074(r16) + lwz r8, Task.AddressSpacePtr(r31) + lwz r9, ContextBlock.SRR0(r16) bl FindAreaAbove - lwz r17, 0x0000(r8) + lwz r17, Area.ID(r8) b MPCall_60_0x36c MPCall_60_0xc0 - lwz r17, 0x0074(r16) + lwz r17, ContextBlock.SRR0(r16) b MPCall_60_0x36c MPCall_60_0xc8 - lwz r17, 0x00f8(r31) + lwz r17, Task.ErrToReturnIfIDie(r31) b MPCall_60_0x36c MPCall_60_0xd0 - lwz r17, 0x0040(r16) - lwz r18, 0x0064(r16) - rlwinm. r8, r17, 0, 27, 27 + lwz r17, ContextBlock.SavedFlags(r16) + lwz r18, 0x0064(r16);some unknown ContextBlock value + rlwinm. r8, r17, 0, EWA.kFlagLowSaves, EWA.kFlagLowSaves li r17, 0x02 beq MPCall_60_0x36c - rlwinm. r8, r18, 0, 1, 1 + rlwinm. r8, r18, 0, EWA.kFlag1, EWA.kFlag1 li r17, 0x01 bne MPCall_60_0x36c li r17, 0x00 b MPCall_60_0x36c MPCall_60_0xf8 - lwz r16, 0x0088(r31) + lwz r16, Task.ContextBlockPtr(r31) cmplwi cr1, r5, 0xf8 andi. r17, r5, 0x07 addi r16, r16, 0xfc b MPCall_60_0x124 MPCall_60_0x10c - lwz r16, 0x0088(r31) + lwz r16, Task.ContextBlockPtr(r31) cmplwi r5, 0x100 cmplwi cr1, r5, 0xf8 beq MPCall_60_0x144 @@ -1440,16 +1445,17 @@ MPCall_63 ; OUTSIDE REFERER cmpwi r9, Task.kIDClass bne ReleaseAndReturnMPCallInvalidIDErr - stw r4, 0x00ec(r8) + stw r4, Task.SomeLabelField(r8) ; r1 = kdp b ReleaseAndReturnZeroFromMPCall +; OSStatus MPSetTaskCPU(TaskID, CPUID) +; Makes it so that a Task can only run on a single CPU. + DeclareMPCall 114, MPSetTaskCPU - DeclareMPCall 114, MPCall_114 - -MPCall_114 ; OUTSIDE REFERER +MPSetTaskCPU ; OUTSIDE REFERER _Lock PSA.SchLock, scratch1=r16, scratch2=r17 @@ -1469,28 +1475,28 @@ MPCall_114 ; OUTSIDE REFERER mr r30, r8 bne ReleaseAndReturnMPCallInvalidIDErr - lwz r16, 0x0064(r31) - lwz r17, 0x00e8(r31) - rlwinm. r8, r16, 0, 30, 30 + lwz r16, Task.Flags(r31) + lwz r17, Task.PreemptCtr(r31) + rlwinm. r8, r16, 0, Task.kFlagAborted, Task.kFlagAborted cmplw cr1, r17, r5 - lwz r18, 0x0018(r30) + lwz r18, CPU.Flags(r30) bne ReleaseAndReturnMPCallOOM bne cr1, ReleaseAndReturnMPCallOOM - rlwinm. r8, r18, 0, 28, 28 + rlwinm. r8, r18, 0, CPU.kFlagScheduled, CPU.kFlagScheduled cmplwi cr1, r17, 0x04 beq ReleaseAndReturnMPCallOOM - lwz r16, 0x0064(r31) + lwz r16, Task.Flags(r31) lhz r17, CPU.EWA + EWA.CPUIndex(r30) - ori r16, r16, 0x40 - stw r16, 0x0064(r31) - sth r17, 0x001a(r31) - rlwinm. r8, r16, 0, 26, 26 + ori r16, r16, 0x40;Task.kFlag25 + stw r16, Task.Flags(r31) + sth r17, Task.CPUIndex(r31) + rlwinm. r8, r16, 0, Task.kFlag26, Task.kFlag26 mr r8, r31 - bne MPCall_114_0x90 + bne @No_Requeueing bl SchTaskUnrdy bl SchRdyTaskNow -MPCall_114_0x90 +@No_Requeueing bl FlagSchEvaluationIfTaskRequires ; r1 = kdp