Reverse userspace sync primitives

Namely queues, semaphores, critical regions, event groups and
"notifications". The MP calls implementing these services have been
named after their MPLibrary wrapper functions. This convention will be
followed in the future (no more NKCreateEvent).
This commit is contained in:
Elliot Nunn 2018-02-18 00:57:01 +08:00
parent f0696e5ceb
commit 7fdc813d8f
25 changed files with 4155 additions and 3404 deletions

View File

@ -19,7 +19,8 @@ BootstrapVersion ds.b 16 ; f00:f10 ; Bootstrap loader version info, from Config
; Gets called the "system context" ; Gets called the "system context"
ContextBlock record 0,INCR ContextBlock record 0,INCR
EmpiricalCpuFeatures ds.l 1 ; 000 ; (SPAC) copied from kdp by CreateTask Flags ds.l 1 ; 000 ; (SPAC) copied from kdp by CreateTask
Enables ds.l 1 ; 004
org 0x5c org 0x5c
LA_EmulatorKernelTrapTable ds.l 1 LA_EmulatorKernelTrapTable ds.l 1

View File

@ -327,7 +327,7 @@ VMDispatchCountTblPtr ds.l 1 ; 128, kdp+ee8
ds.l 1 ds.l 1
ds.l 1 ds.l 1
MPDispatchCountTblPtr ds.l 1 ; 134, kdp+ef4 ; ??????? MPDispatchCountTblPtr ds.l 1 ; 134, kdp+ef4 ; ???????
AddrSpcSetCtr ds.l 1 ; 138, kdp+ef8 ; incremented by SetAddrSpcRegisters AddrSpcSetCtr ds.l 1 ; 138, kdp+ef8 ; incremented by SetSpaceSRsAndBATs
IDCtr ds.l 1 ; 13c, kdp+efc IDCtr ds.l 1 ; 13c, kdp+efc
org 0x160 org 0x160

View File

@ -22,6 +22,7 @@
Process record 0,INCR Process record 0,INCR
kIDClass equ 1 kIDClass equ 1
kFirstID equ 0x00010001
kSignature equ 'PROC' kSignature equ 'PROC'
;_______________________ ;_______________________
@ -30,7 +31,39 @@ kSignature equ 'PROC'
ID ds.l 1 ; 00 ID ds.l 1 ; 00
Signature ds.l 1 ; 04 ; 'PROC' Signature ds.l 1 ; 04 ; 'PROC'
Unused ds.l 1 ; 08 ; MPCall_5 does something here Flags ds.l 1 ; 08 ; MPCall_5 does something here
kFlag0 equ 0
kFlag1 equ 1
kFlag2 equ 2
kFlag3 equ 3
kFlag4 equ 4
kFlag5 equ 5
kFlag6 equ 6
kFlag7 equ 7
kFlag8 equ 8
kFlag9 equ 9
kFlag10 equ 10
kFlag11 equ 11
kFlag12 equ 12
kFlag13 equ 13
kFlag14 equ 14
kFlag15 equ 15
kFlag16 equ 16
kFlag17 equ 17
kFlag18 equ 18
kFlag19 equ 19
kFlag20 equ 20
kFlag21 equ 21
kFlag22 equ 22
kFlag23 equ 23
kFlag24 equ 24
kFlag25 equ 25
kFlag26 equ 26
kFlag27 equ 27
kFlag28 equ 28
kFlag29 equ 29
kFlag30 equ 30
kFlag31 equ 31
SystemAddressSpaceID ds.l 1 ; 0c ; set by Init.s after addrspc creation SystemAddressSpaceID ds.l 1 ; 0c ; set by Init.s after addrspc creation
TaskCount ds.l 1 ; 10 ; incremented by CreateTask TaskCount ds.l 1 ; 10 ; incremented by CreateTask
SystemAddressSpacePtr ds.l 1 ; 14 SystemAddressSpacePtr ds.l 1 ; 14
@ -57,6 +90,7 @@ Size equ *
Task record 0,INCR Task record 0,INCR
kIDClass equ 2 kIDClass equ 2
kFirstID equ 0x00020001
kSignature equ 'TASK' kSignature equ 'TASK'
;_______________________ ;_______________________
@ -77,13 +111,46 @@ Signature ds.l 1 ; 004
QueueMember ds.l 4 ; 008:018 ; a task is always a member of a queue, e.g. the RDYQ QueueMember ds.l 4 ; 008:018 ; a task is always a member of a queue, e.g. the RDYQ
MysteryByte1 ds.b 1 ; 018 ; CreateTask sets 0 by default (blue = 2) MysteryByte1 ds.b 1 ; 018 ; CreateTask sets 0 by default (blue = 2)
Priority ds.b 1 ; 019 ; CreateTask sets 2 by default Priority ds.b 1 ; 019 ; CreateTask sets 2 by default
MysteryHalf ds.w 1 ; 01a CPUIndex ds.w 1 ; 01a
Weight ds.l 1 ; 01c ; default is 100, blue gets 200, idle gets 1 Weight ds.l 1 ; 01c ; default is 100, blue gets 200, idle gets 1
Timer ds.b 64 ; 020:060 Timer ds.b 64 ; 020:060
ProcessID ds.l 1 ; 060 ProcessID ds.l 1 ; 060
ThingThatAlignVecHits ds.l 1 ; 064 ; IntAlignment is interested in bit 9, MPCalls 52/116 in bit 15 Flags ds.l 1 ; 064 ; IntAlignment is interested in bit 9, MPCalls 52/116 in bit 15
kFlag0 equ 0
kFlag1 equ 1
kFlag2 equ 2
kFlag3 equ 3
kFlag4 equ 4
kFlag5 equ 5
kFlag6 equ 6
kFlag7 equ 7
kFlag8 equ 8
kFlag9 equ 9
kFlag10 equ 10
kFlag11 equ 11
kFlag12 equ 12 ; set for idle1, idle2
kFlag13 equ 13
kFlag14 equ 14 ; set for blue, idle1
kFlagBlue equ 15
kFlag16 equ 16
kFlag17 equ 17
kFlag18 equ 18
kFlag19 equ 19
kFlag20 equ 20
kFlag21 equ 21
kFlag22 equ 22
kFlag23 equ 23
kFlag24 equ 24
kFlag25 equ 25 ; set for idle1, idle2
kFlag26 equ 26 ; set for blue
kFlag27 equ 27
kFlag28 equ 28 ; set for blue
kFlag29 equ 29
kFlag30 equ 30
kFlag31 equ 31
ds.l 1 ; 068 ds.l 1 ; 068
OwningProcessPtr ds.l 1 ; 06c OwningProcessPtr ds.l 1 ; 06c
AddressSpacePtr ds.l 1 ; 070 ; borrowed from PROC argument to CreateTask AddressSpacePtr ds.l 1 ; 070 ; borrowed from PROC argument to CreateTask
@ -113,8 +180,8 @@ Zero4 ds.l 1 ; 0e4
Zero5 ds.l 1 ; 0e8 Zero5 ds.l 1 ; 0e8
ds.l 1 ; 0ec ds.l 1 ; 0ec
YellowVecTblPtr ds.l 1 ; 0f0 YellowVecTblPtr ds.l 1 ; 0f0
ds.l 1 ; 0f4 ExceptionHandlerID ds.l 1 ; 0f4 ; a queue
ds.l 1 ; 0f8 ErrToReturnIfIDie ds.l 1 ; 0f8
ds.l 1 ; 0fc ds.l 1 ; 0fc
ContextBlock ds.b 768 ; 100:400 ; like the EDP's Emulator Context Block -- unsure of size ContextBlock ds.b 768 ; 100:400 ; like the EDP's Emulator Context Block -- unsure of size
@ -134,6 +201,7 @@ Size equ *
Timer record 0,INCR Timer record 0,INCR
kIDClass equ 3 kIDClass equ 3
kFirstID equ 0x00030001
kSignature equ 'TIME' kSignature equ 'TIME'
;_______________________ ;_______________________
@ -145,18 +213,29 @@ Signature ds.l 1 ; 04 ; task+24
QueueLLL ds.l 1 ; 08 ; task+28 ; overlaps with the below bytefields, as a union? QueueLLL ds.l 1 ; 08 ; task+28 ; overlaps with the below bytefields, as a union?
ds.l 1 ; 0c ; task+2c ds.l 1 ; 0c ; task+2c
ProcessID ds.l 1 ; 10 ; task+30 ProcessID ds.l 1 ; 10 ; task+30
Byte0 ds.b 1 ; 14 ; task+34 ; InitTMRQs sets to 6, MPCall 55 to 1, MPCall 52 to 2
Kind ds.b 1 ; 14 ; task+34 ; InitTMRQs sets to 6, MPCall 55 to 1, MPCall 52 to 2
kKind1 equ 1
kKind2 equ 2
kKind3 equ 3
kKind4 equ 4
kKind5 equ 5
kKind6 equ 6
kKind7 equ 7
Byte1 ds.b 1 ; 15 ; task+35 Byte1 ds.b 1 ; 15 ; task+35
Byte2 ds.b 1 ; 16 ; task+36 ; InitTMRQs sets to 1 KeepAfterFiring ds.b 1 ; 16 ; task+36 ; InitTMRQs sets to 1
Byte3 ds.b 1 ; 17 ; task+37 ; called_by_init_tmrqs sets to 1 Byte3 ds.b 1 ; 17 ; task+37 ; called_by_init_tmrqs sets to 1
ParentTaskPtr ds.l 1 ; 18 ; task+38 ; MPCall 55 sets
ds.l 1 ; 1c ; task+3c MessageQueueID
ds.l 1 ; 20 ; task+40 ParentTaskPtr ds.l 1 ; 18 ; task+38 ; task to be unblocked when timer fires
ds.l 1 ; 24 ; task+44 ReservedMessage ds.l 1 ; 1c ; task+3c ; 'note' allocated when timer armed
ds.l 1 ; 28 ; task+48 Message1 ds.l 1 ; 20 ; task+40 ; if I hit a message queue
ds.l 1 ; 2c ; task+4c Message2 ds.l 1 ; 24 ; task+44
ds.l 1 ; 30 ; task+50 Message3 ds.l 1 ; 28 ; task+48
ds.l 1 ; 34 ; task+54 EventGroupID ds.l 1 ; 2c ; task+4c ; if I hit an event group
EventGroupFlags ds.l 1 ; 30 ; task+50
SemaphoreID ds.l 1 ; 34 ; task+54
Time ds.l 2 ; 38 ; task+58 ; set from first two args to MPCall 55 Time ds.l 2 ; 38 ; task+58 ; set from first two args to MPCall 55
Size equ * Size equ *
@ -174,18 +253,19 @@ Size equ *
Queue record 0,INCR Queue record 0,INCR
kIDClass equ 4 kIDClass equ 4
kFirstID equ 0x00040001
;_______________________ ;_______________________
; Fields ; Fields
;_______________________ ;_______________________
LLL ds.l 4 ; 00:10 BlockedTasks ds.l 4 ; 00:10 ; titled MSGQ ; waiting for messages
ds.l 4 ; 10:20 Messages ds.l 4 ; 10:20 ; titled NOTQ ; waiting for tasks
ProcessID ds.l 1 ; 20 ProcessID ds.l 1 ; 20 ; why associate a queue with a process?
ds.l 1 ; 24 ReserveCount ds.l 1 ; 24 ; as number of messages, from MPSetQueueReserve
ds.l 1 ; 28 ReservePtr ds.l 1 ; 28 ; ptr to first element of
ds.l 1 ; 2c BlockedTaskCount ds.l 1 ; 2c
ds.l 1 ; 30 MessageCount ds.l 1 ; 30
Size equ * Size equ *
endr endr
@ -209,6 +289,20 @@ kSignature equ 'RDYQ'
Message record 0,INCR
kSignature equ 'note'
kReservedSignature equ 'notr'
LLL ds.l 4 ; 00:10 ; singly linked (next ptrs) only
Word1 ds.l 1 ; 10
Word2 ds.l 1 ; 14
Word3 ds.l 1 ; 18
Size equ *
endr
kTimerQueueSignature equ 'TMRQ' kTimerQueueSignature equ 'TMRQ'
kDelayQueueSignature equ 'DLYQ' kDelayQueueSignature equ 'DLYQ'
kDbugQueueSignature equ 'DBUG' kDbugQueueSignature equ 'DBUG'
@ -228,17 +322,18 @@ kSemaQueueSignature equ 'SEMQ'
Semaphore record 0,INCR Semaphore record 0,INCR
kIDClass equ 5 kIDClass equ 5
kFirstID equ 0x00050001
kSignature equ 'SEMA' kSignature equ 'SEMA'
;_______________________ ;_______________________
; Fields ; Fields
;_______________________ ;_______________________
LLL ds.l 4 ; 00:10 BlockedTasks ds.l 4 ; 00:10 ; blocked tasks
ds.l 1 ; 10 Value ds.l 1 ; 10 ; negative if tasks are blocked???
ds.l 1 ; 14 MaxValue ds.l 1 ; 14
ProcessID ds.l 1 ; 18 ProcessID ds.l 1 ; 18
ds.l 1 ; 1c BlockedTaskCount ds.l 1 ; 1c ; starts as 0
Size equ * Size equ *
endr endr
@ -255,6 +350,7 @@ Size equ *
CriticalRegion record 0,INCR CriticalRegion record 0,INCR
kIDClass equ 6 kIDClass equ 6
kFirstID equ 0x00060001
kSignature equ 'CRGN' kSignature equ 'CRGN'
;_______________________ ;_______________________
@ -280,6 +376,7 @@ Size equ *
CPU record 0,INCR CPU record 0,INCR
kIDClass equ 7 kIDClass equ 7
kFirstID equ 0x00070001
kSignature equ 'CPU ' kSignature equ 'CPU '
;_______________________ ;_______________________
@ -311,6 +408,7 @@ Size equ *
AddressSpace record 0,INCR AddressSpace record 0,INCR
kIDClass equ 8 kIDClass equ 8
kFirstID equ 0x00080001
kSignature equ 'SPAC' kSignature equ 'SPAC'
;_______________________ ;_______________________
@ -362,6 +460,7 @@ Size equ *
EventGroup record 0,INCR EventGroup record 0,INCR
kIDClass equ 9 kIDClass equ 9
kFirstID equ 0x00090001
kSignature equ 'EVNT' kSignature equ 'EVNT'
;_______________________ ;_______________________
@ -389,6 +488,7 @@ Size equ *
CoherenceGroup record 0,INCR CoherenceGroup record 0,INCR
kIDClass equ 10 kIDClass equ 10
kFirstID equ 0x000a0001
kSignature equ 'CGRP' kSignature equ 'CGRP'
;_______________________ ;_______________________
@ -428,6 +528,7 @@ Size equ *
Area record 0,INCR Area record 0,INCR
kIDClass equ 11 kIDClass equ 11
kFirstID equ 0x000b0001
kSignature equ 'AREA' kSignature equ 'AREA'
;_______________________ ;_______________________
@ -488,22 +589,26 @@ Size equ *
Notification record 0,INCR Notification record 0,INCR
kIDClass equ 12 kIDClass equ 12
kFirstID equ 0x000c0001
kSignature equ 'KNOT' kSignature equ 'KNOT'
;_______________________ ;_______________________
; Fields ; Fields
;_______________________ ;_______________________
ds.l 1 ; 00 TaskPtr ds.l 1 ; 00 ; (set on init)
Signature ds.l 1 ; 04 Signature ds.l 1 ; 04 ; (set on init)
ProcessID ds.l 1 ; 08 ProcessID ds.l 1 ; 08 ; (set on init)
ds.l 1 ; 0c
ds.l 1 ; 10 QueueID ds.l 1 ; 0c ; message queue
ds.l 1 ; 14 MsgWord1 ds.l 1 ; 10
ds.l 1 ; 18 MsgWord2 ds.l 1 ; 14
ds.l 1 ; 1c MsgWord3 ds.l 1 ; 18
ds.l 1 ; 20
ds.l 1 ; 24 EventGroupID ds.l 1 ; 1c
EventFlags ds.l 1 ; 20
SemaphoreID ds.l 1 ; 24
Size equ * Size equ *
endr endr
@ -521,6 +626,7 @@ Size equ *
ConsoleLog record 0,INCR ConsoleLog record 0,INCR
kIDClass equ 13 kIDClass equ 13
kFirstID equ 0x000d0001
;_______________________ ;_______________________
; Fields ; Fields

View File

@ -125,13 +125,13 @@ QueueRelatedZero2 ds.l 1 ; -9fc ; same again
ds.l 1 ; -9f8 ds.l 1 ; -9f8
ds.l 1 ; -9f4 ds.l 1 ; -9f4
ReadyQueues ReadyQueues
CriticalReadyQ ds.l 8 ; -9f0:-9d0 CriticalReadyQ ds.l 8 ; -9f0:-9d0 ; unblocked tasks with priority 0
LatencyProtectReadyQ ds.l 8 ; -9d0:-9b0 LatencyProtectReadyQ ds.l 8 ; -9d0:-9b0 ; unblocked tasks with priority 1
NominalReadyQ ds.l 8 ; -9b0:-990 NominalReadyQ ds.l 8 ; -9b0:-990 ; unblocked tasks with priority 2
IdleReadyQ ds.l 8 ; -990:-970 IdleReadyQ ds.l 8 ; -990:-970 ; unblocked tasks with priority 3
PriorityFlags ds.l 1 ; -970 ; bit 0 is 0, bit 1 is 1, etc... PriorityFlags ds.l 1 ; -970 ; bit 0 is 0, bit 1 is 1, etc...
ScrambledMPCallTime ds.l 1 ; -96c ; by MP call return ScrambledMPCallTime ds.l 1 ; -96c ; by MP call return
EmpiricalCpuFeatures ds.l 1 ; -968 ; Init.s saves MQ (should be possible) here GlobalCPUFlags ds.l 1 ; -968 ; Init.s saves MQ (should be possible) here
MQFeatureBit equ 13 ; equals 0x00040000 MQFeatureBit equ 13 ; equals 0x00040000
AVFeatureBit equ 12 ; equals 0x00080000 AVFeatureBit equ 12 ; equals 0x00080000
; 8 0x00800000 ; 8 0x00800000
@ -172,7 +172,7 @@ SystemAddressSpaceID ds.l 1 ; -424
blueProcessPtr ds.l 1 ; -41c ; physical ptr to first type-1 struct created blueProcessPtr ds.l 1 ; -41c ; physical ptr to first type-1 struct created
ThermalHandlerID ds.l 1 ; -418 ; is a Note struct ThermalHandlerID ds.l 1 ; -418 ; is a Note struct
PMFHandlerID ds.l 1 ; -414 ; also a Note struct PMFHandlerID ds.l 1 ; -414 ; also a Note struct
SomeEvtGrpID ds.l 1 ; -410 BlueSpinningOn ds.l 1 ; -410 ; ID or 0 or -1
ds.l 1 ; -40c ds.l 1 ; -40c
ds.l 1 ; -408 ds.l 1 ; -408
ds.l 1 ; -404 ds.l 1 ; -404
@ -313,7 +313,7 @@ SpacesDeferredAreaPtr ds.l 1 ; -26c, cpu+0d4
ds.l 1 ; -264, cpu+0dc ds.l 1 ; -264, cpu+0dc
ds.l 1 ; -260, cpu+0e0 ds.l 1 ; -260, cpu+0e0
ds.l 1 ; -25c, cpu+0e4 ds.l 1 ; -25c, cpu+0e4
ds.l 1 ; -258, cpu+0e8 TimerDispatchLR ds.l 1 ; -258, cpu+0e8
ds.l 1 ; -254, cpu+0ec ds.l 1 ; -254, cpu+0ec
ds.l 1 ; -250, cpu+0f0 ds.l 1 ; -250, cpu+0f0
ds.l 1 ; -24c, cpu+0f4 ds.l 1 ; -24c, cpu+0f4
@ -393,7 +393,9 @@ SpacesDeferredAreaPtr ds.l 1 ; -26c, cpu+0d4
ds.l 1 ; -124, cpu+21c ds.l 1 ; -124, cpu+21c
ds.l 1 ; -120, cpu+220 ds.l 1 ; -120, cpu+220
ds.l 1 ; -11c, cpu+224 ds.l 1 ; -11c, cpu+224
BinaryFlag ds.l 1 ; -118, cpu+228 ; 1 or 0, actually a byte! SchEvalFlag ds.b 1 ; -118, cpu+228
TaskPriority ds.b 1 ; -117, cpu+229
CPUIndex ds.w 1 ; -116, cpu+22a
ds.l 1 ; -114, cpu+22c ds.l 1 ; -114, cpu+22c
ds.l 1 ; -110, cpu+230 ds.l 1 ; -110, cpu+230
ds.l 1 ; -10c, cpu+234 ds.l 1 ; -10c, cpu+234
@ -460,7 +462,7 @@ PA_CurAddressSpace ds.l 1 ; -01c, cpu+324
PA_PSA ds.l 1 ; -018, cpu+328 PA_PSA ds.l 1 ; -018, cpu+328
PA_ContextBlock ds.l 1 ; -014, cpu+32c PA_ContextBlock ds.l 1 ; -014, cpu+32c
Flags ds.l 1 ; -010, cpu+330 Flags ds.l 1 ; -010, cpu+330
ds.l 1 ; -00c, cpu+334 Enables ds.l 1 ; -00c, cpu+334
PA_CurTask ds.l 1 ; -008, cpu+338 PA_CurTask ds.l 1 ; -008, cpu+338
PA_KDP ds.l 1 ; -004, cpu+33c PA_KDP ds.l 1 ; -004, cpu+33c

View File

