; 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 DeclareMPCall 7, MPCall_7 MPCall_7 ; OUTSIDE REFERER rlwinm. r8, r5, 0, 31, 28 bne+ ReturnMPCallOOM _Lock PSA.SchLock, scratch1=r16, scratch2=r17 mr r8, r3 ; r8 = id bl LookupID cmpwi r9, Process.kIDClass mr r30, r8 bne+ ReleaseAndReturnMPCallInvalidIDErr lwz r16, 0x0008(r30) rlwinm. r17, r16, 0, 30, 30 bne+ ReleaseAndReturnMPCallOOM bl CreateTask mr. r31, r8 beq+ major_0x0af60 mfsprg r15, 0 lwz r17, 0x0000(r31) stw r17, 0x0154(r6) lhz r16, -0x0116(r15) sth r16, 0x001a(r31) addi r16, r31, 0x100 lwz r17, 0x013c(r6) stw r17, 0x0164(r16) lwz r17, 0x0144(r6) stw r17, 0x00fc(r16) lwz r17, 0x014c(r6) stw r17, 0x0114(r16) stw r4, 0x0098(r31) lwz r17, 0x0134(r6) stw r17, 0x00ec(r31) lwz r16, 0x0064(r28) rlwinm. r8, r5, 0, 30, 30 beq- MPCall_7_0x98 oris r16, r16, 0x40 MPCall_7_0x98 rlwinm. r8, r5, 0, 29, 29 beq- MPCall_7_0xa4 oris r16, r16, 0x02 MPCall_7_0xa4 stw r16, 0x0064(r28) ; r1 = kdp b ReleaseAndReturnZeroFromMPCall ;Xrefs: ;setup ;major_0x0bb20 ;major_0x0e284 ; ARG EmpiricalCpuFeatures r7, Process *r8 ; RET Task *r8 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 bl PoolAlloc mr. r28, r8 beq- @fail_oom ; Allocate an opaque ID for it li r9, Task.kIDClass bl MakeID cmpwi r8, 0 beq- @fail_no_id ; 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 bl PoolAlloc cmpwi r8, 0 stw r8, Task.NotificationPtr(r28) beq- @fail_note_oom lisori r9, 'note' stw r9, 4(r8) ; Create a semaphore struct inside the task ; (NOT a semaphore queue) addi r16, r28, Task.SemaphoreLLL StartLoadingWord r17, 'SEMA' stw r16, LLL.Next(r16) FinishLoadingWord stw r16, LLL.Prev(r16) stw r17, LLL.Signature(r16) ; Might be part of the SEMA? li r16, 1 stw r16, Task.One(r28) li r16, 0 stw r16, Task.Zero(r28) ; Allocate an ID for the SEMA addi r8, r28, Task.SemaphoreLLL li r9, Semaphore.kIDClass bl MakeID cmpwi r8, 0 beq- @fail_semq_no_id stw r8, Task.SemaphoreLLL + LLL.Freeform(r28) ; Allocate a vector (i.e. AltiVec) save area ; Conditionally, that is rlwinm. r8, r7, 0, PSA.AVFeatureBit, PSA.AVFeatureBit beq- @non_altivec_task ; Allocate and check li r8, 0x214 ;VectorSaveArea.Size ; room for v registers plus 20 bytes bl PoolAlloc 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 ; 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 @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.MysteryByte1(r28) li r16, 9 stw r16, 0x0064(r28) 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.EmpiricalCpuFeatures(r1) stw r16, Task.ContextBlock + ContextBlock.EmpiricalCpuFeatures(r28) lwz r16, PSA.UserModeMSR(r1) stw r16, Task.ContextBlock + ContextBlock.MSR(r28) addi r16, r1, KDP.YellowVecBase stw r16, Task.YellowVecTblPtr(r28) li r16, 0 lwz r17, Task.NotificationPtr(r28) stw r16, 0x0010(r17) stw r16, 0x0014(r17) li r16, -0x7271 stw r16, 0x0018(r17) li r16, 0 stw r16, Task.Zero1(r28) stw r16, Task.Zero2(r28) stw r16, Task.Zero3(r28) stw r16, Task.Zero4(r28) stw r16, Task.Zero5(r28) ; 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 lbz r16, 0x0018(r31) cmpwi r16, 0x00 bne+ ReleaseAndReturnMPCallOOM lwz r8, 0x0060(r31) ; r8 = id bl LookupID cmpwi r9, Process.kIDClass bne+ Local_Panic lwz r16, 0x0008(r8) rlwinm. r17, r16, 0, 30, 30 bne+ ReleaseAndReturnMPCallOOM 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 lwz r17, 0x0008(r16) lwz r18, 0x000c(r16) stw r17, 0x0008(r18) stw r18, 0x000c(r17) li r17, 0x00 stw r17, 0x0008(r16) stw r17, 0x000c(r16) mr r8, r31 bl TaskReadyAsPrev bl CalculateTimeslice bl major_0x14af8 ; r1 = kdp b ReleaseAndReturnZeroFromMPCall ; MPCall_9 ; Xrefs: ; kcMPDispatch ; MPCall_58 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 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 mfsprg r15, 0 lhz r18, 0x001a(r31) lhz r17, -0x0116(r15) cmpw r18, r17 beq- MPCall_9_0xe0 ori r16, r16, 0x400 stw r16, 0x0064(r31) li r17, 0x01 stb r17, 0x0019(r31) mr r8, r31 bl major_0x14af8_0xa0 sync lwz r16, PSA.SchLock + Lock.Count(r1) cmpwi cr1, r16, 0x00 li r16, 0x00 bne+ cr1, MPCall_9_0x8c mflr r16 bl panic MPCall_9_0x8c stw r16, PSA.SchLock + Lock.Count(r1) 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, -0x7271 stw r16, 0x0018(r17) b MPCall_9_0xfc MPCall_9_0xb4 ori r16, r16, 0x02 stw r16, 0x0064(r31) addi r16, r31, 0x08 lwz r17, 0x0008(r16) lwz r18, 0x000c(r16) stw r17, 0x0008(r18) stw r18, 0x000c(r17) li r17, 0x00 stw r17, 0x0008(r16) stw r17, 0x000c(r16) b MPCall_9_0xf0 MPCall_9_0xe0 ori r16, r16, 0x02 stw r16, 0x0064(r31) mr r8, r31 bl major_0x13e4c MPCall_9_0xf0 lwz r17, 0x009c(r31) li r3, 0x00 stw r4, 0x0018(r17) MPCall_9_0xfc addi r16, r1, -0xa44 addi r17, r31, 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) lbz r8, 0x0037(r31) cmpwi r8, 0x01 bne- MPCall_9_0x130 addi r8, r31, 0x20 bl major_0x136c8 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 mr r31, r8 mr r8, r17 bl major_0x0c8b4 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 mr r31, r8 lbz r16, 0x0018(r31) cmpwi r16, 0x00 bne+ ReleaseAndReturnMPCallOOM lwz r16, 0x0064(r31) rlwinm. r16, r16, 0, 30, 30 beq+ ReleaseAndReturnMPCallOOM mr r8, r31 bl TasksFuncThatIsNotAMPCall ; r1 = kdp b ReleaseAndReturnZeroFromMPCall TasksFuncThatIsNotAMPCall mflr r27 mr r26, r8 addi r16, r26, 0x08 lwz r17, 0x0008(r16) lwz r18, 0x000c(r16) stw r17, 0x0008(r18) stw r18, 0x000c(r17) li r17, 0x00 stw r17, 0x0008(r16) stw r17, 0x000c(r16) lwz r8, 0x0000(r26) bl DeleteID lwz r8, 0x00a0(r26) bl DeleteID lwz r8, 0x009c(r26) cmpwi r8, 0x00 beq- @_0x98 bl PoolFree @_0x98 lwz r8, 0x008c(r26) cmpwi r8, 0x00 beq- @_0xa8 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 DeclareMPCall 11, MPCall_11 MPCall_11 ; OUTSIDE REFERER mfsprg r16, 0 cmpwi r3, 0x00 lwz r17, -0x08f0(r1) lwz r18, -0x0008(r16) lwz r19, 0x0000(r17) bne- MPCall_11_0x1c lwz r3, 0x0000(r18) MPCall_11_0x1c cmpw r3, r19 li r3, 0x01 beq+ CommonMPCallReturnPath li r3, 0x00 b CommonMPCallReturnPath DeclareMPCall 12, MPCall_12 MPCall_12 ; OUTSIDE REFERER mfsprg r14, 0 lwz r15, -0x0008(r14) lwz r3, 0x0000(r15) lwz r4, 0x00ec(r15) b CommonMPCallReturnPath DeclareMPCall 14, MPCall_14 MPCall_14 ; OUTSIDE REFERER cmpwi r4, 0x01 cmpwi cr1, r4, 10000 blt+ ReturnMPCallInvalidIDErr bgt+ cr1, ReturnMPCallInvalidIDErr _Lock PSA.SchLock, scratch1=r16, scratch2=r17 mr r8, r3 ; r8 = id bl LookupID cmpwi r9, Task.kIDClass bne+ ReleaseAndReturnMPCallInvalidIDErr mr r31, r8 lbz r16, 0x0018(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 cmpwi r17, 0x00 stw r18, 0x0014(r16) beq- MPCall_14_0x70 mr r8, r31 bl major_0x14af8_0xa0 MPCall_14_0x70 stw r4, 0x001c(r31) ; r1 = kdp b ReleaseAndReturnZeroFromMPCall DeclareMPCall 56, MPCall_56 MPCall_56 ; OUTSIDE REFERER _Lock PSA.SchLock, scratch1=r16, scratch2=r17 mr r8, r3 ; r8 = id bl LookupID cmpwi r9, Task.kIDClass bne+ ReleaseAndReturnMPCallInvalidIDErr mr r31, r8 mr r8, r4 ; r8 = id bl LookupID cmpwi r9, 0 ; invalid cmpwi cr1, r9, 0x04 beq- MPCall_56_0x44 bne+ cr1, ReleaseAndReturnMPCallInvalidIDErr MPCall_56_0x44 mr r30, r8 stw r4, 0x00f4(r31) ; r1 = kdp b ReleaseAndReturnZeroFromMPCall ; KCThrowException ; Throws an exception to a specified task. ; > r3 = MPTaskID task ; > r4 = MPExceptionKind kind ; < r3 = result code DeclareMPCall 57, KCThrowException KCThrowException ; OUTSIDE REFERER mfsprg r15, 0 _Lock PSA.SchLock, scratch1=r16, scratch2=r17 mr r8, r3 ; r8 = id bl LookupID cmpwi r9, Task.kIDClass bne+ ReleaseAndReturnMPCallInvalidIDErr mr r31, r8 lwz r16, 0x0064(r31) mtcr r16 li r3, -0x7271 beq+ cr7, ReleaseAndReturnMPCall li r3, -0x726c beq+ cr5, ReleaseAndReturnMPCall beq+ cr3, ReleaseAndReturnMPCallOOM lbz r17, 0x0018(r31) lhz r18, 0x001a(r31) cmpwi cr1, r17, 0x00 bne- cr1, KCThrowException_0x70 ori r16, r16, 0x600 stw r4, 0x00f8(r31) stw r16, 0x0064(r31) li r3, -0x726b b ReleaseAndReturnMPCall KCThrowException_0x70 lhz r19, -0x0116(r15) cmpw r19, r18 bne- KCThrowException_0xb8 ori r16, r16, 0x200 stw r4, 0x00f8(r31) stw r16, 0x0064(r31) mr r8, r31 bl major_0x13e4c addi r16, r1, -0xa34 addi r17, r31, 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 r3, -0x726c 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 major_0x14af8_0xa0 sync lwz r16, PSA.SchLock + Lock.Count(r1) cmpwi cr1, r16, 0x00 li r16, 0x00 bne+ cr1, KCThrowException_0xf0 mflr r16 bl panic KCThrowException_0xf0 stw r16, PSA.SchLock + Lock.Count(r1) subi r10, r10, 4 b MPCall_6_0x78 ; MPCall_58 ; Xrefs: ; major_0x02ccc ; kcMPDispatch ; MPCall_60 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 mr r31, r8 lwz r29, 0x0064(r31) mtcr r29 li r3, -0x7271 beq+ cr7, ReleaseAndReturnMPCall beq- cr4, MPCall_58_0x44 bne+ cr5, ReleaseAndReturnMPCallOOM MPCall_58_0x44 mtcr r4 lwz r30, 0x0088(r31) bns- cr7, MPCall_58_0x68 li r8, 0x1c bl PoolAlloc_with_crset cmpwi r8, 0x00 beq+ major_0x0af60 li r3, 0x00 b MPCall_58_0x114 MPCall_58_0x68 li r17, 0x3800 rlwinm. r8, r29, 0, 18, 18 andc r29, r29, r17 li r17, 0x00 bne- cr7, MPCall_58_0x80 ori r17, r17, 0x400 MPCall_58_0x80 ble- cr7, MPCall_58_0x88 ori r17, r17, 0x200 MPCall_58_0x88 lwz r18, 0x00a4(r30) rlwimi r18, r17, 0, 21, 22 stw r18, 0x00a4(r30) li r19, 0x600 lwz r17, 0x0008(r31) addi r18, r1, -0xa34 andc r29, r29, r19 cmpw cr1, r17, r18 stw r29, 0x0064(r31) bne- MPCall_58_0xb4 bne- cr1, MPCall_58_0xe0 MPCall_58_0xb4 addi r16, r31, 0x08 lwz r17, 0x0008(r16) lwz r18, 0x000c(r16) stw r17, 0x0008(r18) stw r18, 0x000c(r17) li r17, 0x00 stw r17, 0x0008(r16) stw r17, 0x000c(r16) mr r8, r31 bl TaskReadyAsPrev bl major_0x14af8 MPCall_58_0xe0 ; r1 = kdp b ReleaseAndReturnZeroFromMPCall FuncExportedFromTasks ; OUTSIDE REFERER addi r16, r1, -0xa34 addi r17, r31, 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 r8, 0x1c bl PoolAlloc_with_crset lwz r29, 0x0064(r31) ori r29, r29, 0x200 MPCall_58_0x114 mtcr r29 mr r28, r8 beq- cr3, MPCall_58_0x13c blt- cr5, MPCall_58_0x13c lwz r8, -0x08e8(r1) ; r8 = id bl LookupID cmpwi r9, Queue.kIDClass mr r30, r8 ori r29, r29, 0x800 beq- MPCall_58_0x184 MPCall_58_0x13c bso- cr4, MPCall_58_0x158 lwz r8, 0x00f4(r31) ; r8 = id bl LookupID cmpwi r9, Queue.kIDClass mr r30, r8 ori r29, r29, 0x1000 beq- MPCall_58_0x184 MPCall_58_0x158 mr. r8, r28 bnel- PoolFree addi r16, r31, 0x08 lwz r17, 0x0008(r16) lwz r18, 0x000c(r16) stw r17, 0x0008(r18) stw r18, 0x000c(r17) li r17, 0x00 stw r17, 0x0008(r16) stw r17, 0x000c(r16) b MPCall_9_0x98 MPCall_58_0x184 mr. r8, r28 stw r29, 0x0064(r31) bne- MPCall_58_0x1a4 lwz r8, 0x0028(r30) cmpwi r8, 0x00 beq+ MPCall_58_0x114 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 major_0x0c8b4 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 DeclareMPCall 59, MPCall_59 MPCall_59 ; OUTSIDE REFERER _Lock PSA.SchLock, scratch1=r16, scratch2=r17 mr. r8, r3 beq- MPCall_59_0x30 ; r8 = id bl LookupID cmpwi r9, Queue.kIDClass bne+ ReleaseAndReturnMPCallInvalidIDErr mr r31, r8 MPCall_59_0x30 stw r3, -0x08e8(r1) ; 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 mr r31, r8 cmpwi r4, 0x05 beq- MPCall_60_0x288 lwz r16, 0x0064(r31) mtcr r16 li r3, -0x7271 beq+ cr7, ReleaseAndReturnMPCall beq- cr4, MPCall_60_0x4c bne+ cr5, ReleaseAndReturnMPCallOOM MPCall_60_0x4c lbz r16, 0x0018(r31) cmpwi r16, 0x00 bne+ ReleaseAndReturnMPCallOOM cmpwi r4, 0x00 cmpwi cr1, r4, 0x01 beq- MPCall_60_0xf8 beq- cr1, MPCall_60_0x10c cmpwi r4, 0x02 cmpwi cr1, r4, 0x03 beq- MPCall_60_0x150 beq- cr1, MPCall_60_0x1c0 cmpwi r4, 0x04 bne+ ReleaseAndReturnMPCallOOM lwz r16, 0x0088(r31) li r17, 0x00 cmplwi r5, 0x00 cmplwi cr1, r5, 0x04 beq- MPCall_60_0xac beq- cr1, MPCall_60_0xc0 cmplwi r5, 0x08 cmplwi cr1, r5, 0x0c beq- MPCall_60_0xc8 beq- cr1, MPCall_60_0xd0 b ReleaseAndReturnMPCallOOM MPCall_60_0xac lwz r8, 0x0070(r31) lwz r9, 0x0074(r16) bl FindAreaAbove lwz r17, 0x0000(r8) b MPCall_60_0x36c MPCall_60_0xc0 lwz r17, 0x0074(r16) b MPCall_60_0x36c MPCall_60_0xc8 lwz r17, 0x00f8(r31) b MPCall_60_0x36c MPCall_60_0xd0 lwz r17, 0x0040(r16) lwz r18, 0x0064(r16) rlwinm. r8, r17, 0, 27, 27 li r17, 0x02 beq- MPCall_60_0x36c rlwinm. r8, r18, 0, 1, 1 li r17, 0x01 bne- MPCall_60_0x36c li r17, 0x00 b MPCall_60_0x36c MPCall_60_0xf8 lwz r16, 0x0088(r31) cmplwi cr1, r5, 0xf8 andi. r17, r5, 0x07 addi r16, r16, 0xfc b MPCall_60_0x124 MPCall_60_0x10c lwz r16, 0x0088(r31) cmplwi r5, 0x100 cmplwi cr1, r5, 0xf8 beq- MPCall_60_0x144 andi. r17, r5, 0x07 addi r16, r16, 0x1fc MPCall_60_0x124 add r16, r16, r5 bgt+ cr1, ReleaseAndReturnMPCallOOM bne+ ReleaseAndReturnMPCallOOM 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, 12, 12 lwz r16, 0x00d8(r16) beq+ ReleaseAndReturnMPCallOOM 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 andi. r8, r5, 0x0f add r16, r16, r5 subi r16, r16, 4 bgt+ cr1, ReleaseAndReturnMPCallOOM bne+ ReleaseAndReturnMPCallOOM 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 cmplwi r5, 0x10 cmplwi cr1, r5, 0x30 beq- MPCall_60_0x234 beq- cr1, MPCall_60_0x240 cmplwi r5, 0x1c cmplwi cr1, r5, 0x20 beq- MPCall_60_0x24c beq- cr1, MPCall_60_0x254 cmplwi r5, 0x24 cmplwi cr1, r5, 0x28 beq- MPCall_60_0x25c beq- cr1, MPCall_60_0x264 cmplwi r5, 0x2c cmplwi cr1, r5, 0x18 beq- MPCall_60_0x278 beq- cr1, MPCall_60_0x280 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 cmplwi cr1, r5, 0x20 cmplwi r5, 0x30 beq- cr1, MPCall_60_0x2f4 beq- MPCall_60_0x308 cmpwi cr1, r5, 0x40 cmplwi r5, 0x3c beq- cr1, MPCall_60_0x320 beq- MPCall_60_0x318 cmpwi cr1, r5, 0x50 beq- cr1, MPCall_60_0x34c 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 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 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 mr r31, r8 lwz r16, 0x0064(r31) mtcr r16 li r3, -0x7271 beq+ cr7, ReleaseAndReturnMPCall beq- cr4, MPCall_61_0x44 bne+ cr5, ReleaseAndReturnMPCallOOM MPCall_61_0x44 lbz r16, 0x0018(r31) cmpwi r16, 0x00 bne+ ReleaseAndReturnMPCallOOM 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 cmpwi r4, 0x02 cmpwi cr1, r4, 0x03 beq- MPCall_61_0xe8 beq- cr1, MPCall_61_0x170 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 andi. r8, r5, 0x07 addi r16, r16, 0x1fc MPCall_61_0xb0 add r16, r16, r5 bgt+ cr1, ReleaseAndReturnMPCallOOM bne+ ReleaseAndReturnMPCallOOM 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, 12, 12 lwz r16, 0x00d8(r16) beq+ ReleaseAndReturnMPCallOOM 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 andi. r8, r5, 0x0f add r16, r16, r5 subi r16, r16, 4 bgt+ cr1, ReleaseAndReturnMPCallOOM bne+ ReleaseAndReturnMPCallOOM 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 cmplwi r5, 0x10 beq- MPCall_61_0x1d8 cmplwi r5, 0x1c cmplwi cr1, r5, 0x20 beq- MPCall_61_0x1ec beq- cr1, MPCall_61_0x1fc cmplwi r5, 0x24 cmplwi cr1, r5, 0x18 beq- MPCall_61_0x218 beq- cr1, MPCall_61_0x228 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 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 stw r4, 0x00ec(r8) ; r1 = kdp b ReleaseAndReturnZeroFromMPCall DeclareMPCall 114, MPCall_114 MPCall_114 ; 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 mr r8, r4 ; r8 = id bl LookupID cmpwi r9, CPU.kIDClass mr r30, r8 bne+ ReleaseAndReturnMPCallInvalidIDErr lwz r16, 0x0064(r31) lwz r17, 0x00e8(r31) rlwinm. r8, r16, 0, 30, 30 cmplw cr1, r17, r5 lwz r18, 0x0018(r30) bne+ ReleaseAndReturnMPCallOOM bne+ cr1, ReleaseAndReturnMPCallOOM rlwinm. r8, r18, 0, 28, 28 cmplwi cr1, r17, 0x04 beq+ ReleaseAndReturnMPCallOOM lwz r16, 0x0064(r31) lhz r17, 0x022a(r30) ori r16, r16, 0x40 stw r16, 0x0064(r31) sth r17, 0x001a(r31) rlwinm. r8, r16, 0, 26, 26 mr r8, r31 bne- MPCall_114_0x90 bl major_0x13e4c bl TaskReadyAsPrev MPCall_114_0x90 bl major_0x14af8 ; r1 = kdp b ReleaseAndReturnZeroFromMPCall ; KCSetTaskType DeclareMPCall 126, KCSetTaskType KCSetTaskType ; OUTSIDE REFERER _Lock PSA.SchLock, scratch1=r16, scratch2=r17 mr r8, r3 ; r8 = id bl LookupID cmpwi r9, Task.kIDClass bne+ ReleaseAndReturnMPCallInvalidIDErr stw r4, 0x0074(r8) ; r1 = kdp b ReleaseAndReturnZeroFromMPCall