powermac-rom/NanoKernel/NKTasks.s

1570 lines
28 KiB
ArmAsm

; 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