powermac-rom/NanoKernel/NKTasks.s

1565 lines
30 KiB
ArmAsm
Raw Normal View History

2018-06-30 08:00:35 +00:00
; AUTO-GENERATED SYMBOL LIST
; IMPORTS:
; NKAddressSpaces
; FindAreaAbove
; NKIndex
; DeleteID
; LookupID
; MakeID
; NKMPCalls
; CommonMPCallReturnPath
; MPCall_6_0x78
; ReleaseAndReturnMPCall
; ReleaseAndReturnMPCallInvalidIDErr
; ReleaseAndReturnMPCallOOM
; ReleaseAndReturnZeroFromMPCall
; ReleaseAndScrambleMPCall
; ReturnMPCallInvalidIDErr
; ReturnMPCallOOM
; NKPoolAllocator
; PoolAlloc
; PoolAllocClear
; PoolFree
; NKScheduler
; CalculateTimeslice
; FlagSchEval
; FlagSchEvaluationIfTaskRequires
; SchRdyTaskNow
; SchTaskUnrdy
; NKSync
; EnqueueMessage
; NKThud
; panic
; NKTimers
; DequeueTimer
; GetTime
; EXPORTS:
; CreateTask (=> NKInit, NKMPCalls)
; TasksFuncThatIsNotAMPCall (=> NKScheduler)
; ThrowTaskToDebugger (=> NKInterrupts)
2017-11-19 04:11:07 +00:00
; This file mostly provides MPCall implementations related to multitasking.
; We won't understand this very well until someone disassembles MPLibrary.
Local_Panic set *
b panic
; ARG ProcessID r3
; RET OSStatus r3, TaskID r10
2018-04-23 15:22:55 +00:00
; kMPCreateTaskSuspendedMask is ignored?
2017-11-19 04:11:07 +00:00
DeclareMPCall 7, MPCall_7
MPCall_7 ; OUTSIDE REFERER
2018-04-23 15:22:55 +00:00
rlwinm. r8, r5, 0, ~0x00000006 ; kMPCreateTaskValidOptionsMask minus kMPCreateTaskSuspendedMask
bne ReturnMPCallOOM
2017-11-19 04:11:07 +00:00
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3
bl LookupID
cmpwi r9, Process.kIDClass
mr r30, r8
bne ReleaseAndReturnMPCallInvalidIDErr
lwz r16, Process.Flags(r30)
rlwinm. r17, r16, 0, 30, 30
bne ReleaseAndReturnMPCallOOM
; ARG CPUFlags r7, Process *r8
2017-11-19 04:11:07 +00:00
bl CreateTask
; RET Task *r8
2017-11-19 04:11:07 +00:00
mr. r31, r8
beq ReleaseAndScrambleMPCall
2017-11-19 04:11:07 +00:00
mfsprg r15, 0
lwz r17, Task.ID(r31)
stw r17, ContextBlock.r10(r6)
lhz r16, EWA.CPUIndex(r15)
sth r16, Task.CPUIndex(r31)
addi r16, r31, Task.ContextBlock
lwz r17, ContextBlock.r7(r6)
stw r17, ContextBlock.r12(r16)
lwz r17, ContextBlock.r8(r6)
stw r17, ContextBlock.CodePtr(r16)
lwz r17, ContextBlock.r9(r6)
stw r17, ContextBlock.r2(r16)
2017-11-19 04:11:07 +00:00
stw r4, 0x0098(r31)
lwz r17, ContextBlock.r6(r6)
stw r17, ContextBlock.LR(r31)
2017-11-19 04:11:07 +00:00
lwz r16, Task.Flags(r28)
2017-11-19 04:11:07 +00:00
2018-04-23 15:22:55 +00:00
rlwinm. r8, r5, 0, kMPCreateTaskTakesAllExceptionsMask
beq @noflag
2018-04-23 15:22:55 +00:00
_bset r16, r16, Task.kFlagTakesAllExceptions
@noflag
2017-11-19 04:11:07 +00:00
2018-04-23 15:22:55 +00:00
rlwinm. r8, r5, 0, kMPCreateTaskNotDebuggableMask
beq @noflag2
2018-04-23 15:22:55 +00:00
_bset r16, r16, Task.kFlagNotDebuggable
@noflag2
2017-11-19 04:11:07 +00:00
stw r16, Task.Flags(r28)
2017-11-19 04:11:07 +00:00
b ReleaseAndReturnZeroFromMPCall
2017-11-19 04:11:07 +00:00
; ARG Flags r7, Process *r8
; RET Task *r8
2017-11-19 04:11:07 +00:00
CreateTask
; Save arg and lr for later
mr r27, r8
mflr r29
; Create the 1k TASK struct in the pool and give it an ID, leave ptr in r28
li r8, 0x400 ;Task.Size
2018-03-23 09:22:56 +00:00
bl PoolAllocClear
2017-11-19 04:11:07 +00:00
mr. r28, r8
beq @fail_oom
2017-11-19 04:11:07 +00:00
; Allocate an opaque ID for it
li r9, Task.kIDClass
bl MakeID
cmpwi r8, 0
beq @fail_no_id
2017-11-19 04:11:07 +00:00
; ID and sign it
stw r8, Task.ID(r28)
lisori r8, Task.kSignature
stw r8, Task.Signature(r28)
; Untitled. Usually set to creator code of owning MacOS process
lisori r8, '----'
stw r8, Task.Name(r28)
; Create a subordinate notification struct -- NOPENOPENOPE
li r8, 0x1c ;Notification.Size
2018-03-23 09:22:56 +00:00
bl PoolAllocClear
2017-11-19 04:11:07 +00:00
cmpwi r8, 0
stw r8, Task.NotificationPtr(r28)
beq @fail_note_oom
2017-11-19 04:11:07 +00:00
lisori r9, 'note'
stw r9, 4(r8)
; Create a semaphore struct inside the task
addi r16, r28, Task.PageFaultSema
_lstart r17, Semaphore.kSignature
stw r16, Semaphore.BlockedTasks + LLL.Next(r16)
_lfinish
stw r16, Semaphore.BlockedTasks + LLL.Prev(r16)
stw r17, Semaphore.BlockedTasks + LLL.Signature(r16)
2017-11-19 04:11:07 +00:00
li r16, 1
stw r16, Task.PageFaultSema + Semaphore.MaxValue(r28)
2017-11-19 04:11:07 +00:00
li r16, 0
stw r16, Task.PageFaultSema + Semaphore.Value(r28)
2017-11-19 04:11:07 +00:00
addi r8, r28, Task.PageFaultSema
2017-11-19 04:11:07 +00:00
li r9, Semaphore.kIDClass
bl MakeID
cmpwi r8, 0
beq @fail_semq_no_id
stw r8, Task.PageFaultSema + Semaphore.BlockedTasks + LLL.Freeform(r28)
2017-11-19 04:11:07 +00:00
; Allocate a vector (i.e. AltiVec) save area
; Conditionally, that is
rlwinm. r8, r7, 0, 1 << (31 - EWA.kFlagVec)
beq @non_altivec_task
2017-11-19 04:11:07 +00:00
; Allocate and check
li r8, 0x214 ;VectorSaveArea.Size ; room for v registers plus 20 bytes
2018-03-23 09:22:56 +00:00
bl PoolAllocClear
2017-11-19 04:11:07 +00:00
andi. r9, r8, 16-1 ; Sanity check: aligned to size of vector register?
cmpwi cr1, r8, 0
bne Local_Panic
beq cr1, @fail_altivec_oom
2017-11-19 04:11:07 +00:00
; Point to it (from inside and outside the ECB-like area)
stw r8, Task.VectorSaveArea(r28)
stw r8, Task.ContextBlock + ContextBlock.VectorSaveArea(r28)
; Fill the actual register parts with 0x7fffffff
li r16, 0x80 ;VectorSaveArea.RegisterAreaSize / 4
subi r8, r8, 4
lwz r17, PSA.VectorRegInitWord(r1)
@vectorarea_copyloop
subi r16, r16, 1
stwu r17, 4(r8)
cmpwi r16, 0
bgt @vectorarea_copyloop
2017-11-19 04:11:07 +00:00
@non_altivec_task
; Some unexplored DLYQ stuff
addi r16, r1, PSA.DelayQueue
addi r17, r28, 0x08
stw r16, 0x0000(r17)
stw r16, 0x0008(r17)
lwz r18, 0x000c(r16)
stw r18, 0x000c(r17)
stw r17, 0x0008(r18)
stw r17, 0x000c(r16)
li r16, 0
stb r16, Task.State(r28)
2017-11-19 04:11:07 +00:00
li r16, 9 ; (Z>>Task.kFlag28) | (Z>>Task.kFlag31)
stw r16, Task.Flags(r28)
2017-11-19 04:11:07 +00:00
lisori r16, 'time'
stw r16, 0x0024(r28)
li r16, 1
stb r16, 0x0036(r28)
li r16, 100
stw r16, Task.Weight(r28)
li r16, Task.kNominalPriority
stb r16, Task.Priority(r28)
addi r16, r28, Task.ContextBlock
stw r16, Task.ContextBlockPtr(r28) ; overridden to real ECB on blue
lwz r16, PSA.FlagsTemplate(r1)
stw r16, Task.ContextBlock + ContextBlock.Flags(r28)
2017-11-19 04:11:07 +00:00
lwz r16, PSA.UserModeMSR(r1)
stw r16, Task.ContextBlock + ContextBlock.MSR(r28)
2018-04-23 15:22:55 +00:00
addi r16, r1, KDP.VecBaseSystem
stw r16, Task.VecBase(r28)
2017-11-19 04:11:07 +00:00
li r16, 0
lwz r17, Task.NotificationPtr(r28)
stw r16, 0x0010(r17)
stw r16, 0x0014(r17)
li r16, kMPTaskAbortedErr
2017-11-19 04:11:07 +00:00
stw r16, 0x0018(r17)
li r16, 0
stw r16, Task.Zero1(r28)
stw r16, Task.Zero2(r28)
stw r16, Task.CodeFaultCtr(r28)
stw r16, Task.DataFaultCtr(r28)
stw r16, Task.PreemptCtr(r28)
2017-11-19 04:11:07 +00:00
; Who knows that these are for
bl GetTime
stw r8, Task.CreateTime1(r28)
stw r9, Task.CreateTime1 + 4(r28)
stw r8, Task.CreateTime2(r28)
stw r9, Task.CreateTime2 + 4(r28)
stw r8, Task.CreateTime3(r28)
stw r9, Task.CreateTime3 + 4(r28)
lwz r16, KDP.NanoKernelInfo + NKNanoKernelInfo.TaskCount(r1)
addi r16, r16, 1
stw r16, KDP.NanoKernelInfo + NKNanoKernelInfo.TaskCount(r1)
; Squeeze some info (including my owning process) out of the passed PROC ptr
stw r27, Task.OwningProcessPtr(r28)
lwz r16, Process.ID(r27)
stw r16, Task.ProcessID(r28)
lwz r17, Process.SystemAddressSpacePtr(r27)
stw r17, Task.AddressSpacePtr(r28)
lwz r16, AddressSpace.TaskCount(r17)
addi r16, r16, 1
stw r16, AddressSpace.TaskCount(r17)
lwz r16, Process.TaskCount(r27)
addi r16, r16, 1
stw r16, Process.TaskCount(r27)
; Restore and return
mtlr r29
mr r8, r28
blr
@fail_altivec_oom
lwz r8, 0x00a0(r28)
bl DeleteID
@fail_semq_no_id:
lwz r8, 0x009c(r28)
bl PoolFree
@fail_note_oom
lwz r8, 0x0000(r28)
bl DeleteID
@fail_no_id
mr r8, r28
bl PoolFree
@fail_oom
mtlr r29
li r8, 0
blr
DeclareMPCall 8, MPCall_8
MPCall_8 ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3
; r8 = id
bl LookupID
cmpwi r9, Task.kIDClass
mr r31, r8
bne ReleaseAndReturnMPCallInvalidIDErr
2017-11-19 04:11:07 +00:00
lbz r16, 0x0018(r31)
cmpwi r16, 0x00
bne ReleaseAndReturnMPCallOOM
2017-11-19 04:11:07 +00:00
lwz r8, 0x0060(r31)
; r8 = id
bl LookupID
cmpwi r9, Process.kIDClass
bne Local_Panic
2017-11-19 04:11:07 +00:00
lwz r16, 0x0008(r8)
rlwinm. r17, r16, 0, 30, 30
bne ReleaseAndReturnMPCallOOM
2017-11-19 04:11:07 +00:00
lwz r30, 0x0088(r31)
stw r4, 0x0074(r31)
stw r5, 0x011c(r30)
lwz r18, 0x009c(r31)
lwz r16, 0x0134(r6)
lwz r17, 0x013c(r6)
stw r16, 0x0010(r18)
stw r17, 0x0014(r18)
lwz r16, 0x0144(r6)
lwz r17, 0x014c(r6)
stw r16, 0x010c(r30)
stw r16, 0x0090(r31)
stw r17, 0x0094(r31)
addi r16, r31, 0x08
RemoveFromList r16, scratch1=r17, scratch2=r18
2017-11-19 04:11:07 +00:00
mr r8, r31
bl SchRdyTaskNow
2017-11-19 04:11:07 +00:00
bl CalculateTimeslice
bl FlagSchEvaluationIfTaskRequires
2017-11-19 04:11:07 +00:00
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
DeclareMPCall 9, MPCall_9
MPCall_9 ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3
; r8 = id
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
mr r31, r8
cmpwi r9, 0x02
bne ReleaseAndReturnMPCallInvalidIDErr
2017-11-19 04:11:07 +00:00
lwz r16, 0x0064(r31)
lbz r17, 0x0018(r31)
rlwinm. r18, r16, 0, 30, 30
cmpwi cr1, r17, 0x00
bne ReleaseAndReturnMPCallOOM
beq cr1, MPCall_9_0xb4
2017-11-19 04:11:07 +00:00
mfsprg r15, 0
lhz r18, 0x001a(r31)
lhz r17, EWA.CPUIndex(r15)
2017-11-19 04:11:07 +00:00
cmpw r18, r17
beq MPCall_9_0xe0
2017-11-19 04:11:07 +00:00
ori r16, r16, 0x400
stw r16, 0x0064(r31)
li r17, 0x01
stb r17, 0x0019(r31)
mr r8, r31
bl FlagSchEval
_AssertAndRelease PSA.SchLock, scratch=r16
2017-11-19 04:11:07 +00:00
subi r10, r10, 4
b MPCall_6_0x78
MPCall_9_0x98 ; OUTSIDE REFERER
lwz r16, 0x0064(r31)
ori r16, r16, 0x02
stw r16, 0x0064(r31)
lwz r17, 0x009c(r31)
li r16, kMPTaskAbortedErr
2017-11-19 04:11:07 +00:00
stw r16, 0x0018(r17)
b MPCall_9_0xfc
MPCall_9_0xb4
ori r16, r16, 0x02
stw r16, 0x0064(r31)
addi r16, r31, 0x08
RemoveFromList r16, scratch1=r17, scratch2=r18
2017-11-19 04:11:07 +00:00
b MPCall_9_0xf0
MPCall_9_0xe0
ori r16, r16, 0x02
stw r16, 0x0064(r31)
mr r8, r31
bl SchTaskUnrdy
2017-11-19 04:11:07 +00:00
MPCall_9_0xf0
lwz r17, 0x009c(r31)
li r3, 0x00
stw r4, 0x0018(r17)
MPCall_9_0xfc
addi r16, r1, PSA.DelayQueue
2017-11-19 04:11:07 +00:00
addi r17, r31, 0x08
stw r16, 0x0000(r17)
InsertAsPrev r17, r16, scratch=r18
2017-11-19 04:11:07 +00:00
lbz r8, 0x0037(r31)
cmpwi r8, 0x01
bne MPCall_9_0x130
2017-11-19 04:11:07 +00:00
addi r8, r31, 0x20
bl DequeueTimer
2017-11-19 04:11:07 +00:00
MPCall_9_0x130
lwz r8, 0x0098(r31)
; r8 = id
bl LookupID
cmpwi r9, Queue.kIDClass
li r18, 0x00
lwz r17, 0x009c(r31)
stw r18, 0x009c(r31)
bne MPCall_9_0x15c
2017-11-19 04:11:07 +00:00
mr r31, r8
mr r8, r17
bl EnqueueMessage ; Message *r8, Queue *r31
2017-11-19 04:11:07 +00:00
b ReleaseAndReturnMPCall
MPCall_9_0x15c
mr r8, r17
bl PoolFree
b ReleaseAndReturnMPCall
DeclareMPCall 10, MPCall_10
MPCall_10 ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3
; r8 = id
bl LookupID
cmpwi r9, Task.kIDClass
bne ReleaseAndReturnMPCallInvalidIDErr
2017-11-19 04:11:07 +00:00
mr r31, r8
lbz r16, 0x0018(r31)
cmpwi r16, 0x00
bne ReleaseAndReturnMPCallOOM
2017-11-19 04:11:07 +00:00
lwz r16, 0x0064(r31)
rlwinm. r16, r16, 0, 30, 30
beq ReleaseAndReturnMPCallOOM
2017-11-19 04:11:07 +00:00
mr r8, r31
bl TasksFuncThatIsNotAMPCall
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
TasksFuncThatIsNotAMPCall
mflr r27
mr r26, r8
addi r16, r26, 0x08
RemoveFromList r16, scratch1=r17, scratch2=r18
2017-11-19 04:11:07 +00:00
lwz r8, 0x0000(r26)
bl DeleteID
lwz r8, 0x00a0(r26)
bl DeleteID
lwz r8, 0x009c(r26)
cmpwi r8, 0x00
beq @_0x98
2017-11-19 04:11:07 +00:00
bl PoolFree
@_0x98
lwz r8, 0x008c(r26)
cmpwi r8, 0x00
beq @_0xa8
2017-11-19 04:11:07 +00:00
bl PoolFree
@_0xa8
lwz r17, 0x006c(r26)
lwz r16, 0x0010(r17)
addi r16, r16, -0x01
stw r16, 0x0010(r17)
lwz r17, 0x0070(r26)
lwz r16, 0x000c(r17)
addi r16, r16, -0x01
stw r16, 0x000c(r17)
mr r8, r26
bl PoolFree
lwz r16, 0x0ecc(r1)
addi r16, r16, -0x01
stw r16, 0x0ecc(r1)
mtlr r27
blr
2018-04-29 22:39:50 +00:00
; 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.
2017-11-19 04:11:07 +00:00
2018-04-29 22:39:50 +00:00
DeclareMPCall 11, MPIsTaskBlue
2017-11-19 04:11:07 +00:00
2018-04-29 22:39:50 +00:00
MPIsTaskBlue ; OUTSIDE REFERER
2017-11-19 04:11:07 +00:00
mfsprg r16, 0
cmpwi r3, 0x00
lwz r17, PSA.PA_BlueTask(r1)
2018-04-29 22:39:50 +00:00
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
2017-11-19 04:11:07 +00:00
2018-04-29 22:39:50 +00:00
@ID_Provided
2017-11-19 04:11:07 +00:00
cmpw r3, r19
li r3, 0x01
beq CommonMPCallReturnPath
2017-11-19 04:11:07 +00:00
li r3, 0x00
b CommonMPCallReturnPath
2018-04-29 22:39:50 +00:00
; returns the ID and SomeLabelField of the blue Task.
; Needs a name. MPGetBlueTaskIDAndSomeLabelField() isn't good enough
2017-11-19 04:11:07 +00:00
DeclareMPCall 12, MPCall_12
MPCall_12 ; OUTSIDE REFERER
mfsprg r14, 0
2018-04-29 22:39:50 +00:00
lwz r15, EWA.PA_CurTask(r14)
lwz r3, Task.ID(r15)
lwz r4, Task.SomeLabelField(r15)
2017-11-19 04:11:07 +00:00
b CommonMPCallReturnPath
2018-04-29 22:39:50 +00:00
; 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
2017-11-19 04:11:07 +00:00
2018-04-29 22:39:50 +00:00
MPSetTaskWeight ; OUTSIDE REFERER
2017-11-19 04:11:07 +00:00
cmpwi r4, 0x01
cmpwi cr1, r4, 10000
blt ReturnMPCallInvalidIDErr
bgt cr1, ReturnMPCallInvalidIDErr
2017-11-19 04:11:07 +00:00
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3
; r8 = id
bl LookupID
cmpwi r9, Task.kIDClass
bne ReleaseAndReturnMPCallInvalidIDErr
2017-11-19 04:11:07 +00:00
mr r31, r8
2018-04-29 22:39:50 +00:00
lbz r16, Task.State(r31)
2017-11-19 04:11:07 +00:00
cmpwi r16, 0x01
2018-04-29 22:39:50 +00:00
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
2017-11-19 04:11:07 +00:00
cmpwi r17, 0x00
2018-04-29 22:39:50 +00:00
stw r18, ReadyQueue.TotalWeight(r16)
beq @Set_Weight;don't mess with scheduler if weight is unchanged
2017-11-19 04:11:07 +00:00
mr r8, r31
bl FlagSchEval
2017-11-19 04:11:07 +00:00
2018-04-29 22:39:50 +00:00
@Set_Weight
stw r4, Task.Weight(r31)
2017-11-19 04:11:07 +00:00
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
; MPLibrary passthrough
; When an exception occurs, the message to the queue will be:
; (32 bits) task ID
; (32 bits) exception type a la MachineExceptions.h
; (32 bits) 0 (reserved)
; ARG TaskID r3, QueueID r4
; RET OSStatus r3
2017-11-19 04:11:07 +00:00
DeclareMPCall 56, MPSetExceptionHandler
MPSetExceptionHandler
2017-11-19 04:11:07 +00:00
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3
bl LookupID
cmpwi r9, Task.kIDClass
bne ReleaseAndReturnMPCallInvalidIDErr
2017-11-19 04:11:07 +00:00
mr r31, r8
mr r8, r4
2017-11-19 04:11:07 +00:00
bl LookupID
cmpwi r9, 0
cmpwi cr1, r9, Queue.kIDClass
beq @isnil
bne cr1, ReleaseAndReturnMPCallInvalidIDErr
@isnil
2017-11-19 04:11:07 +00:00
mr r30, r8
stw r4, Task.ExceptionHandlerID(r31)
2017-11-19 04:11:07 +00:00
b ReleaseAndReturnZeroFromMPCall
; MPLibrary passthrough
2017-11-19 04:11:07 +00:00
; Throws an exception to a specified task.
; ARG TaskID r3, ExceptionKind r4
; RET OSStatus r3
2017-11-19 04:11:07 +00:00
DeclareMPCall 57, MPThrowException
2017-11-19 04:11:07 +00:00
MPThrowException
2017-11-19 04:11:07 +00:00
mfsprg r15, 0
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3
bl LookupID
cmpwi r9, Task.kIDClass
bne ReleaseAndReturnMPCallInvalidIDErr
2017-11-19 04:11:07 +00:00
mr r31, r8
; This is gold!
lwz r16, Task.Flags(r31)
mtcr r16
li r3, kMPTaskAbortedErr
bc BO_IF, Task.kFlagAborted, ReleaseAndReturnMPCall
li r3, kMPTaskStoppedErr
bc BO_IF, Task.kFlagStopped, ReleaseAndReturnMPCall
bc BO_IF, 14, ReleaseAndReturnMPCallOOM
2017-11-19 04:11:07 +00:00
lbz r17, 0x0018(r31)
lhz r18, 0x001a(r31)
cmpwi cr1, r17, 0x00
bc BO_IF_NOT, 6, KCThrowException_0x70
2017-11-19 04:11:07 +00:00
ori r16, r16, 0x600
stw r4, 0x00f8(r31)
stw r16, 0x0064(r31)
li r3, kMPTaskBlockedErr
2017-11-19 04:11:07 +00:00
b ReleaseAndReturnMPCall
KCThrowException_0x70
lhz r19, EWA.CPUIndex(r15)
2017-11-19 04:11:07 +00:00
cmpw r19, r18
bne KCThrowException_0xb8
2017-11-19 04:11:07 +00:00
ori r16, r16, 0x200
stw r4, 0x00f8(r31)
stw r16, 0x0064(r31)
mr r8, r31
bl SchTaskUnrdy
addi r16, r1, PSA.DbugQueue
2017-11-19 04:11:07 +00:00
addi r17, r31, 0x08
stw r16, 0x0000(r17)
InsertAsPrev r17, r16, scratch=r18
li r3, kMPTaskStoppedErr
2017-11-19 04:11:07 +00:00
b ReleaseAndReturnMPCall
KCThrowException_0xb8
lwz r3, 0x0000(r31)
ori r16, r16, 0x400
stw r16, 0x0064(r31)
li r17, 0x01
stb r17, 0x0019(r31)
mr r8, r31
bl FlagSchEval
_AssertAndRelease PSA.SchLock, scratch=r16
2017-11-19 04:11:07 +00:00
subi r10, r10, 4
b MPCall_6_0x78
DeclareMPCall 58, MPCall_58
MPCall_58 ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3
; r8 = id
bl LookupID
cmpwi r9, Task.kIDClass
bne ReleaseAndReturnMPCallInvalidIDErr
2017-11-19 04:11:07 +00:00
mr r31, r8
lwz r29, Task.Flags(r31)
2017-11-19 04:11:07 +00:00
mtcr r29
li r3, kMPTaskAbortedErr
2018-04-29 22:39:50 +00:00
bc BO_IF, Task.kFlagAborted, ReleaseAndReturnMPCall
2018-04-29 22:39:50 +00:00
bc BO_IF, Task.kFlagPageFaulted, MPCall_58_0x44
bc BO_IF_NOT, Task.kFlagStopped, ReleaseAndReturnMPCallOOM
2017-11-19 04:11:07 +00:00
MPCall_58_0x44
mtcr r4
2018-04-29 22:39:50 +00:00
lwz r30, Task.ContextBlockPtr(r31)
bc BO_IF_NOT, 31, MPCall_58_0x68
2017-11-19 04:11:07 +00:00
li r8, 0x1c
2018-03-23 09:22:56 +00:00
bl PoolAlloc
2017-11-19 04:11:07 +00:00
cmpwi r8, 0x00
beq ReleaseAndScrambleMPCall
2017-11-19 04:11:07 +00:00
li r3, 0x00
b MPCall_58_0x114
MPCall_58_0x68
li r17, 0x3800
2018-04-29 22:39:50 +00:00
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
2017-11-19 04:11:07 +00:00
li r17, 0x00
bne cr7, MPCall_58_0x80
2017-11-19 04:11:07 +00:00
ori r17, r17, 0x400
MPCall_58_0x80
ble cr7, MPCall_58_0x88
2017-11-19 04:11:07 +00:00
ori r17, r17, 0x200
MPCall_58_0x88
2018-04-29 22:39:50 +00:00
lwz r18, ContextBlock.MSR(r30)
rlwimi r18, r17, 0, MSR_SEbit, MSR_BEbit
2017-11-19 04:11:07 +00:00
stw r18, 0x00a4(r30)
li r19, 0x600
lwz r17, 0x0008(r31)
addi r18, r1, PSA.DbugQueue
2017-11-19 04:11:07 +00:00
andc r29, r29, r19
cmpw cr1, r17, r18
stw r29, 0x0064(r31)
bne MPCall_58_0xb4
bne cr1, MPCall_58_0xe0
2017-11-19 04:11:07 +00:00
MPCall_58_0xb4
addi r16, r31, 0x08
RemoveFromList r16, scratch1=r17, scratch2=r18
2017-11-19 04:11:07 +00:00
mr r8, r31
bl SchRdyTaskNow
bl FlagSchEvaluationIfTaskRequires
2017-11-19 04:11:07 +00:00
MPCall_58_0xe0
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
ThrowTaskToDebugger ; OUTSIDE REFERER
addi r16, r1, PSA.DbugQueue
addi r17, r31, Task.QueueMember
stw r16, LLL.Freeform(r17)
InsertAsPrev r17, r16, scratch=r18
2017-11-19 04:11:07 +00:00
li r8, 0x1c
2018-03-23 09:22:56 +00:00
bl PoolAlloc
lwz r29, Task.Flags(r31)
_bset r29, r29, Task.kFlagStopped
2017-11-19 04:11:07 +00:00
MPCall_58_0x114
mtcr r29
mr r28, r8
2018-04-23 15:22:55 +00:00
bc BO_IF, Task.kFlagNotDebuggable, MPCall_58_0x13c
bc BO_IF, Task.kFlag20, MPCall_58_0x13c
lwz r8, PSA._8e8(r1)
2017-11-19 04:11:07 +00:00
; r8 = id
bl LookupID
cmpwi r9, Queue.kIDClass
mr r30, r8
_bset r29, r29, Task.kFlag20
beq MPCall_58_0x184
2017-11-19 04:11:07 +00:00
MPCall_58_0x13c
bc BO_IF, 19, MPCall_58_0x158
2017-11-19 04:11:07 +00:00
lwz r8, 0x00f4(r31)
; r8 = id
bl LookupID
cmpwi r9, Queue.kIDClass
mr r30, r8
_bset r29, r29, Task.kFlag19
beq MPCall_58_0x184
2017-11-19 04:11:07 +00:00
MPCall_58_0x158
mr. r8, r28
bnel PoolFree
2017-11-19 04:11:07 +00:00
addi r16, r31, 0x08
RemoveFromList r16, scratch1=r17, scratch2=r18
2017-11-19 04:11:07 +00:00
b MPCall_9_0x98
MPCall_58_0x184
mr. r8, r28
stw r29, 0x0064(r31)
bne MPCall_58_0x1a4
2017-11-19 04:11:07 +00:00
lwz r8, 0x0028(r30)
cmpwi r8, 0x00
beq MPCall_58_0x114
2017-11-19 04:11:07 +00:00
lwz r17, 0x0008(r8)
stw r17, 0x0028(r30)
MPCall_58_0x1a4
bl LoadSomeData
lwz r16, 0x0088(r31)
lwz r17, 0x0000(r31)
mflr r18
stw r17, 0x0010(r8)
lwz r17, 0x0074(r16)
lbz r19, 0x0040(r16)
lbzx r18, r18, r19
stw r18, 0x0014(r8)
stw r17, 0x0018(r8)
stw r18, 0x00f8(r31)
mr r31, r30
bl EnqueueMessage ; Message *r8, Queue *r31
2017-11-19 04:11:07 +00:00
b ReleaseAndReturnMPCall
LoadSomeData ; OUTSIDE REFERER
blrl
dc.l 0x0002020d
dc.l 0x01080003
dc.l 0x090a0403
dc.l 0x07000500
dc.l 0x0b0b0403
dc.l 0x07060505
dc.l 0x11000000
; Used to extract task state. This will be tricky.
2017-11-19 04:11:07 +00:00
DeclareMPCall 59, MPCall_59
MPCall_59 ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr. r8, r3
beq MPCall_59_0x30
2017-11-19 04:11:07 +00:00
; r8 = id
bl LookupID
cmpwi r9, Queue.kIDClass
bne ReleaseAndReturnMPCallInvalidIDErr
2017-11-19 04:11:07 +00:00
mr r31, r8
MPCall_59_0x30
stw r3, PSA._8e8(r1)
2017-11-19 04:11:07 +00:00
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
DeclareMPCall 60, MPCall_60
MPCall_60 ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3
; r8 = id
bl LookupID
cmpwi r9, Task.kIDClass
bne ReleaseAndReturnMPCallInvalidIDErr
2017-11-19 04:11:07 +00:00
mr r31, r8
cmpwi r4, 0x05
beq MPCall_60_0x288
lwz r16, Task.Flags(r31)
2017-11-19 04:11:07 +00:00
mtcr r16
li r3, kMPTaskAbortedErr
2018-04-29 22:39:50 +00:00
bc BO_IF, Task.kFlagAborted, ReleaseAndReturnMPCall
2018-04-29 22:39:50 +00:00
bc BO_IF, Task.kFlagPageFaulted, MPCall_60_0x4c
bc BO_IF_NOT, Task.kFlagStopped, ReleaseAndReturnMPCallOOM
2017-11-19 04:11:07 +00:00
MPCall_60_0x4c
2018-04-29 22:39:50 +00:00
lbz r16, Task.State(r31)
2017-11-19 04:11:07 +00:00
cmpwi r16, 0x00
bne ReleaseAndReturnMPCallOOM
2017-11-19 04:11:07 +00:00
cmpwi r4, 0x00
cmpwi cr1, r4, 0x01
beq MPCall_60_0xf8
beq cr1, MPCall_60_0x10c
2017-11-19 04:11:07 +00:00
cmpwi r4, 0x02
cmpwi cr1, r4, 0x03
beq MPCall_60_0x150
beq cr1, MPCall_60_0x1c0
2017-11-19 04:11:07 +00:00
cmpwi r4, 0x04
bne ReleaseAndReturnMPCallOOM
2018-04-29 22:39:50 +00:00
lwz r16, Task.ContextBlockPtr(r31)
2017-11-19 04:11:07 +00:00
li r17, 0x00
cmplwi r5, 0x00
cmplwi cr1, r5, 0x04
2018-04-29 22:39:50 +00:00
beq MPCall_60_0xac;gets ID of Area SRR0 is in
beq cr1, MPCall_60_0xc0
2017-11-19 04:11:07 +00:00
cmplwi r5, 0x08
cmplwi cr1, r5, 0x0c
beq MPCall_60_0xc8
beq cr1, MPCall_60_0xd0
2017-11-19 04:11:07 +00:00
b ReleaseAndReturnMPCallOOM
MPCall_60_0xac
2018-04-29 22:39:50 +00:00
lwz r8, Task.AddressSpacePtr(r31)
lwz r9, ContextBlock.SRR0(r16)
2017-11-19 04:11:07 +00:00
bl FindAreaAbove
2018-04-29 22:39:50 +00:00
lwz r17, Area.ID(r8)
2017-11-19 04:11:07 +00:00
b MPCall_60_0x36c
MPCall_60_0xc0
2018-04-29 22:39:50 +00:00
lwz r17, ContextBlock.SRR0(r16)
2017-11-19 04:11:07 +00:00
b MPCall_60_0x36c
MPCall_60_0xc8
2018-04-29 22:39:50 +00:00
lwz r17, Task.ErrToReturnIfIDie(r31)
2017-11-19 04:11:07 +00:00
b MPCall_60_0x36c
MPCall_60_0xd0
2018-04-29 22:39:50 +00:00
lwz r17, ContextBlock.SavedFlags(r16)
lwz r18, 0x0064(r16);some unknown ContextBlock value
rlwinm. r8, r17, 0, EWA.kFlagLowSaves, EWA.kFlagLowSaves
2017-11-19 04:11:07 +00:00
li r17, 0x02
beq MPCall_60_0x36c
2018-04-29 22:39:50 +00:00
rlwinm. r8, r18, 0, EWA.kFlag1, EWA.kFlag1
2017-11-19 04:11:07 +00:00
li r17, 0x01
bne MPCall_60_0x36c
2017-11-19 04:11:07 +00:00
li r17, 0x00
b MPCall_60_0x36c
MPCall_60_0xf8
2018-04-29 22:39:50 +00:00
lwz r16, Task.ContextBlockPtr(r31)
2017-11-19 04:11:07 +00:00
cmplwi cr1, r5, 0xf8
andi. r17, r5, 0x07
addi r16, r16, 0xfc
b MPCall_60_0x124
MPCall_60_0x10c
2018-04-29 22:39:50 +00:00
lwz r16, Task.ContextBlockPtr(r31)
2017-11-19 04:11:07 +00:00
cmplwi r5, 0x100
cmplwi cr1, r5, 0xf8
beq MPCall_60_0x144
2017-11-19 04:11:07 +00:00
andi. r17, r5, 0x07
addi r16, r16, 0x1fc
MPCall_60_0x124
add r16, r16, r5
bgt cr1, ReleaseAndReturnMPCallOOM
bne ReleaseAndReturnMPCallOOM
2017-11-19 04:11:07 +00:00
lwzu r17, 0x0004(r16)
lwzu r18, 0x0004(r16)
lwzu r19, 0x0004(r16)
lwzu r20, 0x0004(r16)
b MPCall_60_0x3a8
MPCall_60_0x144
lwz r17, 0x00e4(r16)
li r18, 0x00
b MPCall_60_0x37c
MPCall_60_0x150
lwz r16, 0x0088(r31)
rlwinm. r8, r7, 0, EWA.kFlagVec, EWA.kFlagVec
2017-11-19 04:11:07 +00:00
lwz r16, 0x00d8(r16)
beq ReleaseAndReturnMPCallOOM
2017-11-19 04:11:07 +00:00
cmplwi cr3, r16, 0x00
cmplwi r5, 0x200
cmplwi cr2, r5, 0x210
cmplwi cr1, r5, 0x1f0
beql cr3, Local_Panic
beq MPCall_60_0x1a4
beq cr2, MPCall_60_0x1b8
2017-11-19 04:11:07 +00:00
andi. r8, r5, 0x0f
add r16, r16, r5
subi r16, r16, 4
bgt cr1, ReleaseAndReturnMPCallOOM
bne ReleaseAndReturnMPCallOOM
2017-11-19 04:11:07 +00:00
lwzu r17, 0x0004(r16)
lwzu r18, 0x0004(r16)
lwzu r19, 0x0004(r16)
lwzu r20, 0x0004(r16)
b MPCall_60_0x3a8
MPCall_60_0x1a4
lwz r17, 0x0200(r16)
lwz r18, 0x0204(r16)
lwz r19, 0x0208(r16)
lwz r20, 0x020c(r16)
b MPCall_60_0x3a8
MPCall_60_0x1b8
lwz r17, 0x0210(r16)
b MPCall_60_0x36c
MPCall_60_0x1c0
lwz r16, 0x0088(r31)
li r17, 0x00
cmplwi r5, 0x00
cmplwi cr1, r5, 0x08
beq MPCall_60_0x21c
beq cr1, MPCall_60_0x228
2017-11-19 04:11:07 +00:00
cmplwi r5, 0x10
cmplwi cr1, r5, 0x30
beq MPCall_60_0x234
beq cr1, MPCall_60_0x240
2017-11-19 04:11:07 +00:00
cmplwi r5, 0x1c
cmplwi cr1, r5, 0x20
beq MPCall_60_0x24c
beq cr1, MPCall_60_0x254
2017-11-19 04:11:07 +00:00
cmplwi r5, 0x24
cmplwi cr1, r5, 0x28
beq MPCall_60_0x25c
beq cr1, MPCall_60_0x264
2017-11-19 04:11:07 +00:00
cmplwi r5, 0x2c
cmplwi cr1, r5, 0x18
beq MPCall_60_0x278
beq cr1, MPCall_60_0x280
2017-11-19 04:11:07 +00:00
b ReleaseAndReturnMPCallOOM
MPCall_60_0x21c
lwz r17, 0x00f0(r16)
lwz r18, 0x00f4(r16)
b MPCall_60_0x37c
MPCall_60_0x228
lwz r17, 0x00e8(r16)
lwz r18, 0x00ec(r16)
b MPCall_60_0x37c
MPCall_60_0x234
lwz r17, 0x00f8(r16)
lwz r18, 0x00fc(r16)
b MPCall_60_0x37c
MPCall_60_0x240
lwz r17, 0x0070(r16)
lwz r18, 0x0074(r16)
b MPCall_60_0x37c
MPCall_60_0x24c
lwz r17, 0x00d4(r16)
b MPCall_60_0x36c
MPCall_60_0x254
lwz r17, 0x00a4(r16)
b MPCall_60_0x36c
MPCall_60_0x25c
lwz r17, 0x00c4(r16)
b MPCall_60_0x36c
MPCall_60_0x264
lbz r17, 0x0040(r16)
bl LoadSomeData
mflr r18
lbzx r17, r18, r17
b MPCall_60_0x36c
MPCall_60_0x278
li r17, 0x00
b MPCall_60_0x36c
MPCall_60_0x280
lwz r17, 0x00dc(r16)
b MPCall_60_0x36c
MPCall_60_0x288
cmplwi cr1, r5, 0x04
cmplwi r5, 0x14
beq cr1, MPCall_60_0x2c4
beq MPCall_60_0x2e4
2017-11-19 04:11:07 +00:00
cmplwi cr1, r5, 0x20
cmplwi r5, 0x30
beq cr1, MPCall_60_0x2f4
beq MPCall_60_0x308
2017-11-19 04:11:07 +00:00
cmpwi cr1, r5, 0x40
cmplwi r5, 0x3c
beq cr1, MPCall_60_0x320
beq MPCall_60_0x318
2017-11-19 04:11:07 +00:00
cmpwi cr1, r5, 0x50
beq cr1, MPCall_60_0x34c
2017-11-19 04:11:07 +00:00
b ReleaseAndReturnMPCallOOM
MPCall_60_0x2c4
lwz r17, 0x0074(r31)
lwz r18, 0x0008(r31)
lwz r18, 0x0004(r18)
lhz r19, 0x001a(r31)
lbz r20, 0x0018(r31)
rlwimi r19, r20, 16, 8, 15
lwz r20, 0x001c(r31)
b MPCall_60_0x3a8
MPCall_60_0x2e4
lwz r17, 0x0060(r31)
lwz r18, 0x00c0(r31)
lwz r19, 0x00c4(r31)
b MPCall_60_0x390
MPCall_60_0x2f4
lwz r17, 0x00c8(r31)
lwz r18, 0x00cc(r31)
lwz r19, 0x00d0(r31)
lwz r20, 0x00d4(r31)
b MPCall_60_0x3a8
MPCall_60_0x308
lwz r17, 0x00e0(r31)
lwz r18, 0x00e4(r31)
lwz r19, 0x00e8(r31)
b MPCall_60_0x390
MPCall_60_0x318
lwz r17, 0x0078(r31)
b MPCall_60_0x36c
MPCall_60_0x320
lbz r20, 0x0018(r31)
li r17, 0x00
lwz r16, 0x0008(r31)
lwz r18, 0x0070(r31)
cmpwi r20, 0x00
lwz r19, 0x0094(r31)
lwz r20, 0x0090(r31)
lwz r18, 0x0000(r18)
bne MPCall_60_0x3a8
2017-11-19 04:11:07 +00:00
lwz r17, 0x0000(r16)
b MPCall_60_0x3a8
MPCall_60_0x34c
mfsprg r18, 0
lwz r20, 0x0088(r31)
lwz r19, -0x0008(r18)
cmpw r19, r31
lwz r17, 0x0004(r18)
beq MPCall_60_0x36c
2017-11-19 04:11:07 +00:00
lwz r17, 0x010c(r20)
b MPCall_60_0x36c
MPCall_60_0x36c
li r21, 0x04
stw r17, 0x0134(r6)
stw r21, 0x0154(r6)
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
MPCall_60_0x37c
li r21, 0x08
stw r17, 0x0134(r6)
stw r18, 0x013c(r6)
stw r21, 0x0154(r6)
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
MPCall_60_0x390
li r21, 0x0c
stw r17, 0x0134(r6)
stw r18, 0x013c(r6)
stw r19, 0x0144(r6)
stw r21, 0x0154(r6)
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
MPCall_60_0x3a8
li r21, 0x10
stw r17, 0x0134(r6)
stw r18, 0x013c(r6)
stw r19, 0x0144(r6)
stw r20, 0x014c(r6)
stw r21, 0x0154(r6)
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
DeclareMPCall 61, MPCall_61
MPCall_61 ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3
; r8 = id
bl LookupID
cmpwi r9, Task.kIDClass
bne ReleaseAndReturnMPCallInvalidIDErr
2017-11-19 04:11:07 +00:00
mr r31, r8
lwz r16, Task.Flags(r31)
2017-11-19 04:11:07 +00:00
mtcr r16
li r3, kMPTaskAbortedErr
bc BO_IF, 30, ReleaseAndReturnMPCall
bc BO_IF, 18, MPCall_61_0x44
bc BO_IF_NOT, 22, ReleaseAndReturnMPCallOOM
2017-11-19 04:11:07 +00:00
MPCall_61_0x44
lbz r16, 0x0018(r31)
cmpwi r16, 0x00
bne ReleaseAndReturnMPCallOOM
2017-11-19 04:11:07 +00:00
lwz r17, 0x0134(r6)
lwz r18, 0x013c(r6)
lwz r19, 0x0144(r6)
lwz r20, 0x014c(r6)
cmpwi r4, 0x00
cmpwi cr1, r4, 0x01
beq MPCall_61_0x84
beq cr1, MPCall_61_0x98
2017-11-19 04:11:07 +00:00
cmpwi r4, 0x02
cmpwi cr1, r4, 0x03
beq MPCall_61_0xe8
beq cr1, MPCall_61_0x170
2017-11-19 04:11:07 +00:00
b ReleaseAndReturnMPCallOOM
MPCall_61_0x84
lwz r16, 0x0088(r31)
cmplwi cr1, r5, 0xf8
andi. r8, r5, 0x07
addi r16, r16, 0xfc
b MPCall_61_0xb0
MPCall_61_0x98
lwz r16, 0x0088(r31)
cmplwi r5, 0x100
cmplwi cr1, r5, 0xf8
beq MPCall_61_0xd8
2017-11-19 04:11:07 +00:00
andi. r8, r5, 0x07
addi r16, r16, 0x1fc
MPCall_61_0xb0
add r16, r16, r5
bgt cr1, ReleaseAndReturnMPCallOOM
bne ReleaseAndReturnMPCallOOM
2017-11-19 04:11:07 +00:00
li r21, 0x10
stwu r17, 0x0004(r16)
stwu r18, 0x0004(r16)
stwu r19, 0x0004(r16)
stwu r20, 0x0004(r16)
stw r21, 0x0154(r6)
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
MPCall_61_0xd8
li r21, 0x04
stw r17, 0x00e4(r16)
stw r21, 0x0154(r6)
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
MPCall_61_0xe8
lwz r16, 0x0088(r31)
rlwinm. r8, r7, 0, EWA.kFlagVec, EWA.kFlagVec
2017-11-19 04:11:07 +00:00
lwz r16, 0x00d8(r16)
beq ReleaseAndReturnMPCallOOM
2017-11-19 04:11:07 +00:00
cmplwi cr3, r16, 0x00
cmplwi r5, 0x200
cmplwi cr2, r5, 0x210
cmplwi cr1, r5, 0x1f0
beql cr3, Local_Panic
beq MPCall_61_0x144
beq cr2, MPCall_61_0x160
2017-11-19 04:11:07 +00:00
andi. r8, r5, 0x0f
add r16, r16, r5
subi r16, r16, 4
bgt cr1, ReleaseAndReturnMPCallOOM
bne ReleaseAndReturnMPCallOOM
2017-11-19 04:11:07 +00:00
li r21, 0x10
stwu r17, 0x0004(r16)
stwu r18, 0x0004(r16)
stwu r19, 0x0004(r16)
stwu r20, 0x0004(r16)
stw r21, 0x0154(r6)
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
MPCall_61_0x144
li r21, 0x10
stw r17, 0x0200(r16)
stw r18, 0x0204(r16)
stw r19, 0x0208(r16)
stw r20, 0x020c(r16)
stw r21, 0x0154(r6)
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
MPCall_61_0x160
li r21, 0x04
stw r17, 0x0210(r16)
stw r21, 0x0154(r6)
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
MPCall_61_0x170
lwz r16, 0x0088(r31)
cmplwi r5, 0x00
cmplwi cr1, r5, 0x08
beq MPCall_61_0x1b0
beq cr1, MPCall_61_0x1c4
2017-11-19 04:11:07 +00:00
cmplwi r5, 0x10
beq MPCall_61_0x1d8
2017-11-19 04:11:07 +00:00
cmplwi r5, 0x1c
cmplwi cr1, r5, 0x20
beq MPCall_61_0x1ec
beq cr1, MPCall_61_0x1fc
2017-11-19 04:11:07 +00:00
cmplwi r5, 0x24
cmplwi cr1, r5, 0x18
beq MPCall_61_0x218
beq cr1, MPCall_61_0x228
2017-11-19 04:11:07 +00:00
b ReleaseAndReturnMPCallOOM
MPCall_61_0x1b0
li r21, 0x08
stw r17, 0x00f0(r16)
stw r18, 0x00f4(r16)
stw r21, 0x0154(r6)
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
MPCall_61_0x1c4
li r21, 0x08
stw r17, 0x00e8(r16)
stw r18, 0x00ec(r16)
stw r21, 0x0154(r6)
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
MPCall_61_0x1d8
li r21, 0x08
stw r17, 0x00f8(r16)
stw r18, 0x00fc(r16)
stw r21, 0x0154(r6)
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
MPCall_61_0x1ec
li r21, 0x04
stw r17, 0x00d4(r16)
stw r21, 0x0154(r6)
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
MPCall_61_0x1fc
li r21, 0x04
lwz r18, 0x00a4(r16)
rlwimi r18, r17, 0, 20, 23 ; MSR[FE0/SE/BE/FE1]
2017-11-19 04:11:07 +00:00
rlwimi r18, r17, 0, 31, 31
stw r18, 0x00a4(r16)
stw r21, 0x0154(r6)
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
MPCall_61_0x218
li r21, 0x04
stw r17, 0x00c4(r16)
stw r21, 0x0154(r6)
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
MPCall_61_0x228
li r21, 0x04
stw r17, 0x00dc(r16)
stw r21, 0x0154(r6)
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
DeclareMPCall 63, MPCall_63
MPCall_63 ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3
; r8 = id
bl LookupID
cmpwi r9, Task.kIDClass
bne ReleaseAndReturnMPCallInvalidIDErr
2018-04-29 22:39:50 +00:00
stw r4, Task.SomeLabelField(r8)
2017-11-19 04:11:07 +00:00
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
2018-04-29 22:39:50 +00:00
; OSStatus MPSetTaskCPU(TaskID, CPUID)
; Makes it so that a Task can only run on a single CPU.
DeclareMPCall 114, MPSetTaskCPU
2017-11-19 04:11:07 +00:00
2018-04-29 22:39:50 +00:00
MPSetTaskCPU ; OUTSIDE REFERER
2017-11-19 04:11:07 +00:00
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3
; r8 = id
bl LookupID
cmpwi r9, Task.kIDClass
mr r31, r8
bne ReleaseAndReturnMPCallInvalidIDErr
2017-11-19 04:11:07 +00:00
mr r8, r4
; r8 = id
bl LookupID
cmpwi r9, CPU.kIDClass
mr r30, r8
bne ReleaseAndReturnMPCallInvalidIDErr
2018-04-29 22:39:50 +00:00
lwz r16, Task.Flags(r31)
lwz r17, Task.PreemptCtr(r31)
rlwinm. r8, r16, 0, Task.kFlagAborted, Task.kFlagAborted
2017-11-19 04:11:07 +00:00
cmplw cr1, r17, r5
2018-04-29 22:39:50 +00:00
lwz r18, CPU.Flags(r30)
bne ReleaseAndReturnMPCallOOM
bne cr1, ReleaseAndReturnMPCallOOM
2018-04-29 22:39:50 +00:00
rlwinm. r8, r18, 0, CPU.kFlagScheduled, CPU.kFlagScheduled
2017-11-19 04:11:07 +00:00
cmplwi cr1, r17, 0x04
beq ReleaseAndReturnMPCallOOM
2018-04-29 22:39:50 +00:00
lwz r16, Task.Flags(r31)
lhz r17, CPU.EWA + EWA.CPUIndex(r30)
2018-04-29 22:39:50 +00:00
ori r16, r16, 0x40;Task.kFlag25
stw r16, Task.Flags(r31)
sth r17, Task.CPUIndex(r31)
rlwinm. r8, r16, 0, Task.kFlag26, Task.kFlag26
2017-11-19 04:11:07 +00:00
mr r8, r31
2018-04-29 22:39:50 +00:00
bne @No_Requeueing
bl SchTaskUnrdy
bl SchRdyTaskNow
2017-11-19 04:11:07 +00:00
2018-04-29 22:39:50 +00:00
@No_Requeueing
bl FlagSchEvaluationIfTaskRequires
2017-11-19 04:11:07 +00:00
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
; ARG TaskID r3, OSType r4
; RET OSStatus r3
2017-11-19 04:11:07 +00:00
DeclareMPCall 126, KCSetTaskType
KCSetTaskType
2017-11-19 04:11:07 +00:00
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3
bl LookupID
cmpwi r9, Task.kIDClass
bne ReleaseAndReturnMPCallInvalidIDErr
2017-11-19 04:11:07 +00:00
stw r4, Task.Name(r8)
2017-11-19 04:11:07 +00:00
b ReleaseAndReturnZeroFromMPCall