@ -637,7 +637,7 @@ NKCreateAddressSpaceSub
bl PoolFree bl PoolFree
@fail_OOM @fail_OOM
li r8, -0x726e li r8, -29294
b @return b @return
@fail_notcgrp @fail_notcgrp
@ -732,18 +732,15 @@ KCSetTaskAddressSpace ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17 _Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3 mr r8, r3
; r8 = id
bl LookupID 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:cgrp, 11:area, 12:not, 13:log
mr r31, r8 mr r31, r8
cmpwi r9, 0x02 cmpwi r9, Task.kIDClass
bne+ ReleaseAndReturnMPCallInvalidIDErr bne+ ReleaseAndReturnMPCallInvalidIDErr
lwz r16, 0x0064(r31)
lwz r16, Task.Flags(r31)
mtcr r16 mtcr r16
li r3, -0x7271
li r3, kMPTaskAbortedErr
beq+ cr7, ReleaseAndReturnMPCall beq+ cr7, ReleaseAndReturnMPCall
bne+ cr5, ReleaseAndReturnMPCallOOM bne+ cr5, ReleaseAndReturnMPCallOOM
lbz r16, 0x0018(r31) lbz r16, 0x0018(r31)
@ -817,7 +814,7 @@ MPCreateArea
li r8, Area.Size li r8, Area.Size
bl PoolAlloc bl PoolAlloc
mr. r31, r8 mr. r31, r8
beq+ major_0x0af60 beq+ ReleaseAndScrambleMPCall
; Populate ; Populate
stw r30, Area.AddressSpacePtr(r31) stw r30, Area.AddressSpacePtr(r31)
@ -1363,7 +1360,7 @@ major_0x102c8 ; OUTSIDE REFERER
li r29, 0x00 li r29, 0x00
stw r29, 0x0018(r26) stw r29, 0x0018(r26)
mr r30, r26 mr r30, r26
bl major_0x0db04 bl CauseNotification
b major_0x10320_0x20 b major_0x10320_0x20
@ -1383,7 +1380,7 @@ major_0x102c8 ; OUTSIDE REFERER
major_0x10320 ; OUTSIDE REFERER major_0x10320 ; OUTSIDE REFERER
mr r8, r31 mr r8, r31
li r9, -0x726e li r9, -29294
b ReturnFromCreateArea b ReturnFromCreateArea
dc.l 0x811f0000 dc.l 0x811f0000
dc.l 0x48004fd1 dc.l 0x48004fd1
@ -1411,7 +1408,7 @@ major_0x10320_0x64 ; OUTSIDE REFERER
lwz r8, Area.ID(r31) lwz r8, Area.ID(r31)
bl DeleteID bl DeleteID
mr r8, r31 mr r8, r31
li r9, -0x7272 li r9, kMPInsufficientResourcesErr
b ReturnFromCreateArea b ReturnFromCreateArea
major_0x10320_0x94 ; OUTSIDE REFERER major_0x10320_0x94 ; OUTSIDE REFERER
@ -1488,13 +1485,13 @@ MPCreateAliasArea
mr r30, r8 mr r30, r8
lwz r16, Area.Flags(r30) lwz r16, Area.Flags(r30)
rlwinm. r8, r16, 0, Area.kAliasFlag, Area.kAliasFlag rlwinm. r8, r16, 0, Area.kAliasFlag, Area.kAliasFlag
bne+ major_0x0b054 bne+ ReleaseAndReturnParamErrFromMPCall
; Allocate the new Area ; Allocate the new Area
li r8, Area.Size li r8, Area.Size
bl PoolAlloc bl PoolAlloc
mr. r31, r8 mr. r31, r8
beq+ major_0x0af60 beq+ ReleaseAndScrambleMPCall
; Populate ; Populate
mfsprg r28, 0 mfsprg r28, 0
@ -1766,7 +1763,7 @@ MPCall_75 ; OUTSIDE REFERER
lwz r17, Area.Length(r31) lwz r17, Area.Length(r31)
and. r5, r5, r18 and. r5, r5, r18
and r17, r17, r18 and r17, r17, r18
ble+ major_0x0b054 ble+ ReleaseAndReturnParamErrFromMPCall
subf. r27, r17, r5 subf. r27, r17, r5
; r1 = kdp ; r1 = kdp
@ -1904,27 +1901,27 @@ MPCall_130 ; OUTSIDE REFERER
ori r16, r16, 0xfff8 ori r16, r16, 0xfff8
lwz r17, 0x0020(r31) lwz r17, 0x0020(r31)
and. r16, r16, r4 and. r16, r16, r4
bne+ major_0x0b054 bne+ ReleaseAndReturnParamErrFromMPCall
rlwinm. r8, r17, 0, 16, 16 rlwinm. r8, r17, 0, 16, 16
bne+ major_0x0b054 bne+ ReleaseAndReturnParamErrFromMPCall
mr r29, r5 mr r29, r5
lwz r18, 0x0134(r6) lwz r18, 0x0134(r6)
lwz r19, 0x0068(r31) lwz r19, 0x0068(r31)
lwz r16, Area.LogicalBase(r31) lwz r16, Area.LogicalBase(r31)
cmplw r18, r19 cmplw r18, r19
add r28, r18, r29 add r28, r18, r29
bge+ major_0x0b054 bge+ ReleaseAndReturnParamErrFromMPCall
lwz r17, 0x007c(r31) lwz r17, 0x007c(r31)
addi r28, r28, -0x01 addi r28, r28, -0x01
lwz r18, 0x0020(r31) lwz r18, 0x0020(r31)
lwz r19, Area.LogicalEnd(r31) lwz r19, Area.LogicalEnd(r31)
cmplw cr1, r29, r16 cmplw cr1, r29, r16
cmplw cr2, r28, r19 cmplw cr2, r28, r19
blt+ cr1, major_0x0b054 blt+ cr1, ReleaseAndReturnParamErrFromMPCall
bgt+ cr2, major_0x0b054 bgt+ cr2, ReleaseAndReturnParamErrFromMPCall
xor r8, r28, r29 xor r8, r28, r29
rlwinm. r8, r8, 0, 0, 19 rlwinm. r8, r8, 0, 0, 19
bne+ major_0x0b054 bne+ ReleaseAndReturnParamErrFromMPCall
_Lock PSA.HTABLock, scratch1=r14, scratch2=r15 _Lock PSA.HTABLock, scratch1=r14, scratch2=r15
@ -1935,7 +1932,7 @@ MPCall_130 ; OUTSIDE REFERER
rlwinm r8, r16, 0, 29, 30 rlwinm r8, r16, 0, 29, 30
lwz r16, 0x0000(r30) lwz r16, 0x0000(r30)
cmpwi cr7, r8, 0x04 cmpwi cr7, r8, 0x04
beq+ cr7, major_0x0b054 beq+ cr7, ReleaseAndReturnParamErrFromMPCall
lwz r16, 0x0098(r31) lwz r16, 0x0098(r31)
MPCall_130_0xe8 MPCall_130_0xe8
@ -1964,7 +1961,7 @@ MPCall_130_0x11c
; r8 = ptr ; r8 = ptr
mr. r16, r8 mr. r16, r8
beq+ major_0x0af60 beq+ ReleaseAndScrambleMPCall
addi r18, r31, 0x90 addi r18, r31, 0x90
lis r17, 0x4645 lis r17, 0x4645
ori r17, r17, 0x4e43 ori r17, r17, 0x4e43
@ -2021,11 +2018,11 @@ MPSetAreaAccess ; OUTSIDE REFERER
lis r16, -0x01 lis r16, -0x01
ori r16, r16, 0xff10 ori r16, r16, 0xff10
and. r16, r16, r4 and. r16, r16, r4
bne+ major_0x0b054 bne+ ReleaseAndReturnParamErrFromMPCall
lis r16, -0x01 lis r16, -0x01
ori r16, r16, 0xff10 ori r16, r16, 0xff10
and. r16, r16, r5 and. r16, r16, r5
bne+ major_0x0b054 bne+ ReleaseAndReturnParamErrFromMPCall
lwz r29, 0x0134(r6) lwz r29, 0x0134(r6)
lwz r18, 0x013c(r6) lwz r18, 0x013c(r6)
lwz r16, Area.LogicalBase(r31) lwz r16, Area.LogicalBase(r31)
@ -2037,8 +2034,8 @@ MPSetAreaAccess ; OUTSIDE REFERER
rlwinm. r8, r18, 0, 16, 16 rlwinm. r8, r18, 0, 16, 16
cmplw cr1, r29, r16 cmplw cr1, r29, r16
cmplw cr2, r28, r19 cmplw cr2, r28, r19
blt+ cr1, major_0x0b054 blt+ cr1, ReleaseAndReturnParamErrFromMPCall
bgt+ cr2, major_0x0b054 bgt+ cr2, ReleaseAndReturnParamErrFromMPCall
bne- MPSetAreaAccess_0x154 bne- MPSetAreaAccess_0x154
_Lock PSA.HTABLock, scratch1=r14, scratch2=r15 _Lock PSA.HTABLock, scratch1=r14, scratch2=r15
@ -2096,7 +2093,7 @@ MPSetAreaAccess_0x118
b ReleaseAndReturnZeroFromMPCall b ReleaseAndReturnZeroFromMPCall
MPSetAreaAccess_0x154 MPSetAreaAccess_0x154
bne+ cr1, major_0x0b054 bne+ cr1, ReleaseAndReturnParamErrFromMPCall
lwz r18, 0x001c(r31) lwz r18, 0x001c(r31)
and r8, r4, r5 and r8, r4, r5
orc r9, r4, r5 orc r9, r4, r5
@ -2297,8 +2294,8 @@ MPCall_123 ; OUTSIDE REFERER
lwz r18, 0x0020(r31) lwz r18, 0x0020(r31)
cmplw r4, r16 cmplw r4, r16
cmplw cr1, r4, r17 cmplw cr1, r4, r17
blt+ major_0x0b054 blt+ ReleaseAndReturnParamErrFromMPCall
bgt+ cr1, major_0x0b054 bgt+ cr1, ReleaseAndReturnParamErrFromMPCall
rlwinm. r8, r18, 0, 16, 16 rlwinm. r8, r18, 0, 16, 16
lwz r5, 0x001c(r31) lwz r5, 0x001c(r31)
@ -2375,7 +2372,7 @@ MPCall_78 ; OUTSIDE REFERER
bne+ ReleaseAndReturnMPCallInvalidIDErr bne+ ReleaseAndReturnMPCallInvalidIDErr
mr r31, r8 mr r31, r8
cmpwi r4, 0x01 cmpwi r4, 0x01
bne+ major_0x0b054 bne+ ReleaseAndReturnParamErrFromMPCall
cmplwi r5, 0x00 cmplwi r5, 0x00
bne- MPCall_78_0x68 bne- MPCall_78_0x68
li r16, 0x01 li r16, 0x01
@ -2443,7 +2440,7 @@ MPCall_78_0xd0
MPCall_78_0xfc MPCall_78_0xfc
cmpwi r5, 0x3c cmpwi r5, 0x3c
bne+ major_0x0b054 bne+ ReleaseAndReturnParamErrFromMPCall
li r16, 0x00 li r16, 0x00
stw r16, 0x0154(r6) stw r16, 0x0154(r6)
@ -2515,7 +2512,7 @@ MPCall_80_0x38
lwz r16, 0x0024(r8) lwz r16, 0x0024(r8)
li r5, 0x00 li r5, 0x00
cmplw r16, r4 cmplw r16, r4
bgt+ major_0x0b054 bgt+ ReleaseAndReturnParamErrFromMPCall
lwz r5, 0x0000(r8) lwz r5, 0x0000(r8)
; r1 = kdp ; r1 = kdp
@ -2555,7 +2552,7 @@ MPCall_125_0x38
MPCall_125_0x58 MPCall_125_0x58
lwz r9, 0x002c(r8) lwz r9, 0x002c(r8)
cmpwi r9, noErr cmpwi r9, noErr
beq+ major_0x0b054 beq+ ReleaseAndReturnParamErrFromMPCall
lwz r5, 0x0000(r8) lwz r5, 0x0000(r8)
; r1 = kdp ; r1 = kdp
@ -2582,8 +2579,8 @@ MPCall_81 ; OUTSIDE REFERER
lwz r18, 0x0020(r31) lwz r18, 0x0020(r31)
cmplw r4, r16 cmplw r4, r16
cmplw cr1, r4, r17 cmplw cr1, r4, r17
blt+ major_0x0b054 blt+ ReleaseAndReturnParamErrFromMPCall
bgt+ cr1, major_0x0b054 bgt+ cr1, ReleaseAndReturnParamErrFromMPCall
rlwinm. r8, r18, 0, 16, 16 rlwinm. r8, r18, 0, 16, 16
lwz r19, 0x0070(r31) lwz r19, 0x0070(r31)
beq- MPCall_81_0x70 beq- MPCall_81_0x70
@ -2591,7 +2588,7 @@ MPCall_81 ; OUTSIDE REFERER
rlwinm r19, r19, 0, 0, 19 rlwinm r19, r19, 0, 0, 19
cmpwi r17, 0x00 cmpwi r17, 0x00
subf r18, r16, r4 subf r18, r16, r4
beq+ major_0x0b054 beq+ ReleaseAndReturnParamErrFromMPCall
add r5, r18, r19 add r5, r18, r19
; r1 = kdp ; r1 = kdp
@ -2614,7 +2611,7 @@ MPCall_81_0xa4
b ReleaseAndReturnMPCall b ReleaseAndReturnMPCall
MPCall_81_0xc8 MPCall_81_0xc8
li r3, -0x7272 li r3, kMPInsufficientResourcesErr
b MPCall_81_0xa4 b MPCall_81_0xa4
@ -2641,13 +2638,13 @@ MPCall_98 ; OUTSIDE REFERER
addi r5, r5, -0x01 addi r5, r5, -0x01
cmplw r4, r16 cmplw r4, r16
cmplw cr1, r5, r17 cmplw cr1, r5, r17
blt+ major_0x0b054 blt+ ReleaseAndReturnParamErrFromMPCall
bgt+ cr1, major_0x0b054 bgt+ cr1, ReleaseAndReturnParamErrFromMPCall
lwz r20, Area.BytesMapped(r31) lwz r20, Area.BytesMapped(r31)
rlwinm. r8, r18, 0, 16, 16 rlwinm. r8, r18, 0, 16, 16
cmpwi cr1, r20, 0x00 cmpwi cr1, r20, 0x00
beq- MPCall_98_0x84 beq- MPCall_98_0x84
beq+ cr1, major_0x0b054 beq+ cr1, ReleaseAndReturnParamErrFromMPCall
lwz r19, 0x0070(r31) lwz r19, 0x0070(r31)
subf r18, r16, r4 subf r18, r16, r4
rlwinm r19, r19, 0, 0, 19 rlwinm r19, r19, 0, 0, 19
@ -2671,7 +2668,7 @@ MPCall_98_0x84
li r3, 0x00 li r3, 0x00
bso- cr7, MPCall_98_0xc4 bso- cr7, MPCall_98_0xc4
crset cr3_eq crset cr3_eq
li r3, -0x7272 li r3, kMPInsufficientResourcesErr
MPCall_98_0xc4 MPCall_98_0xc4
rlwimi r17, r4, 0, 20, 31 rlwimi r17, r4, 0, 20, 31
@ -2793,7 +2790,7 @@ MPCall_83_0x5c ; OUTSIDE REFERER
mr r31, r8 mr r31, r8
bne+ ReleaseAndReturnMPCallOOM bne+ ReleaseAndReturnMPCallOOM
lwz r8, 0x0020(r31) lwz r8, 0x0020(r31)
bl major_0x0d35c bl SetEvent
b ReleaseAndReturnMPCallOOM b ReleaseAndReturnMPCallOOM
MPCall_83_0x90 ; OUTSIDE REFERER MPCall_83_0x90 ; OUTSIDE REFERER
@ -2930,19 +2927,19 @@ KCMapPage ; OUTSIDE REFERER
mr r31, r8 mr r31, r8
lwz r16, Area.Flags(r31) lwz r16, Area.Flags(r31)
rlwinm. r8, r16, 0, 28, 28 rlwinm. r8, r16, 0, 28, 28
bne+ major_0x0b054 bne+ ReleaseAndReturnParamErrFromMPCall
lwz r16, Area.LogicalBase(r31) lwz r16, Area.LogicalBase(r31)
lwz r17, Area.LogicalEnd(r31) lwz r17, Area.LogicalEnd(r31)
lwz r19, 0x0020(r31) lwz r19, 0x0020(r31)
cmplw r4, r16 cmplw r4, r16
cmplw cr1, r4, r17 cmplw cr1, r4, r17
blt+ major_0x0b054 blt+ ReleaseAndReturnParamErrFromMPCall
bgt+ cr1, major_0x0b054 bgt+ cr1, ReleaseAndReturnParamErrFromMPCall
rlwinm. r8, r19, 0, 16, 16 rlwinm. r8, r19, 0, 16, 16
cmplw cr1, r4, r16 cmplw cr1, r4, r16
lwz r20, Area.BytesMapped(r31) lwz r20, Area.BytesMapped(r31)
beq- KCMapPage_0x8c beq- KCMapPage_0x8c
bne+ cr1, major_0x0b054 bne+ cr1, ReleaseAndReturnParamErrFromMPCall
cmpwi r20, 0x00 cmpwi r20, 0x00
lwz r8, 0x0070(r31) lwz r8, 0x0070(r31)
bne+ ReleaseAndReturnMPCallOOM bne+ ReleaseAndReturnMPCallOOM
@ -3046,7 +3043,7 @@ KCUnmapPages ; OUTSIDE REFERER
lwz r8, 0x0134(r6) lwz r8, 0x0134(r6)
lwz r16, Area.Flags(r31) lwz r16, Area.Flags(r31)
rlwinm. r16, r16, 0, 28, 28 rlwinm. r16, r16, 0, 28, 28
bne+ major_0x0b054 bne+ ReleaseAndReturnParamErrFromMPCall
clrlwi. r8, r8, 0x1f clrlwi. r8, r8, 0x1f
add r5, r5, r4 add r5, r5, r4
lwz r16, Area.LogicalBase(r31) lwz r16, Area.LogicalBase(r31)
@ -3056,14 +3053,14 @@ KCUnmapPages ; OUTSIDE REFERER
addi r5, r5, -0x01 addi r5, r5, -0x01
cmplw r4, r16 cmplw r4, r16
cmplw cr1, r5, r17 cmplw cr1, r5, r17
blt+ major_0x0b054 blt+ ReleaseAndReturnParamErrFromMPCall
bgt+ cr1, major_0x0b054 bgt+ cr1, ReleaseAndReturnParamErrFromMPCall
lwz r29, 0x0068(r31) lwz r29, 0x0068(r31)
lwz r20, Area.BytesMapped(r31) lwz r20, Area.BytesMapped(r31)
rlwinm. r8, r19, 0, 16, 16 rlwinm. r8, r19, 0, 16, 16
cmplw cr1, r4, r16 cmplw cr1, r4, r16
beq- KCUnmapPages_0xd8 beq- KCUnmapPages_0xd8
bne+ cr1, major_0x0b054 bne+ cr1, ReleaseAndReturnParamErrFromMPCall
cmpwi r20, 0x00 cmpwi r20, 0x00
li r20, 0x00 li r20, 0x00
ble+ ReleaseAndReturnMPCallOOM ble+ ReleaseAndReturnMPCallOOM
@ -3161,12 +3158,12 @@ KCMakePhysicallyContiguous ; OUTSIDE REFERER
addi r5, r5, -0x01 addi r5, r5, -0x01
cmplw r4, r16 cmplw r4, r16
cmplw cr1, r5, r17 cmplw cr1, r5, r17
blt+ major_0x0b054 blt+ ReleaseAndReturnParamErrFromMPCall
bgt+ cr1, major_0x0b054 bgt+ cr1, ReleaseAndReturnParamErrFromMPCall
lwz r19, 0x0020(r31) lwz r19, 0x0020(r31)
lwz r29, 0x0068(r31) lwz r29, 0x0068(r31)
rlwinm. r8, r19, 0, 16, 16 rlwinm. r8, r19, 0, 16, 16
bne+ major_0x0b054 bne+ ReleaseAndReturnParamErrFromMPCall
_Lock PSA.HTABLock, scratch1=r14, scratch2=r15 _Lock PSA.HTABLock, scratch1=r14, scratch2=r15
@ -3250,19 +3247,19 @@ KCLockPages ; OUTSIDE REFERER
addi r5, r5, -0x01 addi r5, r5, -0x01
cmplw r4, r16 cmplw r4, r16
cmplw cr1, r5, r17 cmplw cr1, r5, r17
blt+ major_0x0b054 blt+ ReleaseAndReturnParamErrFromMPCall
bgt+ cr1, major_0x0b054 bgt+ cr1, ReleaseAndReturnParamErrFromMPCall
lwz r19, 0x0020(r31) lwz r19, 0x0020(r31)
lwz r29, 0x0068(r31) lwz r29, 0x0068(r31)
rlwinm. r8, r19, 0, 16, 16 rlwinm. r8, r19, 0, 16, 16
bne+ major_0x0b054 bne+ ReleaseAndReturnParamErrFromMPCall
mr r27, r4 mr r27, r4
li r28, 0x00 li r28, 0x00
KCLockPages_0x68 KCLockPages_0x68
mr r8, r27 mr r8, r27
bl MPCall_95_0x254 bl MPCall_95_0x254
beq+ major_0x0b054 beq+ ReleaseAndReturnParamErrFromMPCall
lhz r18, 0x0000(r30) lhz r18, 0x0000(r30)
rlwinm r17, r18, 24, 25, 31 rlwinm r17, r18, 24, 25, 31
rlwinm. r8, r18, 0, 16, 16 rlwinm. r8, r18, 0, 16, 16
@ -3335,18 +3332,18 @@ KCUnlockPages ; OUTSIDE REFERER
addi r5, r5, -0x01 addi r5, r5, -0x01
cmplw r4, r16 cmplw r4, r16
cmplw cr1, r5, r17 cmplw cr1, r5, r17
blt+ major_0x0b054 blt+ ReleaseAndReturnParamErrFromMPCall
bgt+ cr1, major_0x0b054 bgt+ cr1, ReleaseAndReturnParamErrFromMPCall
lwz r19, 0x0020(r31) lwz r19, 0x0020(r31)
lwz r29, 0x0068(r31) lwz r29, 0x0068(r31)
rlwinm. r8, r19, 0, 16, 16 rlwinm. r8, r19, 0, 16, 16
bne+ major_0x0b054 bne+ ReleaseAndReturnParamErrFromMPCall
mr r27, r4 mr r27, r4
KCUnlockPages_0x60 KCUnlockPages_0x60
mr r8, r27 mr r8, r27
bl MPCall_95_0x254 bl MPCall_95_0x254
beq+ major_0x0b054 beq+ ReleaseAndReturnParamErrFromMPCall
lhz r18, 0x0000(r30) lhz r18, 0x0000(r30)
rlwinm r17, r18, 24, 25, 31 rlwinm r17, r18, 24, 25, 31
rlwinm. r8, r18, 0, 16, 16 rlwinm. r8, r18, 0, 16, 16
@ -3362,7 +3359,7 @@ KCUnlockPages_0x60
KCUnlockPages_0x98 KCUnlockPages_0x98
mr r8, r4 mr r8, r4
bl MPCall_95_0x254 bl MPCall_95_0x254
beq+ major_0x0b054 beq+ ReleaseAndReturnParamErrFromMPCall
lhz r18, 0x0000(r30) lhz r18, 0x0000(r30)
rlwinm r17, r18, 24, 25, 31 rlwinm r17, r18, 24, 25, 31
addi r17, r17, -0x01 addi r17, r17, -0x01
@ -3419,19 +3416,19 @@ KCHoldPages_0x2c ; OUTSIDE REFERER
addi r5, r5, -0x01 addi r5, r5, -0x01
cmplw r4, r16 cmplw r4, r16
cmplw cr1, r5, r17 cmplw cr1, r5, r17
blt+ major_0x0b054 blt+ ReleaseAndReturnParamErrFromMPCall
bgt+ cr1, major_0x0b054 bgt+ cr1, ReleaseAndReturnParamErrFromMPCall
lwz r19, 0x0020(r31) lwz r19, 0x0020(r31)
lwz r29, 0x0068(r31) lwz r29, 0x0068(r31)
rlwinm. r8, r19, 0, 16, 16 rlwinm. r8, r19, 0, 16, 16
bne+ major_0x0b054 bne+ ReleaseAndReturnParamErrFromMPCall
mr r27, r4 mr r27, r4
li r28, 0x00 li r28, 0x00
KCHoldPages_0x64 KCHoldPages_0x64
mr r8, r27 mr r8, r27
bl MPCall_95_0x254 bl MPCall_95_0x254
beq+ major_0x0b054 beq+ ReleaseAndReturnParamErrFromMPCall
lhz r18, 0x0000(r30) lhz r18, 0x0000(r30)
clrlwi r17, r18, 0x18 clrlwi r17, r18, 0x18
rlwinm. r8, r18, 0, 16, 16 rlwinm. r8, r18, 0, 16, 16
@ -3504,18 +3501,18 @@ KCUnholdPages ; OUTSIDE REFERER
addi r5, r5, -0x01 addi r5, r5, -0x01
cmplw r4, r16 cmplw r4, r16
cmplw cr1, r5, r17 cmplw cr1, r5, r17
blt+ major_0x0b054 blt+ ReleaseAndReturnParamErrFromMPCall
bgt+ cr1, major_0x0b054 bgt+ cr1, ReleaseAndReturnParamErrFromMPCall
lwz r19, 0x0020(r31) lwz r19, 0x0020(r31)
lwz r29, 0x0068(r31) lwz r29, 0x0068(r31)
rlwinm. r8, r19, 0, 16, 16 rlwinm. r8, r19, 0, 16, 16
bne+ major_0x0b054 bne+ ReleaseAndReturnParamErrFromMPCall
mr r27, r4 mr r27, r4
KCUnholdPages_0x60 KCUnholdPages_0x60
mr r8, r27 mr r8, r27
bl MPCall_95_0x254 bl MPCall_95_0x254
beq+ major_0x0b054 beq+ ReleaseAndReturnParamErrFromMPCall
lhz r18, 0x0000(r30) lhz r18, 0x0000(r30)
clrlwi r17, r18, 0x18 clrlwi r17, r18, 0x18
rlwinm. r8, r18, 0, 16, 16 rlwinm. r8, r18, 0, 16, 16
@ -3531,7 +3528,7 @@ KCUnholdPages_0x60
KCUnholdPages_0x98 KCUnholdPages_0x98
mr r8, r4 mr r8, r4
bl MPCall_95_0x254 bl MPCall_95_0x254
beq+ major_0x0b054 beq+ ReleaseAndReturnParamErrFromMPCall
lhz r18, 0x0000(r30) lhz r18, 0x0000(r30)
clrlwi r17, r18, 0x18 clrlwi r17, r18, 0x18
addi r17, r17, -0x01 addi r17, r17, -0x01
@ -3577,8 +3574,8 @@ MPCall_91 ; OUTSIDE REFERER
lwz r17, Area.LogicalEnd(r31) lwz r17, Area.LogicalEnd(r31)
cmplw r4, r16 cmplw r4, r16
cmplw cr1, r4, r17 cmplw cr1, r4, r17
blt+ major_0x0b054 blt+ ReleaseAndReturnParamErrFromMPCall
bgt+ cr1, major_0x0b054 bgt+ cr1, ReleaseAndReturnParamErrFromMPCall
_Lock PSA.HTABLock, scratch1=r14, scratch2=r15 _Lock PSA.HTABLock, scratch1=r14, scratch2=r15
@ -3634,19 +3631,19 @@ MPCall_92 ; OUTSIDE REFERER
mr r31, r8 mr r31, r8
lwz r16, Area.Flags(r31) lwz r16, Area.Flags(r31)
rlwinm. r8, r16, 0, 28, 28 rlwinm. r8, r16, 0, 28, 28
bne+ major_0x0b054 bne+ ReleaseAndReturnParamErrFromMPCall
lwz r29, 0x0134(r6) lwz r29, 0x0134(r6)
li r8, 0x318 li r8, 0x318
andc. r9, r5, r8 andc. r9, r5, r8
bne+ major_0x0b054 bne+ ReleaseAndReturnParamErrFromMPCall
andc. r9, r29, r8 andc. r9, r29, r8
bne+ major_0x0b054 bne+ ReleaseAndReturnParamErrFromMPCall
lwz r16, Area.LogicalBase(r31) lwz r16, Area.LogicalBase(r31)
lwz r17, Area.LogicalEnd(r31) lwz r17, Area.LogicalEnd(r31)
cmplw r4, r16 cmplw r4, r16
cmplw cr1, r4, r17 cmplw cr1, r4, r17
blt+ major_0x0b054 blt+ ReleaseAndReturnParamErrFromMPCall
bgt+ cr1, major_0x0b054 bgt+ cr1, ReleaseAndReturnParamErrFromMPCall
_Lock PSA.HTABLock, scratch1=r14, scratch2=r15 _Lock PSA.HTABLock, scratch1=r14, scratch2=r15
@ -3694,11 +3691,11 @@ MPCall_93 ; OUTSIDE REFERER
lwz r17, Area.LogicalEnd(r31) lwz r17, Area.LogicalEnd(r31)
cmplw r4, r16 cmplw r4, r16
cmplw cr1, r4, r17 cmplw cr1, r4, r17
blt+ major_0x0b054 blt+ ReleaseAndReturnParamErrFromMPCall
bgt+ cr1, major_0x0b054 bgt+ cr1, ReleaseAndReturnParamErrFromMPCall
mr r8, r4 mr r8, r4
bl MPCall_95_0x254 bl MPCall_95_0x254
beq+ major_0x0b054 beq+ ReleaseAndReturnParamErrFromMPCall
lhz r18, 0x0000(r30) lhz r18, 0x0000(r30)
rlwinm. r8, r18, 0, 16, 16 rlwinm. r8, r18, 0, 16, 16
li r5, 0x00 li r5, 0x00
@ -3730,13 +3727,13 @@ MPCall_94 ; OUTSIDE REFERER
lwz r17, Area.LogicalEnd(r31) lwz r17, Area.LogicalEnd(r31)
cmplw r4, r16 cmplw r4, r16
cmplw cr1, r4, r17 cmplw cr1, r4, r17
blt+ major_0x0b054 blt+ ReleaseAndReturnParamErrFromMPCall
bgt+ cr1, major_0x0b054 bgt+ cr1, ReleaseAndReturnParamErrFromMPCall
mr r8, r4 mr r8, r4
bl MPCall_95_0x254 bl MPCall_95_0x254
beq+ major_0x0b054 beq+ ReleaseAndReturnParamErrFromMPCall
cmplwi r5, 0x7fff cmplwi r5, 0x7fff
bgt+ major_0x0b054 bgt+ ReleaseAndReturnParamErrFromMPCall
lhz r18, 0x0000(r30) lhz r18, 0x0000(r30)
rlwinm. r8, r18, 0, 16, 16 rlwinm. r8, r18, 0, 16, 16
bne+ ReleaseAndReturnMPCallOOM bne+ ReleaseAndReturnMPCallOOM
@ -3779,11 +3776,11 @@ MPCall_129 ; OUTSIDE REFERER
lwz r17, Area.LogicalEnd(r31) lwz r17, Area.LogicalEnd(r31)
cmplw r4, r16 cmplw r4, r16
cmplw cr1, r4, r17 cmplw cr1, r4, r17
blt+ major_0x0b054 blt+ ReleaseAndReturnParamErrFromMPCall
bgt+ cr1, major_0x0b054 bgt+ cr1, ReleaseAndReturnParamErrFromMPCall
mr r8, r4 mr r8, r4
bl MPCall_95_0x254 bl MPCall_95_0x254
beq+ major_0x0b054 beq+ ReleaseAndReturnParamErrFromMPCall
lhz r18, 0x0000(r30) lhz r18, 0x0000(r30)
li r5, 0x00 li r5, 0x00
rlwinm. r8, r18, 0, 16, 16 rlwinm. r8, r18, 0, 16, 16

View File

