powermac-rom/NanoKernel/NKMPCalls.s

2673 lines
46 KiB
ArmAsm

; Important note: If you want more than r3-r5, get them from ECB!!!
; Unimplemented MPCalls from MPLibrary:
; NKSetPrInfoPageSize 109
; NKSetPrInfoILockSizes 110
; NKSetPrInfoTransCache 111
; NKSetPrInfoL1Cache 112
; NKSetPrInfoL2Cache 113
;MPCall_Panic set MPCall_Panic
if &TYPE('NKDebugShim') != 'UNDEFINED'
MaxMPCallCount equ 300
else
MaxMPCallCount equ 134
endif
MACRO
DeclareMPCall &n, &code
@h
org MPCallTable + 4*&n
dc.l &code - NKTop - 4*&n
org @h
ENDM
; Creates a blank table without overflowing PPCAsm's default
; macro stack size :)
MACRO
CreateMPCallTbl &n
if &n >= 1
dc.l (MPCallBad - NKTop) - (* - MPCallTable)
endif
if &n >= 2
dc.l (MPCallBad - NKTop) - (* - MPCallTable)
endif
if &n >= 3
dc.l (MPCallBad - NKTop) - (* - MPCallTable)
endif
if &n >= 4
dc.l (MPCallBad - NKTop) - (* - MPCallTable)
endif
if &n >= 5
dc.l (MPCallBad - NKTop) - (* - MPCallTable)
endif
if &n >= 6
dc.l (MPCallBad - NKTop) - (* - MPCallTable)
endif
if &n >= 7
dc.l (MPCallBad - NKTop) - (* - MPCallTable)
endif
if &n >= 8
dc.l (MPCallBad - NKTop) - (* - MPCallTable)
endif
if &n >= 9
dc.l (MPCallBad - NKTop) - (* - MPCallTable)
endif
if &n >= 10
dc.l (MPCallBad - NKTop) - (* - MPCallTable)
endif
if &n >= 11
CreateMPCallTbl (&n) - 10
endif
ENDM
kcMPDispatch ; reached by `sc`, or `twi *, *, 8`
bl Save_r14_r31
lwz r8, EWA.r6(r8) ; clobbers our EWA pointer :(
lwz r14, KDP.PA_NanoKernelCode(r1) ; but r14...
lwz r15, ContextBlock.r0(r6) ; ...and r15 were saved
stw r8, ContextBlock.r6(r6) ; why move r6 from EWA to ContextBlock?
b MPCallTableEnd
MPCallTable
CreateMPCallTbl MaxMPCallCount
MPCallTableEnd
; Not sure where this counter table is?
lwz r16, KDP.NanoKernelInfo + NKNanoKernelInfo.MPDispatchCountTblPtr(r1)
rlwinm r17, r15, 2, 20, 29
cmplwi r16, 0
beq- @no_count
lwzx r18, r16, r17
addi r18, r18, 1
stwx r18, r16, r17
@no_count
cmplwi r15, MaxMPCallCount
rlwimi r14, r15, 2, 21, 29
llabel r16, MPCallTable
lwzx r15, r16, r14
add r15, r15, r14
mtlr r15
bltlr-
; Handler for out-of-range or unimplemented (debug)
; MPCalls.
MPCallBad ; OUTSIDE REFERER
li r3, -4
b CommonMPCallReturnPath
; ReleaseAndMPCallWasBad
; Xrefs:
; MPCall_75
ReleaseAndMPCallWasBad ; OUTSIDE REFERER
sync
lwz r16, PSA.SchLock + Lock.Count(r1)
cmpwi cr1, r16, 0x00
li r16, 0x00
bne+ cr1, @dont_panic
mflr r16
bl panic
@dont_panic
stw r16, PSA.SchLock + Lock.Count(r1)
b MPCallBad
; ReleaseAndReturnZeroFromMPCall
; Xrefs:
; KCRegisterCpuPlugin
; KCCreateProcess
; MPCall_5
; MPCall_55
; KCCreateCpuStruct
; MPCall_43
; KCStartCPU
; KCStopScheduling
; KCRegisterThermalHandler
; KCRegisterPMFHandler
; KCMarkPMFTask
; NKSetClockStep
; NKSetClockDriftCorrection
; MPCall_115
; KCRegisterExternalHandler
; MPCall_133
; MPCall_15
; MPCall_16
; MPCall_39
; MPCall_17
; MPCall_18
; MPCall_19
; MPCall_20
; MPCall_23
; MPCall_24
; MPCall_21
; MPCall_25
; MPCall_27
; MPCall_29
; MPCall_28
; MPCall_26
; MPCall_49
; MPCall_50
; MPCall_51
; MPCall_52
; MPCall_53
; MPCall_54
; MPCall_40
; MPCall_30
; MPCall_31
; MPCall_32
; MPCall_64
; MPCall_65
; MPCall_66
; MPCall_128
; MPCall_120
; MPCall_7
; MPCall_8
; MPCall_10
; MPCall_14
; MPCall_56
; MPCall_58
; MPCall_59
; MPCall_60
; MPCall_61
; MPCall_63
; MPCall_114
; KCSetTaskType
; MPCall_71
; KCSetTaskAddressSpace
; MPCall_74
; MPCall_75
; MPCall_130
; KCSetAreaAccess
; MPCall_123
; MPCall_77
; MPCall_78
; MPCall_80
; MPCall_125
; MPCall_81
; MPCall_98
; MPCall_82
; KCMapPage
; KCUnmapPages
; KCMakePhysicallyContiguous
; KCLockPages
; KCUnlockPages
; KCHoldPages
; KCUnholdPages
; MPCall_91
; MPCall_92
; MPCall_93
; MPCall_94
; MPCall_129
; MPCall_95
; > r1 = kdp
ReleaseAndReturnZeroFromMPCall ; OUTSIDE REFERER
sync
lwz r16, PSA.SchLock + Lock.Count(r1)
cmpwi cr1, r16, 0x00
li r16, 0x00
bne+ cr1, @dont_panic
mflr r16
bl panic
@dont_panic
stw r16, PSA.SchLock + Lock.Count(r1)
; ReturnZeroFromMPCall
; Xrefs:
; ReleaseAndReturnZeroFromMPCall
; MPCall_0
; MPCall_6
; MPCall_55
; MPCall_34
; MPCall_35
; MPCall_36
; KCGetNextID
; KCGetNextIDOwnedByProcess
; MPCall_38
; MPCall_62
; KCStartCPU
; MPCall_47
; NKxprintf
; KCSetBlueProcessID
; NKLocateInfoRecord
; MPCall_108
; NKSetClockDriftCorrection
; MPCall_41
; MPCall_79
; MPCall_83
; MPCall_102
ReturnZeroFromMPCall ; OUTSIDE REFERER
li r3, 0x00
b CommonMPCallReturnPath
; major_0x0af60
; Xrefs:
; KCRegisterCpuPlugin
; KCCreateProcess
; MPCall_5
; MPCall_6
; MPCall_34
; KCCreateCpuStruct
; MPCall_43
; KCStartCPU
; KCStopScheduling
; MPCall_115
; MPCall_15
; MPCall_39
; MPCall_17
; MPCall_18
; MPCall_19
; MPCall_20
; MPCall_23
; MPCall_24
; MPCall_25
; MPCall_27
; MPCall_29
; MPCall_28
; MPCall_49
; MPCall_52
; MPCall_53
; MPCall_40
; MPCall_31
; MPCall_64
; MPCall_7
; MPCall_8
; MPCall_9
; MPCall_10
; KCThrowException
; MPCall_58
; MPCall_60
; MPCall_61
; MPCall_114
; MPCall_70
; MPCall_71
; KCSetTaskAddressSpace
; MPCall_72
; MPCall_73
; MPCall_74
; MPCall_75
; MPCall_130
; MPCall_83
; KCMapPage
; KCUnmapPages
; KCMakePhysicallyContiguous
; KCLockPages
; KCHoldPages
; MPCall_91
; MPCall_92
; MPCall_94
; MPCall_95
major_0x0af60 ; OUTSIDE REFERER
sync
lwz r16, PSA.SchLock + Lock.Count(r1)
cmpwi cr1, r16, 0x00
li r16, 0x00
bne+ cr1, @dont_panic
mflr r16
bl panic
@dont_panic
stw r16, PSA.SchLock + Lock.Count(r1)
; I'd really live a name for this.
major_0x0af60_0x20 ; OUTSIDE REFERER
mfspr r16, pvr
rlwinm. r16, r16, 0, 0, 14
beq- @is_601
mftb r4
b @not_601
@is_601
mfspr r4, rtcl
@not_601
xori r16, r4, 0x1007
xoris r16, r16, 0x1950
stw r16, PSA.ScrambledMPCallTime(r1)
li r3, -0x726e
b CommonMPCallReturnPath
; dead code?
li r3, kMPDeletedErr
b CommonMPCallReturnPath
ReleaseAndTimeoutMPCall ; OUTSIDE REFERER
sync
lwz r16, PSA.SchLock + Lock.Count(r1)
cmpwi cr1, r16, 0x00
li r16, 0x00
bne+ cr1, @dont_panic
mflr r16
bl panic
@dont_panic
stw r16, PSA.SchLock + Lock.Count(r1)
li r3, kMPTimeOutErr
b CommonMPCallReturnPath
ReleaseAndReturnMPCallTaskAborted ; OUTSIDE REFERER
sync
lwz r16, PSA.SchLock + Lock.Count(r1)
cmpwi cr1, r16, 0x00
li r16, 0x00
bne+ cr1, @dont_panic
mflr r16
bl panic
@dont_panic
stw r16, PSA.SchLock + Lock.Count(r1)
li r3, kMPTaskAbortedErr
b CommonMPCallReturnPath
ReleaseAndReturnMPCallOOM ; OUTSIDE REFERER
sync
lwz r16, PSA.SchLock + Lock.Count(r1)
cmpwi cr1, r16, 0x00
li r16, 0x00
bne+ cr1, @dont_panic
mflr r16
bl panic
@dont_panic
stw r16, PSA.SchLock + Lock.Count(r1)
; ReturnMPCallOOM
; Xrefs:
; major_0x0af60
; MPCall_0
; KCRegisterCpuPlugin
; MPCall_47
; NKxprintf
; KCSetBlueProcessID
; NKSetClockStep
; NKSetClockDriftCorrection
; MPCall_39
; MPCall_20
; MPCall_7
; MPCall_82
; KCPropogateExternalInterrupt
; major_0x16b80
ReturnMPCallOOM ; OUTSIDE REFERER
li r3, kMPInsufficientResourcesErr
b CommonMPCallReturnPath
; ReleaseAndReturnMPCallBlueBlocking
; Xrefs:
; MPCall_18
; MPCall_23
; MPCall_27
; MPCall_52
ReleaseAndReturnMPCallBlueBlocking ; OUTSIDE REFERER
sync
lwz r16, PSA.SchLock + Lock.Count(r1)
cmpwi cr1, r16, 0x00
li r16, 0x00
bne+ cr1, major_0x0b02c_0x1c
mflr r16
bl panic
major_0x0b02c_0x1c
stw r16, PSA.SchLock + Lock.Count(r1)
; ReturnMPCallBlueBlocking
; Xrefs:
; ReleaseAndReturnMPCallBlueBlocking
; MPCall_33
ReturnMPCallBlueBlocking ; OUTSIDE REFERER
li r3, kMPBlueBlockingErr
b CommonMPCallReturnPath
; major_0x0b054
; Xrefs:
; MPCall_128
; MPCall_120
; MPCall_73
; MPCall_75
; MPCall_130
; KCSetAreaAccess
; MPCall_123
; MPCall_78
; MPCall_80
; MPCall_125
; MPCall_81
; MPCall_98
; KCMapPage
; KCUnmapPages
; KCMakePhysicallyContiguous
; KCLockPages
; KCUnlockPages
; KCHoldPages
; KCUnholdPages
; MPCall_91
; MPCall_92
; MPCall_93
; MPCall_94
; MPCall_129
major_0x0b054 ; OUTSIDE REFERER
sync
lwz r16, PSA.SchLock + Lock.Count(r1)
cmpwi cr1, r16, 0x00
li r16, 0x00
bne+ cr1, major_0x0b054_0x1c
mflr r16
bl panic
major_0x0b054_0x1c
stw r16, PSA.SchLock + Lock.Count(r1)
; ReturnParamErrFromMPCall
; Xrefs:
; major_0x0b054
; KCGetNextIDOwnedByProcess
; NKLocateInfoRecord
; MPCall_108
; NKSetClockStep
; KCGetPageSize
; MPCall_95
; KCPropogateExternalInterrupt
; major_0x16b80
ReturnParamErrFromMPCall ; OUTSIDE REFERER
li r3, -0x32
b CommonMPCallReturnPath
; ReleaseAndReturnMPCallPrivilegedErr
; Xrefs:
; KCRegisterCpuPlugin
; KCCreateProcess
; MPCall_5
; MPCall_6
; MPCall_43
; KCStartCPU
; KCStopScheduling
; KCRegisterThermalHandler
; KCRegisterPMFHandler
; KCMarkPMFTask
; MPCall_115
; KCRegisterExternalHandler
; MPCall_16
; MPCall_39
; MPCall_17
; MPCall_18
; MPCall_19
; MPCall_23
; MPCall_24
; MPCall_22
; MPCall_21
; MPCall_27
; MPCall_29
; MPCall_28
; MPCall_26
; MPCall_50
; MPCall_51
; MPCall_52
; MPCall_53
; MPCall_54
; MPCall_41
; MPCall_30
; MPCall_31
; MPCall_32
; MPCall_65
; MPCall_67
; MPCall_66
; MPCall_128
; MPCall_7
; MPCall_8
; MPCall_9
; MPCall_10
; MPCall_14
; MPCall_56
; KCThrowException
; MPCall_58
; MPCall_59
; MPCall_60
; MPCall_61
; MPCall_63
; MPCall_114
; KCSetTaskType
; MPCall_71
; KCSetTaskAddressSpace
; MPCall_72
; MPCall_73
; MPCall_74
; MPCall_75
; MPCall_130
; KCSetAreaAccess
; MPCall_123
; MPCall_77
; MPCall_78
; MPCall_80
; MPCall_125
; MPCall_81
; MPCall_98
; MPCall_82
; KCMapPage
; KCUnmapPages
; KCMakePhysicallyContiguous
; KCLockPages
; KCUnlockPages
; KCHoldPages
; KCUnholdPages
; MPCall_91
; MPCall_92
; MPCall_93
; MPCall_94
; MPCall_129
ReleaseAndReturnMPCallPrivilegedErr ; OUTSIDE REFERER
sync
lwz r16, PSA.SchLock + Lock.Count(r1)
cmpwi cr1, r16, 0x00
li r16, 0x00
bne+ cr1, @dont_panic
mflr r16
bl panic
@dont_panic
stw r16, PSA.SchLock + Lock.Count(r1)
li r3, kMPPrivilegedErr
b CommonMPCallReturnPath
ReleaseAndReturnMPCallInvalidIDErr ; OUTSIDE REFERER
sync
lwz r16, PSA.SchLock + Lock.Count(r1)
cmpwi cr1, r16, 0x00
li r16, 0x00
bne+ cr1, @dont_panic
mflr r16
bl panic
@dont_panic
stw r16, PSA.SchLock + Lock.Count(r1)
; ReturnMPCallInvalidIDErr
; Xrefs:
; ReleaseAndReturnMPCallPrivilegedErr
; KCRegisterCpuPlugin
; MPCall_35
; MPCall_36
; KCGetNextID
; KCGetNextIDOwnedByProcess
; MPCall_38
; MPCall_62
; KCCreateCpuStruct
; KCSetBlueProcessID
; MPCall_14
; MPCall_79
ReturnMPCallInvalidIDErr ; OUTSIDE REFERER
li r3, kMPInvalidIDErr
b CommonMPCallReturnPath
; major_0x0b0cc
; Xrefs:
; KCLockPages
; KCUnlockPages
; KCHoldPages
; KCUnholdPages
major_0x0b0cc ; OUTSIDE REFERER
sync
lwz r16, PSA.SchLock + Lock.Count(r1)
cmpwi cr1, r16, 0x00
li r16, 0x00
bne+ cr1, major_0x0b0cc_0x1c
mflr r16
bl panic
major_0x0b0cc_0x1c
stw r16, PSA.SchLock + Lock.Count(r1)
li r3, -0x725a
b CommonMPCallReturnPath
; ReturnZeroFromMPCall_again
; Xrefs:
; MPCall_1
ReturnZeroFromMPCall_again ; OUTSIDE REFERER
li r3, 0x00
b CommonMPCallReturnPath
; AlternateMPCallReturnPath
; Xrefs:
; major_0x02964
; major_0x02ccc
; MPCall_55
; MPCall_18
; MPCall_23
; MPCall_22
; MPCall_27
; MPCall_52
; MPCall_67
; MPCall_9
; KCThrowException
; MPCall_58
; MPCall_60
; MPCall_61
; KCSetTaskAddressSpace
; MPCall_81
; MPCall_98
AlternateMPCallReturnPath ; OUTSIDE REFERER
crclr cr2_eq
b TrulyCommonMPCallReturnPath
ReleaseAndReturnMPCall ; OUTSIDE REFERER
sync
lwz r16, PSA.SchLock + Lock.Count(r1)
cmpwi cr1, r16, 0x00
li r16, 0x00
bne+ cr1, @dont_panic
mflr r16
bl panic
@dont_panic
stw r16, PSA.SchLock + Lock.Count(r1)
; CommonMPCallReturnPath
; Xrefs:
; MPCallBad
; ReturnZeroFromMPCall
; major_0x0af60
; ReturnMPCallOOM
; ReturnMPCallBlueBlocking
; ReturnParamErrFromMPCall
; ReleaseAndReturnMPCallPrivilegedErr
; ReturnMPCallInvalidIDErr
; major_0x0b0cc
; ReturnZeroFromMPCall_again
; AlternateMPCallReturnPath
; KCGetCpuCount
; MPCall_6
; KCYieldWithHint
; KCCpuPlugin
; NKPrintHex
; NKPrintDecimal
; MPCall_11
; MPCall_12
; KCGetPageSizeClasses
; KCGetPageSize
; MPCall_70
; KCCurrentAddressSpace
; KCHomeAddressSpace
; MPCall_72
; MPCall_73
; MPCall_84
; KCGetFreePageCount
; KCGetUnheldFreePageCount
; major_0x16b80
CommonMPCallReturnPath ; OUTSIDE REFERER
crset cr2_eq
TrulyCommonMPCallReturnPath ; OUTSIDE REFERER
mfsprg r8, 0
lwz r9, 0x0134(r6)
stw r9, 0x0018(r8)
bne- cr2, @do_the_other_thing_instead
bl Restore_r14_r31
b skeleton_key
@do_the_other_thing_instead
b major_0x142dc
; MPCall_0
DeclareMPCall 0, MPCall_0
MPCall_0 ; OUTSIDE REFERER
andi. r16, r3, 0xfff
mr r30, r7
mr r29, r6
bne+ ReturnMPCallOOM
rlwinm. r4, r3, 20, 12, 31
lwz r9, 0x06a8(r1)
beq+ ReturnMPCallOOM
cmplw r4, r9
bge+ ReturnMPCallOOM
_Lock PSA.HTABLock, scratch1=r17, scratch2=r18
bl VeryPopularFunction
bge- cr4, MPCall_0_0xd8
bgt- cr5, MPCall_0_0xd8
bns- cr7, MPCall_0_0xd8
bgt- cr7, MPCall_0_0xd8
bltl+ cr5, VMDoSomethingWithTLB
bgel+ cr5, VMSecondLastExportedFunc
ori r16, r16, 0x404
li r31, 0x03
rlwimi r9, r31, 0, 30, 31
bl VMDoSomeIO
mr r7, r30
mr r6, r29
sync
lwz r16, -0x0b90(r1)
cmpwi cr1, r16, 0x00
li r16, 0x00
bne+ cr1, MPCall_0_0x8c
mflr r16
bl panic
MPCall_0_0x8c
stw r16, -0x0b90(r1)
_Lock PSA.PoolLock, scratch1=r16, scratch2=r17
rlwinm r8, r9, 0, 0, 19
mr r9, r3
; r1 = kdp
; r8 = anywhere in new page (phys)
; r9 = page_virt
bl ExtendPool
sync
lwz r16, -0x0ad0(r1)
cmpwi cr1, r16, 0x00
li r16, 0x00
bne+ cr1, MPCall_0_0xd0
mflr r16
bl panic
MPCall_0_0xd0
stw r16, -0x0ad0(r1)
b ReturnZeroFromMPCall
MPCall_0_0xd8
mr r7, r30
mr r6, r29
sync
lwz r16, -0x0b90(r1)
cmpwi cr1, r16, 0x00
li r16, 0x00
bne+ cr1, MPCall_0_0xfc
mflr r16
bl panic
MPCall_0_0xfc
stw r16, -0x0b90(r1)
b ReturnMPCallOOM
; MPCall_1
DeclareMPCall 1, MPCall_1
MPCall_1 ; OUTSIDE REFERER
b ReturnZeroFromMPCall_again
; KCRegisterCpuPlugin
DeclareMPCall 2, KCRegisterCpuPlugin
KCRegisterCpuPlugin ; OUTSIDE REFERER
mfsprg r14, 0
lwz r15, EWA.PA_CurTask(r14)
lwz r16, ContextBlock.r6(r6)
andi. r8, r4, 0xfff ; page alignment?
bne+ ReturnMPCallOOM
andi. r8, r5, 0xfff ; r5 page aligned and nonzero?
cmpwi cr1, r5, 0
bne+ ReturnMPCallOOM
beq+ cr1, ReturnMPCallOOM
_Lock PSA.SchLock, scratch1=r18, scratch2=r19
mr. r8, r3
bne- KCRegisterCpuPlugin_0x50
mfsprg r15, 0
lwz r14, -0x0338(r15)
b KCRegisterCpuPlugin_0x60
KCRegisterCpuPlugin_0x50
; r8 = id
bl LookupID
cmpwi r9, CoherenceGroup.kIDClass
mr r14, r8
bne+ ReturnMPCallInvalidIDErr
KCRegisterCpuPlugin_0x60
cmpwi r16, 0x00
bne- KCRegisterCpuPlugin_0x74
stw r16, 0x0038(r14)
stw r16, 0x0034(r14)
b ReleaseAndReturnMPCallInvalidIDErr
KCRegisterCpuPlugin_0x74
add r17, r4, r5
cmplw r16, r4
cmplw cr1, r16, r17
blt+ ReleaseAndReturnMPCallOOM
bge+ cr1, ReleaseAndReturnMPCallOOM
lwz r19, 0x0038(r14)
mr. r19, r19
bne+ ReleaseAndReturnMPCallInvalidIDErr
mr r27, r4
addi r29, r1, 800
bl PagingFunc3
beq+ ReleaseAndReturnMPCallOOM
rlwinm r18, r31, 0, 0, 19
mr r27, r16
mr r19, r16
addi r29, r1, 800
bl PagingFunc3
beq+ ReleaseAndReturnMPCallOOM
rlwimi r19, r31, 0, 0, 19
stw r4, 0x0028(r14)
stw r18, 0x002c(r14)
stw r5, 0x0030(r14)
stw r16, 0x0034(r14)
stw r19, 0x0038(r14)
lwz r27, 0x0000(r19)
addi r29, r1, 800
bl PagingFunc3
beq+ ReleaseAndReturnMPCallOOM
rlwimi r27, r31, 0, 0, 19
stw r27, 0x0040(r14)
mfsprg r16, 0
lwz r17, -0x001c(r16)
stw r17, 0x004c(r14)
addi r16, r19, 0x20
stw r16, 0x003c(r14)
subi r16, r16, 4
lwz r17, 0x001c(r19)
cmplwi r17, 0x40
stw r17, 0x0044(r14)
bgt+ ReleaseAndReturnMPCallOOM
KCRegisterCpuPlugin_0x114
lwzu r27, 0x0004(r16)
addi r29, r1, 800
bl PagingFunc3
beq+ ReleaseAndReturnMPCallOOM
addi r17, r17, -0x01
rlwimi r27, r31, 0, 0, 19
cmpwi r17, 0x00
stw r27, 0x0000(r16)
bgt+ KCRegisterCpuPlugin_0x114
_log 'CPU plugin registered^n'
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
; KCGetCpuCount
; Called by MPProcessors and MPProcessorsScheduled
; > r3 = 0:all, 1:scheduled
; < r3 = cpu_count
DeclareMPCall 3, KCGetCpuCount
KCGetCpuCount ; OUTSIDE REFERER
mfsprg r15, 0
lwz r14, EWA.CPUBase + CPU.CgrpList + LLL.Freeform(r15)
mr. r8, r3
lwz r3, CoherenceGroup.CpuCount(r14)
beq+ CommonMPCallReturnPath
lwz r3, CoherenceGroup.ScheduledCpuCount(r14)
b CommonMPCallReturnPath
; ARG AddressSpaceID r3
; RET AddressSpaceID r3, ??? r4, ProcessStructID r5
DeclareMPCall 4, KCCreateProcess
KCCreateProcess ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr. r8, r3
bne- @spac_id_supplied
lwz r3, PSA.SystemAddressSpaceID(r1)
mr r8, r3
@spac_id_supplied
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
cmpwi r9, AddressSpace.kIDClass
mr r30, r8
bne+ ReleaseAndReturnMPCallInvalidIDErr
li r8, 0x20 ;Process.Size
bl PoolAlloc
mr. r31, r8
beq+ major_0x0af60
li r9, Process.kIDClass
bl MakeID
cmpwi r8, 0x00
bne- @did_not_fail
mr r8, r31
bl PoolFree
b major_0x0af60
@did_not_fail
stw r8, Process.ID(r31)
lisori r16, Process.kSignature
stw r16, Process.Signature(r31)
stw r3, Process.SystemAddressSpaceID(r31) ; NOT SYSTEM -- fix struct
stw r30, Process.SystemAddressSpacePtr(r31)
lwz r17, Process.AddressSpaceCount(r31)
addi r17, r17, 1
stw r17, Process.AddressSpaceCount(r31)
mr r5, r8
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
DeclareMPCall 5, MPCall_5
MPCall_5 ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3
; r8 = id
bl LookupID
cmpwi r9, Process.kIDClass
bne+ ReleaseAndReturnMPCallInvalidIDErr
mr r31, r8
lwz r16, 0x0008(r31)
rlwinm. r17, r16, 0, 30, 30
bne+ ReleaseAndReturnMPCallOOM
ori r16, r16, 0x02
stw r16, 0x0008(r31)
mr r8, r3
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
; MPCall_6
; Xrefs:
; kcMPDispatch
; KCStopScheduling
; MPCall_9
; KCThrowException
DeclareMPCall 6, MPCall_6
MPCall_6 ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3
; r8 = id
bl LookupID
cmpwi r9, Process.kIDClass
bne+ ReleaseAndReturnMPCallInvalidIDErr
mr r31, r8
lwz r16, 0x0008(r31)
lwz r17, 0x0010(r31)
rlwinm. r8, r16, 0, 30, 30
cmpwi cr1, r17, 0x00
beq+ ReleaseAndReturnMPCallOOM
bne+ cr1, ReleaseAndReturnMPCallOOM
mr r8, r3
bl DeleteID
sync
lwz r16, PSA.SchLock + Lock.Count(r1)
cmpwi cr1, r16, 0x00
li r16, 0x00
bne+ cr1, MPCall_6_0x68
mflr r16
bl panic
MPCall_6_0x68
stw r16, PSA.SchLock + Lock.Count(r1)
mr r8, r31
bl PoolFree
b ReturnZeroFromMPCall
MPCall_6_0x78 ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mfsprg r16, 0
rlwinm. r8, r7, 0, 10, 10
lwz r17, 0x0658(r1)
lwz r31, -0x0008(r16)
beq- MPCall_6_0xb4
lwz r8, 0x00cc(r17)
rlwinm r8, r8, 0, 24, 21
oris r8, r8, 0x8000
stw r8, 0x00cc(r17)
MPCall_6_0xb4
mr r8, r31
bl major_0x13e4c
li r16, 0x02
stb r16, 0x0019(r31)
bl TaskReadyAsPrev
mr r8, r31
bl major_0x14af8
sync
lwz r16, PSA.SchLock + Lock.Count(r1)
cmpwi cr1, r16, 0x00
li r16, 0x00
bne+ cr1, MPCall_6_0xec
mflr r16
bl panic
MPCall_6_0xec
stw r16, PSA.SchLock + Lock.Count(r1)
b CommonMPCallReturnPath
; KCYieldWithHint
DeclareMPCall 13, KCYieldWithHint
KCYieldWithHint ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mfsprg r16, 0
rlwinm. r8, r7, 0, 10, 10
lwz r17, 0x0658(r1)
lwz r31, -0x0008(r16)
beq- KCYieldWithHint_0x68
clrlwi. r8, r3, 0x1f
lwz r8, 0x00cc(r17)
rlwinm r8, r8, 0, 24, 21
oris r8, r8, 0x8000
stw r8, 0x00cc(r17)
beq- KCYieldWithHint_0x68
lbz r16, 0x0019(r31)
cmpwi r16, 0x02
bge- KCYieldWithHint_0x7c
mr r8, r31
bl major_0x13e4c
li r16, 0x02
stb r16, 0x0019(r31)
bl TaskReadyAsNext
b KCYieldWithHint_0x7c
KCYieldWithHint_0x68
mr r8, r31
bl major_0x13e4c
li r16, 0x02
stb r16, 0x0019(r31)
bl TaskReadyAsPrev
KCYieldWithHint_0x7c
mr r8, r31
bl major_0x14af8
sync
lwz r16, PSA.SchLock + Lock.Count(r1)
cmpwi cr1, r16, 0x00
li r16, 0x00
bne+ cr1, KCYieldWithHint_0xa0
mflr r16
bl panic
KCYieldWithHint_0xa0
stw r16, PSA.SchLock + Lock.Count(r1)
b CommonMPCallReturnPath
DeclareMPCall 33, MPCall_33
MPCall_33 ; OUTSIDE REFERER
rlwinm. r8, r7, 0, 10, 10
bne+ ReturnMPCallBlueBlocking
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
b MPCall_55_0x60
; MPCall_55
; Xrefs:
; kcMPDispatch
; MPCall_33
DeclareMPCall 55, MPCall_55
MPCall_55 ; OUTSIDE REFERER
rlwinm. r8, r7, 0, 10, 10
lwz r16, 0x0e80(r1)
beq- MPCall_55_0x60
lwz r17, -0x08e4(r1)
lwz r18, 0x0658(r1)
cmpw r16, r17
stw r16, -0x08e4(r1)
bne+ ReturnZeroFromMPCall
lwz r8, 0x00cc(r18)
rlwinm r8, r8, 0, 24, 21
oris r8, r8, 0x8000
stw r8, 0x00cc(r18)
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
lwz r16, -0x0410(r1)
cmpwi r16, -0x01
li r16, 0x00
bne- MPCall_55_0x60
stw r16, -0x0410(r1)
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
MPCall_55_0x60 ; OUTSIDE REFERER
mfsprg r16, 0
li r17, 0x01
lwz r31, -0x0008(r16)
addi r16, r31, 0x20
stb r17, 0x0014(r16)
clrlwi r3, r3, 0x01
stw r3, 0x0038(r16)
stw r4, 0x003c(r16)
stw r31, 0x0018(r16)
mr r8, r16
bl called_by_init_tmrqs
mr r8, r31
bl major_0x13e4c
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)
li r3, 0x00
b AlternateMPCallReturnPath
DeclareMPCall 34, MPCall_34
MPCall_34 ; OUTSIDE REFERER
mr r8, r3
mr r9, r4
; r1 = kdp
; r9 = kind
bl MakeID
cmpwi r8, 0x00
beq+ major_0x0af60_0x20
mr r5, r8
b ReturnZeroFromMPCall
DeclareMPCall 35, MPCall_35
MPCall_35 ; OUTSIDE REFERER
mr r8, r3
bl DeleteID
cmpwi r8, 0x01
beq+ ReturnZeroFromMPCall
b ReturnMPCallInvalidIDErr
DeclareMPCall 36, MPCall_36
MPCall_36 ; OUTSIDE REFERER
mr r8, r3
; r8 = id
bl LookupID
cmpwi r9, 0 ; invalid
mr r4, r9
mr r5, r8
bne+ ReturnZeroFromMPCall
b ReturnMPCallInvalidIDErr
; Replace the provided process/coherence/console ID with
; the "next" one. IDs were opaque but were only longs.
; Wrapped by MPGetNext*ID, which indirects the opaque ID
; structure.
; From MP docs: A coherence group is the set of processors
; and other bus controllers that have cache-coherent
; access to memory. Mac OS 9 defines only one coherence
; group, which is all the processors that can access
; internal memory (RAM). Other coherence groups are
; possible; for example, a PCI card with its own memory
; and processors can comprise a coherence group.
; > r3 = kind (process=1,coherence=10,console=13)
; > r4 = prev_id
; < r3 = MP result code
; < r4 = next_id
DeclareMPCall 37, KCGetNextID
KCGetNextID ; OUTSIDE REFERER
mr r8, r4
mr r9, r3
bl GetNextIDOfClass
cmpwi r8, 0x00
mr r4, r8
bne+ ReturnZeroFromMPCall
b ReturnMPCallInvalidIDErr
; Replace the provided address
; space/task/queue/semaphore/critical
; region/timer/event/notification ID with the "next" one.
; IDs were opaque but were only longs. Wrapped by
; MPGetNext*ID, which indirects the opaque ID structure.
; Differs from KCGetNextID because it deals in
; objects owned by a particular process.
; Useful info about some poorly understood structures
; ARG ProcessID r3, IDClass r4, ID r5
; RET MPErr r3, IDClass r4, ID r5
DeclareMPCall 116, KCGetNextIDOwnedByProcess
KCGetNextIDOwnedByProcess ; OUTSIDE REFERER
; Confirm that owner ID in r3 is a Process
mr r8, r3
bl LookupID
cmpwi r9, Process.kIDClass
bne+ ReturnMPCallInvalidIDErr
; Loop over IDs (and resolve them) until one is owned by the Process
@try_another_id
mr r8, r5
mr r9, r4
; ARG ID r8, IDClass r9
bl GetNextIDOfClass
; RET ID r8
mr. r5, r8
beq+ ReturnMPCallInvalidIDErr
; ARG ID r8
bl LookupID
; RET Ptr r8, IDClass r9
cmpwi r4, Task.kIDClass
cmpwi cr1, r4, Timer.kIDClass
beq- @task
beq- cr1, @timer
cmpwi r4, Queue.kIDClass
cmpwi cr1, r4, Semaphore.kIDClass
beq- @queue
beq- cr1, @semaphore
cmpwi r4, CriticalRegion.kIDClass
cmpwi cr1, r4, AddressSpace.kIDClass
beq- @critical_region
beq- cr1, @address_space
cmpwi r4, EventGroup.kIDClass
cmpwi cr1, r4, Area.kIDClass
beq- @event_group
beq- cr1, @area
cmpwi r4, Notification.kIDClass
cmpwi cr1, r4, ConsoleLog.kIDClass
beq- @notification
beq- cr1, @console_log
b ReturnParamErrFromMPCall
@task
lwz r17, Task.ThingThatAlignVecHits(r8)
lwz r9, Task.ProcessID(r8)
rlwinm. r17, r17, 0, 15, 15
beq- @not_owned_by_blue_process
lwz r9, PSA.blueProcessPtr(r1)
lwz r9, Task.ID(r9)
@not_owned_by_blue_process
cmpw r9, r3
bne+ @try_another_id
b ReturnZeroFromMPCall
@timer
lwz r9, Timer.ProcessID(r8)
cmpw r9, r3
bne+ @try_another_id
b ReturnZeroFromMPCall
@queue
lwz r9, Queue.ProcessID(r8)
cmpw r9, r3
bne+ @try_another_id
b ReturnZeroFromMPCall
@semaphore
lwz r9, Semaphore.ProcessID(r8)
cmpw r9, r3
bne+ @try_another_id
b ReturnZeroFromMPCall
@critical_region
lwz r9, CriticalRegion.ProcessID(r8)
cmpw r9, r3
bne+ @try_another_id
b ReturnZeroFromMPCall
@address_space
lwz r9, AddressSpace.ProcessID(r8)
cmpw r9, r3
bne+ @try_another_id
b ReturnZeroFromMPCall
@event_group
lwz r9, EventGroup.ProcessID(r8)
cmpw r9, r3
bne+ @try_another_id
b ReturnZeroFromMPCall
@area
lwz r9, Area.ProcessID(r8)
cmpw r9, r3
bne+ @try_another_id
b ReturnZeroFromMPCall
@notification
lwz r9, Notification.ProcessID(r8)
cmpw r9, r3
bne+ @try_another_id
b ReturnZeroFromMPCall
@console_log
lwz r9, ConsoleLog.ProcessID(r8)
cmpw r9, r3
bne+ @try_another_id
b ReturnZeroFromMPCall
DeclareMPCall 38, MPCall_38
MPCall_38 ; OUTSIDE REFERER
mr r8, r3
; r8 = id
bl LookupID
cmpwi r9, Process.kIDClass
bne+ ReturnMPCallInvalidIDErr
mr r31, r8
MPCall_38_0x14
mr r8, r4
li r9, 0x02
bl GetNextIDOfClass
cmpwi r8, 0x00
beq+ ReturnMPCallInvalidIDErr
mr r4, r8
; 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
lwz r17, 0x0064(r8)
lwz r16, 0x0060(r8)
rlwinm. r17, r17, 0, 15, 15
beq- MPCall_38_0x48
lwz r16, -0x041c(r1)
lwz r16, 0x0000(r16)
MPCall_38_0x48
cmpw r16, r3
beq+ ReturnZeroFromMPCall
b MPCall_38_0x14
DeclareMPCall 62, MPCall_62
MPCall_62 ; OUTSIDE REFERER
mr. r8, r3
bne- MPCall_62_0x18
mfsprg r15, 0
lwz r31, -0x0338(r15)
lwz r3, 0x0000(r31)
b MPCall_62_0x24
MPCall_62_0x18
; r8 = id
bl LookupID
cmpwi r9, CoherenceGroup.kIDClass
bne+ ReturnMPCallInvalidIDErr
MPCall_62_0x24
mr r8, r4
li r9, 0x07
bl GetNextIDOfClass
cmpwi r8, 0x00
beq+ ReturnMPCallInvalidIDErr
mr r4, r8
; 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
lwz r16, 0x0008(r8)
lwz r17, 0x0000(r16)
cmpw r17, r3
bne+ MPCall_62_0x24
b ReturnZeroFromMPCall
DeclareMPCall 42, KCCreateCpuStruct
KCCreateCpuStruct ; OUTSIDE REFERER
mr. r8, r3
bne- KCCreateCpuStruct_0x14
mfsprg r15, 0
lwz r30, EWA.CPUBase + CPU.CgrpList + LLL.Freeform(r15)
b KCCreateCpuStruct_0x24
KCCreateCpuStruct_0x14
; r8 = id
bl LookupID
cmpwi r9, CoherenceGroup.kIDClass
mr r30, r8
bne+ ReturnMPCallInvalidIDErr
KCCreateCpuStruct_0x24
li r8, 960
; r1 = kdp
; r8 = size
bl PoolAlloc
; r8 = ptr
mr. r31, r8
beq+ major_0x0af60_0x20
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
li r9, 0x07
; r1 = kdp
; r9 = kind
bl MakeID
cmpwi r8, 0x00
bne+ KCCreateCpuStruct_0x68
mr r8, r31
bl PoolFree
b major_0x0af60
KCCreateCpuStruct_0x68
stw r8, CPU.ID(r31)
lisori r16, CPU.kSignature
stw r8, ContextBlock.r6(r6) ; return ID in r6
stw r16, CPU.Signature(r31)
lwz r17, 0x0020(r30)
addi r17, r17, 0x01
stw r17, 0x0020(r30)
addi r16, r31, 0x08
stw r30, 0x0000(r16)
stw r30, 0x0008(r16)
lwz r17, 0x000c(r30)
stw r17, 0x000c(r16)
stw r16, 0x0008(r17)
stw r16, 0x000c(r30)
lisori r8, 11
lisori r8, 6
stw r8, CPU.Eff(r31)
addi r30, r31, CPU.EWABase
addi r8, r1, PSA.Base
stw r8, EWA.PA_PSA - EWA.Base(r30)
stw r1, EWA.PA_KDP - EWA.Base(r30)
li r8, 0
stw r8, EWA.PA_CurTask - EWA.Base(r30)
; Matches code in Init.s quite closely
li r8, -0x01
sth r4, 0x020a(r30)
stb r8, 0x0209(r30) ; interesting...
lwz r8, EWA.PA_IRP(r1)
stw r8, EWA.PA_IRP - EWA.Base(r30)
lisori r8, 'time'
stw r8, EWA.TimeList - EWA.Base + LLL.Signature(r30)
li r8, 0x04
stb r8, 0x0014(r30)
li r8, 0x01
stb r8, 0x0016(r30)
li r8, 0x00
stb r8, 0x0017(r30)
lisori r8, 0x7fffffff
stw r8, 0x0038(r30)
oris r8, r8, 0xffff
stw r8, 0x003c(r30)
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
DeclareMPCall 43, MPCall_43
MPCall_43 ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3
; r8 = id
bl LookupID
cmpwi r9, CPU.kIDClass
mr r31, r8
bne+ ReleaseAndReturnMPCallInvalidIDErr
lwz r16, 0x0018(r31)
lis r17, 0x00
ori r17, r17, 0x09
and. r17, r17, r16
bne+ ReleaseAndReturnMPCallOOM
mfsprg r15, 0
li r16, 0x04
stw r16, -0x0238(r15)
lhz r16, 0x022a(r31)
stw r16, -0x0234(r15)
li r8, 0x02
; r7 = flags
; r8 = usually 2?
bl SIGP
lwz r17, 0x0008(r31)
addi r16, r31, 0x08
lwz r18, 0x0020(r17)
addi r18, r18, -0x01
stw r18, 0x0020(r17)
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 PoolFree
mr r8, r3
bl DeleteID
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
DeclareMPCall 44, KCStartCPU
; ARG CpuID r3
KCStartCPU ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3
bl LookupID
cmpwi r9, CPU.kIDClass
bne+ ReleaseAndReturnMPCallInvalidIDErr
mr r30, r8
lwz r16, CPU.Eff(r30)
rlwinm. r8, r16, 0, 28, 28
bne+ ReleaseAndReturnZeroFromMPCall
mfsprg r15, 0
li r16, 0x04
stw r16, -0x0238(r15)
lhz r16, 0x022a(r30)
stw r16, -0x0234(r15)
; Put the boots in?
_log 'SIGP kResetProcessor^n'
li r8, 2
bl SIGP
cmpwi r8, -0x7264
cmpwi cr1, r8, 0
beq+ ReleaseAndReturnMPCallOOM
bne+ cr1, ReleaseAndReturnMPCallOOM
; Every CPU gets an idle task
_log 'Creating idle task^n'
mr r31, r7
rlwinm r7, r7, 0, 13, 11
lwz r8, PSA.blueProcessPtr(r1)
; ARG EmpiricalCpuFeatures r7, Process *r8
bl CreateTask
; RET Task *r8
mr r7, r31
mr. r31, r8
beq+ major_0x0af60
stw r31, CPU.IdleTaskPtr(r30)
lisori r8, 'idle'
stw r8, Task.Name(r31)
lisori r8, 0x00080040 ; clearly flags
stw r8, Task.ThingThatAlignVecHits(r31)
li r8, 1
stw r8, Task.Weight(r31)
li r8, Task.kIdlePriority
stb r8, Task.Priority(r31)
; whoa -- cpu structs arent this big?
lhz r8, 0x022a(r30)
sth r8, Task.MysteryHalf(r31)
lwz r8, Task.ContextBlock + ContextBlock.EmpiricalCpuFeatures(r31)
_bset r8, r8, 9
stw r8, Task.ContextBlock + ContextBlock.EmpiricalCpuFeatures(r31)
lwz r8, KDP.PA_NanoKernelCode(r1)
llabel r26, IdleCode
add r8, r8, r26
stw r8, Task.ContextBlock + ContextBlock.CodePtr(r31)
; better compare this with init code idle task
lwz r8, Task.ContextBlock + ContextBlock.MSR(r31)
andi. r8, r8, 0xbfcf
stw r8, Task.ContextBlock + ContextBlock.MSR(r31)
sync ; flush pending lwarxen?
; This feels like cheating with the Sch lock
lwz r16, PSA.SchLock + Lock.Count(r1)
cmpwi cr1, r16, 0
li r16, 0
bne+ cr1, @do_not_panic
mflr r16
bl panic
@do_not_panic
stw r16, PSA.SchLock + Lock.Count(r1)
; Some EWA/KDP stuff I do not understand
mfsprg r15, 0
li r16, 0x08
stw r16, -0x0238(r15)
lhz r16, 0x022a(r30)
stw r16, -0x0234(r15)
MPCall_44_0x15c
_log 'SIGP kSynchClock^n'
li r8, 0x02
; r7 = flags
; r8 = usually 2?
bl SIGP
cmpwi r8, -0x7264
cmpwi cr1, r8, 0x00
beq+ MPCall_44_0x15c
bne- cr1, MPCall_Panic
mfsprg r15, 0
li r16, 0x01
stw r16, -0x0238(r15)
lhz r16, 0x022a(r30)
stw r16, -0x0234(r15)
lwz r16, 0x064c(r1)
llabel r17, major_0x14bcc
add r16, r16, r17
stw r16, -0x0230(r15)
stw r30, -0x022c(r15)
MPCall_44_0x1c0
_log 'SIGP kStartProcessor^n'
li r8, 0x04
; r7 = flags
; r8 = usually 2?
bl SIGP
cmpwi r8, -0x7264
cmpwi cr1, r8, 0x00
beq+ MPCall_44_0x1c0
bne- cr1, MPCall_Panic
_log 'Processor scheduled^n'
b ReturnZeroFromMPCall
; KCStopScheduling
DeclareMPCall 45, KCStopScheduling
KCStopScheduling ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3
; r8 = id
bl LookupID
cmpwi r9, CPU.kIDClass
bne+ ReleaseAndReturnMPCallInvalidIDErr
mr r30, r8
lwz r16, 0x0018(r30)
rlwinm. r8, r16, 0, 28, 28
; r1 = kdp
beq+ ReleaseAndReturnZeroFromMPCall
lwz r31, 0x001c(r30)
clrlwi. r8, r16, 0x1f
bne+ ReleaseAndReturnMPCallOOM
lbz r17, 0x0019(r31)
cmpwi r17, 0x00
beq- KCStopScheduling_0x94
lwz r17, 0x0064(r31)
oris r17, r17, 0x80
stw r17, 0x0064(r31)
mr r8, r31
bl major_0x13e4c
li r17, 0x00
stb r17, 0x0019(r31)
mr r8, r31
bl TaskReadyAsNext
bl CalculateTimeslice
mr r8, r31
bl major_0x14af8_0xa0
lwz r8, 0x064c(r1)
llabel r9, StopProcessor
add r8, r8, r9
stw r8, 0x01fc(r31)
KCStopScheduling_0x94
sync
lwz r16, PSA.SchLock + Lock.Count(r1)
cmpwi cr1, r16, 0x00
li r16, 0x00
bne+ cr1, KCStopScheduling_0xb0
mflr r16
bl panic
KCStopScheduling_0xb0
stw r16, PSA.SchLock + Lock.Count(r1)
b MPCall_6_0x78
; KCCpuPlugin
DeclareMPCall 46, KCCpuPlugin
KCCpuPlugin ; OUTSIDE REFERER
li r8, 0x00
; r7 = flags
; r8 = usually 2?
bl SIGP
mr r3, r8
mr r4, r9
b CommonMPCallReturnPath
DeclareMPCall 47, MPCall_47
MPCall_47 ; OUTSIDE REFERER
rlwinm. r8, r7, 0, 12, 12
lwz r15, 0x00d8(r6)
beq+ ReturnMPCallOOM
cmpwi r15, 0x00
mr r16, r2
beq+ ReturnMPCallOOM
mr r17, r3
mr r18, r4
mr r19, r5
bl Save_v0_v31
mr r2, r16
mr r3, r17
mr r4, r18
mr r5, r19
b ReturnZeroFromMPCall
; MPCall_48_Bad
DeclareMPCall 48, MPCall_48_Bad
MPCall_48_Bad ; OUTSIDE REFERER
b MPCallBad
; NKxprintf
DeclareMPCall 96, NKxprintf
NKxprintf ; OUTSIDE REFERER
rlwinm. r9, r11, 0, 27, 27
mr r8, r3
beq- NKxprintf_0x1c
li r9, 0x00
bl V2P
beq- NKxprintf_0x24
rlwimi r8, r17, 0, 0, 19
NKxprintf_0x1c
bl PrintS
b ReturnZeroFromMPCall
NKxprintf_0x24
_log 'NKxprintf (V->P translation error)^n'
b ReturnMPCallOOM
; ARG long r3, int r4 size (1:byte, 2:half, else:word)
DeclareMPCall 97, NKPrintHex
NKPrintHex
mr r8, r3
cmpwi r4, 1
cmpwi cr1, r4, 2
beq- @byte
beq- cr1, @half
bl Printw
b CommonMPCallReturnPath
@half
bl Printh
b CommonMPCallReturnPath
@byte
bl Printb
b CommonMPCallReturnPath
DeclareMPCall 124, NKPrintDecimal
NKPrintDecimal ; OUTSIDE REFERER
mr r8, r3
bl Printd
b CommonMPCallReturnPath
; KCSetBlueProcessID
DeclareMPCall 99, KCSetBlueProcessID
KCSetBlueProcessID ; OUTSIDE REFERER
mfsprg r16, 0
rlwinm. r8, r7, 0, 10, 10
lwz r31, EWA.PA_CurTask(r16)
beq+ ReturnMPCallOOM
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
cmpwi r9, Process.kIDClass
bne+ ReturnMPCallInvalidIDErr
stw r3, Task.ProcessID(r31)
stw r4, 0x00ec(r31)
b ReturnZeroFromMPCall
; KCRegisterThermalHandler
DeclareMPCall 104, KCRegisterThermalHandler
KCRegisterThermalHandler ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr. r8, r3
beq- @is_zero
bl LookupID
cmpwi r9, Notification.kIDClass
bne+ ReleaseAndReturnMPCallInvalidIDErr
@is_zero
stw r3, PSA.ThermalHandlerID(r1)
b ReleaseAndReturnZeroFromMPCall
; KCRegisterPMFHandler
DeclareMPCall 105, KCRegisterPMFHandler
KCRegisterPMFHandler ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr. r8, r3
beq- @is_zero
bl LookupID
cmpwi r9, Notification.kIDClass
bne+ ReleaseAndReturnMPCallInvalidIDErr
@is_zero
stw r3, PSA.PMFHandlerID(r1)
b ReleaseAndReturnZeroFromMPCall
; KCMarkPMFTask
DeclareMPCall 106, KCMarkPMFTask
KCMarkPMFTask ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mfsprg r30, 0
mr. r8, r3
lwz r31, EWA.PA_CurTask(r30)
beq- @use_blue_task_instead
bl LookupID
cmpwi r9, Task.kIDClass
mr r31, r8
bne+ ReleaseAndReturnMPCallInvalidIDErr
@use_blue_task_instead
; Insert bit 31 of r4 into bit 21 of these flags
lwz r17, Task.ThingThatAlignVecHits(r31)
rlwimi r17, r4, 10, 21, 21
stw r17, Task.ThingThatAlignVecHits(r31)
; Don't know what this does!
mr r8, r31
bl major_0x14af8_0xa0
b ReleaseAndReturnZeroFromMPCall
; ARG int r6:
; 2: SystemInfo
; 3: DiagInfo
; 4: NanoKernelInfo
; 5: ProcessorInfo
; 6: HWInfo
; 7: ProcessorState
; RET Ptr r4, short r5 ver, short r6 len
DeclareMPCall 107, NKLocateInfoRecord
NKLocateInfoRecord
cmpwi r3, 5
cmpwi cr1, r3, 2
beq- @ProcessorInfo
beq- cr1, @SystemInfo
cmpwi r3, 3
cmpwi cr1, r3, 4
beq- @DiagInfo
beq- cr1, @NanoKernelInfo
cmpwi r3, 7
cmpwi cr1, r3, 6
beq- @ProcessorState
bne+ cr1, ReturnParamErrFromMPCall
lwz r4, KDP.InfoRecord + InfoRecord.NKHWInfoPtr(r1)
lhz r16, KDP.InfoRecord + InfoRecord.NKHWInfoLen(r1)
lhz r5, KDP.InfoRecord + InfoRecord.NKHWInfoVer(r1)
stw r16, ContextBlock.r6(r6)
b ReturnZeroFromMPCall
@ProcessorState
lwz r4, KDP.InfoRecord + InfoRecord.NKProcessorStatePtr(r1)
lhz r16, KDP.InfoRecord + InfoRecord.NKProcessorStateLen(r1)
lhz r5, KDP.InfoRecord + InfoRecord.NKProcessorStateVer(r1)
stw r16, ContextBlock.r6(r6)
b ReturnZeroFromMPCall
@ProcessorInfo
lwz r4, KDP.InfoRecord + InfoRecord.NKProcessorInfoPtr(r1)
lhz r16, KDP.InfoRecord + InfoRecord.NKProcessorInfoLen(r1)
lhz r5, KDP.InfoRecord + InfoRecord.NKProcessorInfoVer(r1)
stw r16, ContextBlock.r6(r6)
b ReturnZeroFromMPCall
@NanoKernelInfo
lwz r4, KDP.InfoRecord + InfoRecord.NKNanoKernelInfoPtr(r1)
lhz r16, KDP.InfoRecord + InfoRecord.NKNanoKernelInfoLen(r1)
lhz r5, KDP.InfoRecord + InfoRecord.NKNanoKernelInfoVer(r1)
stw r16, ContextBlock.r6(r6)
b ReturnZeroFromMPCall
@DiagInfo
lwz r4, KDP.InfoRecord + InfoRecord.NKDiagInfoPtr(r1)
lhz r16, KDP.InfoRecord + InfoRecord.NKDiagInfoLen(r1)
lhz r5, KDP.InfoRecord + InfoRecord.NKDiagInfoVer(r1)
stw r16, ContextBlock.r6(r6)
b ReturnZeroFromMPCall
@SystemInfo
lwz r4, KDP.InfoRecord + InfoRecord.NKSystemInfoPtr(r1)
lhz r16, KDP.InfoRecord + InfoRecord.NKSystemInfoLen(r1)
lhz r5, KDP.InfoRecord + InfoRecord.NKSystemInfoVer(r1)
stw r16, ContextBlock.r6(r6)
b ReturnZeroFromMPCall
DeclareMPCall 108, MPCall_108
MPCall_108 ; OUTSIDE REFERER
cmplwi r3, 0x02
bge+ ReturnParamErrFromMPCall
mulli r17, r3, 0x10
addi r18, r1, 0xf80
add r18, r17, r18
lwz r16, 0x0134(r6)
stw r4, 0x0000(r18)
stw r5, 0x0004(r18)
stw r16, 0x0008(r18)
_log 'Clock rates for step '
mr r8, r3
bl Printd
_log '- Cpu '
mr r8, r4
bl Printd
_log '- Bus '
mr r8, r5
bl Printd
_log '- Dec '
mr r8, r16
bl Printd
_log 'Hz^n'
b ReturnZeroFromMPCall
; NKSetClockStep
; Debug string matches MPLibrary!
; 0xf7e(r1) = clock_step (half-word)
; > r3 = new_clock_step # (half-word)
DeclareMPCall 131, NKSetClockStep
NKSetClockStep ; OUTSIDE REFERER
mfsprg r9, 0
lwz r8, -0x0338(r9)
lwz r9, 0x0024(r8)
cmpwi r9, 0x01
bgt+ ReturnMPCallOOM
lhz r19, 0x0f7e(r1)
_log 'NKSetClockStep - current '
mr r8, r19
bl Printd
_log ' new '
mr r8, r3
bl Printd
_log '^n'
cmplwi r3, 0x02
cmpw cr1, r3, r19
bge+ ReturnParamErrFromMPCall
beq+ cr1, ReturnMPCallOOM
mulli r17, r3, 0x10
addi r18, r1, 0xf80
sth r17, 0x0f7e(r1)
add r18, r17, r18
lwz r16, 0x0000(r18)
lwz r17, 0x0004(r18)
stw r16, 0x0f24(r1)
stw r17, 0x0f28(r1)
lwz r16, 0x0f88(r1)
stw r16, 0x0f2c(r1)
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
lwz r16, 0x0008(r18)
stw r16, -0x0438(r1)
bgt- cr1, NKSetClockStep_0xec
lwz r31, -0x0434(r1)
lbz r18, 0x0017(r31)
cmpwi r18, 0x00
; r1 = kdp
beq+ ReleaseAndReturnZeroFromMPCall
mr r8, r31
bl major_0x136c8
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
NKSetClockStep_0xec
lwz r31, -0x0434(r1)
lbz r18, 0x0017(r31)
cmpwi r18, 0x01
; r1 = kdp
beq+ ReleaseAndReturnZeroFromMPCall
bl GetTime
stw r8, 0x0038(r31)
stw r9, 0x003c(r31)
mr r8, r31
bl called_by_init_tmrqs
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
; NKSetClockDriftCorrection
; There's a one-billion constant in here, for fractional
; expression.
; -0x36c(r1) = tb_drift_numerator
; -0x368(r1) = tb_drift_denominator
; > r3 = to
DeclareMPCall 132, NKSetClockDriftCorrection
NKSetClockDriftCorrection ; OUTSIDE REFERER
lwz r31, -0x0364(r1)
mfsprg r9, 0
cmpwi r31, 0x00
beq+ ReturnMPCallOOM
lwz r8, -0x0338(r9)
lwz r9, 0x0024(r8)
cmpwi r9, 0x01
bgt+ ReturnMPCallOOM
lwz r19, 0x0fa0(r1)
cmpwi r3, 0x00
cmpw cr1, r3, r19
stw r3, 0x0fa0(r1)
beq- NKSetClockDriftCorrection_0x12c
beq+ cr1, ReturnZeroFromMPCall
lis r16, 0x3b9a
ori r16, r16, 0xca00
lwz r17, 0x0f88(r1)
srwi r17, r17, 7
divw r18, r16, r3
cmpw r18, r17
bge- NKSetClockDriftCorrection_0x64
divw r16, r16, r17
mr r18, r17
divw r17, r3, r16
b NKSetClockDriftCorrection_0x6c
NKSetClockDriftCorrection_0x64
rlwinm r17, r3, 2, 30, 30
addi r17, r17, 0x01
NKSetClockDriftCorrection_0x6c
stw r17, -0x036c(r1)
stw r18, -0x0368(r1)
_log 'TB drift adjusted to '
mr r8, r3
bl Printd
_log ' ppb ( '
mr r8, r17
bl Printd
_log '/ '
mr r8, r18
bl Printd
_log ')^n'
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
lwz r31, -0x0364(r1)
lbz r18, 0x0017(r31)
cmpwi r18, 0x01
; r1 = kdp
beq+ ReleaseAndReturnZeroFromMPCall
bl GetTime
stw r8, 0x0038(r31)
stw r9, 0x003c(r31)
mr r8, r31
bl called_by_init_tmrqs
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
NKSetClockDriftCorrection_0x12c
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
li r17, 0x00
stw r17, -0x036c(r1)
stw r17, -0x0368(r1)
lwz r31, -0x0364(r1)
lbz r18, 0x0017(r31)
cmpwi r18, 0x00
; r1 = kdp
beq+ ReleaseAndReturnZeroFromMPCall
mr r8, r31
bl major_0x136c8
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
DeclareMPCall 115, MPCall_115
MPCall_115 ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3
; r8 = id
bl LookupID
cmpwi r9, ConsoleLog.kIDClass
mr r31, r8
bne+ ReleaseAndReturnMPCallInvalidIDErr
lwz r30, 0x000c(r31)
cmpwi r30, 0x00
bne- MPCall_115_0x94
_Lock PSA.DbugLock, scratch1=r16, scratch2=r17
lwz r30, -0x0404(r1)
MPCall_115_0x54
addi r30, r30, 0x01
andi. r29, r30, 0xfff
bne- MPCall_115_0x64
lwz r30, -0x1000(r30)
MPCall_115_0x64
lbz r16, 0x0000(r30)
cmpwi r16, 0x00
beq+ MPCall_115_0x54
stw r30, 0x000c(r31)
sync
lwz r16, -0x0af0(r1)
cmpwi cr1, r16, 0x00
li r16, 0x00
bne+ cr1, MPCall_115_0x90
mflr r16
bl panic
MPCall_115_0x90
stw r16, -0x0af0(r1)
MPCall_115_0x94
cmpwi r5, 0x00
ble+ ReleaseAndReturnMPCallOOM
rlwinm. r9, r11, 0, 27, 27
mr r8, r4
crmove 30, 2
beq- MPCall_115_0xd0
li r9, 0x00
bl MPCall_95_0x45c
beq+ ReleaseAndReturnMPCallOOM
add r8, r4, r5
li r9, 0x00
addi r8, r8, -0x01
mr r30, r8
bl MPCall_95_0x45c
beq+ ReleaseAndReturnMPCallOOM
MPCall_115_0xd0
lwz r28, -0x0404(r1)
lwz r29, 0x000c(r31)
li r5, 0x00
not r27, r4
MPCall_115_0xe0
cmpw r28, r29
cmplw cr1, r4, r30
beq- MPCall_115_0x144
bgt- cr1, MPCall_115_0x144
rlwinm r16, r4, 0, 0, 19
mr r8, r4
beq- cr7, MPCall_115_0x11c
cmpw r16, r27
mr r17, r26
beq- MPCall_115_0x11c
mr r27, r16
li r9, 0x00
bl MPCall_95_0x45c
beq+ ReleaseAndReturnMPCallOOM
mr r26, r17
MPCall_115_0x11c
rlwimi r17, r4, 0, 20, 31
lbz r8, 0x0000(r29)
addi r29, r29, 0x01
andi. r16, r29, 0xfff
bne+ MPCall_115_0x134
lwz r29, -0x1000(r29)
MPCall_115_0x134
stb r8, 0x0000(r17)
addi r5, r5, 0x01
addi r4, r4, 0x01
b MPCall_115_0xe0
MPCall_115_0x144
stw r29, 0x000c(r31)
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
; KCRegisterExternalHandler
; Point external interrupts (thing PIHes) towards this notification
DeclareMPCall 121, KCRegisterExternalHandler
KCRegisterExternalHandler
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr. r8, r3
beq- @zero
bl LookupID
cmpwi r9, Notification.kIDClass
bne+ ReleaseAndReturnMPCallInvalidIDErr
@zero
stw r3, PSA.ExternalHandlerID(r1)
b ReleaseAndReturnZeroFromMPCall
DeclareMPCall 133, MPCall_133
MPCall_133 ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
cmpw r3, r0
lwz r16, 0x0edc(r1)
li r17, 0x0b
blt- MPCall_133_0x34
and r3, r3, r17
or r16, r16, r3
b MPCall_133_0x3c
MPCall_133_0x34
orc r3, r3, r17
and r16, r16, r3
MPCall_133_0x3c
stw r16, 0x0edc(r1)
srawi r16, r4, 16
extsh r17, r4
cmpwi r16, -0x01
cmpwi cr1, r17, -0x01
beq- MPCall_133_0x60
bgt- MPCall_133_0x5c
li r16, 0x00
MPCall_133_0x5c
sth r16, -0x0360(r1)
MPCall_133_0x60
beq- cr1, MPCall_133_0x70
bgt- cr1, MPCall_133_0x6c
li r17, 0x00
MPCall_133_0x6c
sth r17, -0x035e(r1)
MPCall_133_0x70
srawi r16, r5, 16
extsh r17, r5
cmpwi r16, -0x01
cmpwi cr1, r17, -0x01
beq- MPCall_133_0x90
bgt- MPCall_133_0x8c
li r16, 0x00
MPCall_133_0x8c
sth r16, -0x035c(r1)
MPCall_133_0x90
beq- cr1, MPCall_133_0xa0
bgt- cr1, MPCall_133_0x9c
li r17, 0x00
MPCall_133_0x9c
sth r17, -0x035a(r1)
MPCall_133_0xa0
; r1 = kdp
bl ScreenConsole_redraw
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall
; MPCall_Panic
; Xrefs:
; KCStartCPU
MPCall_Panic
b panic