@ -145,7 +145,7 @@ kcCacheDispatch_0x1d0
lwz r22, 0x01b4(r6) lwz r22, 0x01b4(r6)
lwz r23, 0x01bc(r6) lwz r23, 0x01bc(r6)
sync sync
b skeleton_key b IntReturn
kcCacheDispatch_0x1e4 kcCacheDispatch_0x1e4
clrlwi r8, r3, 0x10 clrlwi r8, r3, 0x10

View File

@ -46,5 +46,9 @@ kKDPfromIRP equ 10 * 4096
; Branch instruction BO fields
; (disregarding static prediction :)
BO_IF equ 12
BO_IF_NOT equ 4
noErr equ 0 Z equ 0x80000000

View File

@ -213,7 +213,7 @@ FinishInitBuiltin
mtspr mq, r8 mtspr mq, r8
li r8, 0 li r8, 0
mfspr r8, mq mfspr r8, mq
stw r8, PSA.EmpiricalCpuFeatures(r1) stw r8, PSA.GlobalCPUFlags(r1)
; Add AV and save that in scratch field ; Add AV and save that in scratch field
oris r9, r8, 1 << (15 - PSA.AVFeatureBit) oris r9, r8, 1 << (15 - PSA.AVFeatureBit)
@ -230,11 +230,11 @@ FinishInitBuiltin
stvewx v0, 0, r9 stvewx v0, 0, r9
; Scratch field now contains AltiVec and MQ flags. ; Scratch field now contains AltiVec and MQ flags.
; Copy it to EmpiricalCpuFeatures ; Copy it to GlobalCPUFlags
lwz r8, EWA.r0(r1) lwz r8, EWA.r0(r1)
stw r8, PSA.EmpiricalCpuFeatures(r1) stw r8, PSA.GlobalCPUFlags(r1)
; AllCpuFeatures = EmpiricalCpuFeatures | 0x00a00000 ; current flags = tested flags | CPU flag 8 | CPU flag 9
oris r7, r8, 0xa0 oris r7, r8, 0xa0
stw r7, EWA.Flags(r1) stw r7, EWA.Flags(r1)
@ -300,7 +300,7 @@ ResetBuiltinKernel
; r5 = SystemInfo ; r5 = SystemInfo
; r6 = PA_ECB ; r6 = PA_ECB
; r7 = AllCpuFeatures ; r7 = AllCpuFeatures
; r8 = EmpiricalCpuFeatures ; r8 = GlobalCPUFlags
; r9 = even more altivec crud ; r9 = even more altivec crud
; r10 = LA_EmulatorKernelTrapTable ; r10 = LA_EmulatorKernelTrapTable
; r11 = MSR ; r11 = MSR
@ -1105,13 +1105,13 @@ SetProcessorFlags
lwz r8, EWA.PA_CurAddressSpace(r1) lwz r8, EWA.PA_CurAddressSpace(r1)
li r9, 0 li r9, 0
bl SetAddrSpcRegisters bl SetSpaceSRsAndBATs
; Create the Blue MacOS task ; Create the Blue MacOS task
; ARG EmpiricalCpuFeatures r7, Process *r8 ; ARG GlobalCPUFlags r7, Process *r8
; RET Task *r8 ; RET Task *r8
lwz r8, PSA.blueProcessPtr(r1) lwz r8, PSA.blueProcessPtr(r1)
@ -1140,8 +1140,8 @@ SetProcessorFlags
li r8, 2 li r8, 2
stb r8, Task.MysteryByte1(r31) stb r8, Task.MysteryByte1(r31)
lisori r8, 0x00030028 lisori r8, 0x30028 ; (Z>>Task.kFlag14) | (Z>>Task.kFlagBlue) | (Z>>Task.kFlag26) | (Z>>Task.kFlag28)
stw r8, 0x0064(r31) stw r8, Task.Flags(r31)
li r8, 200 li r8, 200
stw r8, Task.Weight(r31) stw r8, Task.Weight(r31)
@ -1149,7 +1149,7 @@ SetProcessorFlags
li r8, Task.kNominalPriority li r8, Task.kNominalPriority
stb r8, Task.Priority(r31) stb r8, Task.Priority(r31)
lhz r8, -0x0116(r1) ; zero?????? lhz r8, EWA.CPUIndex(r1) ; zero??????
sth r8, 0x001a(r31) sth r8, 0x001a(r31)
lwz r8, EWA.CPUBase + CPU.ID(r1) lwz r8, EWA.CPUBase + CPU.ID(r1)
@ -1209,20 +1209,20 @@ SetProcessorFlags
; Create the idle task for the first CPU ; Create the idle task for the first CPU
; Unset the AV bit in EmpiricalCpuFeatures so that ; Unset the AV bit in GlobalCPUFlags so that
; idle task vector registers are not saved/restored ; idle task vector registers are not saved/restored
; (Leave the old value in r31) ; (Leave the old value in r31)
av set PSA.AVFeatureBit av set PSA.AVFeatureBit
mr r31, r7 mr r31, r7
rlwinm r7, r7, 0, av + 1, av - 1 rlwinm r7, r7, 0, av + 1, av - 1
; ARG EmpiricalCpuFeatures r7, Process *r8 ; ARG GlobalCPUFlags r7, Process *r8
; RET Task *r8 ; RET Task *r8
lwz r8, PSA.blueProcessPtr(r1) lwz r8, PSA.blueProcessPtr(r1)
bl CreateTask bl CreateTask
; Restore EmpiricalCpuFeatures ; Restore GlobalCPUFlags
mr r7, r31 mr r7, r31
; Check ; Check
@ -1234,9 +1234,8 @@ av set PSA.AVFeatureBit
stw r8, Task.Name(r31) stw r8, Task.Name(r31)
; Blue has 0x00030028 lisori r8, 0xA0040 ; (Z>>Task.kFlag12) | (Z>>Task.kFlag14) | (Z>>Task.kFlag25)
lisori r8, 0x000a0040 stw r8, Task.Flags(r31)
stw r8, Task.ThingThatAlignVecHits(r31)
; For the scheduler ; For the scheduler
li r8, 1 li r8, 1
@ -1253,9 +1252,9 @@ av set PSA.AVFeatureBit
stw r8, Task.CpuID(r31) stw r8, Task.CpuID(r31)
; Add a feature!?!?!?! ; Add a feature!?!?!?!
lwz r8, Task.ContextBlock + ContextBlock.EmpiricalCpuFeatures(r31) lwz r8, Task.ContextBlock + ContextBlock.Flags(r31)
oris r8, r8, 0x40 oris r8, r8, 0x40
stw r8, Task.ContextBlock + ContextBlock.EmpiricalCpuFeatures(r31) stw r8, Task.ContextBlock + ContextBlock.Flags(r31)
; Point task ECB at the idle loop within the nanokernel code ; Point task ECB at the idle loop within the nanokernel code
lwz r8, KDP.PA_NanoKernelCode(r1) lwz r8, KDP.PA_NanoKernelCode(r1)

View File

@ -9,7 +9,7 @@ Local_Panic set *
; major_0x02ccc ; major_0x02ccc
major_0x02964 ; OUTSIDE REFERER major_0x02964 ; OUTSIDE REFERER
b AlternateMPCallReturnPath b BlockMPCall
@ -37,7 +37,7 @@ major_0x02964 ; OUTSIDE REFERER
major_0x02980 ; OUTSIDE REFERER major_0x02980 ; OUTSIDE REFERER
mfsprg r1, 0 mfsprg r1, 0
mtsprg 3, r24 mtsprg 3, r24
lwz r9, -0x000c(r1) lwz r9, EWA.Enables(r1)
rlwinm r23, r17, 31, 27, 31 rlwinm r23, r17, 31, 27, 31
rlwnm. r9, r9, r8, 0x00, 0x00 rlwnm. r9, r9, r8, 0x00, 0x00
bsol- cr3, major_0x02980_0x100 bsol- cr3, major_0x02980_0x100
@ -84,12 +84,12 @@ major_0x02980_0xa8
stw r12, 0x008c(r6) stw r12, 0x008c(r6)
stw r3, 0x0094(r6) stw r3, 0x0094(r6)
stw r4, 0x009c(r6) stw r4, 0x009c(r6)
lwz r8, -0x000c(r1) lwz r8, EWA.Enables(r1)
stw r7, 0x0040(r6) stw r7, 0x0040(r6)
stw r8, 0x0044(r6) stw r8, 0x0044(r6)
li r8, 0x00 li r8, 0x00
lwz r10, 0x004c(r6) lwz r10, 0x004c(r6)
stw r8, -0x000c(r1) stw r8, EWA.Enables(r1)
lwz r1, -0x0004(r1) lwz r1, -0x0004(r1)
lwz r4, 0x0054(r6) lwz r4, 0x0054(r6)
lwz r3, 0x0654(r1) lwz r3, 0x0654(r1)
@ -102,7 +102,7 @@ major_0x02980_0xec
bsol- cr6, major_0x02980_0x114 bsol- cr6, major_0x02980_0x114
rlwinm r7, r7, 0, 29, 16 rlwinm r7, r7, 0, 29, 16
rlwimi r11, r7, 0, 20, 23 rlwimi r11, r7, 0, 20, 23
b skeleton_key b IntReturn
major_0x02980_0x100 major_0x02980_0x100
lwz r2, 0x0008(r1) lwz r2, 0x0008(r1)
@ -124,7 +124,7 @@ major_0x02980_0x114 ; OUTSIDE REFERER
major_0x02980_0x134 ; OUTSIDE REFERER major_0x02980_0x134 ; OUTSIDE REFERER
mfsprg r1, 0 mfsprg r1, 0
mtcrf 0x3f, r7 mtcrf 0x3f, r7
lwz r9, -0x000c(r1) lwz r9, EWA.Enables(r1)
lwz r1, -0x0004(r1) lwz r1, -0x0004(r1)
rlwnm. r9, r9, r8, 0x00, 0x00 rlwnm. r9, r9, r8, 0x00, 0x00
rlwimi r7, r8, 24, 0, 7 rlwimi r7, r8, 24, 0, 7
@ -142,16 +142,16 @@ major_0x02980_0x134 ; OUTSIDE REFERER
major_0x02980_0x178 ; OUTSIDE REFERER major_0x02980_0x178 ; OUTSIDE REFERER
lwz r1, -0x0004(r1) lwz r1, -0x0004(r1)
lwz r9, 0x0658(r1) lwz r9, KDP.PA_ECB(r1)
addi r8, r1, 0x360 addi r8, r1, 0x360
mtsprg 3, r8 mtsprg 3, r8
bltl- cr2, major_0x02ccc_0x108 bltl- cr2, BlueException
major_0x02980_0x18c ; OUTSIDE REFERER major_0x02980_0x18c ; OUTSIDE REFERER
mfsprg r1, 0 mfsprg r1, 0
lwz r8, -0x000c(r1) lwz r8, EWA.Enables(r1)
stw r7, 0x0000(r6) stw r7, ContextBlock.Flags(r6)
stw r8, 0x0004(r6) stw r8, ContextBlock.Enables(r6)
bns- cr6, major_0x02980_0x1b8 bns- cr6, major_0x02980_0x1b8
stw r17, 0x0024(r6) stw r17, 0x0024(r6)
stw r20, 0x0028(r6) stw r20, 0x0028(r6)
@ -217,7 +217,7 @@ major_0x02980_0x260
andi. r8, r11, 0x900 andi. r8, r11, 0x900
lwz r8, 0x0004(r6) lwz r8, 0x0004(r6)
lwz r13, 0x00dc(r6) lwz r13, 0x00dc(r6)
stw r8, -0x000c(r1) stw r8, EWA.Enables(r1)
lwz r8, 0x00d4(r6) lwz r8, 0x00d4(r6)
lwz r12, 0x00ec(r6) lwz r12, 0x00ec(r6)
mtxer r8 mtxer r8
@ -264,7 +264,7 @@ major_0x02980_0x2d0
; skeleton_key ; IntReturn
; Called when a Gary reset trap is called. When else? ; Called when a Gary reset trap is called. When else?
@ -288,14 +288,14 @@ major_0x02980_0x2d0
; CommonMPCallReturnPath ; CommonMPCallReturnPath
; CommonPIHPath ; CommonPIHPath
skeleton_key ; OUTSIDE REFERER IntReturn ; OUTSIDE REFERER
andi. r8, r7, 0x30 andi. r8, r7, 0x30
mfsprg r1, 0 mfsprg r1, 0
bnel- major_0x02ccc bnel- major_0x02ccc
li r8, 0x00 li r8, 0x00
stw r7, -0x0010(r1) stw r7, EWA.Flags(r1)
stw r8, -0x0114(r1) stw r8, -0x0114(r1)
b major_0x142a8 b ReturnToAnyTask
@ -303,20 +303,20 @@ skeleton_key ; OUTSIDE REFERER
; Xrefs: ; Xrefs:
; major_0x02980 ; major_0x02980
; skeleton_key ; IntReturn
major_0x02ccc ; OUTSIDE REFERER major_0x02ccc ; OUTSIDE REFERER
mtcrf 0x3f, r7 mtcrf 0x3f, r7
bns- cr6, major_0x02ccc_0x18 bc BO_IF_NOT, 27, major_0x02ccc_0x18
rlwinm r7, r7, 0, 28, 26 rlwinm r7, r7, 0, 28, 26
bso- cr7, major_0x02ccc_0x30 bc BO_IF, 31, major_0x02ccc_0x30
rlwinm r7, r7, 0, 27, 25 rlwinm r7, r7, 0, 27, 25
b major_0x02ccc_0x2c b major_0x02ccc_0x2c
major_0x02ccc_0x18 major_0x02ccc_0x18
bne- cr6, major_0x02ccc_0x2c bne- cr6, major_0x02ccc_0x2c
rlwinm r7, r7, 0, 27, 25 rlwinm r7, r7, 0, 27, 25
stw r7, -0x0010(r1) stw r7, EWA.Flags(r1)
li r8, 0x08 li r8, 0x08
b major_0x02980_0x134 b major_0x02980_0x134
@ -325,8 +325,8 @@ major_0x02ccc_0x2c
major_0x02ccc_0x30 major_0x02ccc_0x30
rlwinm. r8, r7, 0, 8, 8 rlwinm. r8, r7, 0, 8, 8
beq- major_0x02ccc_0x108 beq- BlueException
stw r7, -0x0010(r1) stw r7, EWA.Flags(r1)
lwz r8, 0x0104(r6) lwz r8, 0x0104(r6)
stw r8, 0x0000(r1) stw r8, 0x0000(r1)
stw r2, 0x0008(r1) stw r2, 0x0008(r1)
@ -361,7 +361,7 @@ major_0x02ccc_0x30
rlwimi r25, r17, 7, 25, 30 rlwimi r25, r17, 7, 25, 30
lhz r26, 0x0d20(r25) lhz r26, 0x0d20(r25)
rlwimi r25, r19, 1, 28, 30 rlwimi r25, r19, 1, 28, 30
stw r16, -0x0010(r1) stw r16, EWA.Flags(r1)
rlwimi r26, r26, 8, 8, 15 ; copy hi byte of entry to second byte of word rlwimi r26, r26, 8, 8, 15 ; copy hi byte of entry to second byte of word
rlwimi r25, r17, 4, 23, 27 rlwimi r25, r17, 4, 23, 27
mtcrf 0x10, r26 ; so the second nybble of the entry is copied to cr3 mtcrf 0x10, r26 ; so the second nybble of the entry is copied to cr3
@ -381,36 +381,44 @@ major_0x02ccc_0x30
major_0x02ccc_0x108 ; OUTSIDE REFERER BlueException
bl Save_r14_r31 ; r8 := EWA bl Save_r14_r31 ; r8 := EWA
lwz r31, EWA.PA_CurTask(r8) lwz r31, EWA.PA_CurTask(r8)
lwz r8, 0x00f4(r31) lwz r8, Task.ExceptionHandlerID(r31)
; r8 = id
bl LookupID bl LookupID
cmpwi r9, Queue.kIDClass cmpwi r9, Queue.kIDClass
mr r30, r8 mr r30, r8
bnel- major_0x02ccc_0x20c bnel- @no_exception_handler
lwz r28, 0x0028(r30)
cmpwi r28, 0x00
beql- major_0x02ccc_0x20c
lwz r28, Queue.ReservePtr(r30)
cmpwi r28, 0
beql- @no_memory_reserved_for_exception_messages
;notify exception handler
_Lock PSA.SchLock, scratch1=r8, scratch2=r9 _Lock PSA.SchLock, scratch1=r8, scratch2=r9
lwz r29, 0x0064(r31) lwz r29, Task.Flags(r31)
ori r29, r29, 0x200 _bset r29, r29, Task.kFlag22
ori r29, r29, 0x1000 _bset r29, r29, Task.kFlag19
stw r29, 0x0064(r31) stw r29, Task.Flags(r31)
lwz r17, 0x0008(r28)
stw r17, 0x0028(r30) ; pop 'notr'
lwz r17, 0x0000(r31) lwz r17, Message.LLL + LLL.Next(r28)
stw r17, 0x0010(r28) stw r17, Queue.ReservePtr(r30)
li r18, -0x7271
stw r18, 0x0014(r28) ; word1 = task ID
stw r18, 0x00f8(r31) lwz r17, Task.ID(r31)
stw r10, 0x0018(r28) stw r17, Message.Word1(r28)
; word 2 = kMPTaskAbortedErr
li r18, kMPTaskAbortedErr
stw r18, Message.Word2(r28)
stw r18, Task.ErrToReturnIfIDie(r31)
; word 3 = SRR0
stw r10, Message.Word3(r28)
_log 'Blue task suspended. Notifying exception handler - srr1/0 ' _log 'Blue task suspended. Notifying exception handler - srr1/0 '
mr r8, r11 mr r8, r11
bl Printw bl Printw
@ -420,12 +428,15 @@ major_0x02ccc_0x108 ; OUTSIDE REFERER
mr r8, r12 mr r8, r12
bl Printw bl Printw
_log '^n' _log '^n'
mr r31, r30 mr r31, r30
mr r8, r28 mr r8, r28
bl major_0x0c8b4 bl EnqueueMessage ; Message *r8, Queue *r31
b major_0x142dc
major_0x02ccc_0x20c b RescheduleAndReturn
@no_exception_handler
@no_memory_reserved_for_exception_messages
mflr r16 mflr r16
_log 'Blue task terminated - no exception handler registered - srr1/0 ' _log 'Blue task terminated - no exception handler registered - srr1/0 '
mr r8, r11 mr r8, r11
@ -439,6 +450,8 @@ major_0x02ccc_0x20c
mtlr r16 mtlr r16
b Local_Panic b Local_Panic
major_0x02ccc_0x2a4 ; OUTSIDE REFERER major_0x02ccc_0x2a4 ; OUTSIDE REFERER
bsol+ cr6, Local_Panic bsol+ cr6, Local_Panic
@ -457,7 +470,7 @@ major_0x02ccc_0x2a4 ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r28, scratch2=r29 _Lock PSA.SchLock, scratch1=r28, scratch2=r29
mr r8, r31 mr r8, r31
bl DequeueTask bl TaskUnready
lwz r16, 0x0064(r31) lwz r16, 0x0064(r31)
srwi r8, r7, 24 srwi r8, r7, 24
rlwinm. r16, r16, 0, 9, 9 rlwinm. r16, r16, 0, 9, 9
@ -489,7 +502,7 @@ major_0x02ccc_0x310 ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r28, scratch2=r29 _Lock PSA.SchLock, scratch1=r28, scratch2=r29
mr r8, r31 mr r8, r31
bl DequeueTask bl TaskUnready
lwz r16, 0x0064(r31) lwz r16, 0x0064(r31)
srwi r8, r7, 24 srwi r8, r7, 24
rlwinm. r16, r16, 0, 9, 9 rlwinm. r16, r16, 0, 9, 9
@ -545,7 +558,7 @@ major_0x02ccc_0x3d4
stw r27, 0x0014(r26) stw r27, 0x0014(r26)
stw r28, 0x0018(r26) stw r28, 0x0018(r26)
mr r30, r26 mr r30, r26
bl major_0x0db04 bl CauseNotification
cmpwi r8, 0x00 cmpwi r8, 0x00
beq+ major_0x02964 beq+ major_0x02964
@ -572,10 +585,10 @@ major_0x02ccc_0x430
stw r30, 0x0018(r26) stw r30, 0x0018(r26)
mr r8, r26 mr r8, r26
addi r31, r1, -0xa24 addi r31, r1, -0xa24
bl major_0x0c8b4 bl EnqueueMessage ; Message *r8, Queue *r31
lwz r8, -0x0410(r1) lwz r8, -0x0410(r1)
bl major_0x0dce8 bl UnblockBlueIfCouldBePolling
b AlternateMPCallReturnPath b BlockMPCall
major_0x02ccc_0x4a8 major_0x02ccc_0x4a8
mr r8, r31 mr r8, r31
@ -606,7 +619,7 @@ major_0x02ccc_0x50c
mr r8, r31 mr r8, r31
bl TaskReadyAsPrev bl TaskReadyAsPrev
bl major_0x14af8_0xa0 bl major_0x14af8_0xa0
b AlternateMPCallReturnPath b BlockMPCall
major_0x02ccc_0x524 major_0x02ccc_0x524
b FuncExportedFromTasks b FuncExportedFromTasks
@ -635,24 +648,27 @@ IntDecrementer ; OUTSIDE REFERER
; r12 = sprg2 ; r12 = sprg2
; r13 = cr ; r13 = cr
lwz r8, 0x05a0(r1) lwz r8, KDP.OldKDP(r1)
rlwinm. r9, r11, 0, 16, 16 rlwinm. r9, r11, 0, 16, 16
cmpwi cr1, r8, 0x00 cmpwi cr1, r8, 0x00
beq- MaskedInterruptTaken beq- MaskedInterruptTaken
beq- cr1, IntDecrementer_0x54 beq- cr1, IntDecrementer_0x54
stw r16, 0x0184(r6) stw r16, ContextBlock.r16(r6)
stw r17, 0x018c(r6) stw r17, ContextBlock.r17(r6)
stw r18, 0x0194(r6) stw r18, ContextBlock.r18(r6)
stw r25, 0x01cc(r6) stw r25, ContextBlock.r25(r6)
bl major_0x14a98 bl major_0x14a98
ble- IntDecrementer_0x48 ble- IntDecrementer_0x48
lwz r8, -0x09d4(r1)
lwz r8, PSA.CriticalReadyQ + ReadyQueue.Timecake + 4(r1)
mtspr dec, r8 mtspr dec, r8
lwz r16, 0x0184(r6)
lwz r17, 0x018c(r6) lwz r16, ContextBlock.r16(r6)
lwz r18, 0x0194(r6) lwz r17, ContextBlock.r17(r6)
b skeleton_key lwz r18, ContextBlock.r18(r6)
b IntReturn
IntDecrementer_0x48 IntDecrementer_0x48
lwz r16, 0x0184(r6) lwz r16, 0x0184(r6)
@ -673,9 +689,8 @@ IntDecrementer_0x54
bl TimerDispatch bl TimerDispatch
_AssertAndRelease PSA.SchLock, scratch=r8 _AssertAndRelease PSA.SchLock, scratch=r8
; r6 = ewa
bl Restore_r14_r31 bl Restore_r14_r31
b skeleton_key b IntReturn
@ -698,7 +713,7 @@ IntDSI ; OUTSIDE REFERER
mfsprg r12, 2 mfsprg r12, 2
mfcr r13 mfcr r13
mfsprg r24, 3 mfsprg r24, 3
lwz r16, -0x0010(r1) lwz r16, EWA.Flags(r1)
lwz r1, -0x0004(r1) lwz r1, -0x0004(r1)
mfspr r26, dsisr mfspr r26, dsisr
addi r23, r1, 0x4e0 addi r23, r1, 0x4e0
@ -731,7 +746,7 @@ major_0x03324 ; OUTSIDE REFERER
major_0x03324_0x18 major_0x03324_0x18
andis. r26, r27, 0xec00 andis. r26, r27, 0xec00
lwz r16, -0x0010(r1) lwz r16, EWA.Flags(r1)
rlwinm r17, r27, 0, 6, 15 rlwinm r17, r27, 0, 6, 15
rlwimi r16, r16, 27, 26, 26 rlwimi r16, r16, 27, 26, 26
bge- major_0x03324_0x58 bge- major_0x03324_0x58
@ -831,7 +846,7 @@ IntAlignment ; OUTSIDE REFERER
lwz r11, EWA.PA_CurTask(r1) lwz r11, EWA.PA_CurTask(r1)
lwz r16, EWA.Flags(r1) lwz r16, EWA.Flags(r1)
lwz r21, Task.ThingThatAlignVecHits(r11) lwz r21, Task.Flags(r11)
lwz r1, -0x0004(r1) ; wha??? lwz r1, -0x0004(r1) ; wha???
lwz r11, KDP.NanoKernelInfo + NKNanoKernelInfo.MisalignmentCount(r1) lwz r11, KDP.NanoKernelInfo + NKNanoKernelInfo.MisalignmentCount(r1)
@ -846,7 +861,7 @@ IntAlignment ; OUTSIDE REFERER
mfspr r27, dsisr mfspr r27, dsisr
mfspr r18, dar mfspr r18, dar
rlwinm. r21, r21, 0, 9, 9 ; KDP.ThingThatAlignVecHits rlwinm. r21, r21, 0, Task.kFlag9, Task.kFlag9
addi r23, r1, KDP.RedVecBase addi r23, r1, KDP.RedVecBase
@ -1223,7 +1238,7 @@ IntISI ; OUTSIDE REFERER
mfsprg r8, 0 mfsprg r8, 0
mtsprg 3, r24 mtsprg 3, r24
lmw r14, 0x0038(r8) lmw r14, 0x0038(r8)
b skeleton_key b IntReturn
@ -1289,7 +1304,7 @@ IntMachineCheck ; OUTSIDE REFERER
rlwinm. r8, r11, 0, 2, 2 rlwinm. r8, r11, 0, 2, 2
beq- IntMachineCheck_0xa4 beq- IntMachineCheck_0xa4
bl kcCacheDispatch_0x39c bl kcCacheDispatch_0x39c
b skeleton_key b IntReturn
IntMachineCheck_0xa4 IntMachineCheck_0xa4
li r8, 0x07 li r8, 0x07
@ -1393,14 +1408,14 @@ major_0x03be0_0x58
rlwimi r7, r8, 0, 17, 7 rlwimi r7, r8, 0, 17, 7
lwz r8, 0x0044(r6) lwz r8, 0x0044(r6)
rlwimi r11, r7, 0, 20, 23 rlwimi r11, r7, 0, 20, 23
stw r8, -0x000c(r1) stw r8, EWA.Enables(r1)
andi. r8, r11, 0x900 andi. r8, r11, 0x900
lwz r12, 0x008c(r6) lwz r12, 0x008c(r6)
lwz r3, 0x0094(r6) lwz r3, 0x0094(r6)
lwz r4, 0x009c(r6) lwz r4, 0x009c(r6)
bnel- major_0x03e18 bnel- major_0x03e18
addi r9, r6, 0x40 addi r9, r6, 0x40
b skeleton_key b IntReturn
major_0x03be0_0x90 major_0x03be0_0x90
lwz r9, 0x0ea8(r1) lwz r9, 0x0ea8(r1)
@ -1413,7 +1428,7 @@ major_0x03be0_0x90
lwz r8, 0x0044(r6) lwz r8, 0x0044(r6)
mtcrf 0x0f, r7 mtcrf 0x0f, r7
rlwimi r11, r7, 0, 20, 23 rlwimi r11, r7, 0, 20, 23
stw r8, -0x000c(r1) stw r8, EWA.Enables(r1)
lwz r12, 0x008c(r6) lwz r12, 0x008c(r6)
lwz r3, 0x0094(r6) lwz r3, 0x0094(r6)
lwz r4, 0x009c(r6) lwz r4, 0x009c(r6)
@ -1462,7 +1477,7 @@ save_all_registers ; OUTSIDE REFERER
mfspr r11, srr1 mfspr r11, srr1
mfcr r13 mfcr r13
mfsprg r12, 2 mfsprg r12, 2
lwz r7, -0x0010(r1) lwz r7, EWA.Flags(r1)
lwz r1, -0x0004(r1) lwz r1, -0x0004(r1)
; r6 = ewa ; r6 = ewa
@ -1495,7 +1510,7 @@ save_all_registers ; OUTSIDE REFERER
; r4 (itself) ; r4 (itself)
; r5 (itself) ; r5 (itself)
; r6 ContextBlock EWA ; r6 ContextBlock EWA
; r7 AllCpuFeatures ContextBlock ; r7 Flags ContextBlock
; r8 EWA ContextBlock ; r8 EWA ContextBlock
; r9 (itself) ContextBlock ; r9 (itself) ContextBlock
; r10 SRR0 ContextBlock ; r10 SRR0 ContextBlock
@ -1833,21 +1848,18 @@ IntPerfMonitor ; OUTSIDE REFERER
stw r16, 0x0014(r30) stw r16, 0x0014(r30)
mfspr r16, 955 mfspr r16, 955
stw r16, 0x0018(r30) stw r16, 0x0018(r30)
bl major_0x0db04 bl CauseNotification
IntPerfMonitor_0x88 IntPerfMonitor_0x88
_AssertAndRelease PSA.SchLock, scratch=r8 _AssertAndRelease PSA.SchLock, scratch=r8
; r6 = ewa ; r6 = ewa
bl Restore_r14_r31 bl Restore_r14_r31
b skeleton_key b IntReturn
; IntThermalEvent ; Notify the Thermal Handler
; Xrefs:
; "vec"
align kIntAlign align kIntAlign
@ -1860,24 +1872,20 @@ IntThermalEvent ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r8, scratch2=r9 _Lock PSA.SchLock, scratch1=r8, scratch2=r9
lwz r8, -0x0418(r1) lwz r8, PSA.ThermalHandlerID(r1)
; r8 = id
bl LookupID bl LookupID
cmpwi r9, Notification.kIDClass cmpwi r9, Notification.kIDClass
mr r30, r8 mr r30, r8
bne- IntThermalEvent_0x68 bne- @no_thermal_handler
lwz r16, -0x0340(r28)
stw r16, 0x0010(r30) lwz r16, EWA.CPUBase + CPU.ID(r28)
bl major_0x0db04 stw r16, Notification.MsgWord1(r30)
bl CauseNotification
@no_thermal_handler
IntThermalEvent_0x68
_AssertAndRelease PSA.SchLock, scratch=r8 _AssertAndRelease PSA.SchLock, scratch=r8
; r6 = ewa
bl Restore_r14_r31 bl Restore_r14_r31
b skeleton_key b IntReturn
@ -1890,12 +1898,12 @@ IntThermalEvent_0x68
kcRunAlternateContext ; OUTSIDE REFERER kcRunAlternateContext ; OUTSIDE REFERER
mtcrf 0x3f, r7 mtcrf 0x3f, r7
bnel+ cr2, skeleton_key bnel+ cr2, IntReturn
and. r8, r4, r13 and. r8, r4, r13
lwz r9, 0x0340(r1) lwz r9, 0x0340(r1)
rlwinm r8, r3, 0, 0, 25 rlwinm r8, r3, 0, 0, 25
cmpw cr1, r8, r9 cmpw cr1, r8, r9
bne+ skeleton_key bne+ IntReturn
lwz r9, 0x0344(r1) lwz r9, 0x0344(r1)
bne- cr1, major_0x043a0_0x48 bne- cr1, major_0x043a0_0x48
@ -2014,20 +2022,11 @@ wordfill ; OUTSIDE REFERER
; kcResetSystem
; Handle a 68k reset trap. ; Handle a 68k reset trap.
; Some messing around with 601 RTC vs later timebase
; registers.
; If Gary Davidian's first name and birthdate were in the
; 68k's A0/A1 (the 'skeleton key'), do something.
; Otherwise, farm it out to non_skeleton_reset_trap.
; Xrefs: ; If A0(r3)/A1(r4) == 'Gary'/$05051955, load the register list in A3? Or is this now disabled?
; "sup"
; > r3 = a0 ; New SRR0 = SRR0 & ~r5(D0) | r7(D2)
; > r4 = a1
align kIntAlign align kIntAlign
@ -2056,12 +2055,12 @@ kcResetSystem ; OUTSIDE REFERER
andis. r9, r9, 0xffff andis. r9, r9, 0xffff
cmplwi r8, 'ry' cmplwi r8, 'ry'
bne- non_skeleton_reset_trap bne- NonGaryReset
; r4 (i.e. A1) == 5 May 1956? ; r4 (i.e. A1) == 5 May 1956?
xoris r8, r4, 0x0505 xoris r8, r4, 0x0505
cmplwi r8, 0x1956 cmplwi r8, 0x1956
bne- non_skeleton_reset_trap bne- NonGaryReset
andc r11, r11, r5 andc r11, r11, r5
lwz r8, ContextBlock.r7(r6) lwz r8, ContextBlock.r7(r6)
@ -2077,18 +2076,18 @@ kcResetSystem ; OUTSIDE REFERER
_log '^n' _log '^n'
b skeleton_key b IntReturn
; non_skeleton_reset_trap ; NonGaryReset
; A 68k reset trap without Gary Davidian's magic numbers. ; A 68k reset trap without Gary Davidian's magic numbers.
; Xrefs: ; Xrefs:
; kcResetSystem ; kcResetSystem
non_skeleton_reset_trap NonGaryReset
_log 'ResetSystem trap entered^n' _log 'ResetSystem trap entered^n'
@ -2114,7 +2113,7 @@ non_skeleton_reset_trap
stw r6, 0x065c(r8) stw r6, 0x065c(r8)
stw r7, 0x0660(r8) ; ?????????? stw r7, 0x0660(r8) ; ??????????
lwz r9, -0x000c(r1) lwz r9, EWA.Enables(r1)
stw r9, 0x0664(r8) stw r9, 0x0664(r8)
; r6 = ewa ; r6 = ewa
@ -2130,7 +2129,7 @@ non_skeleton_reset_trap
; r11 = new srr1 ; r11 = new srr1
; r12 = lr restore ; r12 = lr restore
; r13 = cr restore ; r13 = cr restore
b int_teardown b ReturnFromInterrupt
@ -2338,7 +2337,7 @@ IntProgram_0xd0
xoris r13, r13, 0x2000 xoris r13, r13, 0x2000
lwz r8, 0x00ec(r9) lwz r8, 0x00ec(r9)
stw r8, 0x0104(r6) stw r8, 0x0104(r6)
b skeleton_key b IntReturn
IntProgram_0x110 IntProgram_0x110
mtcr r7 mtcr r7
@ -2435,13 +2434,13 @@ IntExternalYellow ; OUTSIDE REFERER
cmpwi cr2, r8, -0x725f cmpwi cr2, r8, -0x725f
beq+ kcPrioritizeInterrupts beq+ kcPrioritizeInterrupts
beq+ cr1, skeleton_key beq+ cr1, IntReturn
bne+ cr2, kcPrioritizeInterrupts bne+ cr2, kcPrioritizeInterrupts
mfsprg r9, 0 mfsprg r9, 0
li r8, 0x01 li r8, 0x01
stb r8, EWA.BinaryFlag(r9) stb r8, EWA.SchEvalFlag(r9)
b skeleton_key b IntReturn
@ -2454,7 +2453,7 @@ IntExternalYellow ; OUTSIDE REFERER
; MPCall_43 ; MPCall_43
; KCStartCPU ; KCStartCPU
; KCCpuPlugin ; KCCpuPlugin
; major_0x14af8 ; FlagSchEvaluationIfTaskRequires
; MPCall_103 ; MPCall_103
; > r7 = flags ; > r7 = flags
@ -2501,7 +2500,7 @@ SIGP_0x28
lwz r8, 0x004c(r22) lwz r8, 0x004c(r22)
cmpw r9, r8 cmpw r9, r8
beq- SIGP_0x94 beq- SIGP_0x94
bl SetAddrSpcRegisters bl SetSpaceSRsAndBATs
SIGP_0x94 SIGP_0x94
lwz r16, 0x0004(r23) lwz r16, 0x0004(r23)
@ -2513,7 +2512,7 @@ SIGP_0x94
stw r5, 0x012c(r6) stw r5, 0x012c(r6)
stw r17, 0x0134(r6) stw r17, 0x0134(r6)
lwz r17, 0x0648(r1) lwz r17, 0x0648(r1)
lhz r16, -0x0116(r23) lhz r16, EWA.CPUIndex(r23)
lwz r19, -0x0964(r1) lwz r19, -0x0964(r1)
slwi r16, r16, 2 slwi r16, r16, 2
rlwinm r19, r19, 0, 18, 15 rlwinm r19, r19, 0, 18, 15
@ -2581,7 +2580,7 @@ major_0x04a20_0x30
lwz r9, -0x001c(r23) lwz r9, -0x001c(r23)
cmpw r9, r8 cmpw r9, r8
beq- major_0x04a20_0x44 beq- major_0x04a20_0x44
bl SetAddrSpcRegisters bl SetSpaceSRsAndBATs
major_0x04a20_0x44 major_0x04a20_0x44
lwz r10, -0x02d0(r23) lwz r10, -0x02d0(r23)
@ -2648,7 +2647,7 @@ IntSyscall ; OUTSIDE REFERER
; sc -1: mess around with flags ; sc -1: mess around with flags
lwz r0, -0x0010(r1) lwz r0, EWA.Flags(r1)
mfsprg r1, 2 mfsprg r1, 2
rlwinm. r0, r0, 0, 10, 10 rlwinm. r0, r0, 0, 10, 10
mtlr r1 mtlr r1
@ -2661,7 +2660,7 @@ IntSyscall ; OUTSIDE REFERER
; sc -2: more flag nonsense? ; sc -2: more flag nonsense?
lwz r0, -0x0010(r1) lwz r0, EWA.Flags(r1)
lwz r1, -0x0008(r1) lwz r1, -0x0008(r1)
rlwinm. r0, r0, 0, 10, 10 rlwinm. r0, r0, 0, 10, 10
lwz r0, 0x00ec(r1) lwz r0, 0x00ec(r1)

View File

@ -267,7 +267,7 @@ ReturnZeroFromMPCall ; OUTSIDE REFERER
; major_0x0af60 ; ReleaseAndScrambleMPCall
; Xrefs: ; Xrefs:
; KCRegisterCpuPlugin ; KCRegisterCpuPlugin
@ -326,14 +326,14 @@ ReturnZeroFromMPCall ; OUTSIDE REFERER
; MPCall_94 ; MPCall_94
; MPCall_95 ; MPCall_95
major_0x0af60 ; OUTSIDE REFERER ReleaseAndScrambleMPCall ; OUTSIDE REFERER
_AssertAndRelease PSA.SchLock, scratch=r16 _AssertAndRelease PSA.SchLock, scratch=r16
; I'd really live a name for this. ; I'd really live a name for this.
major_0x0af60_0x20 ; OUTSIDE REFERER ScrambleMPCall ; OUTSIDE REFERER
mfspr r16, pvr mfspr r16, pvr
rlwinm. r16, r16, 0, 0, 14 rlwinm. r16, r16, 0, 0, 14
@ -348,7 +348,7 @@ major_0x0af60_0x20 ; OUTSIDE REFERER
xoris r16, r16, 0x1950 xoris r16, r16, 0x1950
stw r16, PSA.ScrambledMPCallTime(r1) stw r16, PSA.ScrambledMPCallTime(r1)
li r3, -0x726e li r3, -29294
b CommonMPCallReturnPath b CommonMPCallReturnPath
@ -382,7 +382,7 @@ ReleaseAndReturnMPCallOOM ; OUTSIDE REFERER
; ReturnMPCallOOM ; ReturnMPCallOOM
; Xrefs: ; Xrefs:
; major_0x0af60 ; ReleaseAndScrambleMPCall
; MPCall_0 ; MPCall_0
; KCRegisterCpuPlugin ; KCRegisterCpuPlugin
; MPCall_47 ; MPCall_47
@ -428,7 +428,7 @@ ReturnMPCallBlueBlocking ; OUTSIDE REFERER
; major_0x0b054 ; ReleaseAndReturnParamErrFromMPCall
; Xrefs: ; Xrefs:
; MPCall_128 ; MPCall_128
@ -456,7 +456,7 @@ ReturnMPCallBlueBlocking ; OUTSIDE REFERER
; MPCall_94 ; MPCall_94
; MPCall_129 ; MPCall_129
major_0x0b054 ; OUTSIDE REFERER ReleaseAndReturnParamErrFromMPCall ; OUTSIDE REFERER
_AssertAndRelease PSA.SchLock + Lock.Count, scratch=r16 _AssertAndRelease PSA.SchLock + Lock.Count, scratch=r16
@ -464,7 +464,7 @@ major_0x0b054 ; OUTSIDE REFERER
; ReturnParamErrFromMPCall ; ReturnParamErrFromMPCall
; Xrefs: ; Xrefs:
; major_0x0b054 ; ReleaseAndReturnParamErrFromMPCall
; KCGetNextIDOwnedByProcess ; KCGetNextIDOwnedByProcess
; NKLocateInfoRecord ; NKLocateInfoRecord
; MPCall_108 ; MPCall_108
@ -624,7 +624,7 @@ ReturnZeroFromMPCall_again ; OUTSIDE REFERER
; AlternateMPCallReturnPath ; BlockMPCall
; Xrefs: ; Xrefs:
; major_0x02964 ; major_0x02964
@ -645,8 +645,8 @@ ReturnZeroFromMPCall_again ; OUTSIDE REFERER
; MPCall_81 ; MPCall_81
; MPCall_98 ; MPCall_98
AlternateMPCallReturnPath ; OUTSIDE REFERER BlockMPCall ; OUTSIDE REFERER
crclr cr2_eq crclr 10
b TrulyCommonMPCallReturnPath b TrulyCommonMPCallReturnPath
ReleaseAndReturnMPCall ; OUTSIDE REFERER ReleaseAndReturnMPCall ; OUTSIDE REFERER
@ -659,7 +659,7 @@ ReleaseAndReturnMPCall ; OUTSIDE REFERER
; Xrefs: ; Xrefs:
; MPCallBad ; MPCallBad
; ReturnZeroFromMPCall ; ReturnZeroFromMPCall
; major_0x0af60 ; ReleaseAndScrambleMPCall
; ReturnMPCallOOM ; ReturnMPCallOOM
; ReturnMPCallBlueBlocking ; ReturnMPCallBlueBlocking
; ReturnParamErrFromMPCall ; ReturnParamErrFromMPCall
@ -667,7 +667,7 @@ ReleaseAndReturnMPCall ; OUTSIDE REFERER
; ReturnMPCallInvalidIDErr ; ReturnMPCallInvalidIDErr
; major_0x0b0cc ; major_0x0b0cc
; ReturnZeroFromMPCall_again ; ReturnZeroFromMPCall_again
; AlternateMPCallReturnPath ; BlockMPCall
; KCGetCpuCount ; KCGetCpuCount
; MPCall_6 ; MPCall_6
; KCYieldWithHint ; KCYieldWithHint
@ -689,19 +689,21 @@ ReleaseAndReturnMPCall ; OUTSIDE REFERER
; major_0x16b80 ; major_0x16b80
CommonMPCallReturnPath ; OUTSIDE REFERER CommonMPCallReturnPath ; OUTSIDE REFERER
crset cr2_eq crset 10
TrulyCommonMPCallReturnPath ; OUTSIDE REFERER TrulyCommonMPCallReturnPath ; OUTSIDE REFERER
mfsprg r8, 0 mfsprg r8, 0
lwz r9, 0x0134(r6) lwz r9, 0x0134(r6)
stw r9, 0x0018(r8) stw r9, 0x0018(r8)
bne- cr2, @do_the_other_thing_instead bc BO_IF_NOT, 10, @block
bl Restore_r14_r31
b skeleton_key
@do_the_other_thing_instead
b major_0x142dc ;return immediately
bl Restore_r14_r31
b IntReturn
@block
b RescheduleAndReturn
@ -917,7 +919,7 @@ KCCreateProcess ; OUTSIDE REFERER
bl PoolAlloc bl PoolAlloc
mr. r31, r8 mr. r31, r8
beq+ major_0x0af60 beq+ ReleaseAndScrambleMPCall
li r9, Process.kIDClass li r9, Process.kIDClass
bl MakeID bl MakeID
@ -926,7 +928,7 @@ KCCreateProcess ; OUTSIDE REFERER
bne- @did_not_fail bne- @did_not_fail
mr r8, r31 mr r8, r31
bl PoolFree bl PoolFree
b major_0x0af60 b ReleaseAndScrambleMPCall
@did_not_fail @did_not_fail
stw r8, Process.ID(r31) stw r8, Process.ID(r31)
@ -974,63 +976,67 @@ MPCall_5 ; OUTSIDE REFERER
; MPCall_6 ; ARG ProcessID r3
; RET OSStatus r3
; Xrefs: DeclareMPCall 6, MPDeleteProcess
; kcMPDispatch
; KCStopScheduling
; MPCall_9
; KCThrowException
DeclareMPCall 6, MPCall_6 MPDeleteProcess
MPCall_6 ; OUTSIDE REFERER _Lock PSA.SchLock, scratch1=r16, scratch2=r17
_Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3 mr r8, r3
; r8 = id
bl LookupID bl LookupID
cmpwi r9, Process.kIDClass cmpwi r9, Process.kIDClass
bne+ ReleaseAndReturnMPCallInvalidIDErr bne+ ReleaseAndReturnMPCallInvalidIDErr
mr r31, r8 mr r31, r8
lwz r16, 0x0008(r31)
lwz r17, 0x0010(r31) lwz r16, Process.Flags(r31)
rlwinm. r8, r16, 0, 30, 30 lwz r17, Process.TaskCount(r31)
cmpwi cr1, r17, 0x00 rlwinm. r8, r16, 0, Process.kFlag30, Process.kFlag30
cmpwi cr1, r17, 0
beq+ ReleaseAndReturnMPCallOOM beq+ ReleaseAndReturnMPCallOOM
bne+ cr1, ReleaseAndReturnMPCallOOM bne+ cr1, ReleaseAndReturnMPCallOOM
mr r8, r3 mr r8, r3
bl DeleteID bl DeleteID
_AssertAndRelease PSA.SchLock + Lock.Count, scratch=r16 _AssertAndRelease PSA.SchLock + Lock.Count, scratch=r16
mr r8, r31 mr r8, r31
bl PoolFree bl PoolFree
b ReturnZeroFromMPCall b ReturnZeroFromMPCall
MPCall_6_0x78 ; OUTSIDE REFERER MPCall_6_0x78 ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17 _Lock PSA.SchLock, scratch1=r16, scratch2=r17
mfsprg r16, 0 mfsprg r16, 0
rlwinm. r8, r7, 0, 10, 10 rlwinm. r8, r7, 0, 10, 10
lwz r17, 0x0658(r1) lwz r17, KDP.PA_ECB(r1)
lwz r31, -0x0008(r16) lwz r31, EWA.PA_CurTask(r16)
beq- MPCall_6_0xb4 beq- MPCall_6_0xb4
lwz r8, 0x00cc(r17) lwz r8, ContextBlock.PriorityShifty(r17)
rlwinm r8, r8, 0, 24, 21 rlwinm r8, r8, 0, 24, 21
oris r8, r8, 0x8000 oris r8, r8, 0x8000
stw r8, 0x00cc(r17) stw r8, ContextBlock.PriorityShifty(r17)
MPCall_6_0xb4 MPCall_6_0xb4
mr r8, r31 mr r8, r31
bl DequeueTask
li r16, 0x02 bl TaskUnready
stb r16, 0x0019(r31)
li r16, Task.kNominalPriority
stb r16, Task.Priority(r31)
bl TaskReadyAsPrev bl TaskReadyAsPrev
mr r8, r31 mr r8, r31
bl major_0x14af8 bl FlagSchEvaluationIfTaskRequires
_AssertAndRelease PSA.SchLock + Lock.Count, scratch=r16 _AssertAndRelease PSA.SchLock + Lock.Count, scratch=r16
b CommonMPCallReturnPath b CommonMPCallReturnPath
@ -1047,20 +1053,20 @@ KCYieldWithHint ; OUTSIDE REFERER
mfsprg r16, 0 mfsprg r16, 0
rlwinm. r8, r7, 0, 10, 10 rlwinm. r8, r7, 0, 10, 10
lwz r17, 0x0658(r1) lwz r17, KDP.PA_ECB(r1)
lwz r31, -0x0008(r16) lwz r31, -0x0008(r16)
beq- KCYieldWithHint_0x68 beq- KCYieldWithHint_0x68
clrlwi. r8, r3, 0x1f clrlwi. r8, r3, 0x1f
lwz r8, 0x00cc(r17) lwz r8, ContextBlock.PriorityShifty(r17)
rlwinm r8, r8, 0, 24, 21 rlwinm r8, r8, 0, 24, 21
oris r8, r8, 0x8000 oris r8, r8, 0x8000
stw r8, 0x00cc(r17) stw r8, ContextBlock.PriorityShifty(r17)
beq- KCYieldWithHint_0x68 beq- KCYieldWithHint_0x68
lbz r16, 0x0019(r31) lbz r16, 0x0019(r31)
cmpwi r16, 0x02 cmpwi r16, 0x02
bge- KCYieldWithHint_0x7c bge- KCYieldWithHint_0x7c
mr r8, r31 mr r8, r31
bl DequeueTask bl TaskUnready
li r16, 0x02 li r16, 0x02
stb r16, 0x0019(r31) stb r16, 0x0019(r31)
bl TaskReadyAsNext bl TaskReadyAsNext
@ -1068,14 +1074,14 @@ KCYieldWithHint ; OUTSIDE REFERER
KCYieldWithHint_0x68 KCYieldWithHint_0x68
mr r8, r31 mr r8, r31
bl DequeueTask bl TaskUnready
li r16, 0x02 li r16, 0x02
stb r16, 0x0019(r31) stb r16, 0x0019(r31)
bl TaskReadyAsPrev bl TaskReadyAsPrev
KCYieldWithHint_0x7c KCYieldWithHint_0x7c
mr r8, r31 mr r8, r31
bl major_0x14af8 bl FlagSchEvaluationIfTaskRequires
_AssertAndRelease PSA.SchLock + Lock.Count, scratch=r16 _AssertAndRelease PSA.SchLock + Lock.Count, scratch=r16
b CommonMPCallReturnPath b CommonMPCallReturnPath
@ -1120,12 +1126,11 @@ MPCall_55 ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17 _Lock PSA.SchLock, scratch1=r16, scratch2=r17
; if(-0x0410(r1) == -1) {-0x0410(r1) = 0; return 0;} lwz r16, PSA.BlueSpinningOn(r1)
lwz r16, -0x0410(r1) cmpwi r16, -1
cmpwi r16, -0x01 li r16, 0
li r16, 0x00
bne- MPCall_55_0x60 bne- MPCall_55_0x60
stw r16, -0x0410(r1) stw r16, PSA.BlueSpinningOn(r1)
b ReleaseAndReturnZeroFromMPCall b ReleaseAndReturnZeroFromMPCall
@ -1135,9 +1140,9 @@ MPCall_55_0x60 ; OUTSIDE REFERER
li r17, 1 li r17, 1
lwz r31, EWA.PA_CurTask(r16) lwz r31, EWA.PA_CurTask(r16)
addi r16, r31, 0x20 addi r16, r31, Task.Timer
stb r17, Timer.Byte0(r16) stb r17, Timer.Kind(r16)
; High bit is possibly suspect? Or a flag? ; High bit is possibly suspect? Or a flag?
clrlwi r3, r3, 1 clrlwi r3, r3, 1
@ -1150,7 +1155,7 @@ MPCall_55_0x60 ; OUTSIDE REFERER
bl EnqueueTimer bl EnqueueTimer
mr r8, r31 mr r8, r31
bl DequeueTask bl TaskUnready
addi r16, r1, PSA.DelayQueue addi r16, r1, PSA.DelayQueue
addi r17, r31, Timer.QueueLLL addi r17, r31, Timer.QueueLLL
@ -1159,7 +1164,7 @@ MPCall_55_0x60 ; OUTSIDE REFERER
InsertAsPrev r17, r16, scratch=r18 InsertAsPrev r17, r16, scratch=r18
li r3, 0 li r3, 0
b AlternateMPCallReturnPath b BlockMPCall
@ -1173,7 +1178,7 @@ MPCall_34 ; OUTSIDE REFERER
; r9 = kind ; r9 = kind
bl MakeID bl MakeID
cmpwi r8, 0x00 cmpwi r8, 0x00
beq+ major_0x0af60_0x20 beq+ ScrambleMPCall
mr r5, r8 mr r5, r8
b ReturnZeroFromMPCall b ReturnZeroFromMPCall
@ -1307,7 +1312,7 @@ KCGetNextIDOwnedByProcess ; OUTSIDE REFERER
b ReturnParamErrFromMPCall b ReturnParamErrFromMPCall
@task @task
lwz r17, Task.ThingThatAlignVecHits(r8) lwz r17, Task.Flags(r8)
lwz r9, Task.ProcessID(r8) lwz r9, Task.ProcessID(r8)
rlwinm. r17, r17, 0, 15, 15 rlwinm. r17, r17, 0, 15, 15
@ -1479,7 +1484,7 @@ KCCreateCpuStruct_0x24
; r8 = ptr ; r8 = ptr
mr. r31, r8 mr. r31, r8
beq+ major_0x0af60_0x20 beq+ ScrambleMPCall
_Lock PSA.SchLock, scratch1=r16, scratch2=r17 _Lock PSA.SchLock, scratch1=r16, scratch2=r17
@ -1492,7 +1497,7 @@ KCCreateCpuStruct_0x24
bne+ KCCreateCpuStruct_0x68 bne+ KCCreateCpuStruct_0x68
mr r8, r31 mr r8, r31
bl PoolFree bl PoolFree
b major_0x0af60 b ReleaseAndScrambleMPCall
KCCreateCpuStruct_0x68 KCCreateCpuStruct_0x68
@ -1584,7 +1589,7 @@ MPCall_43 ; OUTSIDE REFERER
mfsprg r15, 0 mfsprg r15, 0
li r16, 0x04 li r16, 0x04
stw r16, -0x0238(r15) stw r16, -0x0238(r15)
lhz r16, 0x022a(r31) lhz r16, CPU.EWA + EWA.CPUIndex(r31)
stw r16, -0x0234(r15) stw r16, -0x0234(r15)
li r8, 0x02 li r8, 0x02
@ -1628,7 +1633,7 @@ KCStartCPU ; OUTSIDE REFERER
mfsprg r15, 0 mfsprg r15, 0
li r16, 0x04 li r16, 0x04
stw r16, -0x0238(r15) stw r16, -0x0238(r15)
lhz r16, 0x022a(r30) lhz r16, CPU.EWA + EWA.CPUIndex(r30)
stw r16, -0x0234(r15) stw r16, -0x0234(r15)
@ -1650,21 +1655,21 @@ KCStartCPU ; OUTSIDE REFERER
rlwinm r7, r7, 0, 13, 11 rlwinm r7, r7, 0, 13, 11
lwz r8, PSA.blueProcessPtr(r1) lwz r8, PSA.blueProcessPtr(r1)
; ARG EmpiricalCpuFeatures r7, Process *r8 ; ARG GlobalCPUFlags r7, Process *r8
bl CreateTask bl CreateTask
; RET Task *r8 ; RET Task *r8
mr r7, r31 mr r7, r31
mr. r31, r8 mr. r31, r8
beq+ major_0x0af60 beq+ ReleaseAndScrambleMPCall
stw r31, CPU.IdleTaskPtr(r30) stw r31, CPU.IdleTaskPtr(r30)
lisori r8, 'idle' lisori r8, 'idle'
stw r8, Task.Name(r31) stw r8, Task.Name(r31)
lisori r8, 0x00080040 ; clearly flags lisori r8, 0x80040 ; (Z>>Task.kFlag12)| (Z>>Task.kFlag25)
stw r8, Task.ThingThatAlignVecHits(r31) stw r8, Task.Flags(r31)
li r8, 1 li r8, 1
stw r8, Task.Weight(r31) stw r8, Task.Weight(r31)
@ -1673,12 +1678,12 @@ KCStartCPU ; OUTSIDE REFERER
stb r8, Task.Priority(r31) stb r8, Task.Priority(r31)
; whoa -- cpu structs arent this big? ; whoa -- cpu structs arent this big?
lhz r8, 0x022a(r30) lhz r8, CPU.EWA + EWA.CPUIndex(r30)
sth r8, Task.MysteryHalf(r31) sth r8, Task.CPUIndex(r31)
lwz r8, Task.ContextBlock + ContextBlock.EmpiricalCpuFeatures(r31) lwz r8, Task.ContextBlock + ContextBlock.Flags(r31)
_bset r8, r8, 9 _bset r8, r8, 9
stw r8, Task.ContextBlock + ContextBlock.EmpiricalCpuFeatures(r31) stw r8, Task.ContextBlock + ContextBlock.Flags(r31)
lwz r8, KDP.PA_NanoKernelCode(r1) lwz r8, KDP.PA_NanoKernelCode(r1)
@ -1699,7 +1704,7 @@ KCStartCPU ; OUTSIDE REFERER
mfsprg r15, 0 mfsprg r15, 0
li r16, 0x08 li r16, 0x08
stw r16, -0x0238(r15) stw r16, -0x0238(r15)
lhz r16, 0x022a(r30) lhz r16, CPU.EWA + EWA.CPUIndex(r30)
stw r16, -0x0234(r15) stw r16, -0x0234(r15)
MPCall_44_0x15c MPCall_44_0x15c
@ -1718,7 +1723,7 @@ MPCall_44_0x15c
mfsprg r15, 0 mfsprg r15, 0
li r16, 0x01 li r16, 0x01
stw r16, -0x0238(r15) stw r16, -0x0238(r15)
lhz r16, 0x022a(r30) lhz r16, CPU.EWA + EWA.CPUIndex(r30)
stw r16, -0x0234(r15) stw r16, -0x0234(r15)
lwz r16, 0x064c(r1) lwz r16, 0x064c(r1)
llabel r17, major_0x14bcc llabel r17, major_0x14bcc
@ -1774,7 +1779,7 @@ KCStopScheduling ; OUTSIDE REFERER
oris r17, r17, 0x80 oris r17, r17, 0x80
stw r17, 0x0064(r31) stw r17, 0x0064(r31)
mr r8, r31 mr r8, r31
bl DequeueTask bl TaskUnready
li r17, 0x00 li r17, 0x00
stb r17, 0x0019(r31) stb r17, 0x0019(r31)
mr r8, r31 mr r8, r31
@ -1991,9 +1996,9 @@ KCMarkPMFTask ; OUTSIDE REFERER
@use_blue_task_instead @use_blue_task_instead
; Insert bit 31 of r4 into bit 21 of these flags ; Insert bit 31 of r4 into bit 21 of these flags
lwz r17, Task.ThingThatAlignVecHits(r31) lwz r17, Task.Flags(r31)
rlwimi r17, r4, 10, 21, 21 rlwimi r17, r4, 10, 21, 21
stw r17, Task.ThingThatAlignVecHits(r31) stw r17, Task.Flags(r31)
; Don't know what this does! ; Don't know what this does!
@ -2155,7 +2160,7 @@ NKSetClockStep ; OUTSIDE REFERER
; r1 = kdp ; r1 = kdp
beq+ ReleaseAndReturnZeroFromMPCall beq+ ReleaseAndReturnZeroFromMPCall
mr r8, r31 mr r8, r31
bl major_0x136c8 bl DequeueTimer
; r1 = kdp ; r1 = kdp
b ReleaseAndReturnZeroFromMPCall b ReleaseAndReturnZeroFromMPCall
@ -2265,7 +2270,7 @@ NKSetClockDriftCorrection_0x12c
; r1 = kdp ; r1 = kdp
beq+ ReleaseAndReturnZeroFromMPCall beq+ ReleaseAndReturnZeroFromMPCall
mr r8, r31 mr r8, r31
bl major_0x136c8 bl DequeueTimer
; r1 = kdp ; r1 = kdp
b ReleaseAndReturnZeroFromMPCall b ReleaseAndReturnZeroFromMPCall

View File

@ -86,7 +86,7 @@
MACRO MACRO
StartLoadingWord &reg, &val _lstart &reg, &val
LHHI (&reg), (&val) LHHI (&reg), (&val)
HalfLoadedWord set (&val) HalfLoadedWord set (&val)
HalfLoadedReg set (&reg) HalfLoadedReg set (&reg)
@ -94,16 +94,16 @@ HalfLoadedReg set (&reg)
MACRO MACRO
FinishLoadingWord _lfinish
LLHI HalfLoadedReg, HalfLoadedWord LLHI HalfLoadedReg, HalfLoadedWord
ENDM ENDM
MACRO MACRO
InitList &ptr, &sig, &scratch==r8 InitList &ptr, &sig, &scratch==r8
StartLoadingWord &scratch, &sig _lstart &scratch, &sig
stw &ptr, LLL.Next(&ptr) stw &ptr, LLL.Next(&ptr)
FinishLoadingWord _lfinish
stw &ptr, LLL.Prev(&ptr) stw &ptr, LLL.Prev(&ptr)
stw &scratch, LLL.Signature(&ptr) stw &scratch, LLL.Signature(&ptr)
ENDM ENDM
@ -203,3 +203,30 @@ HalfLoadedReg set (&reg)
ENDIF ENDIF
ENDM ENDM
MACRO
_b_if_time_gt &lhi, &rhi, &targ
cmpw &lhi, &rhi
cmplw cr1, &lhi + 1, &rhi + 1
bgt &targ
blt @fallthru
bgt cr1, &targ
@fallthru
ENDM
MACRO
_b_if_time_le &lhi, &rhi, &targ
cmpw &lhi, &rhi
cmplw cr1, &lhi + 1, &rhi + 1
blt &targ
bgt @fallthru
ble cr1, &targ
@fallthru
ENDM

View File

@ -83,7 +83,7 @@ InitPool ; OUTSIDE REFERER
; MPCall_40 ; MPCall_40
; MPCall_31 ; MPCall_31
; MPCall_64 ; MPCall_64
; major_0x0db04 ; CauseNotification
; CreateTask ; CreateTask
; MPCall_58 ; MPCall_58
; convert_pmdts_to_areas ; convert_pmdts_to_areas

View File

@ -138,7 +138,7 @@ major_0x09e28_0x4
lwz r29, 0x01ec(r6) lwz r29, 0x01ec(r6)
lwz r30, 0x01f4(r6) lwz r30, 0x01f4(r6)
lwz r31, 0x01fc(r6) lwz r31, 0x01fc(r6)
b skeleton_key b IntReturn
major_0x09e28_0x24 ; OUTSIDE REFERER major_0x09e28_0x24 ; OUTSIDE REFERER
li r3, -0x7267 li r3, -0x7267
@ -146,11 +146,11 @@ major_0x09e28_0x24 ; OUTSIDE REFERER
major_0x09e28_0x2c ; OUTSIDE REFERER major_0x09e28_0x2c ; OUTSIDE REFERER
li r3, 0x00 li r3, 0x00
b skeleton_key b IntReturn
major_0x09e28_0x34 ; OUTSIDE REFERER major_0x09e28_0x34 ; OUTSIDE REFERER
li r3, -0x01 li r3, -0x01
b skeleton_key b IntReturn
major_0x09e28_0x3c ; OUTSIDE REFERER major_0x09e28_0x3c ; OUTSIDE REFERER
mfsprg r9, 0 mfsprg r9, 0
@ -158,7 +158,7 @@ major_0x09e28_0x3c ; OUTSIDE REFERER
lwz r9, 0x0024(r8) lwz r9, 0x0024(r8)
cmpwi r9, 0x01 cmpwi r9, 0x01
li r3, -0x7267 li r3, -0x7267
bgt+ skeleton_key bgt+ IntReturn
stw r26, 0x01d4(r6) stw r26, 0x01d4(r6)
stw r27, 0x01dc(r6) stw r27, 0x01dc(r6)
stw r28, 0x01e4(r6) stw r28, 0x01e4(r6)
@ -510,7 +510,7 @@ major_0x09e28_0x4a8
mtspr ibat3l, r9 mtspr ibat3l, r9
lwz r16, 0x0184(r6) lwz r16, 0x0184(r6)
li r3, 0x00 li r3, 0x00
b skeleton_key b IntReturn
major_0x09e28_0x59c major_0x09e28_0x59c
mflr r9 mflr r9
@ -573,7 +573,7 @@ major_0x0a600 ; OUTSIDE REFERER
major_0x0a600_0x10 ; OUTSIDE REFERER major_0x0a600_0x10 ; OUTSIDE REFERER
mtspr 1019, r5 mtspr 1019, r5
li r3, 0x00 li r3, 0x00
b skeleton_key b IntReturn
major_0x0a600_0x1c ; OUTSIDE REFERER major_0x0a600_0x1c ; OUTSIDE REFERER
b major_0x0a600_0x1c b major_0x0a600_0x1c

View File

@ -64,17 +64,19 @@ PIHTableEnd
; > r1 = kdp ; > r1 = kdp
; ARG r28 = 68k int number
; Alignment probably to fit a cache block (very oft-run code). ; Alignment probably to fit a cache block (very oft-run code).
align 5 align 5
CommonPIHPath ; OUTSIDE REFERER CommonPIHPath ; OUTSIDE REFERER
mtsprg 3, r30 mtsprg 3, r30
lwz r23, KDP.PA_EmulatorIplValue(r1) lwz r23, KDP.PA_EmulatorIplValue(r1)
lwz r27, -0x0428(r1) lwz r27, PSA.ExternalHandlerID(r1)
CommonPIHPath_0xc ; OUTSIDE REFERER CommonPIHPath_0xc ; OUTSIDE REFERER
cmpwi cr7, r28, 0 cmpwi cr7, r28, 0
li r31, 0x00 li r31, 0
blt- cr7, @negative blt- cr7, @negative
beq- cr7, @zero_rupt beq- cr7, @zero_rupt
@ -83,7 +85,7 @@ CommonPIHPath_0xc ; OUTSIDE REFERER
@zero_rupt @zero_rupt
andis. r8, r11, 0x8000 >> 14 ; some kind of perfmon bit andis. r8, r11, 0x8000 >> 14 ; some kind of perfmon bit
cmpwi cr1, r27, 0x00 cmpwi cr1, r27, 0
lwz r29, KDP.ClearIntMaskInit(r1) lwz r29, KDP.ClearIntMaskInit(r1)
bne- @noperf bne- @noperf
@ -100,7 +102,7 @@ CommonPIHPath_0xc ; OUTSIDE REFERER
@negative @negative
_AssertAndRelease PSA.PIHLock, scratch=r8 _AssertAndRelease PSA.PIHLock, scratch=r8
bl Restore_r20_r31 bl Restore_r20_r31
b skeleton_key b IntReturn
CommonPIHPath_0x78 CommonPIHPath_0x78
_AssertAndRelease PSA.PIHLock, scratch=r8 _AssertAndRelease PSA.PIHLock, scratch=r8
@ -109,24 +111,21 @@ CommonPIHPath_0x78
_Lock PSA.SchLock, scratch1=r8, scratch2=r9 _Lock PSA.SchLock, scratch1=r8, scratch2=r9
mr r8, r27 mr r8, r27
; r8 = id
bl LookupID bl LookupID
cmpwi r9, Notification.kIDClass cmpwi r9, Notification.kIDClass
mr r30, r8 mr r30, r8
bne- CommonPIHPath_0x100 bne- @no_handler_notification
clrlwi r9, r28, 0x11
stw r9, 0x0010(r30) clrlwi r9, r28, 17
stw r22, 0x0014(r30) stw r9, Notification.MsgWord1(r30)
bl major_0x0db04 stw r22, Notification.MsgWord2(r30)
bl CauseNotification
_AssertAndRelease PSA.SchLock, scratch=r8 _AssertAndRelease PSA.SchLock, scratch=r8
; r6 = ewa
bl Restore_r14_r31 bl Restore_r14_r31
b skeleton_key b IntReturn
CommonPIHPath_0x100 @no_handler_notification
li r27, 0x00 li r27, 0x00
lwz r23, 0x067c(r1) lwz r23, 0x067c(r1)
stw r27, -0x0428(r1) stw r27, -0x0428(r1)
@ -156,7 +155,7 @@ CommonPIHPath_0x14c
cmpwi r29, 0x00 cmpwi r29, 0x00
lhz r16, 0x001a(r31) lhz r16, 0x001a(r31)
beq- CommonPIHPath_0x1dc beq- CommonPIHPath_0x1dc
lhz r17, -0x0116(r30) lhz r17, EWA.CPUIndex(r30)
cmpw cr1, r16, r17 cmpw cr1, r16, r17
rlwinm. r8, r28, 0, 26, 26 rlwinm. r8, r28, 0, 26, 26
beq- cr1, CommonPIHPath_0x1d0 beq- cr1, CommonPIHPath_0x1d0
@ -164,7 +163,7 @@ CommonPIHPath_0x14c
CommonPIHPath_0x1d0 CommonPIHPath_0x1d0
mr r8, r31 mr r8, r31
bl DequeueTask bl TaskUnready
b CommonPIHPath_0x218 b CommonPIHPath_0x218
CommonPIHPath_0x1dc CommonPIHPath_0x1dc
@ -174,7 +173,7 @@ CommonPIHPath_0x1dc
cmpwi r17, 0x01 cmpwi r17, 0x01
bne- CommonPIHPath_0x210 bne- CommonPIHPath_0x210
addi r8, r31, 0x20 addi r8, r31, 0x20
bl major_0x136c8 bl DequeueTimer
CommonPIHPath_0x210 CommonPIHPath_0x210
lwz r16, 0x0e80(r1) lwz r16, 0x0e80(r1)
@ -190,12 +189,12 @@ CommonPIHPath_0x218
CommonPIHPath_0x230 CommonPIHPath_0x230
mr r8, r31 mr r8, r31
bl major_0x14af8 bl FlagSchEvaluationIfTaskRequires
_AssertAndRelease PSA.SchLock, scratch=r16 _AssertAndRelease PSA.SchLock, scratch=r16
; r6 = ewa ; r6 = ewa
bl Restore_r14_r31 bl Restore_r14_r31
b skeleton_key b IntReturn

File diff suppressed because it is too large Load Diff

View File

@ -22,15 +22,15 @@ kcRTASDispatch ; OUTSIDE REFERER
cmpwi r8, 0x00 cmpwi r8, 0x00
bne- rtas_is_available bne- rtas_is_available
li r3, -0x01 li r3, -0x01
b skeleton_key b IntReturn
rtas_is_available rtas_is_available
_Lock PSA.RTASLock, scratch1=r8, scratch2=r9 _Lock PSA.RTASLock, scratch1=r8, scratch2=r9
mtcrf 0x3f, r7 mtcrf 0x3f, r7
lwz r9, 0x0658(r1) lwz r9, KDP.PA_ECB(r1)
lwz r8, -0x000c(r1) lwz r8, EWA.Enables(r1)
stw r7, 0x0000(r6) stw r7, 0x0000(r6)
stw r8, 0x0004(r6) stw r8, 0x0004(r6)
bns- cr6, kcRTASDispatch_0x5c bns- cr6, kcRTASDispatch_0x5c
@ -138,7 +138,7 @@ kcRTASDispatch_0x190
andi. r8, r11, 0x900 andi. r8, r11, 0x900
lwz r8, 0x0004(r6) lwz r8, 0x0004(r6)
lwz r13, 0x00dc(r6) lwz r13, 0x00dc(r6)
stw r8, -0x000c(r1) stw r8, EWA.Enables(r1)
lwz r8, 0x00d4(r6) lwz r8, 0x00d4(r6)
lwz r12, 0x00ec(r6) lwz r12, 0x00ec(r6)
mtxer r8 mtxer r8
@ -174,7 +174,7 @@ kcRTASDispatch_0x190
lwz r31, 0x01fc(r6) lwz r31, 0x01fc(r6)
_AssertAndRelease PSA.RTASLock, scratch=r8 _AssertAndRelease PSA.RTASLock, scratch=r8
li r3, 0x00 li r3, 0x00
b skeleton_key b IntReturn
rtas_make_actual_call rtas_make_actual_call
mtctr r9 mtctr r9

View File

@ -111,7 +111,7 @@ InitReplacement
; Do something terrible with the CPU features ; Do something terrible with the CPU features
lwz r12, -0x0010(r1) lwz r12, EWA.Flags(r1)
li r10, 0x00 li r10, 0x00
rlwimi r10, r12, 0, 12, 15 rlwimi r10, r12, 0, 12, 15
rlwimi r10, r12, 0, 28, 30 rlwimi r10, r12, 0, 28, 30
@ -161,7 +161,7 @@ InitReplacement
stw r12, EWA.Flags(r1) stw r12, EWA.Flags(r1)
lwz r12, 0x0664(r1) lwz r12, 0x0664(r1)
stw r12, -0x000c(r1) ; boy, better figure out what this is stw r12, EWA.Enables(r1) ; boy, better figure out what this is
b @endif b @endif
@replaces_later_than_0101 @replaces_later_than_0101
@ -178,7 +178,7 @@ InitReplacement
stw r12, EWA.Flags(r1) stw r12, EWA.Flags(r1)
lwz r12, -0x000c(r11) lwz r12, -0x000c(r11)
stw r12, -0x000c(r1) stw r12, EWA.Enables(r1)
@endif @endif

View File

@ -3,19 +3,33 @@ Local_Panic set *
; Called by setup only #### ## ## #### ######## ######## ######## ## ## ####### ######
; Each queue has a 64-bit time value (measured in implementation-dependent ticks). ## ### ## ## ## ## ## ## ## ## ## ## ## ## ##
; Critical queue has ~1ms, other queues increase this by 8x. ## #### ## ## ## ## ## ## ## #### ## ## ##
## ## ## ## ## ## ######## ## ## ## ## ## ######
## ## #### ## ## ## ## ## ## ## ## ## ## ##
## ## ### ## ## ## ## ## ## ## ## ## ## ##
#### ## ## #### ## ## ## ######## ## ##### ## ######
; Create the queues that hold unblocked tasks ready to be run.
; There are four ready queues (RDYQs), all in the PSA:
; 1. critical
; 2. latency protection (newly unblocked tasks)
; 3. nominal
; 4. idle
; Each one has a "time cake" that gets divided among its tasks.
; For critical it is ~1ms, successively multiplying by 8.
InitRDYQs InitRDYQs
li r16, 0 li r16, 0
stw r16, KDP.NanoKernelInfo + NKNanoKernelInfo.TaskCount(r1) stw r16, KDP.NanoKernelInfo + NKNanoKernelInfo.TaskCount(r1)
; Get a time doubleword approximating 1ms (for critical priority)
mflr r20 mflr r20
; Get a time doubleword approximating 1ms (for critical priority)
li r8, -1042 ; negative args are in usec li r8, -1042 ; negative args are in usec
bl TimebaseTicksPerPeriod bl TimebaseTicksPerPeriod
mr r16, r8 ; hi mr r16, r8 ; hi
@ -23,42 +37,37 @@ InitRDYQs
mtlr r20 mtlr r20
; These priority flags (top 4 bits) denote the state of each queue
; Zero out the KDP priority flags (a full value would be 0xf0000000)
li r23, 0 li r23, 0
stw r23, PSA.PriorityFlags(r1) stw r23, PSA.PriorityFlags(r1)
; Populate one RDYQ for each of the four task priorities
addi r9, r1, PSA.ReadyQueues addi r9, r1, PSA.ReadyQueues
; r23 = index of queue, r16/r17 = time cake
; Populate one RDYQ for each of the four task priorities
@loop @loop
; Empty linked list
lisori r8, ReadyQueue.kSignature lisori r8, ReadyQueue.kSignature
stw r8, LLL.Signature(r9) stw r8, LLL.Signature(r9)
stw r9, LLL.Next(r9) stw r9, LLL.Next(r9)
stw r9, LLL.Prev(r9) stw r9, LLL.Prev(r9)
; ... with a priority flag in its freeform field!
; Set one word in the structure in the format of KDP PriorityFlags,
; with the bit SET that corresponds with this queue
lis r8, 0x8000 ; ...0000 lis r8, 0x8000 ; ...0000
srw r8, r8, r23 srw r8, r8, r23
stw r8, LLL.Freeform(r9) stw r8, LLL.Freeform(r9)
; Zero some shit ; Zero some shit
li r8, 0 li r8, 0
stw r8, ReadyQueue.Counter(r9) ; incremented by TaskReadyAsNext stw r8, ReadyQueue.Counter(r9) ; incremented by TaskReadyAsPrev/Next
stw r8, ReadyQueue.TotalWeight(r9) stw r8, ReadyQueue.TotalWeight(r9)
; 1ms for critical, successively 8x for other queues
; Save the doubleword (1ms, 8ms...) for this priority
stw r16, ReadyQueue.Timecake(r9) stw r16, ReadyQueue.Timecake(r9)
stw r17, ReadyQueue.Timecake + 4(r9) stw r17, ReadyQueue.Timecake + 4(r9)
; Show off a bit ; Show off a bit
mflr r20 mflr r20
@ -67,7 +76,7 @@ InitRDYQs
mr r8, r23 ; the priority (1,2,3,4) mr r8, r23 ; the priority (1,2,3,4)
bl printw bl printw
mr r8, r16 ; the Timeslice mr r8, r16 ; the time cake
bl printw bl printw
mr r8, r17 mr r8, r17
@ -77,8 +86,7 @@ InitRDYQs
mtlr r20 mtlr r20
; Multiply time by 8 for the next iteration
; Multiply Timeslice by 8 for the next iteration
slwi r16, r16, 3 slwi r16, r16, 3
rlwimi r16, r17, 3, 29, 31 rlwimi r16, r17, 3, 29, 31
slwi r17, r17, 3 slwi r17, r17, 3
@ -89,11 +97,10 @@ InitRDYQs
addi r9, r9, 32 ;ReadyQueue.Size addi r9, r9, 32 ;ReadyQueue.Size
blt+ @loop blt+ @loop
; If the low nybble is empty, set ContextBlock.PriorityShifty to 2. ; If the low nybble is empty, set ContextBlock.PriorityShifty to 2.
lwz r16, KDP.PA_ECB(r1) lwz r16, KDP.PA_ECB(r1)
lwz r17, ContextBlock.PriorityShifty(r16) lwz r17, ContextBlock.PriorityShifty(r16)
andi. r9, r17, (1<<4)-1 andi. r9, r17, 0xF
li r17, 2 li r17, 2
bnelr- bnelr-
@ -102,6 +109,14 @@ InitRDYQs
###### ### ## ## ######## ###### ######## ######## ######
## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ## ## ##
###### ## ## ## ## ###### ## #### ######## ######## ######
## ######### ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ## ## ## ## ##
###### ## ## ### ######## ###### ## ## ## ######
; ...to (ECB *)r6 ; ...to (ECB *)r6
; (and also copy SPRG0 to r8) ; (and also copy SPRG0 to r8)
@ -144,6 +159,14 @@ Save_r24_r31
## ####### ### ######## ###### ######## ######## ######
## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## #### ######## ######## ######
## ## ## ######### ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ## ## ## ## ##
######## ####### ## ## ######## ###### ## ## ## ######
; ...from (ECB *)r6 ; ...from (ECB *)r6
Restore_r14_r31 Restore_r14_r31
@ -184,6 +207,14 @@ Restore_r24_r31
###### ### ## ## ######## ######## ######## ######## ######
## ## ## ## ## ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ## ## ##
###### ## ## ## ## ###### ###### ######## ######## ######
## ######### ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ## ## ## ##
###### ## ## ### ######## ## ## ## ## ######
; ...to (ECB *)r6 ; ...to (ECB *)r6
; (but first set the MSR_FP bit in MSR, but *unset* it in r11) ; (but first set the MSR_FP bit in MSR, but *unset* it in r11)
@ -246,6 +277,13 @@ Save_f0_f31
## ####### ### ######## ## ## ######## ######
## ## ## ## ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ######## ######
## ## ## ######### ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ## ## ## ##
######## ####### ## ## ######## ### ## ## ######
Restore_v0_v31 ; OUTSIDE REFERER Restore_v0_v31 ; OUTSIDE REFERER
li r8, 0x200 li r8, 0x200
@ -452,6 +490,14 @@ major_0x13988_0x2f8
###### ### ## ## ######## ## ## ######## ######
## ## ## ## ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ## ##
###### ## ## ## ## ###### ## ## ######## ######
## ######### ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ## ## ## ##
###### ## ## ### ######## ### ## ## ######
; Save_v0_v31 ; Save_v0_v31
; Xrefs: ; Xrefs:
@ -638,15 +684,22 @@ Save_v0_v31_0x1b8
; Remove a task from a queue, cleaning up the queue structures behind me. ######## ### ###### ## ## ## ## ## ## ######## ######## ## ##
## ## ## ## ## ## ## ## ## ### ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## #### ## ## ## ## ## ####
## ## ## ###### ##### ## ## ## ## ## ######## ## ## ##
## ######### ## ## ## ## ## ## #### ## ## ## ## ##
## ## ## ## ## ## ## ## ## ## ### ## ## ## ## ##
## ## ## ###### ## ## ####### ## ## ## ## ######## ##
; Remove a task from its RDYQ, cleaning up the queue structures behind me.
; If a queue is empty, unset the priority flag of the queue in ; If a queue is empty, unset the priority flag of the queue in
; PSA.PriorityFlags (presumably has no effect with non-ready queues). ; PSA.PriorityFlags. Also set the mysterious EWA.SchEvalFlag to 1.
; Also set the mysterious EWA.BinaryFlag to 1.
; ARG Task *r8 ; ARG Task *r8
; CLOB r16, r17, r18 ; CLOB r16, r17, r18
DequeueTask TaskUnready
lwz r17, Task.QueueMember + LLL.Next( r8) lwz r17, Task.QueueMember + LLL.Next( r8)
lbz r18, Task.MysteryByte1( r8) lbz r18, Task.MysteryByte1( r8)
@ -691,32 +744,18 @@ DequeueTask
mfsprg r17, 0 mfsprg r17, 0
li r16, 1 li r16, 1
stb r16, EWA.BinaryFlag(r17) stb r16, EWA.SchEvalFlag(r17)
blr blr
######## ### ###### ## ## ######## ######## ## ##
## ## ## ## ## ## ## ## ## ## ## ## ##
; TaskReadyAsNext ## ## ## ## ## ## ## ## ## ## ####
## ## ## ###### ##### ######## ## ## ##
; Xrefs: ## ######### ## ## ## ## ## ## ## ##
; major_0x02ccc ## ## ## ## ## ## ## ## ## ## ## ##
; MPCall_6 ## ## ## ###### ## ## ## ## ######## ##
; KCYieldWithHint
; MPCall_55
; KCStopScheduling
; MPCall_18
; MPCall_23
; MPCall_27
; MPCall_52
; MPCall_9
; KCThrowException
; MPCall_114
; major_0x130f0
; major_0x142dc
; CommonPIHPath
; These two entry cases specify different directions of queue insertion ; These two entry cases specify different directions of queue insertion
@ -787,6 +826,13 @@ TaskReadyCommonPath
###### ######## ######## ### ######## ###### ######## ########
## ## ## ## ## ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ## ## ##
###### ######## ###### ######## ## ## ## ###### ###### ##
## ## ## ## ## ## ######### ## ## ## ##
## ## ## ## ## ## ## ## ## ## ## ## ## ##
###### ## ## ######## ## ## ## ###### ######## ##
; Set the segment and block allocation table registers according to the ; Set the segment and block allocation table registers according to the
; SPAC structure passed in. On non-601 machines, unset the "guarded" bit ; SPAC structure passed in. On non-601 machines, unset the "guarded" bit
@ -796,7 +842,7 @@ TaskReadyCommonPath
; ARG AddressSpace *r8, AddressSpace *r9 (can be zero?) ; ARG AddressSpace *r8, AddressSpace *r9 (can be zero?)
SetAddrSpcRegisters SetSpaceSRsAndBATs
; This is the only function that hits this counter ; This is the only function that hits this counter
lwz r17, KDP.NanoKernelInfo + NKNanoKernelInfo.AddrSpcSetCtr(r1) lwz r17, KDP.NanoKernelInfo + NKNanoKernelInfo.AddrSpcSetCtr(r1)
@ -1084,59 +1130,41 @@ SetAddrSpcRegisters_0x314:
; major_0x142a8 ######## ######## ######## ## ### ## ## ## ##
## ## ## ## ## ## ## ### ## ## ##
## ## ## ## ## ## ## #### ## ####
######## ###### ## ## ## ## ## ## ## ##
## ## ## ## ## ######### ## #### ##
## ## ## ## ## ## ## ## ### ##
## ## ######## ## ## ## ## ## ## ##
; Xrefs: ReturnToAnyTask ; OUTSIDE REFERER
; skeleton_key lbz r8, EWA.SchEvalFlag(r1)
rlwinm. r9, r7, 0, 16, 16
major_0x142a8 ; OUTSIDE REFERER lwz r1, EWA.PA_KDP(r1)
lbz r8, EWA.BinaryFlag(r1)
rlwinm. r9, r7, 0, 16, 16
lwz r1, -0x0004(r1)
cmpwi cr1, r8, 0x00 cmpwi cr1, r8, 0x00
; sprg0 = for r1 and r6 bne- ReturnFromInterrupt
; r1 = kdp beq+ cr1, ReturnFromInterrupt
; r6 = register restore area
; r7 = flag to insert into XER
; r10 = new srr0 (return location)
; r11 = new srr1
; r12 = lr restore
; r13 = cr restore
bne- int_teardown
; sprg0 = for r1 and r6
; r1 = kdp
; r6 = register restore area
; r7 = flag to insert into XER
; r10 = new srr0 (return location)
; r11 = new srr1
; r12 = lr restore
; r13 = cr restore
beq+ cr1, int_teardown
; r6 = ewa
bl Save_r14_r31 bl Save_r14_r31
; r8 = sprg0 (not used by me) _Lock PSA.SchLock, scratch1=r27, scratch2=r28
_Lock PSA.SchLock, scratch1=r27, scratch2=r28
; major_0x142dc ######## ######## ######## ## ####### ######## ## ## ######## ########
## ## ## ## ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ## ## ## ##
######## ###### ## ## ## ## ## ######### ###### ########
## ## ## ## ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ## ## ## ##
## ## ######## ## ## ####### ## ## ## ######## ## ##
; Xrefs: RescheduleAndReturn ; OUTSIDE REFERER
; major_0x02ccc
; CommonMPCallReturnPath
; major_0x142a8
; major_0x14bcc
major_0x142dc ; OUTSIDE REFERER
mfsprg r14, 0 mfsprg r14, 0
li r8, 0x00 li r8, 0x00
stb r8, EWA.BinaryFlag(r14) stb r8, EWA.SchEvalFlag(r14)
lwz r31, -0x0008(r14) lwz r31, -0x0008(r14)
lwz r1, -0x0004(r14) lwz r1, -0x0004(r14)
lwz r9, 0x0ee4(r1) lwz r9, 0x0ee4(r1)
@ -1153,7 +1181,7 @@ major_0x142dc_0x38
cmpw r27, r26 cmpw r27, r26
mr r8, r31 mr r8, r31
beq- major_0x142dc_0x58 beq- major_0x142dc_0x58
bl DequeueTask bl TaskUnready
stb r26, 0x0019(r31) stb r26, 0x0019(r31)
mr r8, r31 mr r8, r31
bl TaskReadyAsPrev bl TaskReadyAsPrev
@ -1174,7 +1202,7 @@ major_0x142dc_0x5c
addi r30, r29, -0x08 addi r30, r29, -0x08
major_0x142dc_0x80 major_0x142dc_0x80
lhz r28, -0x0116(r14) lhz r28, EWA.CPUIndex(r14)
lwz r24, 0x0064(r30) lwz r24, 0x0064(r30)
lhz r25, 0x001a(r30) lhz r25, 0x001a(r30)
rlwinm. r8, r24, 0, 25, 26 rlwinm. r8, r24, 0, 25, 26
@ -1264,7 +1292,15 @@ major_0x142dc_0x1bc
; int_teardown ######## ######## ####
## ## ## ##
## ## ## ##
######## ###### ##
## ## ## ##
## ## ## ##
## ## ## ####
; ReturnFromInterrupt
; All MPCalls get here? ; All MPCalls get here?
; r0,7,8,9,10,11,12,13 restored from r6 area ; r0,7,8,9,10,11,12,13 restored from r6 area
@ -1276,8 +1312,8 @@ major_0x142dc_0x1bc
; Xrefs: ; Xrefs:
; non_skeleton_reset_trap ; non_skeleton_reset_trap
; major_0x142a8 ; ReturnToAnyTask
; major_0x142dc ; RescheduleAndReturn
; major_0x14548 ; major_0x14548
; > sprg0 = for r1 and r6 ; > sprg0 = for r1 and r6
@ -1289,20 +1325,20 @@ major_0x142dc_0x1bc
; > r12 = lr restore ; > r12 = lr restore
; > r13 = cr restore ; > r13 = cr restore
int_teardown ; OUTSIDE REFERER ReturnFromInterrupt ; OUTSIDE REFERER
lwz r8, 0x0edc(r1) lwz r8, 0x0edc(r1)
mfsprg r1, 0 mfsprg r1, 0
mtlr r12 mtlr r12
mtspr srr0, r10 mtspr srr0, r10
mtspr srr1, r11 mtspr srr1, r11
rlwinm. r8, r8, 0, 27, 27 rlwinm. r8, r8, 0, 27, 27
beq- int_teardown_0x2c beq- ReturnFromInterrupt_0x2c
mfxer r8 mfxer r8
rlwinm r8, r8, 0, 23, 21 rlwinm r8, r8, 0, 23, 21
rlwimi r8, r7, 19, 23, 23 rlwimi r8, r7, 19, 23, 23
mtxer r8 mtxer r8
int_teardown_0x2c ReturnFromInterrupt_0x2c
mtcr r13 mtcr r13
lwz r10, 0x0154(r6) lwz r10, 0x0154(r6)
lwz r11, 0x015c(r6) lwz r11, 0x015c(r6)
@ -1323,7 +1359,7 @@ int_teardown_0x2c
; major_0x14548 ; major_0x14548
; Xrefs: ; Xrefs:
; major_0x142dc ; RescheduleAndReturn
major_0x14548 ; OUTSIDE REFERER major_0x14548 ; OUTSIDE REFERER
lwz r16, 0x0064(r31) lwz r16, 0x0064(r31)
@ -1381,12 +1417,12 @@ major_0x14548_0x58
cmpwi r16, 0x00 cmpwi r16, 0x00
mr r8, r31 mr r8, r31
beql+ TaskReadyAsPrev beql+ TaskReadyAsPrev
major_0x14548_0xd4 major_0x14548_0xd4
mfsprg r19, 0 mfsprg r19, 0
li r8, 0x00 li r8, 0x00
stb r8, EWA.BinaryFlag(r19) stb r8, EWA.SchEvalFlag(r19)
lhz r8, -0x0116(r19) lhz r8, EWA.CPUIndex(r19)
lwz r6, 0x0088(r30) lwz r6, 0x0088(r30)
lwz r28, -0x0340(r19) lwz r28, -0x0340(r19)
sth r8, 0x001a(r30) sth r8, 0x001a(r30)
@ -1411,7 +1447,7 @@ major_0x14548_0xd4
cmpw r18, r9 cmpw r18, r9
beq- major_0x14548_0x148 beq- major_0x14548_0x148
mr r8, r18 mr r8, r18
bl SetAddrSpcRegisters bl SetSpaceSRsAndBATs
major_0x14548_0x148 major_0x14548_0x148
mfsprg r19, 0 mfsprg r19, 0
@ -1430,7 +1466,7 @@ major_0x14548_0x148
bsol+ cr6, Local_Panic bsol+ cr6, Local_Panic
clrlwi r8, r7, 0x08 clrlwi r8, r7, 0x08
stw r8, 0x0000(r6) stw r8, 0x0000(r6)
lwz r6, 0x0658(r1) lwz r6, KDP.PA_ECB(r1)
addi r26, r1, 0x360 addi r26, r1, 0x360
mtsprg 3, r26 mtsprg 3, r26
stw r26, 0x00f0(r30) stw r26, 0x00f0(r30)
@ -1449,9 +1485,9 @@ major_0x14548_0x148
stw r7, -0x0010(r19) stw r7, -0x0010(r19)
major_0x14548_0x1cc major_0x14548_0x1cc
lwz r17, 0x00cc(r6) lwz r17, ContextBlock.PriorityShifty(r6)
ori r17, r17, 0x100 ori r17, r17, 0x100
stw r17, 0x00cc(r6) stw r17, ContextBlock.PriorityShifty(r6)
lhz r17, -0x043c(r1) lhz r17, -0x043c(r1)
lwz r18, 0x067c(r1) lwz r18, 0x067c(r1)
cmplwi r17, 0xffff cmplwi r17, 0xffff
@ -1578,14 +1614,14 @@ major_0x14548_0x380
; r11 = new srr1 ; r11 = new srr1
; r12 = lr restore ; r12 = lr restore
; r13 = cr restore ; r13 = cr restore
b int_teardown b ReturnFromInterrupt
; major_0x148ec ; major_0x148ec
; Xrefs: ; Xrefs:
; major_0x142dc ; RescheduleAndReturn
; major_0x14548 ; major_0x14548
major_0x148ec ; OUTSIDE REFERER major_0x148ec ; OUTSIDE REFERER
@ -1666,18 +1702,20 @@ major_0x148ec_0xc8
; setup ; setup
; KCStopScheduling ; KCStopScheduling
; major_0x0c8b4 ; major_0x0c8b4
; major_0x0ccf4 ; SignalSemaphore
; MPCall_28 ; MPCall_28
; major_0x0d35c ; SetEvent
; MPCall_8 ; MPCall_8
; major_0x130f0 ; major_0x130f0
; major_0x142dc ; RescheduleAndReturn
; major_0x14bcc ; major_0x14bcc
; CommonPIHPath ; CommonPIHPath
; Almost certain this was hand-written. Has a typo, and some ; Almost certain this was hand-written. Has a typo, and some
; instructions the compiler rarely touched, and is in hot path. ; instructions the compiler rarely touched, and is in hot path.
; ARG Task *r8
major_0x149d4 ; OUTSIDE REFERER major_0x149d4 ; OUTSIDE REFERER
crset cr1_eq crset cr1_eq
b major_0x149d4_0xc b major_0x149d4_0xc
@ -1688,61 +1726,58 @@ CalculateTimeslice ; OUTSIDE REFERER
major_0x149d4_0xc: major_0x149d4_0xc:
; CALCULATE TASK'S TIMESLICE
; Get task info
lwz r18, Task.QueueMember + LLL.Next(r8) lwz r18, Task.QueueMember + LLL.Next(r8)
lwz r16, Task.QueueMember + LLL.Freeform(r8) ; points to RDYQ lwz r16, Task.QueueMember + LLL.Freeform(r8) ; points to RDYQ
cmpwi r18, 0 cmpwi r18, 0
lwz r17, Task.Weight(r8) lwz r17, Task.Weight(r8)
beq+ Local_Panic beq+ Local_Panic
; Get queue info
lwz r18, ReadyQueue.TotalWeight(r16) lwz r18, ReadyQueue.TotalWeight(r16)
lwz r19, ReadyQueue.Timecake(r16) lwz r19, ReadyQueue.Timecake(r16)
lwz r20, ReadyQueue.Timecake + 4(r16) lwz r20, ReadyQueue.Timecake + 4(r16)
; Skip some stuff if this task accounts for all of the weight in this queue ; Skip calculation if only task in queue
cmpw r18, r17 cmpw r18, r17
rlwinm r17, r17, 10, 0, 22 ; looks like a typo; should multiply wt by 1024 rlwinm r17, r17, 10, 0, 22 ; r17 *= 1024, but with minor masking typo?
beq- @is_only_weighted_task beq- @is_only_weighted_task
divw. r18, r17, r18 ; how many slices do I get in 1024? divw. r18, r17, r18 ; r8 = my share of this queue's weight, out of 1024
ble- @no_time ; if not specified, fall back on 1/1024
ble- @no_time ; fall back on one slice worth of ticks per 1024 slices ; t = t * r18 = my share of queue's time, out of 1024
; r19 || r20 = (r19 || r20) * r18 = ticks owed to this task in 1024 slices
mulhw r17, r20, r18 mulhw r17, r20, r18
mullw r19, r19, r18 mullw r19, r19, r18
mullw r20, r20, r18 mullw r20, r20, r18
add r19, r19, r17 add r19, r19, r17
@no_time @no_time
; Set r19 || r20 to ticks owed to this task per RoundRobinTime ; t = t / 1024 = my share of queue's time
srwi r20, r20, 10 srwi r20, r20, 10
rlwimi r20, r19, 22, 0, 9 rlwimi r20, r19, 22, 0, 9
srwi r19, r19, 10 srwi r19, r19, 10
@is_only_weighted_task @is_only_weighted_task
; NOW: r19 || r20 == task's slice of queue Timecake, in TB/DEC units
; Now r19 || r20 contains something meaningful
lbz r18, Task.Priority(r8) lbz r18, Task.Priority(r8)
cmpwi r18, Task.kNominalPriority cmpwi r18, Task.kNominalPriority
ori r20, r20, 1 ; why make this odd? ori r20, r20, 1 ; why make this odd?
bge- @nominal_or_idle
bge- @priority_nominal_or_idle ;critical or latency protected
; Critical or latency protection: save the low word of (ticks per round)
stw r20, 0x00fc(r8) stw r20, 0x00fc(r8)
blr blr
@priority_nominal_or_idle @nominal_or_idle
lwz r16, 0x00d8(r8) lwz r16, 0x00d8(r8)
lwz r17, 0x00dc(r8) lwz r17, 0x00dc(r8)
beq- cr1, @definitely_do_the_thing bc BO_IF, cr1_eq, @definitely_do_the_thing
cmpwi r16, 0 cmpwi r16, 0
cmplwi cr2, r17, 0 cmplwi cr2, r17, 0
blt- @definitely_do_the_thing blt- @definitely_do_the_thing
@ -1750,6 +1785,7 @@ major_0x149d4_0xc:
bgtlr- cr2 bgtlr- cr2
@definitely_do_the_thing @definitely_do_the_thing
;double-int is negative or zero
mfxer r18 mfxer r18
addc r20, r20, r17 addc r20, r20, r17
adde r19, r19, r16 adde r19, r19, r16
@ -1780,130 +1816,114 @@ clear_cr0_lt ; OUTSIDE REFERER
; Xrefs: ; Xrefs:
; IntDecrementer ; IntDecrementer
; major_0x142dc ; RescheduleAndReturn
major_0x14a98 ; OUTSIDE REFERER major_0x14a98 ; OUTSIDE REFERER
rlwinm r8, r7, 10, 0, 0 rlwinm r8, r7, 10, 0, 0
lwz r18, 0x0658(r1) lwz r18, KDP.PA_ECB(r1)
nand. r8, r8, r8 nand. r8, r8, r8
lwz r17, 0x00cc(r18) lwz r17, ContextBlock.PriorityShifty(r18)
bltlr- bltlr-
cmpwi r17, 0x00 cmpwi r17, 0
rlwinm r9, r17, 0, 22, 22 rlwinm r9, r17, 0, 22, 22
blt- major_0x14a98_0x54 blt- major_0x14a98_0x54
cmpwi r9, 0x200 cmpwi r9, 0x200
lwz r16, 0x01cc(r18) lwz r16, ContextBlock.r25(r18)
beq- major_0x14a98_0x48 beq- major_0x14a98_0x48
clrlwi r8, r16, 0x1d clrlwi r8, r16, 29
clrlwi r9, r17, 0x1c clrlwi r9, r17, 28
cmpwi r8, 0x06 cmpwi r8, 6
bgt- major_0x14a98_0x48 bgt- major_0x14a98_0x48
cmpw r8, r9 cmpw r8, r9
bltlr- bltlr-
cmpw r8, r8 cmpw r8, r8
major_0x14a98_0x48 major_0x14a98_0x48
ori r17, r17, 0x100 ori r17, r17, 0x100
stw r17, 0x00cc(r18) stw r17, ContextBlock.PriorityShifty(r18)
blr blr
major_0x14a98_0x54 major_0x14a98_0x54
clrlwi r17, r17, 0x01 clrlwi r17, r17, 1
stw r17, 0x00cc(r18) stw r17, ContextBlock.PriorityShifty(r18)
blr blr
; major_0x14af8 ######## ## ### ###### ######## ## ## ### ##
## ## ## ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ## ##
###### ## ## ## ## #### ###### ## ## ## ## ##
## ## ######### ## ## ## ## ## ######### ##
## ## ## ## ## ## ## ## ## ## ## ##
## ######## ## ## ###### ######## ### ## ## ########
; Xrefs: FlagSchEvaluationIfTaskRequires ; OUTSIDE REFERER
; setup lwz r16, Task.Flags(r8)
; major_0x02ccc
; MPCall_6
; KCYieldWithHint
; KCStopScheduling
; KCMarkPMFTask
; MPCall_16
; major_0x0c8b4
; major_0x0ccf4
; MPCall_21
; MPCall_28
; MPCall_26
; MPCall_50
; major_0x0d35c
; major_0x0dce8
; MPCall_8
; MPCall_9
; MPCall_14
; KCThrowException
; MPCall_58
; MPCall_114
; major_0x130f0
; CommonPIHPath
major_0x14af8 ; OUTSIDE REFERER
lwz r16, 0x0064(r8)
mfsprg r15, 0 mfsprg r15, 0
rlwinm. r16, r16, 0, 25, 26 rlwinm. r16, r16, 0, Task.kFlag25, Task.kFlag26
bne- major_0x14af8_0xa0 bne- major_0x14af8_0xa0
addi r16, r15, -0x340
lbz r17, 0x0019(r8)
lwz r19, 0x0008(r16)
lwz r14, 0x0024(r19)
cmpwi r14, 0x02
blt- major_0x14af8_0xa0
lwz r14, 0x0020(r19)
mr r18, r16
b major_0x14af8_0x3c
major_0x14af8_0x34 addi r16, r15, EWA.CPUBase
lbz r17, 0x0019(r8)
lwz r19, CPU.LLL + LLL.Freeform(r16)
lwz r14, CoherenceGroup.ScheduledCpuCount(r19)
cmpwi r14, 2
blt- major_0x14af8_0xa0
;multiprocessor
lwz r14, CoherenceGroup.CpuCount(r19)
mr r18, r16
b @loopentry
@34
lwz r16, 0x0008(r19) lwz r16, 0x0008(r19)
major_0x14af8_0x38 @38
addi r16, r16, -0x08 addi r16, r16, -0x08
major_0x14af8_0x3c @loopentry
addi r14, r14, -0x01 addi r14, r14, -0x01
lbz r20, 0x0229(r16) lbz r20, 0x0229(r16)
lwz r21, 0x0018(r16) lwz r21, 0x0018(r16)
cmpw cr1, r17, r20 cmpw cr1, r17, r20
rlwinm. r21, r21, 0, 28, 28 rlwinm. r21, r21, 0, 28, 28
bge- cr1, major_0x14af8_0x60 bge- cr1, @60
beq- major_0x14af8_0x60 beq- @60
mr r17, r20 mr r17, r20
mr r18, r16 mr r18, r16
major_0x14af8_0x60 @60
lwz r16, 0x0010(r16) lwz r16, 0x0010(r16)
cmpwi cr1, r14, 0x00 cmpwi cr1, r14, 0x00
cmpw r16, r19 cmpw r16, r19
ble- cr1, major_0x14af8_0x78 ble- cr1, @78
beq+ major_0x14af8_0x34 beq+ @34
b major_0x14af8_0x38 b @38
major_0x14af8_0x78 @78
lbz r16, 0x0019(r8) lbz r16, 0x0019(r8)
cmpw r17, r16 cmpw r17, r16
blelr- blelr-
lhz r17, -0x0116(r15) lhz r17, EWA.CPUIndex(r15)
lhz r18, 0x022a(r18) lhz r18, CPU.EWA + EWA.CPUIndex(r18)
cmpw r18, r17 cmpw r18, r17
bne- major_0x14af8_0xb4 bne- BEFOUR
major_0x14af8_0x94 NINETYFOUR
li r16, 0x01 li r16, 0x01
stb r16, EWA.BinaryFlag(r15) stb r16, EWA.SchEvalFlag(r15)
blr blr
major_0x14af8_0xa0 ; OUTSIDE REFERER major_0x14af8_0xa0
mfsprg r15, 0 mfsprg r15, 0
lhz r18, Task.MysteryHalf(r8) lhz r18, Task.CPUIndex(r8)
lhz r17, -0x0116(r15) ; somewhere in EWA lhz r17, EWA.CPUIndex(r15)
cmpw r17, r18 cmpw r17, r18
beq+ major_0x14af8_0x94 beq+ NINETYFOUR
major_0x14af8_0xb4 BEFOUR
lwz r9, 0x0ee0(r1) lwz r9, 0x0ee0(r1)
addi r9, r9, 0x01 addi r9, r9, 0x01
stw r9, 0x0ee0(r1) stw r9, 0x0ee0(r1)
@ -1945,7 +1965,7 @@ major_0x14bcc
_log 'Sch: Symmetric Multiprocessing^n' _log 'Sch: Symmetric Multiprocessing^n'
_log 'Sch: On CPU ' _log 'Sch: On CPU '
lhz r8, 0x022a(r3) lhz r8, CPU.EWA + EWA.CPUIndex(r3)
bl Printh bl Printh
_log ' ID-' _log ' ID-'
lwz r8, -0x0340(r3) lwz r8, -0x0340(r3)
@ -1967,75 +1987,101 @@ major_0x14bcc
bl PagingFlushTLB bl PagingFlushTLB
; This is important to figure out:
_log 'Sch: Starting SMP idle task^n' _log 'Sch: Starting SMP idle task^n'
_Lock PSA.SchLock, scratch1=r27, scratch2=r28 _Lock PSA.SchLock, scratch1=r27, scratch2=r28
mfsprg r14, 0 mfsprg r14, 0
lwz r31, 0x001c(r3) lwz r31, CPU.IdleTaskPtr(r3)
li r8, 0x00
stb r8, EWA.BinaryFlag(r14) li r8, 0
lwz r6, 0x0088(r31) stb r8, EWA.SchEvalFlag(r14)
stw r31, -0x0008(r14)
stw r6, -0x0014(r14) lwz r6, Task.ContextBlockPtr(r31)
lwz r7, 0x0000(r6)
lwz r28, 0x0004(r6) stw r31, EWA.PA_CurTask(r14)
stw r7, -0x0010(r14)
stw r28, -0x000c(r14) stw r6, EWA.PA_ContextBlock(r14)
lwz r8, 0x00f0(r31)
lwz r7, ContextBlock.Flags(r6)
lwz r28, ContextBlock.Enables(r6)
stw r7, EWA.Flags(r14)
stw r28, EWA.Enables(r14)
lwz r8, Task.YellowVecTblPtr(r31)
mtsprg 3, r8 mtsprg 3, r8
lwz r10, 0x00fc(r6)
lwz r11, 0x00a4(r6) lwz r10, ContextBlock.CodePtr(r6)
lwz r13, 0x00dc(r6) lwz r11, ContextBlock.MSR(r6)
lwz r12, 0x00ec(r6) lwz r13, 0x00dc(r6)
lwz r12, 0x00ec(r6)
_log 'EWA ' _log 'EWA '
mr r8, r14 mr r8, r14
bl Printw bl Printw
_log 'ContextPtr ' _log 'ContextPtr '
mr r8, r6 mr r8, r6
bl Printw bl Printw
_log 'Flags ' _log 'Flags '
mr r8, r7 mr r8, r7
bl Printw bl Printw
_log 'Enables ' _log 'Enables '
mr r8, r28 mr r8, r28
bl Printw bl Printw
_log '^n' _log '^n'
addi r16, r31, 0x08
addi r16, r31, Task.QueueMember
RemoveFromList r16, scratch1=r17, scratch2=r18 RemoveFromList r16, scratch1=r17, scratch2=r18
li r16, 0x02
stb r16, 0x0018(r31) li r16, 2
lwz r16, 0x0064(r31) stb r16, Task.MysteryByte1(r31)
ori r16, r16, 0x20
stw r16, 0x0064(r31) lwz r16, Task.Flags(r31)
ori r16, r16, 0x20
stw r16, Task.Flags(r31)
mfsprg r14, 0 mfsprg r14, 0
lbz r8, 0x0019(r31)
stb r8, -0x0117(r14) lbz r8, Task.Priority(r31)
lwz r8, 0x0070(r31) stb r8, EWA.TaskPriority(r14)
li r9, 0x00
bl SetAddrSpcRegisters lwz r8, Task.AddressSpacePtr(r31)
li r9, 0
bl SetSpaceSRsAndBATs
_log 'Adding idle task 0x' _log 'Adding idle task 0x'
mr r8, r31 mr r8, r31
bl Printw bl Printw
_log 'to the ready queue^n' _log 'to the ready queue^n'
mr r8, r31 mr r8, r31
bl TaskReadyAsPrev bl TaskReadyAsPrev
bl CalculateTimeslice bl CalculateTimeslice
lwz r16, 0x0018(r3) lwz r16, CPU.Eff(r3)
ori r16, r16, 0x08 ori r16, r16, 8
stw r16, 0x0018(r3) stw r16, CPU.Eff(r3)
lwz r17, 0x0008(r3)
lwz r17, Task.QueueMember + LLL.Freeform(r3)
lwz r16, 0x0024(r17) lwz r16, 0x0024(r17)
addi r16, r16, 0x01 addi r16, r16, 0x01
stw r16, 0x0024(r17) stw r16, 0x0024(r17)
li r8, 0x01
li r8, 1
mtspr dec, r8 mtspr dec, r8
_log 'Sch: Going to ' _log 'Sch: Going to '
mr r8, r11 mr r8, r11 ; MSR
bl Printw bl Printw
mr r8, r10 mr r8, r10 ; PC
bl Printw bl Printw
_log '^n' _log '^n'
mr r30, r31 mr r30, r31
b major_0x142dc_0xd8 b major_0x142dc_0xd8
b major_0x142dc_0x58 b major_0x142dc_0x58
@ -2138,7 +2184,7 @@ StopProcessor
lwz r8, 0x001c(r31) lwz r8, 0x001c(r31)
li r9, 0x00 li r9, 0x00
stw r9, 0x001c(r31) stw r9, 0x001c(r31)
bl DequeueTask bl TaskUnready
addi r16, r1, -0xa44 addi r16, r1, -0xa44
addi r17, r8, 0x08 addi r17, r8, 0x08
stw r16, 0x0000(r17) stw r16, 0x0000(r17)
@ -2147,7 +2193,7 @@ StopProcessor
_AssertAndRelease PSA.SchLock, scratch=r16 _AssertAndRelease PSA.SchLock, scratch=r16
_log 'SIGP kStopProcessor^n' _log 'SIGP kStopProcessor^n'
li r3, 0x03 li r3, 0x03
lhz r4, 0x022a(r31) lhz r4, CPU.EWA + EWA.CPUIndex(r31)
li r0, 0x2e li r0, 0x2e
twi 31, r31, 0x08 twi 31, r31, 0x08
_log 'Stop didn''t work - going to sleep.^n' _log 'Stop didn''t work - going to sleep.^n'

View File

@ -122,7 +122,7 @@ MPCall_103_0x10c
mr r29, r17 mr r29, r17
li r16, 0x06 li r16, 0x06
stw r16, -0x0238(r15) stw r16, -0x0238(r15)
lhz r16, -0x0116(r15) lhz r16, EWA.CPUIndex(r15)
stw r16, -0x0234(r15) stw r16, -0x0234(r15)
li r8, 0x02 li r8, 0x02
@ -259,7 +259,7 @@ MPCall_103_0x270
mfsprg r15, 0 mfsprg r15, 0
li r16, 0x11 li r16, 0x11
stw r16, -0x0238(r15) stw r16, -0x0238(r15)
lhz r16, -0x0116(r15) lhz r16, EWA.CPUIndex(r15)
stw r16, -0x0234(r15) stw r16, -0x0234(r15)
li r8, 0x02 li r8, 0x02
@ -359,12 +359,12 @@ RestoreKernelState_0x144
mfsprg r15, 0 mfsprg r15, 0
lwz r8, -0x001c(r15) lwz r8, -0x001c(r15)
li r9, 0x00 li r9, 0x00
bl SetAddrSpcRegisters bl SetSpaceSRsAndBATs
isync isync
mfsprg r15, 0 mfsprg r15, 0
li r16, 0x07 li r16, 0x07
stw r16, -0x0238(r15) stw r16, -0x0238(r15)
lhz r16, -0x0116(r15) lhz r16, EWA.CPUIndex(r15)
stw r16, -0x0234(r15) stw r16, -0x0234(r15)
li r8, 0x02 li r8, 0x02
@ -374,7 +374,7 @@ RestoreKernelState_0x144
mfsprg r15, 0 mfsprg r15, 0
li r16, 0x11 li r16, 0x11
stw r16, -0x0238(r15) stw r16, -0x0238(r15)
lhz r16, -0x0116(r15) lhz r16, EWA.CPUIndex(r15)
stw r16, -0x0234(r15) stw r16, -0x0234(r15)
li r8, 0x02 li r8, 0x02

3031
NanoKernel/NKSync.s Normal file

File diff suppressed because it is too large Load Diff

View File

@ -8,6 +8,9 @@ Local_Panic set *
; ARG ProcessID r3
; RET OSStatus r3, TaskID r10
DeclareMPCall 7, MPCall_7 DeclareMPCall 7, MPCall_7
MPCall_7 ; OUTSIDE REFERER MPCall_7 ; OUTSIDE REFERER
@ -17,62 +20,71 @@ MPCall_7 ; OUTSIDE REFERER
_Lock PSA.SchLock, scratch1=r16, scratch2=r17 _Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3 mr r8, r3
; r8 = id
bl LookupID bl LookupID
cmpwi r9, Process.kIDClass cmpwi r9, Process.kIDClass
mr r30, r8 mr r30, r8
bne+ ReleaseAndReturnMPCallInvalidIDErr bne+ ReleaseAndReturnMPCallInvalidIDErr
lwz r16, 0x0008(r30)
rlwinm. r17, r16, 0, 30, 30 lwz r16, Process.Flags(r30)
rlwinm. r17, r16, 0, 30, 30
bne+ ReleaseAndReturnMPCallOOM bne+ ReleaseAndReturnMPCallOOM
; ARG CPUFlags r7, Process *r8
bl CreateTask bl CreateTask
; RET Task *r8
mr. r31, r8 mr. r31, r8
beq+ major_0x0af60 beq+ ReleaseAndScrambleMPCall
mfsprg r15, 0 mfsprg r15, 0
lwz r17, 0x0000(r31)
stw r17, 0x0154(r6) lwz r17, Task.ID(r31)
lhz r16, -0x0116(r15) stw r17, ContextBlock.r10(r6)
sth r16, 0x001a(r31)
addi r16, r31, 0x100 lhz r16, EWA.CPUIndex(r15)
lwz r17, 0x013c(r6) sth r16, Task.CPUIndex(r31)
stw r17, 0x0164(r16)
lwz r17, 0x0144(r6)
stw r17, 0x00fc(r16) addi r16, r31, Task.ContextBlock
lwz r17, 0x014c(r6)
stw r17, 0x0114(r16) lwz r17, ContextBlock.r7(r6)
stw r17, ContextBlock.r12(r16)
lwz r17, ContextBlock.r8(r6)
stw r17, ContextBlock.CodePtr(r16)
lwz r17, ContextBlock.r9(r6)
stw r17, ContextBlock.r2(r16)
stw r4, 0x0098(r31) stw r4, 0x0098(r31)
lwz r17, 0x0134(r6)
lwz r17, ContextBlock.r6(r6)
stw r17, 0x00ec(r31) 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 lwz r16, Task.Flags(r28)
stw r16, 0x0064(r28)
rlwinm. r8, r5, 0, 30, 30
beq- @noflag
oris r16, r16, 0x40 ; Task.kFlag9
@noflag
rlwinm. r8, r5, 0, 29, 29
beq- @noflag2
oris r16, r16, 0x02 ; Task.kFlag14
@noflag2
stw r16, Task.Flags(r28)
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall b ReleaseAndReturnZeroFromMPCall
;Xrefs: ; ARG GlobalCPUFlags r7, Process *r8
;setup
;major_0x0bb20
;major_0x0e284
; ARG EmpiricalCpuFeatures r7, Process *r8
; RET Task *r8 ; RET Task *r8
CreateTask CreateTask
; Save arg and lr for later ; Save arg and lr for later
@ -122,9 +134,9 @@ CreateTask
; (NOT a semaphore queue) ; (NOT a semaphore queue)
addi r16, r28, Task.SemaphoreLLL addi r16, r28, Task.SemaphoreLLL
StartLoadingWord r17, 'SEMA' _lstart r17, 'SEMA'
stw r16, LLL.Next(r16) stw r16, LLL.Next(r16)
FinishLoadingWord _lfinish
stw r16, LLL.Prev(r16) stw r16, LLL.Prev(r16)
stw r17, LLL.Signature(r16) stw r17, LLL.Signature(r16)
@ -196,8 +208,8 @@ CreateTask
li r16, 0 li r16, 0
stb r16, Task.MysteryByte1(r28) stb r16, Task.MysteryByte1(r28)
li r16, 9 li r16, 9 ; (Z>>Task.kFlag28) | (Z>>Task.kFlag31)
stw r16, 0x0064(r28) stw r16, Task.Flags(r28)
lisori r16, 'time' lisori r16, 'time'
stw r16, 0x0024(r28) stw r16, 0x0024(r28)
@ -217,8 +229,8 @@ CreateTask
addi r16, r28, Task.ContextBlock addi r16, r28, Task.ContextBlock
stw r16, Task.ContextBlockPtr(r28) ; overridden to real ECB on blue stw r16, Task.ContextBlockPtr(r28) ; overridden to real ECB on blue
lwz r16, PSA.EmpiricalCpuFeatures(r1) lwz r16, PSA.GlobalCPUFlags(r1)
stw r16, Task.ContextBlock + ContextBlock.EmpiricalCpuFeatures(r28) stw r16, Task.ContextBlock + ContextBlock.Flags(r28)
lwz r16, PSA.UserModeMSR(r1) lwz r16, PSA.UserModeMSR(r1)
stw r16, Task.ContextBlock + ContextBlock.MSR(r28) stw r16, Task.ContextBlock + ContextBlock.MSR(r28)
@ -230,7 +242,7 @@ CreateTask
lwz r17, Task.NotificationPtr(r28) lwz r17, Task.NotificationPtr(r28)
stw r16, 0x0010(r17) stw r16, 0x0010(r17)
stw r16, 0x0014(r17) stw r16, 0x0014(r17)
li r16, -0x7271 li r16, kMPTaskAbortedErr
stw r16, 0x0018(r17) stw r16, 0x0018(r17)
li r16, 0 li r16, 0
@ -346,7 +358,7 @@ MPCall_8 ; OUTSIDE REFERER
mr r8, r31 mr r8, r31
bl TaskReadyAsPrev bl TaskReadyAsPrev
bl CalculateTimeslice bl CalculateTimeslice
bl major_0x14af8 bl FlagSchEvaluationIfTaskRequires
; r1 = kdp ; r1 = kdp
b ReleaseAndReturnZeroFromMPCall b ReleaseAndReturnZeroFromMPCall
@ -383,7 +395,7 @@ MPCall_9 ; OUTSIDE REFERER
beq- cr1, MPCall_9_0xb4 beq- cr1, MPCall_9_0xb4
mfsprg r15, 0 mfsprg r15, 0
lhz r18, 0x001a(r31) lhz r18, 0x001a(r31)
lhz r17, -0x0116(r15) lhz r17, EWA.CPUIndex(r15)
cmpw r18, r17 cmpw r18, r17
beq- MPCall_9_0xe0 beq- MPCall_9_0xe0
ori r16, r16, 0x400 ori r16, r16, 0x400
@ -401,7 +413,7 @@ MPCall_9_0x98 ; OUTSIDE REFERER
ori r16, r16, 0x02 ori r16, r16, 0x02
stw r16, 0x0064(r31) stw r16, 0x0064(r31)
lwz r17, 0x009c(r31) lwz r17, 0x009c(r31)
li r16, -0x7271 li r16, kMPTaskAbortedErr
stw r16, 0x0018(r17) stw r16, 0x0018(r17)
b MPCall_9_0xfc b MPCall_9_0xfc
@ -416,7 +428,7 @@ MPCall_9_0xe0
ori r16, r16, 0x02 ori r16, r16, 0x02
stw r16, 0x0064(r31) stw r16, 0x0064(r31)
mr r8, r31 mr r8, r31
bl DequeueTask bl TaskUnready
MPCall_9_0xf0 MPCall_9_0xf0
lwz r17, 0x009c(r31) lwz r17, 0x009c(r31)
@ -432,7 +444,7 @@ MPCall_9_0xfc
cmpwi r8, 0x01 cmpwi r8, 0x01
bne- MPCall_9_0x130 bne- MPCall_9_0x130
addi r8, r31, 0x20 addi r8, r31, 0x20
bl major_0x136c8 bl DequeueTimer
MPCall_9_0x130 MPCall_9_0x130
lwz r8, 0x0098(r31) lwz r8, 0x0098(r31)
@ -447,7 +459,7 @@ MPCall_9_0x130
bne- MPCall_9_0x15c bne- MPCall_9_0x15c
mr r31, r8 mr r31, r8
mr r8, r17 mr r8, r17
bl major_0x0c8b4 bl EnqueueMessage ; Message *r8, Queue *r31
b ReleaseAndReturnMPCall b ReleaseAndReturnMPCall
MPCall_9_0x15c MPCall_9_0x15c
@ -595,94 +607,102 @@ MPCall_14_0x70
DeclareMPCall 56, MPCall_56 ; MPLibrary passthrough
MPCall_56 ; OUTSIDE REFERER ; When an exception occurs, the message to the queue will be:
; (32 bits) task ID
; (32 bits) exception type a la MachineExceptions.h
; (32 bits) 0 (reserved)
; ARG TaskID r3, QueueID r4
; RET OSStatus r3
DeclareMPCall 56, MPSetExceptionHandler
MPSetExceptionHandler
_Lock PSA.SchLock, scratch1=r16, scratch2=r17 _Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3 mr r8, r3
; r8 = id
bl LookupID bl LookupID
cmpwi r9, Task.kIDClass cmpwi r9, Task.kIDClass
bne+ ReleaseAndReturnMPCallInvalidIDErr bne+ ReleaseAndReturnMPCallInvalidIDErr
mr r31, r8 mr r31, r8
mr r8, r4 mr r8, r4
; r8 = id
bl LookupID bl LookupID
cmpwi r9, 0 ; invalid
cmpwi cr1, r9, 0x04 cmpwi r9, 0
beq- MPCall_56_0x44 cmpwi cr1, r9, Queue.kIDClass
beq- @isnil
bne+ cr1, ReleaseAndReturnMPCallInvalidIDErr bne+ cr1, ReleaseAndReturnMPCallInvalidIDErr
@isnil
MPCall_56_0x44
mr r30, r8 mr r30, r8
stw r4, 0x00f4(r31) stw r4, Task.ExceptionHandlerID(r31)
; r1 = kdp
b ReleaseAndReturnZeroFromMPCall b ReleaseAndReturnZeroFromMPCall
; KCThrowException ; MPLibrary passthrough
; Throws an exception to a specified task. ; Throws an exception to a specified task.
; > r3 = MPTaskID task ; ARG TaskID r3, ExceptionKind r4
; > r4 = MPExceptionKind kind ; RET OSStatus r3
; < r3 = result code DeclareMPCall 57, MPThrowException
DeclareMPCall 57, KCThrowException MPThrowException
KCThrowException ; OUTSIDE REFERER
mfsprg r15, 0 mfsprg r15, 0
_Lock PSA.SchLock, scratch1=r16, scratch2=r17 _Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3 mr r8, r3
; r8 = id
bl LookupID bl LookupID
cmpwi r9, Task.kIDClass cmpwi r9, Task.kIDClass
bne+ ReleaseAndReturnMPCallInvalidIDErr bne+ ReleaseAndReturnMPCallInvalidIDErr
mr r31, r8 mr r31, r8
lwz r16, 0x0064(r31)
mtcr r16 ; This is gold!
li r3, -0x7271 lwz r16, Task.Flags(r31)
beq+ cr7, ReleaseAndReturnMPCall mtcr r16
li r3, -0x726c
beq+ cr5, ReleaseAndReturnMPCall li r3, kMPTaskAbortedErr
beq+ cr3, ReleaseAndReturnMPCallOOM bc BO_IF, 30, ReleaseAndReturnMPCall
li r3, kMPTaskStoppedErr
bc BO_IF, 22, ReleaseAndReturnMPCall
bc BO_IF, 14, ReleaseAndReturnMPCallOOM
lbz r17, 0x0018(r31) lbz r17, 0x0018(r31)
lhz r18, 0x001a(r31) lhz r18, 0x001a(r31)
cmpwi cr1, r17, 0x00 cmpwi cr1, r17, 0x00
bne- cr1, KCThrowException_0x70 bc BO_IF_NOT, 6, KCThrowException_0x70
ori r16, r16, 0x600 ori r16, r16, 0x600
stw r4, 0x00f8(r31) stw r4, 0x00f8(r31)
stw r16, 0x0064(r31) stw r16, 0x0064(r31)
li r3, -0x726b
li r3, kMPTaskBlockedErr
b ReleaseAndReturnMPCall b ReleaseAndReturnMPCall
KCThrowException_0x70 KCThrowException_0x70
lhz r19, -0x0116(r15) lhz r19, EWA.CPUIndex(r15)
cmpw r19, r18 cmpw r19, r18
bne- KCThrowException_0xb8 bne- KCThrowException_0xb8
ori r16, r16, 0x200 ori r16, r16, 0x200
stw r4, 0x00f8(r31) stw r4, 0x00f8(r31)
stw r16, 0x0064(r31) stw r16, 0x0064(r31)
mr r8, r31 mr r8, r31
bl DequeueTask bl TaskUnready
addi r16, r1, -0xa34 addi r16, r1, -0xa34
addi r17, r31, 0x08 addi r17, r31, 0x08
stw r16, 0x0000(r17) stw r16, 0x0000(r17)
InsertAsPrev r17, r16, scratch=r18 InsertAsPrev r17, r16, scratch=r18
li r3, -0x726c li r3, kMPTaskStoppedErr
b ReleaseAndReturnMPCall b ReleaseAndReturnMPCall
KCThrowException_0xb8 KCThrowException_0xb8
@ -720,21 +740,24 @@ MPCall_58 ; OUTSIDE REFERER
bne+ ReleaseAndReturnMPCallInvalidIDErr bne+ ReleaseAndReturnMPCallInvalidIDErr
mr r31, r8 mr r31, r8
lwz r29, 0x0064(r31)
lwz r29, Task.Flags(r31)
mtcr r29 mtcr r29
li r3, -0x7271
beq+ cr7, ReleaseAndReturnMPCall li r3, kMPTaskAbortedErr
beq- cr4, MPCall_58_0x44 bc BO_IF, 30, ReleaseAndReturnMPCall
bne+ cr5, ReleaseAndReturnMPCallOOM
bc BO_IF, 18, MPCall_58_0x44
bc BO_IF_NOT, 22, ReleaseAndReturnMPCallOOM
MPCall_58_0x44 MPCall_58_0x44
mtcr r4 mtcr r4
lwz r30, 0x0088(r31) lwz r30, 0x0088(r31)
bns- cr7, MPCall_58_0x68 bc BO_IF_NOT, 31, MPCall_58_0x68
li r8, 0x1c li r8, 0x1c
bl PoolAlloc_with_crset bl PoolAlloc_with_crset
cmpwi r8, 0x00 cmpwi r8, 0x00
beq+ major_0x0af60 beq+ ReleaseAndScrambleMPCall
li r3, 0x00 li r3, 0x00
b MPCall_58_0x114 b MPCall_58_0x114
@ -768,7 +791,7 @@ MPCall_58_0xb4
RemoveFromList r16, scratch1=r17, scratch2=r18 RemoveFromList r16, scratch1=r17, scratch2=r18
mr r8, r31 mr r8, r31
bl TaskReadyAsPrev bl TaskReadyAsPrev
bl major_0x14af8 bl FlagSchEvaluationIfTaskRequires
MPCall_58_0xe0 MPCall_58_0xe0
; r1 = kdp ; r1 = kdp
@ -783,14 +806,14 @@ FuncExportedFromTasks ; OUTSIDE REFERER
InsertAsPrev r17, r16, scratch=r18 InsertAsPrev r17, r16, scratch=r18
li r8, 0x1c li r8, 0x1c
bl PoolAlloc_with_crset bl PoolAlloc_with_crset
lwz r29, 0x0064(r31) lwz r29, Task.Flags(r31)
ori r29, r29, 0x200 _bset r29, r29, 22
MPCall_58_0x114 MPCall_58_0x114
mtcr r29 mtcr r29
mr r28, r8 mr r28, r8
beq- cr3, MPCall_58_0x13c bc BO_IF, 14, MPCall_58_0x13c
blt- cr5, MPCall_58_0x13c bc BO_IF, 20, MPCall_58_0x13c
lwz r8, -0x08e8(r1) lwz r8, -0x08e8(r1)
; r8 = id ; r8 = id
@ -802,7 +825,7 @@ MPCall_58_0x114
beq- MPCall_58_0x184 beq- MPCall_58_0x184
MPCall_58_0x13c MPCall_58_0x13c
bso- cr4, MPCall_58_0x158 bc BO_IF, 19, MPCall_58_0x158
lwz r8, 0x00f4(r31) lwz r8, 0x00f4(r31)
; r8 = id ; r8 = id
@ -843,7 +866,7 @@ MPCall_58_0x1a4
stw r17, 0x0018(r8) stw r17, 0x0018(r8)
stw r18, 0x00f8(r31) stw r18, 0x00f8(r31)
mr r31, r30 mr r31, r30
bl major_0x0c8b4 bl EnqueueMessage ; Message *r8, Queue *r31
b ReleaseAndReturnMPCall b ReleaseAndReturnMPCall
@ -903,12 +926,15 @@ MPCall_60 ; OUTSIDE REFERER
mr r31, r8 mr r31, r8
cmpwi r4, 0x05 cmpwi r4, 0x05
beq- MPCall_60_0x288 beq- MPCall_60_0x288
lwz r16, 0x0064(r31)
lwz r16, Task.Flags(r31)
mtcr r16 mtcr r16
li r3, -0x7271
beq+ cr7, ReleaseAndReturnMPCall li r3, kMPTaskAbortedErr
beq- cr4, MPCall_60_0x4c bc BO_IF, 30, ReleaseAndReturnMPCall
bne+ cr5, ReleaseAndReturnMPCallOOM
bc BO_IF, 18, MPCall_60_0x4c
bc BO_IF_NOT, 22, ReleaseAndReturnMPCallOOM
MPCall_60_0x4c MPCall_60_0x4c
lbz r16, 0x0018(r31) lbz r16, 0x0018(r31)
@ -1226,12 +1252,15 @@ MPCall_61 ; OUTSIDE REFERER
bne+ ReleaseAndReturnMPCallInvalidIDErr bne+ ReleaseAndReturnMPCallInvalidIDErr
mr r31, r8 mr r31, r8
lwz r16, 0x0064(r31)
lwz r16, Task.Flags(r31)
mtcr r16 mtcr r16
li r3, -0x7271
beq+ cr7, ReleaseAndReturnMPCall li r3, kMPTaskAbortedErr
beq- cr4, MPCall_61_0x44 bc BO_IF, 30, ReleaseAndReturnMPCall
bne+ cr5, ReleaseAndReturnMPCallOOM
bc BO_IF, 18, MPCall_61_0x44
bc BO_IF_NOT, 22, ReleaseAndReturnMPCallOOM
MPCall_61_0x44 MPCall_61_0x44
lbz r16, 0x0018(r31) lbz r16, 0x0018(r31)
@ -1469,41 +1498,38 @@ MPCall_114 ; OUTSIDE REFERER
cmplwi cr1, r17, 0x04 cmplwi cr1, r17, 0x04
beq+ ReleaseAndReturnMPCallOOM beq+ ReleaseAndReturnMPCallOOM
lwz r16, 0x0064(r31) lwz r16, 0x0064(r31)
lhz r17, 0x022a(r30) lhz r17, CPU.EWA + EWA.CPUIndex(r30)
ori r16, r16, 0x40 ori r16, r16, 0x40
stw r16, 0x0064(r31) stw r16, 0x0064(r31)
sth r17, 0x001a(r31) sth r17, 0x001a(r31)
rlwinm. r8, r16, 0, 26, 26 rlwinm. r8, r16, 0, 26, 26
mr r8, r31 mr r8, r31
bne- MPCall_114_0x90 bne- MPCall_114_0x90
bl DequeueTask bl TaskUnready
bl TaskReadyAsPrev bl TaskReadyAsPrev
MPCall_114_0x90 MPCall_114_0x90
bl major_0x14af8 bl FlagSchEvaluationIfTaskRequires
; r1 = kdp ; r1 = kdp
b ReleaseAndReturnZeroFromMPCall b ReleaseAndReturnZeroFromMPCall
; KCSetTaskType ; ARG TaskID r3, OSType r4
; RET OSStatus r3
DeclareMPCall 126, KCSetTaskType DeclareMPCall 126, KCSetTaskType
KCSetTaskType ; OUTSIDE REFERER KCSetTaskType
_Lock PSA.SchLock, scratch1=r16, scratch2=r17 _Lock PSA.SchLock, scratch1=r16, scratch2=r17
mr r8, r3 mr r8, r3
; r8 = id
bl LookupID bl LookupID
cmpwi r9, Task.kIDClass cmpwi r9, Task.kIDClass
bne+ ReleaseAndReturnMPCallInvalidIDErr bne+ ReleaseAndReturnMPCallInvalidIDErr
stw r4, 0x0074(r8)
; r1 = kdp stw r4, Task.Name(r8)
b ReleaseAndReturnZeroFromMPCall b ReleaseAndReturnZeroFromMPCall

View File

@ -20,12 +20,12 @@
; kcRTASDispatch ; kcRTASDispatch
; ReleaseAndMPCallWasBad ; ReleaseAndMPCallWasBad
; ReleaseAndReturnZeroFromMPCall ; ReleaseAndReturnZeroFromMPCall
; major_0x0af60 ; ReleaseAndScrambleMPCall
; ReleaseAndReturnMPCallBlueBlocking ; ReleaseAndReturnMPCallBlueBlocking
; major_0x0b054 ; major_0x0b054
; ReleaseAndReturnMPCallPrivilegedErr ; ReleaseAndReturnMPCallPrivilegedErr
; major_0x0b0cc ; major_0x0b0cc
; AlternateMPCallReturnPath ; BlockMPCall
; MPCall_0 ; MPCall_0
; MPCall_6 ; MPCall_6
; KCYieldWithHint ; KCYieldWithHint
@ -33,7 +33,7 @@
; KCStopScheduling ; KCStopScheduling
; MPCall_115 ; MPCall_115
; Local_Panic ; Local_Panic
; major_0x0d35c ; SetEvent
; MPCall_41 ; MPCall_41
; Local_Panic ; Local_Panic
; MPCall_9 ; MPCall_9
@ -68,7 +68,7 @@
; major_0x129cc ; major_0x129cc
; Local_Panic ; Local_Panic
; Local_Panic ; Local_Panic
; major_0x142dc ; RescheduleAndReturn
; major_0x14548 ; major_0x14548
; Local_Panic ; Local_Panic
; CommonPIHPath ; CommonPIHPath
@ -695,7 +695,7 @@ panic_common
bl Printw bl Printw
_log ' is CPU ' _log ' is CPU '
lhz r8, -0x0116(r17) lhz r8, EWA.CPUIndex(r17)
bl Printh bl Printh
_log ' ID-' _log ' ID-'

View File

@ -92,10 +92,11 @@ InitTMRQs_0xb4
mr. r31, r8 mr. r31, r8
beq+ Local_Panic beq+ Local_Panic
li r9, 0x06 li r9, Timer.kKind6
stb r9, 0x0014(r31) stb r9, Timer.Kind(r31)
li r9, 0x01
stb r9, 0x0016(r31) li r9, 1
stb r9, Timer.KeepAfterFiring(r31)
bl GetTime bl GetTime
stw r8, Timer.Time(r31) stw r8, Timer.Time(r31)
@ -116,88 +117,91 @@ InitTMRQs_0xb4
; Xrefs: ; Xrefs:
; IntDecrementer ; IntDecrementer
; major_0x130f0 ; TimerFire0
TimerTable TimerTable
dc.l major_0x130f0 - NKTop dc.l TimerFireUnknownKind - NKTop ; Timer.kKind0
dc.l major_0x13120 - NKTop dc.l TimerFire1 - NKTop ; Timer.kKind1
dc.l major_0x1318c - NKTop dc.l TimerFire2 - NKTop ; Timer.kKind2
dc.l major_0x1324c - NKTop dc.l TimerFire3 - NKTop ; Timer.kKind3
dc.l major_0x132e8 - NKTop dc.l TimerFire4 - NKTop ; Timer.kKind4
dc.l major_0x13350 - NKTop dc.l TimerFire5 - NKTop ; Timer.kKind5
dc.l major_0x135b8 - NKTop dc.l TimerFire6 - NKTop ; Timer.kKind6
dc.l major_0x134bc - NKTop dc.l TimerFire7 - NKTop ; Timer.kKind7
dc.l major_0x13524 - NKTop dc.l TimerFire8 - NKTop ; Timer.kKind8
TimerDispatch ; OUTSIDE REFERER TimerDispatch ; OUTSIDE REFERER
mflr r19 mflr r19
mfsprg r18, 0 mfsprg r18, 0
stw r19, -0x0258(r18) stw r19, EWA.TimerDispatchLR(r18)
TimerDispatch_0x30 ; OUTSIDE REFERER TimerDispatch_0x30 ; OUTSIDE REFERER
mfspr r8, pvr mfspr r8, pvr
rlwinm. r8, r8, 0, 0, 14 rlwinm. r8, r8, 0, 0, 14
beq- TimerDispatch_0x54 beq- @is_601
TimerDispatch_0x3c ;not 601
@gettime_loop_non_601
mftbu r8 mftbu r8
mftb r9 mftb r9
mftbu r16 mftbu r16
cmpw r8, r16 cmpw r8, r16
bne- TimerDispatch_0x3c bne- @gettime_loop_non_601
b TimerDispatch_0x90 b @common
TimerDispatch_0x54 @is_601
@gettime_loop_601
mfspr r8, rtcu mfspr r8, rtcu
mfspr r9, rtcl mfspr r9, rtcl
mfspr r16, rtcu mfspr r16, rtcu
cmpw r8, r16 cmpw r8, r16
bne- TimerDispatch_0x54 bne- @gettime_loop_601
lis r16, 0x3b9a
ori r16, r16, 0xca00 dialect POWER
mfspr r17, mq
dc.l 0x7d1040d6 liu r16, 1000000000 >> 16
mfspr r16, mq oril r16, r16, 1000000000 & 0xffff
mtspr mq, r17
mfmq r17
mul r8, r16, r8
mfmq r16
mtmq r17
mfxer r17 mfxer r17
addc r9, r16, r9 a r9, r16, r9
addze r8, r8 aze r8, r8
mtxer r17 mtxer r17
TimerDispatch_0x90 dialect PowerPC
lbz r19, -0x0309(r18) @common
addi r30, r18, -0x320
cmpwi r19, 0x01
lwz r16, 0x0038(r30)
bne- TimerDispatch_0xcc
lwz r17, 0x003c(r30)
cmpw r16, r8
cmplw cr1, r17, r9
bgt- TimerDispatch_0xcc
blt- TimerDispatch_0xbc
bgt- cr1, TimerDispatch_0xcc
TimerDispatch_0xbc
lbz r19, EWA.GlobalTimeIsValid(r18)
addi r30, r18, EWA.Base
cmpwi r19, 1
lwz r16, EWA.GlobalTime - EWA.Base(r30)
bne- timer_earlier_than_sometime
lwz r17, EWA.GlobalTime + 4 - EWA.Base(r30)
_b_if_time_gt r16, r8, timer_earlier_than_sometime
@skipbranch
li r19, 0x00 li r19, 0x00
stw r30, -0x0254(r18) stw r30, -0x0254(r18)
stb r19, 0x0017(r30) stb r19, 0x0017(r30)
b major_0x132e8_0x10 b TimerFire4_0x10
TimerDispatch_0xcc timer_earlier_than_sometime
lwz r30, -0x0a7c(r1) lwz r30, -0x0a7c(r1)
lwz r16, 0x0038(r30) lwz r16, 0x0038(r30)
lwz r17, 0x003c(r30) lwz r17, 0x003c(r30)
cmpw r16, r8
cmplw cr1, r17, r9
bgt- TimerDispatch_0x188
blt- TimerDispatch_0xec
bgt- cr1, TimerDispatch_0x188
TimerDispatch_0xec _b_if_time_gt r16, r8, TimerDispatch_0x188
RemoveFromList r30, scratch1=r19, scratch2=r20 RemoveFromList r30, scratch1=r19, scratch2=r20
lwz r19, 0x064c(r1) lwz r19, 0x064c(r1)
lbz r20, 0x0014(r30) lbz r20, Timer.Kind(r30)
rlwimi r19, r20, 2, 23, 29 rlwimi r19, r20, 2, 23, 29
cmplwi r20, 0x09 cmplwi r20, 0x09
llabel r20, TimerTable llabel r20, TimerTable
@ -233,7 +237,7 @@ TimerDispatch_0x180:
b TimerDispatch_0x30 b TimerDispatch_0x30
TimerDispatch_0x188 TimerDispatch_0x188
lwz r19, -0x0258(r18) lwz r19, EWA.TimerDispatchLR(r18)
mtlr r19 mtlr r19
b AdjustDecForTMRQGivenCurTimeAndTripTime b AdjustDecForTMRQGivenCurTimeAndTripTime
@ -248,7 +252,7 @@ StartTimeslicing ; OUTSIDE REFERER
mfsprg r19, 0 mfsprg r19, 0
li r8, 1 li r8, 1
stb r8, -0x0309(r19) stb r8, EWA.GlobalTimeIsValid(r19)
li r8, 0 li r8, 0
stw r8, -0x02e8(r19) stw r8, -0x02e8(r19)
@ -278,7 +282,7 @@ AdjustDecForTMRQ
AdjustDecForTMRQGivenCurTime AdjustDecForTMRQGivenCurTime
; This should get the most distant time??? ; This should get the most distant time???
lwz r18, PSA.TimerQueue + Queue.LLL + LLL.Next(r1) lwz r18, PSA.TimerQueue + LLL.Next(r1)
lwz r16, Timer.Time(r18) lwz r16, Timer.Time(r18)
lwz r17, Timer.Time+4(r18) lwz r17, Timer.Time+4(r18)
@ -300,20 +304,15 @@ AdjustDecForTMRQGivenCurTimeAndTripTime
; r16/r17 = soonest(last timer, global PSA time if available) ; r16/r17 = soonest(last timer, global PSA time if available)
bne- @global_time_invalid bne- global_time_invalid
lwz r18, EWA.GlobalTime(r19) lwz r18, EWA.GlobalTime(r19)
lwz r19, EWA.GlobalTime+4(r19) lwz r19, EWA.GlobalTime+4(r19)
cmpw r16, r18 _b_if_time_le r16, r18, last_timer_fires_sooner
cmplw cr1, r17, r19
blt- @last_timer_fires_sooner
bgt- @global_time_sooner
ble- cr1, @last_timer_fires_sooner
@global_time_sooner
mr r17, r19 mr r17, r19
mr r16, r18 mr r16, r18
@last_timer_fires_sooner last_timer_fires_sooner
@global_time_invalid global_time_invalid
; Subtract the current time (or what we were passed in r8/r9) from that time ; Subtract the current time (or what we were passed in r8/r9) from that time
@ -341,23 +340,23 @@ AdjustDecForTMRQGivenCurTimeAndTripTime
; major_0x130f0 ; TimerFire0
; Xrefs: ; Xrefs:
; TimerDispatch ; TimerDispatch
major_0x130f0 ; OUTSIDE REFERER TimerFireUnknownKind
_log 'TimerInformation.kind is zero??^n' _log 'TimerInformation.kind is zero??^n'
; major_0x13120 ; TimerFire1
; Xrefs: ; Xrefs:
; TimerDispatch ; TimerDispatch
; major_0x130f0 ; TimerFire0
major_0x13120 ; OUTSIDE REFERER TimerFire1 ; OUTSIDE REFERER
bl Local_Panic bl Local_Panic
lwz r18, 0x0018(r30) lwz r18, 0x0018(r30)
stw r16, 0x0080(r18) stw r16, 0x0080(r18)
@ -368,29 +367,29 @@ major_0x13120 ; OUTSIDE REFERER
lwz r19, 0x0088(r8) lwz r19, 0x0088(r8)
cmpwi r17, 0x00 cmpwi r17, 0x00
stw r16, 0x011c(r19) stw r16, 0x011c(r19)
bne- major_0x13120_0x64 bne- TimerFire1_0x64
addi r16, r8, 0x08 addi r16, r8, 0x08
RemoveFromList r16, scratch1=r17, scratch2=r19 RemoveFromList r16, scratch1=r17, scratch2=r19
li r17, 0x01 li r17, 0x01
stb r17, 0x0019(r8) stb r17, 0x0019(r8)
bl TaskReadyAsPrev bl TaskReadyAsPrev
bl CalculateTimeslice bl CalculateTimeslice
bl major_0x14af8 bl FlagSchEvaluationIfTaskRequires
b TimerDispatch_0x144 b TimerDispatch_0x144
major_0x13120_0x64 TimerFire1_0x64
lwz r16, 0x0064(r8) lwz r16, 0x0064(r8)
rlwinm. r16, r16, 0, 30, 30 rlwinm. r16, r16, 0, 30, 30
; major_0x1318c ; TimerFire2
; Xrefs: ; Xrefs:
; TimerDispatch ; TimerDispatch
; major_0x13120 ; TimerFire1
major_0x1318c ; OUTSIDE REFERER TimerFire2 ; OUTSIDE REFERER
bne+ TimerDispatch_0x144 bne+ TimerDispatch_0x144
bl Local_Panic bl Local_Panic
lwz r18, 0x0018(r30) lwz r18, 0x0018(r30)
@ -401,7 +400,7 @@ major_0x1318c ; OUTSIDE REFERER
lbz r17, 0x0018(r8) lbz r17, 0x0018(r8)
lwz r18, 0x0088(r8) lwz r18, 0x0088(r8)
cmpwi r17, 0x00 cmpwi r17, 0x00
bne- major_0x1324c_0x8 bne- TimerFire3_0x8
stw r16, 0x011c(r18) stw r16, 0x011c(r18)
lwz r8, 0x0008(r8) lwz r8, 0x0008(r8)
lwz r8, 0x0000(r8) lwz r8, 0x0000(r8)
@ -411,35 +410,35 @@ major_0x1318c ; OUTSIDE REFERER
cmpwi r9, Queue.kIDClass cmpwi r9, Queue.kIDClass
cmpwi cr1, r9, 0x05 cmpwi cr1, r9, 0x05
beq- major_0x1318c_0x8c beq- TimerFire2_0x8c
beq- cr1, major_0x1318c_0x7c beq- cr1, TimerFire2_0x7c
cmpwi r9, 0x09 cmpwi r9, 0x09
cmpwi cr1, r9, 0x06 cmpwi cr1, r9, 0x06
beq- major_0x1318c_0x6c beq- TimerFire2_0x6c
bne+ cr1, Local_Panic bne+ cr1, Local_Panic
lwz r16, 0x0020(r8) lwz r16, 0x0020(r8)
addi r16, r16, -0x01 addi r16, r16, -0x01
stw r16, 0x0020(r8) stw r16, 0x0020(r8)
b major_0x1318c_0x98 b TimerFire2_0x98
major_0x1318c_0x6c TimerFire2_0x6c
lwz r16, 0x001c(r8) lwz r16, 0x001c(r8)
addi r16, r16, -0x01 addi r16, r16, -0x01
stw r16, 0x001c(r8) stw r16, 0x001c(r8)
b major_0x1318c_0x98 b TimerFire2_0x98
major_0x1318c_0x7c TimerFire2_0x7c
lwz r16, 0x001c(r8) lwz r16, 0x001c(r8)
addi r16, r16, -0x01 addi r16, r16, -0x01
stw r16, 0x001c(r8) stw r16, 0x001c(r8)
b major_0x1318c_0x98 b TimerFire2_0x98
major_0x1318c_0x8c TimerFire2_0x8c
lwz r16, 0x002c(r8) lwz r16, 0x002c(r8)
addi r16, r16, -0x01 addi r16, r16, -0x01
stw r16, 0x002c(r8) stw r16, 0x002c(r8)
major_0x1318c_0x98 TimerFire2_0x98
lwz r8, 0x0018(r30) lwz r8, 0x0018(r30)
addi r16, r8, 0x08 addi r16, r8, 0x08
RemoveFromList r16, scratch1=r17, scratch2=r18 RemoveFromList r16, scratch1=r17, scratch2=r18
@ -447,17 +446,17 @@ major_0x1318c_0x98
; major_0x1324c ; TimerFire3
; Xrefs: ; Xrefs:
; TimerDispatch ; TimerDispatch
; major_0x1318c ; TimerFire2
major_0x1324c ; OUTSIDE REFERER TimerFire3 ; OUTSIDE REFERER
bl major_0x14af8 bl FlagSchEvaluationIfTaskRequires
b TimerDispatch_0x144 b TimerDispatch_0x144
major_0x1324c_0x8 ; OUTSIDE REFERER TimerFire3_0x8 ; OUTSIDE REFERER
b Local_Panic b Local_Panic
@ -498,7 +497,7 @@ major_0x13258_0x4c
stw r16, 0x0010(r8) stw r16, 0x0010(r8)
stw r17, 0x0014(r8) stw r17, 0x0014(r8)
stw r18, 0x0018(r8) stw r18, 0x0018(r8)
bl major_0x0c8b4 bl EnqueueMessage ; Message *r8, Queue *r31
major_0x13258_0x68 major_0x13258_0x68
lwz r8, 0x0034(r30) lwz r8, 0x0034(r30)
@ -509,7 +508,7 @@ major_0x13258_0x68
mr r31, r8 mr r31, r8
bne- major_0x13258_0x80 bne- major_0x13258_0x80
bl major_0x0ccf4 bl SignalSemaphore
major_0x13258_0x80 major_0x13258_0x80
lwz r8, 0x002c(r30) lwz r8, 0x002c(r30)
@ -522,62 +521,62 @@ major_0x13258_0x80
; major_0x132e8 ; TimerFire4
; Xrefs: ; Xrefs:
; TimerDispatch ; TimerDispatch
; major_0x13258 ; major_0x13258
major_0x132e8 ; OUTSIDE REFERER TimerFire4 ; OUTSIDE REFERER
bne- major_0x132e8_0xc bne- TimerFire4_0xc
lwz r8, 0x0030(r30) lwz r8, 0x0030(r30)
bl major_0x0d35c bl SetEvent
major_0x132e8_0xc TimerFire4_0xc
b TimerDispatch_0x144 b TimerDispatch_0x144
major_0x132e8_0x10 ; OUTSIDE REFERER TimerFire4_0x10 ; OUTSIDE REFERER
mfsprg r28, 0 mfsprg r28, 0
lwz r29, -0x0008(r28) lwz r29, -0x0008(r28)
mr r8, r29 mr r8, r29
bl DequeueTask bl TaskUnready
lbz r17, 0x0019(r29) lbz r17, 0x0019(r29)
cmpwi r17, 0x02 cmpwi r17, 0x02
bge- major_0x132e8_0x64 bge- TimerFire4_0x64
mr r8, r29 mr r8, r29
lwz r16, 0x0038(r30) lwz r16, 0x0038(r30)
lwz r17, 0x003c(r30) lwz r17, 0x003c(r30)
bl clear_cr0_lt bl clear_cr0_lt
bge- major_0x132e8_0x50 bge- TimerFire4_0x50
mr r8, r29 mr r8, r29
bl TaskReadyAsPrev bl TaskReadyAsPrev
bl CalculateTimeslice bl CalculateTimeslice
b major_0x13350_0x8 b TimerFire5_0x8
major_0x132e8_0x50 TimerFire4_0x50
li r18, 0x02 li r18, 0x02
stb r18, 0x0019(r29) stb r18, 0x0019(r29)
mr r8, r29 mr r8, r29
bl TaskReadyAsPrev bl TaskReadyAsPrev
b major_0x13350_0x8 b TimerFire5_0x8
major_0x132e8_0x64 TimerFire4_0x64
mr r8, r29 mr r8, r29
; major_0x13350 ; TimerFire5
; Xrefs: ; Xrefs:
; TimerDispatch ; TimerDispatch
; major_0x132e8 ; TimerFire4
major_0x13350 ; OUTSIDE REFERER TimerFire5 ; OUTSIDE REFERER
bl TaskReadyAsPrev bl TaskReadyAsPrev
bl major_0x149d4 bl major_0x149d4
major_0x13350_0x8 ; OUTSIDE REFERER TimerFire5_0x8 ; OUTSIDE REFERER
bl major_0x14af8 bl FlagSchEvaluationIfTaskRequires
mfsprg r18, 0 mfsprg r18, 0
b TimerDispatch_0x30 b TimerDispatch_0x30
@ -605,7 +604,7 @@ major_0x13350_0x8 ; OUTSIDE REFERER
mr r8, r16 mr r8, r16
bl printb bl printb
_log 'scr-' _log 'scr-'
lwz r16, 0x0658(r1) lwz r16, KDP.PA_ECB(r1)
lwz r18, 0x0674(r1) lwz r18, 0x0674(r1)
lwz r16, 0x00dc(r16) lwz r16, 0x00dc(r16)
and r16, r16, r18 and r16, r16, r18
@ -621,7 +620,7 @@ major_0x13350_0x8 ; OUTSIDE REFERER
mr r8, r16 mr r8, r16
bl printh bl printh
_log 'eSR-' _log 'eSR-'
lwz r16, 0x0658(r1) lwz r16, KDP.PA_ECB(r1)
lwz r16, 0x01cc(r16) lwz r16, 0x01cc(r16)
andi. r16, r16, 0x07 andi. r16, r16, 0x07
mr r8, r16 mr r8, r16
@ -636,13 +635,13 @@ major_0x13350_0x8 ; OUTSIDE REFERER
; major_0x134bc ; TimerFire7
; Xrefs: ; Xrefs:
; TimerDispatch ; TimerDispatch
; major_0x13364 ; major_0x13364
major_0x134bc ; OUTSIDE REFERER TimerFire7 ; OUTSIDE REFERER
addze r16, r16 addze r16, r16
stw r16, 0x0038(r30) stw r16, 0x0038(r30)
stw r17, 0x003c(r30) stw r17, 0x003c(r30)
@ -660,7 +659,7 @@ major_0x134bc ; OUTSIDE REFERER
lwz r18, -0x0438(r1) lwz r18, -0x0438(r1)
lwz r19, 0x0f88(r1) lwz r19, 0x0f88(r1)
subf. r19, r18, r19 subf. r19, r18, r19
ble- major_0x13524_0x1c ble- TimerFire8_0x1c
srwi r19, r19, 11 srwi r19, r19, 11
mfxer r20 mfxer r20
@ -681,13 +680,13 @@ major_0x134d8_0x18
; major_0x13524 ; TimerFire8
; Xrefs: ; Xrefs:
; TimerDispatch ; TimerDispatch
; major_0x134d8 ; major_0x134d8
major_0x13524 ; OUTSIDE REFERER TimerFire8 ; OUTSIDE REFERER
addc r17, r17, r18 addc r17, r17, r18
addze r16, r16 addze r16, r16
stw r16, 0x0038(r30) stw r16, 0x0038(r30)
@ -696,7 +695,7 @@ major_0x13524 ; OUTSIDE REFERER
mr r8, r30 mr r8, r30
bl EnqueueTimer bl EnqueueTimer
major_0x13524_0x1c ; OUTSIDE REFERER TimerFire8_0x1c ; OUTSIDE REFERER
b TimerDispatch_0x144 b TimerDispatch_0x144
@ -709,7 +708,7 @@ major_0x13524_0x1c ; OUTSIDE REFERER
mfxer r20 mfxer r20
cmpwi cr1, r19, 0x00 cmpwi cr1, r19, 0x00
srawi r8, r19, 31 srawi r8, r19, 31
beq- cr1, major_0x135b8_0x4 beq- cr1, TimerFire6_0x4
major_0x13544_0x14 major_0x13544_0x14
mftbu r16 mftbu r16
@ -743,16 +742,16 @@ major_0x13544_0x64
; major_0x135b8 ; TimerFire6
; Xrefs: ; Xrefs:
; TimerDispatch ; TimerDispatch
; major_0x13544 ; major_0x13544
major_0x135b8 ; OUTSIDE REFERER TimerFire6 ; OUTSIDE REFERER
stw r17, 0x003c(r30) stw r17, 0x003c(r30)
major_0x135b8_0x4 ; OUTSIDE REFERER TimerFire6_0x4 ; OUTSIDE REFERER
mtxer r20 mtxer r20
beq+ cr1, TimerDispatch_0x144 beq+ cr1, TimerDispatch_0x144
mr r8, r30 mr r8, r30
@ -873,40 +872,26 @@ EnqueueTimer ; OUTSIDE REFERER
; Remove a Timer from the global timer firing queue (TMRQ).
; If the Timer was to be the next to fire, then perform the
; standard decrementer rollover adjustment.
; ARG Timer *r8
DequeueTimer
lwz r16, Timer.QueueLLL + LLL.FreeForm(r8)
; major_0x136c8 cmpwi r16, 0
lwz r18, PSA.TimerQueue + TimerQueueStruct.LLL + LLL.Next(r1)
; Xrefs:
; NKSetClockStep
; NKSetClockDriftCorrection
; MPCall_16
; major_0x0c8b4
; major_0x0ccf4
; MPCall_21
; MPCall_28
; MPCall_26
; MPCall_50
; major_0x0d35c
; MPCall_41
; MPCall_31
; MPCall_32
; major_0x0dce8
; MPCall_9
; CommonPIHPath
major_0x136c8 ; OUTSIDE REFERER
lwz r16, 0x0008(r8)
cmpwi r16, 0x00
lwz r18, -0x0a7c(r1)
beq+ Local_Panic beq+ Local_Panic
RemoveFromList r8, scratch1=r16, scratch2=r17 RemoveFromList r8, scratch1=r16, scratch2=r17
li r16, 0x00
li r16, 0
cmpw r18, r8 cmpw r18, r8
stb r16, 0x0017(r8) stb r16, Timer.Byte3(r8)
beq+ AdjustDecForTMRQ beq+ AdjustDecForTMRQ
blr blr
@ -966,7 +951,7 @@ TimebaseTicksPerPeriod
; CreateTask ; CreateTask
; InitTMRQs ; InitTMRQs
; AdjustDecForTMRQ ; AdjustDecForTMRQ
; major_0x142dc ; RescheduleAndReturn
; major_0x14548 ; major_0x14548
; RET long r8 tbu, long r9 tbl ; RET long r8 tbu, long r9 tbl

View File

@ -189,7 +189,7 @@ VMReturn ; OUTSIDE REFERER
lwz r7, -0x0010(r8) lwz r7, -0x0010(r8)
lwz r6, -0x0014(r8) lwz r6, -0x0014(r8)
_AssertAndRelease PSA.HTABLock, scratch=r8 _AssertAndRelease PSA.HTABLock, scratch=r8
b skeleton_key b IntReturn

View File

@ -1,4 +1,5 @@
include 'MacErrors.a' include 'MacErrors.a'
include 'Multiprocessing.a'
include 'InfoRecords.a' include 'InfoRecords.a'
include 'EmulatorPublic.a' include 'EmulatorPublic.a'
@ -29,7 +30,7 @@ NKTop
align 5 align 5
include 'NKMPCalls.s' include 'NKMPCalls.s'
align 5 align 5
include 'NKQueues.s' include 'NKSync.s'
align 5 align 5
include 'NKTasks.s' include 'NKTasks.s'
align 5 align 5