diff --git a/Internal/EmulatorPublic.a b/Internal/EmulatorPublic.a index 8765625..8d48d25 100644 --- a/Internal/EmulatorPublic.a +++ b/Internal/EmulatorPublic.a @@ -19,7 +19,8 @@ BootstrapVersion ds.b 16 ; f00:f10 ; Bootstrap loader version info, from Config ; Gets called the "system context" 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 LA_EmulatorKernelTrapTable ds.l 1 diff --git a/Internal/InfoRecords.a b/Internal/InfoRecords.a index 35f776b..01b39ef 100644 --- a/Internal/InfoRecords.a +++ b/Internal/InfoRecords.a @@ -327,7 +327,7 @@ VMDispatchCountTblPtr ds.l 1 ; 128, kdp+ee8 ds.l 1 ds.l 1 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 org 0x160 diff --git a/Internal/NKOpaque.a b/Internal/NKOpaque.a index d8eac50..16a20aa 100644 --- a/Internal/NKOpaque.a +++ b/Internal/NKOpaque.a @@ -22,6 +22,7 @@ Process record 0,INCR kIDClass equ 1 +kFirstID equ 0x00010001 kSignature equ 'PROC' ;_______________________ @@ -30,7 +31,39 @@ kSignature equ 'PROC' ID ds.l 1 ; 00 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 TaskCount ds.l 1 ; 10 ; incremented by CreateTask SystemAddressSpacePtr ds.l 1 ; 14 @@ -57,6 +90,7 @@ Size equ * Task record 0,INCR kIDClass equ 2 +kFirstID equ 0x00020001 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 MysteryByte1 ds.b 1 ; 018 ; CreateTask sets 0 by default (blue = 2) 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 Timer ds.b 64 ; 020: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 OwningProcessPtr ds.l 1 ; 06c 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 ds.l 1 ; 0ec YellowVecTblPtr ds.l 1 ; 0f0 - ds.l 1 ; 0f4 - ds.l 1 ; 0f8 +ExceptionHandlerID ds.l 1 ; 0f4 ; a queue +ErrToReturnIfIDie ds.l 1 ; 0f8 ds.l 1 ; 0fc 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 kIDClass equ 3 +kFirstID equ 0x00030001 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? ds.l 1 ; 0c ; task+2c 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 -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 -ParentTaskPtr ds.l 1 ; 18 ; task+38 ; MPCall 55 sets - ds.l 1 ; 1c ; task+3c - ds.l 1 ; 20 ; task+40 - ds.l 1 ; 24 ; task+44 - ds.l 1 ; 28 ; task+48 - ds.l 1 ; 2c ; task+4c - ds.l 1 ; 30 ; task+50 - ds.l 1 ; 34 ; task+54 + +MessageQueueID +ParentTaskPtr ds.l 1 ; 18 ; task+38 ; task to be unblocked when timer fires +ReservedMessage ds.l 1 ; 1c ; task+3c ; 'note' allocated when timer armed +Message1 ds.l 1 ; 20 ; task+40 ; if I hit a message queue +Message2 ds.l 1 ; 24 ; task+44 +Message3 ds.l 1 ; 28 ; task+48 +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 Size equ * @@ -174,18 +253,19 @@ Size equ * Queue record 0,INCR kIDClass equ 4 +kFirstID equ 0x00040001 ;_______________________ ; Fields ;_______________________ -LLL ds.l 4 ; 00:10 - ds.l 4 ; 10:20 -ProcessID ds.l 1 ; 20 - ds.l 1 ; 24 - ds.l 1 ; 28 - ds.l 1 ; 2c - ds.l 1 ; 30 +BlockedTasks ds.l 4 ; 00:10 ; titled MSGQ ; waiting for messages +Messages ds.l 4 ; 10:20 ; titled NOTQ ; waiting for tasks +ProcessID ds.l 1 ; 20 ; why associate a queue with a process? +ReserveCount ds.l 1 ; 24 ; as number of messages, from MPSetQueueReserve +ReservePtr ds.l 1 ; 28 ; ptr to first element of +BlockedTaskCount ds.l 1 ; 2c +MessageCount ds.l 1 ; 30 Size equ * 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' kDelayQueueSignature equ 'DLYQ' kDbugQueueSignature equ 'DBUG' @@ -228,17 +322,18 @@ kSemaQueueSignature equ 'SEMQ' Semaphore record 0,INCR kIDClass equ 5 +kFirstID equ 0x00050001 kSignature equ 'SEMA' ;_______________________ ; Fields ;_______________________ -LLL ds.l 4 ; 00:10 - ds.l 1 ; 10 - ds.l 1 ; 14 +BlockedTasks ds.l 4 ; 00:10 ; blocked tasks +Value ds.l 1 ; 10 ; negative if tasks are blocked??? +MaxValue ds.l 1 ; 14 ProcessID ds.l 1 ; 18 - ds.l 1 ; 1c +BlockedTaskCount ds.l 1 ; 1c ; starts as 0 Size equ * endr @@ -255,6 +350,7 @@ Size equ * CriticalRegion record 0,INCR kIDClass equ 6 +kFirstID equ 0x00060001 kSignature equ 'CRGN' ;_______________________ @@ -280,6 +376,7 @@ Size equ * CPU record 0,INCR kIDClass equ 7 +kFirstID equ 0x00070001 kSignature equ 'CPU ' ;_______________________ @@ -311,6 +408,7 @@ Size equ * AddressSpace record 0,INCR kIDClass equ 8 +kFirstID equ 0x00080001 kSignature equ 'SPAC' ;_______________________ @@ -362,6 +460,7 @@ Size equ * EventGroup record 0,INCR kIDClass equ 9 +kFirstID equ 0x00090001 kSignature equ 'EVNT' ;_______________________ @@ -389,6 +488,7 @@ Size equ * CoherenceGroup record 0,INCR kIDClass equ 10 +kFirstID equ 0x000a0001 kSignature equ 'CGRP' ;_______________________ @@ -428,6 +528,7 @@ Size equ * Area record 0,INCR kIDClass equ 11 +kFirstID equ 0x000b0001 kSignature equ 'AREA' ;_______________________ @@ -488,22 +589,26 @@ Size equ * Notification record 0,INCR kIDClass equ 12 +kFirstID equ 0x000c0001 kSignature equ 'KNOT' ;_______________________ ; Fields ;_______________________ - ds.l 1 ; 00 -Signature ds.l 1 ; 04 -ProcessID ds.l 1 ; 08 - ds.l 1 ; 0c - ds.l 1 ; 10 - ds.l 1 ; 14 - ds.l 1 ; 18 - ds.l 1 ; 1c - ds.l 1 ; 20 - ds.l 1 ; 24 +TaskPtr ds.l 1 ; 00 ; (set on init) +Signature ds.l 1 ; 04 ; (set on init) +ProcessID ds.l 1 ; 08 ; (set on init) + +QueueID ds.l 1 ; 0c ; message queue +MsgWord1 ds.l 1 ; 10 +MsgWord2 ds.l 1 ; 14 +MsgWord3 ds.l 1 ; 18 + +EventGroupID ds.l 1 ; 1c +EventFlags ds.l 1 ; 20 + +SemaphoreID ds.l 1 ; 24 Size equ * endr @@ -521,6 +626,7 @@ Size equ * ConsoleLog record 0,INCR kIDClass equ 13 +kFirstID equ 0x000d0001 ;_______________________ ; Fields diff --git a/Internal/NKPublic.a b/Internal/NKPublic.a index 82fb842..79c340a 100644 --- a/Internal/NKPublic.a +++ b/Internal/NKPublic.a @@ -125,13 +125,13 @@ QueueRelatedZero2 ds.l 1 ; -9fc ; same again ds.l 1 ; -9f8 ds.l 1 ; -9f4 ReadyQueues -CriticalReadyQ ds.l 8 ; -9f0:-9d0 -LatencyProtectReadyQ ds.l 8 ; -9d0:-9b0 -NominalReadyQ ds.l 8 ; -9b0:-990 -IdleReadyQ ds.l 8 ; -990:-970 +CriticalReadyQ ds.l 8 ; -9f0:-9d0 ; unblocked tasks with priority 0 +LatencyProtectReadyQ ds.l 8 ; -9d0:-9b0 ; unblocked tasks with priority 1 +NominalReadyQ ds.l 8 ; -9b0:-990 ; unblocked tasks with priority 2 +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... 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 AVFeatureBit equ 12 ; equals 0x00080000 ; 8 0x00800000 @@ -172,7 +172,7 @@ SystemAddressSpaceID ds.l 1 ; -424 blueProcessPtr ds.l 1 ; -41c ; physical ptr to first type-1 struct created ThermalHandlerID ds.l 1 ; -418 ; is 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 ; -408 ds.l 1 ; -404 @@ -313,7 +313,7 @@ SpacesDeferredAreaPtr ds.l 1 ; -26c, cpu+0d4 ds.l 1 ; -264, cpu+0dc ds.l 1 ; -260, cpu+0e0 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 ; -250, cpu+0f0 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 ; -120, cpu+220 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 ; -110, cpu+230 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_ContextBlock ds.l 1 ; -014, cpu+32c 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_KDP ds.l 1 ; -004, cpu+33c diff --git a/NanoKernel/NKAddressSpaceMPCalls.s b/NanoKernel/NKAddressSpaceMPCalls.s index c913b96..97989e8 100644 --- a/NanoKernel/NKAddressSpaceMPCalls.s +++ b/NanoKernel/NKAddressSpaceMPCalls.s @@ -637,7 +637,7 @@ NKCreateAddressSpaceSub bl PoolFree @fail_OOM - li r8, -0x726e + li r8, -29294 b @return @fail_notcgrp @@ -732,18 +732,15 @@ KCSetTaskAddressSpace ; OUTSIDE REFERER _Lock PSA.SchLock, scratch1=r16, scratch2=r17 mr r8, r3 - -; r8 = id bl LookupID -; r8 = something not sure what -; r9 = 0:inval, 1:proc, 2:task, 3:timer, 4:q, 5:sema, 6:cr, 7:cpu, 8:addrspc, 9:evtg, 10:cgrp, 11:area, 12:not, 13:log - mr r31, r8 - cmpwi r9, 0x02 + cmpwi r9, Task.kIDClass bne+ ReleaseAndReturnMPCallInvalidIDErr - lwz r16, 0x0064(r31) + + lwz r16, Task.Flags(r31) mtcr r16 - li r3, -0x7271 + + li r3, kMPTaskAbortedErr beq+ cr7, ReleaseAndReturnMPCall bne+ cr5, ReleaseAndReturnMPCallOOM lbz r16, 0x0018(r31) @@ -817,7 +814,7 @@ MPCreateArea li r8, Area.Size bl PoolAlloc mr. r31, r8 - beq+ major_0x0af60 + beq+ ReleaseAndScrambleMPCall ; Populate stw r30, Area.AddressSpacePtr(r31) @@ -1363,7 +1360,7 @@ major_0x102c8 ; OUTSIDE REFERER li r29, 0x00 stw r29, 0x0018(r26) mr r30, r26 - bl major_0x0db04 + bl CauseNotification b major_0x10320_0x20 @@ -1383,7 +1380,7 @@ major_0x102c8 ; OUTSIDE REFERER major_0x10320 ; OUTSIDE REFERER mr r8, r31 - li r9, -0x726e + li r9, -29294 b ReturnFromCreateArea dc.l 0x811f0000 dc.l 0x48004fd1 @@ -1411,7 +1408,7 @@ major_0x10320_0x64 ; OUTSIDE REFERER lwz r8, Area.ID(r31) bl DeleteID mr r8, r31 - li r9, -0x7272 + li r9, kMPInsufficientResourcesErr b ReturnFromCreateArea major_0x10320_0x94 ; OUTSIDE REFERER @@ -1488,13 +1485,13 @@ MPCreateAliasArea mr r30, r8 lwz r16, Area.Flags(r30) rlwinm. r8, r16, 0, Area.kAliasFlag, Area.kAliasFlag - bne+ major_0x0b054 + bne+ ReleaseAndReturnParamErrFromMPCall ; Allocate the new Area li r8, Area.Size bl PoolAlloc mr. r31, r8 - beq+ major_0x0af60 + beq+ ReleaseAndScrambleMPCall ; Populate mfsprg r28, 0 @@ -1766,7 +1763,7 @@ MPCall_75 ; OUTSIDE REFERER lwz r17, Area.Length(r31) and. r5, r5, r18 and r17, r17, r18 - ble+ major_0x0b054 + ble+ ReleaseAndReturnParamErrFromMPCall subf. r27, r17, r5 ; r1 = kdp @@ -1904,27 +1901,27 @@ MPCall_130 ; OUTSIDE REFERER ori r16, r16, 0xfff8 lwz r17, 0x0020(r31) and. r16, r16, r4 - bne+ major_0x0b054 + bne+ ReleaseAndReturnParamErrFromMPCall rlwinm. r8, r17, 0, 16, 16 - bne+ major_0x0b054 + bne+ ReleaseAndReturnParamErrFromMPCall mr r29, r5 lwz r18, 0x0134(r6) lwz r19, 0x0068(r31) lwz r16, Area.LogicalBase(r31) cmplw r18, r19 add r28, r18, r29 - bge+ major_0x0b054 + bge+ ReleaseAndReturnParamErrFromMPCall lwz r17, 0x007c(r31) addi r28, r28, -0x01 lwz r18, 0x0020(r31) lwz r19, Area.LogicalEnd(r31) cmplw cr1, r29, r16 cmplw cr2, r28, r19 - blt+ cr1, major_0x0b054 - bgt+ cr2, major_0x0b054 + blt+ cr1, ReleaseAndReturnParamErrFromMPCall + bgt+ cr2, ReleaseAndReturnParamErrFromMPCall xor r8, r28, r29 rlwinm. r8, r8, 0, 0, 19 - bne+ major_0x0b054 + bne+ ReleaseAndReturnParamErrFromMPCall _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 @@ -1935,7 +1932,7 @@ MPCall_130 ; OUTSIDE REFERER rlwinm r8, r16, 0, 29, 30 lwz r16, 0x0000(r30) cmpwi cr7, r8, 0x04 - beq+ cr7, major_0x0b054 + beq+ cr7, ReleaseAndReturnParamErrFromMPCall lwz r16, 0x0098(r31) MPCall_130_0xe8 @@ -1964,7 +1961,7 @@ MPCall_130_0x11c ; r8 = ptr mr. r16, r8 - beq+ major_0x0af60 + beq+ ReleaseAndScrambleMPCall addi r18, r31, 0x90 lis r17, 0x4645 ori r17, r17, 0x4e43 @@ -2021,11 +2018,11 @@ MPSetAreaAccess ; OUTSIDE REFERER lis r16, -0x01 ori r16, r16, 0xff10 and. r16, r16, r4 - bne+ major_0x0b054 + bne+ ReleaseAndReturnParamErrFromMPCall lis r16, -0x01 ori r16, r16, 0xff10 and. r16, r16, r5 - bne+ major_0x0b054 + bne+ ReleaseAndReturnParamErrFromMPCall lwz r29, 0x0134(r6) lwz r18, 0x013c(r6) lwz r16, Area.LogicalBase(r31) @@ -2037,8 +2034,8 @@ MPSetAreaAccess ; OUTSIDE REFERER rlwinm. r8, r18, 0, 16, 16 cmplw cr1, r29, r16 cmplw cr2, r28, r19 - blt+ cr1, major_0x0b054 - bgt+ cr2, major_0x0b054 + blt+ cr1, ReleaseAndReturnParamErrFromMPCall + bgt+ cr2, ReleaseAndReturnParamErrFromMPCall bne- MPSetAreaAccess_0x154 _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 @@ -2096,7 +2093,7 @@ MPSetAreaAccess_0x118 b ReleaseAndReturnZeroFromMPCall MPSetAreaAccess_0x154 - bne+ cr1, major_0x0b054 + bne+ cr1, ReleaseAndReturnParamErrFromMPCall lwz r18, 0x001c(r31) and r8, r4, r5 orc r9, r4, r5 @@ -2297,8 +2294,8 @@ MPCall_123 ; OUTSIDE REFERER lwz r18, 0x0020(r31) cmplw r4, r16 cmplw cr1, r4, r17 - blt+ major_0x0b054 - bgt+ cr1, major_0x0b054 + blt+ ReleaseAndReturnParamErrFromMPCall + bgt+ cr1, ReleaseAndReturnParamErrFromMPCall rlwinm. r8, r18, 0, 16, 16 lwz r5, 0x001c(r31) @@ -2375,7 +2372,7 @@ MPCall_78 ; OUTSIDE REFERER bne+ ReleaseAndReturnMPCallInvalidIDErr mr r31, r8 cmpwi r4, 0x01 - bne+ major_0x0b054 + bne+ ReleaseAndReturnParamErrFromMPCall cmplwi r5, 0x00 bne- MPCall_78_0x68 li r16, 0x01 @@ -2443,7 +2440,7 @@ MPCall_78_0xd0 MPCall_78_0xfc cmpwi r5, 0x3c - bne+ major_0x0b054 + bne+ ReleaseAndReturnParamErrFromMPCall li r16, 0x00 stw r16, 0x0154(r6) @@ -2515,7 +2512,7 @@ MPCall_80_0x38 lwz r16, 0x0024(r8) li r5, 0x00 cmplw r16, r4 - bgt+ major_0x0b054 + bgt+ ReleaseAndReturnParamErrFromMPCall lwz r5, 0x0000(r8) ; r1 = kdp @@ -2555,7 +2552,7 @@ MPCall_125_0x38 MPCall_125_0x58 lwz r9, 0x002c(r8) cmpwi r9, noErr - beq+ major_0x0b054 + beq+ ReleaseAndReturnParamErrFromMPCall lwz r5, 0x0000(r8) ; r1 = kdp @@ -2582,8 +2579,8 @@ MPCall_81 ; OUTSIDE REFERER lwz r18, 0x0020(r31) cmplw r4, r16 cmplw cr1, r4, r17 - blt+ major_0x0b054 - bgt+ cr1, major_0x0b054 + blt+ ReleaseAndReturnParamErrFromMPCall + bgt+ cr1, ReleaseAndReturnParamErrFromMPCall rlwinm. r8, r18, 0, 16, 16 lwz r19, 0x0070(r31) beq- MPCall_81_0x70 @@ -2591,7 +2588,7 @@ MPCall_81 ; OUTSIDE REFERER rlwinm r19, r19, 0, 0, 19 cmpwi r17, 0x00 subf r18, r16, r4 - beq+ major_0x0b054 + beq+ ReleaseAndReturnParamErrFromMPCall add r5, r18, r19 ; r1 = kdp @@ -2614,7 +2611,7 @@ MPCall_81_0xa4 b ReleaseAndReturnMPCall MPCall_81_0xc8 - li r3, -0x7272 + li r3, kMPInsufficientResourcesErr b MPCall_81_0xa4 @@ -2641,13 +2638,13 @@ MPCall_98 ; OUTSIDE REFERER addi r5, r5, -0x01 cmplw r4, r16 cmplw cr1, r5, r17 - blt+ major_0x0b054 - bgt+ cr1, major_0x0b054 + blt+ ReleaseAndReturnParamErrFromMPCall + bgt+ cr1, ReleaseAndReturnParamErrFromMPCall lwz r20, Area.BytesMapped(r31) rlwinm. r8, r18, 0, 16, 16 cmpwi cr1, r20, 0x00 beq- MPCall_98_0x84 - beq+ cr1, major_0x0b054 + beq+ cr1, ReleaseAndReturnParamErrFromMPCall lwz r19, 0x0070(r31) subf r18, r16, r4 rlwinm r19, r19, 0, 0, 19 @@ -2671,7 +2668,7 @@ MPCall_98_0x84 li r3, 0x00 bso- cr7, MPCall_98_0xc4 crset cr3_eq - li r3, -0x7272 + li r3, kMPInsufficientResourcesErr MPCall_98_0xc4 rlwimi r17, r4, 0, 20, 31 @@ -2793,7 +2790,7 @@ MPCall_83_0x5c ; OUTSIDE REFERER mr r31, r8 bne+ ReleaseAndReturnMPCallOOM lwz r8, 0x0020(r31) - bl major_0x0d35c + bl SetEvent b ReleaseAndReturnMPCallOOM MPCall_83_0x90 ; OUTSIDE REFERER @@ -2930,19 +2927,19 @@ KCMapPage ; OUTSIDE REFERER mr r31, r8 lwz r16, Area.Flags(r31) rlwinm. r8, r16, 0, 28, 28 - bne+ major_0x0b054 + bne+ ReleaseAndReturnParamErrFromMPCall lwz r16, Area.LogicalBase(r31) lwz r17, Area.LogicalEnd(r31) lwz r19, 0x0020(r31) cmplw r4, r16 cmplw cr1, r4, r17 - blt+ major_0x0b054 - bgt+ cr1, major_0x0b054 + blt+ ReleaseAndReturnParamErrFromMPCall + bgt+ cr1, ReleaseAndReturnParamErrFromMPCall rlwinm. r8, r19, 0, 16, 16 cmplw cr1, r4, r16 lwz r20, Area.BytesMapped(r31) beq- KCMapPage_0x8c - bne+ cr1, major_0x0b054 + bne+ cr1, ReleaseAndReturnParamErrFromMPCall cmpwi r20, 0x00 lwz r8, 0x0070(r31) bne+ ReleaseAndReturnMPCallOOM @@ -3046,7 +3043,7 @@ KCUnmapPages ; OUTSIDE REFERER lwz r8, 0x0134(r6) lwz r16, Area.Flags(r31) rlwinm. r16, r16, 0, 28, 28 - bne+ major_0x0b054 + bne+ ReleaseAndReturnParamErrFromMPCall clrlwi. r8, r8, 0x1f add r5, r5, r4 lwz r16, Area.LogicalBase(r31) @@ -3056,14 +3053,14 @@ KCUnmapPages ; OUTSIDE REFERER addi r5, r5, -0x01 cmplw r4, r16 cmplw cr1, r5, r17 - blt+ major_0x0b054 - bgt+ cr1, major_0x0b054 + blt+ ReleaseAndReturnParamErrFromMPCall + bgt+ cr1, ReleaseAndReturnParamErrFromMPCall lwz r29, 0x0068(r31) lwz r20, Area.BytesMapped(r31) rlwinm. r8, r19, 0, 16, 16 cmplw cr1, r4, r16 beq- KCUnmapPages_0xd8 - bne+ cr1, major_0x0b054 + bne+ cr1, ReleaseAndReturnParamErrFromMPCall cmpwi r20, 0x00 li r20, 0x00 ble+ ReleaseAndReturnMPCallOOM @@ -3161,12 +3158,12 @@ KCMakePhysicallyContiguous ; OUTSIDE REFERER addi r5, r5, -0x01 cmplw r4, r16 cmplw cr1, r5, r17 - blt+ major_0x0b054 - bgt+ cr1, major_0x0b054 + blt+ ReleaseAndReturnParamErrFromMPCall + bgt+ cr1, ReleaseAndReturnParamErrFromMPCall lwz r19, 0x0020(r31) lwz r29, 0x0068(r31) rlwinm. r8, r19, 0, 16, 16 - bne+ major_0x0b054 + bne+ ReleaseAndReturnParamErrFromMPCall _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 @@ -3250,19 +3247,19 @@ KCLockPages ; OUTSIDE REFERER addi r5, r5, -0x01 cmplw r4, r16 cmplw cr1, r5, r17 - blt+ major_0x0b054 - bgt+ cr1, major_0x0b054 + blt+ ReleaseAndReturnParamErrFromMPCall + bgt+ cr1, ReleaseAndReturnParamErrFromMPCall lwz r19, 0x0020(r31) lwz r29, 0x0068(r31) rlwinm. r8, r19, 0, 16, 16 - bne+ major_0x0b054 + bne+ ReleaseAndReturnParamErrFromMPCall mr r27, r4 li r28, 0x00 KCLockPages_0x68 mr r8, r27 bl MPCall_95_0x254 - beq+ major_0x0b054 + beq+ ReleaseAndReturnParamErrFromMPCall lhz r18, 0x0000(r30) rlwinm r17, r18, 24, 25, 31 rlwinm. r8, r18, 0, 16, 16 @@ -3335,18 +3332,18 @@ KCUnlockPages ; OUTSIDE REFERER addi r5, r5, -0x01 cmplw r4, r16 cmplw cr1, r5, r17 - blt+ major_0x0b054 - bgt+ cr1, major_0x0b054 + blt+ ReleaseAndReturnParamErrFromMPCall + bgt+ cr1, ReleaseAndReturnParamErrFromMPCall lwz r19, 0x0020(r31) lwz r29, 0x0068(r31) rlwinm. r8, r19, 0, 16, 16 - bne+ major_0x0b054 + bne+ ReleaseAndReturnParamErrFromMPCall mr r27, r4 KCUnlockPages_0x60 mr r8, r27 bl MPCall_95_0x254 - beq+ major_0x0b054 + beq+ ReleaseAndReturnParamErrFromMPCall lhz r18, 0x0000(r30) rlwinm r17, r18, 24, 25, 31 rlwinm. r8, r18, 0, 16, 16 @@ -3362,7 +3359,7 @@ KCUnlockPages_0x60 KCUnlockPages_0x98 mr r8, r4 bl MPCall_95_0x254 - beq+ major_0x0b054 + beq+ ReleaseAndReturnParamErrFromMPCall lhz r18, 0x0000(r30) rlwinm r17, r18, 24, 25, 31 addi r17, r17, -0x01 @@ -3419,19 +3416,19 @@ KCHoldPages_0x2c ; OUTSIDE REFERER addi r5, r5, -0x01 cmplw r4, r16 cmplw cr1, r5, r17 - blt+ major_0x0b054 - bgt+ cr1, major_0x0b054 + blt+ ReleaseAndReturnParamErrFromMPCall + bgt+ cr1, ReleaseAndReturnParamErrFromMPCall lwz r19, 0x0020(r31) lwz r29, 0x0068(r31) rlwinm. r8, r19, 0, 16, 16 - bne+ major_0x0b054 + bne+ ReleaseAndReturnParamErrFromMPCall mr r27, r4 li r28, 0x00 KCHoldPages_0x64 mr r8, r27 bl MPCall_95_0x254 - beq+ major_0x0b054 + beq+ ReleaseAndReturnParamErrFromMPCall lhz r18, 0x0000(r30) clrlwi r17, r18, 0x18 rlwinm. r8, r18, 0, 16, 16 @@ -3504,18 +3501,18 @@ KCUnholdPages ; OUTSIDE REFERER addi r5, r5, -0x01 cmplw r4, r16 cmplw cr1, r5, r17 - blt+ major_0x0b054 - bgt+ cr1, major_0x0b054 + blt+ ReleaseAndReturnParamErrFromMPCall + bgt+ cr1, ReleaseAndReturnParamErrFromMPCall lwz r19, 0x0020(r31) lwz r29, 0x0068(r31) rlwinm. r8, r19, 0, 16, 16 - bne+ major_0x0b054 + bne+ ReleaseAndReturnParamErrFromMPCall mr r27, r4 KCUnholdPages_0x60 mr r8, r27 bl MPCall_95_0x254 - beq+ major_0x0b054 + beq+ ReleaseAndReturnParamErrFromMPCall lhz r18, 0x0000(r30) clrlwi r17, r18, 0x18 rlwinm. r8, r18, 0, 16, 16 @@ -3531,7 +3528,7 @@ KCUnholdPages_0x60 KCUnholdPages_0x98 mr r8, r4 bl MPCall_95_0x254 - beq+ major_0x0b054 + beq+ ReleaseAndReturnParamErrFromMPCall lhz r18, 0x0000(r30) clrlwi r17, r18, 0x18 addi r17, r17, -0x01 @@ -3577,8 +3574,8 @@ MPCall_91 ; OUTSIDE REFERER lwz r17, Area.LogicalEnd(r31) cmplw r4, r16 cmplw cr1, r4, r17 - blt+ major_0x0b054 - bgt+ cr1, major_0x0b054 + blt+ ReleaseAndReturnParamErrFromMPCall + bgt+ cr1, ReleaseAndReturnParamErrFromMPCall _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 @@ -3634,19 +3631,19 @@ MPCall_92 ; OUTSIDE REFERER mr r31, r8 lwz r16, Area.Flags(r31) rlwinm. r8, r16, 0, 28, 28 - bne+ major_0x0b054 + bne+ ReleaseAndReturnParamErrFromMPCall lwz r29, 0x0134(r6) li r8, 0x318 andc. r9, r5, r8 - bne+ major_0x0b054 + bne+ ReleaseAndReturnParamErrFromMPCall andc. r9, r29, r8 - bne+ major_0x0b054 + bne+ ReleaseAndReturnParamErrFromMPCall lwz r16, Area.LogicalBase(r31) lwz r17, Area.LogicalEnd(r31) cmplw r4, r16 cmplw cr1, r4, r17 - blt+ major_0x0b054 - bgt+ cr1, major_0x0b054 + blt+ ReleaseAndReturnParamErrFromMPCall + bgt+ cr1, ReleaseAndReturnParamErrFromMPCall _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 @@ -3694,11 +3691,11 @@ MPCall_93 ; OUTSIDE REFERER lwz r17, Area.LogicalEnd(r31) cmplw r4, r16 cmplw cr1, r4, r17 - blt+ major_0x0b054 - bgt+ cr1, major_0x0b054 + blt+ ReleaseAndReturnParamErrFromMPCall + bgt+ cr1, ReleaseAndReturnParamErrFromMPCall mr r8, r4 bl MPCall_95_0x254 - beq+ major_0x0b054 + beq+ ReleaseAndReturnParamErrFromMPCall lhz r18, 0x0000(r30) rlwinm. r8, r18, 0, 16, 16 li r5, 0x00 @@ -3730,13 +3727,13 @@ MPCall_94 ; OUTSIDE REFERER lwz r17, Area.LogicalEnd(r31) cmplw r4, r16 cmplw cr1, r4, r17 - blt+ major_0x0b054 - bgt+ cr1, major_0x0b054 + blt+ ReleaseAndReturnParamErrFromMPCall + bgt+ cr1, ReleaseAndReturnParamErrFromMPCall mr r8, r4 bl MPCall_95_0x254 - beq+ major_0x0b054 + beq+ ReleaseAndReturnParamErrFromMPCall cmplwi r5, 0x7fff - bgt+ major_0x0b054 + bgt+ ReleaseAndReturnParamErrFromMPCall lhz r18, 0x0000(r30) rlwinm. r8, r18, 0, 16, 16 bne+ ReleaseAndReturnMPCallOOM @@ -3779,11 +3776,11 @@ MPCall_129 ; OUTSIDE REFERER lwz r17, Area.LogicalEnd(r31) cmplw r4, r16 cmplw cr1, r4, r17 - blt+ major_0x0b054 - bgt+ cr1, major_0x0b054 + blt+ ReleaseAndReturnParamErrFromMPCall + bgt+ cr1, ReleaseAndReturnParamErrFromMPCall mr r8, r4 bl MPCall_95_0x254 - beq+ major_0x0b054 + beq+ ReleaseAndReturnParamErrFromMPCall lhz r18, 0x0000(r30) li r5, 0x00 rlwinm. r8, r18, 0, 16, 16 diff --git a/NanoKernel/NKCacheCalls.s b/NanoKernel/NKCacheCalls.s index 922feab..f28095d 100644 --- a/NanoKernel/NKCacheCalls.s +++ b/NanoKernel/NKCacheCalls.s @@ -145,7 +145,7 @@ kcCacheDispatch_0x1d0 lwz r22, 0x01b4(r6) lwz r23, 0x01bc(r6) sync - b skeleton_key + b IntReturn kcCacheDispatch_0x1e4 clrlwi r8, r3, 0x10 diff --git a/NanoKernel/NKEquates.s b/NanoKernel/NKEquates.s index 09145e3..de11928 100644 --- a/NanoKernel/NKEquates.s +++ b/NanoKernel/NKEquates.s @@ -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 diff --git a/NanoKernel/NKInit.s b/NanoKernel/NKInit.s index 3586194..dce9e70 100644 --- a/NanoKernel/NKInit.s +++ b/NanoKernel/NKInit.s @@ -213,7 +213,7 @@ FinishInitBuiltin mtspr mq, r8 li r8, 0 mfspr r8, mq - stw r8, PSA.EmpiricalCpuFeatures(r1) + stw r8, PSA.GlobalCPUFlags(r1) ; Add AV and save that in scratch field oris r9, r8, 1 << (15 - PSA.AVFeatureBit) @@ -230,11 +230,11 @@ FinishInitBuiltin stvewx v0, 0, r9 ; Scratch field now contains AltiVec and MQ flags. - ; Copy it to EmpiricalCpuFeatures + ; Copy it to GlobalCPUFlags 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 stw r7, EWA.Flags(r1) @@ -300,7 +300,7 @@ ResetBuiltinKernel ; r5 = SystemInfo ; r6 = PA_ECB ; r7 = AllCpuFeatures -; r8 = EmpiricalCpuFeatures +; r8 = GlobalCPUFlags ; r9 = even more altivec crud ; r10 = LA_EmulatorKernelTrapTable ; r11 = MSR @@ -1105,13 +1105,13 @@ SetProcessorFlags lwz r8, EWA.PA_CurAddressSpace(r1) li r9, 0 - bl SetAddrSpcRegisters + bl SetSpaceSRsAndBATs ; Create the Blue MacOS task - ; ARG EmpiricalCpuFeatures r7, Process *r8 + ; ARG GlobalCPUFlags r7, Process *r8 ; RET Task *r8 lwz r8, PSA.blueProcessPtr(r1) @@ -1140,8 +1140,8 @@ SetProcessorFlags li r8, 2 stb r8, Task.MysteryByte1(r31) - lisori r8, 0x00030028 - stw r8, 0x0064(r31) + lisori r8, 0x30028 ; (Z>>Task.kFlag14) | (Z>>Task.kFlagBlue) | (Z>>Task.kFlag26) | (Z>>Task.kFlag28) + stw r8, Task.Flags(r31) li r8, 200 stw r8, Task.Weight(r31) @@ -1149,7 +1149,7 @@ SetProcessorFlags li r8, Task.kNominalPriority stb r8, Task.Priority(r31) - lhz r8, -0x0116(r1) ; zero?????? + lhz r8, EWA.CPUIndex(r1) ; zero?????? sth r8, 0x001a(r31) lwz r8, EWA.CPUBase + CPU.ID(r1) @@ -1209,20 +1209,20 @@ SetProcessorFlags ; 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 ; (Leave the old value in r31) av set PSA.AVFeatureBit mr r31, r7 rlwinm r7, r7, 0, av + 1, av - 1 - ; ARG EmpiricalCpuFeatures r7, Process *r8 + ; ARG GlobalCPUFlags r7, Process *r8 ; RET Task *r8 lwz r8, PSA.blueProcessPtr(r1) bl CreateTask - ; Restore EmpiricalCpuFeatures + ; Restore GlobalCPUFlags mr r7, r31 ; Check @@ -1234,9 +1234,8 @@ av set PSA.AVFeatureBit stw r8, Task.Name(r31) - ; Blue has 0x00030028 - lisori r8, 0x000a0040 - stw r8, Task.ThingThatAlignVecHits(r31) + lisori r8, 0xA0040 ; (Z>>Task.kFlag12) | (Z>>Task.kFlag14) | (Z>>Task.kFlag25) + stw r8, Task.Flags(r31) ; For the scheduler li r8, 1 @@ -1253,9 +1252,9 @@ av set PSA.AVFeatureBit stw r8, Task.CpuID(r31) ; Add a feature!?!?!?! - lwz r8, Task.ContextBlock + ContextBlock.EmpiricalCpuFeatures(r31) + lwz r8, Task.ContextBlock + ContextBlock.Flags(r31) 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 lwz r8, KDP.PA_NanoKernelCode(r1) diff --git a/NanoKernel/NKInterrupts.s b/NanoKernel/NKInterrupts.s index 7894f74..f561ec6 100644 --- a/NanoKernel/NKInterrupts.s +++ b/NanoKernel/NKInterrupts.s @@ -9,7 +9,7 @@ Local_Panic set * ; major_0x02ccc major_0x02964 ; OUTSIDE REFERER - b AlternateMPCallReturnPath + b BlockMPCall @@ -37,7 +37,7 @@ major_0x02964 ; OUTSIDE REFERER major_0x02980 ; OUTSIDE REFERER mfsprg r1, 0 mtsprg 3, r24 - lwz r9, -0x000c(r1) + lwz r9, EWA.Enables(r1) rlwinm r23, r17, 31, 27, 31 rlwnm. r9, r9, r8, 0x00, 0x00 bsol- cr3, major_0x02980_0x100 @@ -84,12 +84,12 @@ major_0x02980_0xa8 stw r12, 0x008c(r6) stw r3, 0x0094(r6) stw r4, 0x009c(r6) - lwz r8, -0x000c(r1) + lwz r8, EWA.Enables(r1) stw r7, 0x0040(r6) stw r8, 0x0044(r6) li r8, 0x00 lwz r10, 0x004c(r6) - stw r8, -0x000c(r1) + stw r8, EWA.Enables(r1) lwz r1, -0x0004(r1) lwz r4, 0x0054(r6) lwz r3, 0x0654(r1) @@ -102,7 +102,7 @@ major_0x02980_0xec bsol- cr6, major_0x02980_0x114 rlwinm r7, r7, 0, 29, 16 rlwimi r11, r7, 0, 20, 23 - b skeleton_key + b IntReturn major_0x02980_0x100 lwz r2, 0x0008(r1) @@ -124,7 +124,7 @@ major_0x02980_0x114 ; OUTSIDE REFERER major_0x02980_0x134 ; OUTSIDE REFERER mfsprg r1, 0 mtcrf 0x3f, r7 - lwz r9, -0x000c(r1) + lwz r9, EWA.Enables(r1) lwz r1, -0x0004(r1) rlwnm. r9, r9, r8, 0x00, 0x00 rlwimi r7, r8, 24, 0, 7 @@ -142,16 +142,16 @@ major_0x02980_0x134 ; OUTSIDE REFERER major_0x02980_0x178 ; OUTSIDE REFERER lwz r1, -0x0004(r1) - lwz r9, 0x0658(r1) + lwz r9, KDP.PA_ECB(r1) addi r8, r1, 0x360 mtsprg 3, r8 - bltl- cr2, major_0x02ccc_0x108 + bltl- cr2, BlueException major_0x02980_0x18c ; OUTSIDE REFERER mfsprg r1, 0 - lwz r8, -0x000c(r1) - stw r7, 0x0000(r6) - stw r8, 0x0004(r6) + lwz r8, EWA.Enables(r1) + stw r7, ContextBlock.Flags(r6) + stw r8, ContextBlock.Enables(r6) bns- cr6, major_0x02980_0x1b8 stw r17, 0x0024(r6) stw r20, 0x0028(r6) @@ -217,7 +217,7 @@ major_0x02980_0x260 andi. r8, r11, 0x900 lwz r8, 0x0004(r6) lwz r13, 0x00dc(r6) - stw r8, -0x000c(r1) + stw r8, EWA.Enables(r1) lwz r8, 0x00d4(r6) lwz r12, 0x00ec(r6) mtxer r8 @@ -264,7 +264,7 @@ major_0x02980_0x2d0 -; skeleton_key +; IntReturn ; Called when a Gary reset trap is called. When else? @@ -288,14 +288,14 @@ major_0x02980_0x2d0 ; CommonMPCallReturnPath ; CommonPIHPath -skeleton_key ; OUTSIDE REFERER +IntReturn ; OUTSIDE REFERER andi. r8, r7, 0x30 mfsprg r1, 0 bnel- major_0x02ccc li r8, 0x00 - stw r7, -0x0010(r1) + stw r7, EWA.Flags(r1) stw r8, -0x0114(r1) - b major_0x142a8 + b ReturnToAnyTask @@ -303,20 +303,20 @@ skeleton_key ; OUTSIDE REFERER ; Xrefs: ; major_0x02980 -; skeleton_key +; IntReturn major_0x02ccc ; OUTSIDE REFERER mtcrf 0x3f, r7 - bns- cr6, major_0x02ccc_0x18 + bc BO_IF_NOT, 27, major_0x02ccc_0x18 rlwinm r7, r7, 0, 28, 26 - bso- cr7, major_0x02ccc_0x30 + bc BO_IF, 31, major_0x02ccc_0x30 rlwinm r7, r7, 0, 27, 25 b major_0x02ccc_0x2c major_0x02ccc_0x18 bne- cr6, major_0x02ccc_0x2c rlwinm r7, r7, 0, 27, 25 - stw r7, -0x0010(r1) + stw r7, EWA.Flags(r1) li r8, 0x08 b major_0x02980_0x134 @@ -325,8 +325,8 @@ major_0x02ccc_0x2c major_0x02ccc_0x30 rlwinm. r8, r7, 0, 8, 8 - beq- major_0x02ccc_0x108 - stw r7, -0x0010(r1) + beq- BlueException + stw r7, EWA.Flags(r1) lwz r8, 0x0104(r6) stw r8, 0x0000(r1) stw r2, 0x0008(r1) @@ -361,7 +361,7 @@ major_0x02ccc_0x30 rlwimi r25, r17, 7, 25, 30 lhz r26, 0x0d20(r25) 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 r25, r17, 4, 23, 27 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 lwz r31, EWA.PA_CurTask(r8) - lwz r8, 0x00f4(r31) - -; r8 = id + lwz r8, Task.ExceptionHandlerID(r31) bl LookupID cmpwi r9, Queue.kIDClass - mr r30, r8 - bnel- major_0x02ccc_0x20c - lwz r28, 0x0028(r30) - cmpwi r28, 0x00 - beql- major_0x02ccc_0x20c + bnel- @no_exception_handler + 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 - lwz r29, 0x0064(r31) - ori r29, r29, 0x200 - ori r29, r29, 0x1000 - stw r29, 0x0064(r31) - lwz r17, 0x0008(r28) - stw r17, 0x0028(r30) - lwz r17, 0x0000(r31) - stw r17, 0x0010(r28) - li r18, -0x7271 - stw r18, 0x0014(r28) - stw r18, 0x00f8(r31) - stw r10, 0x0018(r28) + lwz r29, Task.Flags(r31) + _bset r29, r29, Task.kFlag22 + _bset r29, r29, Task.kFlag19 + stw r29, Task.Flags(r31) + + ; pop 'notr' + lwz r17, Message.LLL + LLL.Next(r28) + stw r17, Queue.ReservePtr(r30) + + ; word1 = task ID + lwz r17, Task.ID(r31) + 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 ' mr r8, r11 bl Printw @@ -420,12 +428,15 @@ major_0x02ccc_0x108 ; OUTSIDE REFERER mr r8, r12 bl Printw _log '^n' + mr r31, r30 mr r8, r28 - bl major_0x0c8b4 - b major_0x142dc + bl EnqueueMessage ; Message *r8, Queue *r31 -major_0x02ccc_0x20c + b RescheduleAndReturn + +@no_exception_handler +@no_memory_reserved_for_exception_messages mflr r16 _log 'Blue task terminated - no exception handler registered - srr1/0 ' mr r8, r11 @@ -439,6 +450,8 @@ major_0x02ccc_0x20c mtlr r16 b Local_Panic + + major_0x02ccc_0x2a4 ; OUTSIDE REFERER bsol+ cr6, Local_Panic @@ -457,7 +470,7 @@ major_0x02ccc_0x2a4 ; OUTSIDE REFERER _Lock PSA.SchLock, scratch1=r28, scratch2=r29 mr r8, r31 - bl DequeueTask + bl TaskUnready lwz r16, 0x0064(r31) srwi r8, r7, 24 rlwinm. r16, r16, 0, 9, 9 @@ -489,7 +502,7 @@ major_0x02ccc_0x310 ; OUTSIDE REFERER _Lock PSA.SchLock, scratch1=r28, scratch2=r29 mr r8, r31 - bl DequeueTask + bl TaskUnready lwz r16, 0x0064(r31) srwi r8, r7, 24 rlwinm. r16, r16, 0, 9, 9 @@ -545,7 +558,7 @@ major_0x02ccc_0x3d4 stw r27, 0x0014(r26) stw r28, 0x0018(r26) mr r30, r26 - bl major_0x0db04 + bl CauseNotification cmpwi r8, 0x00 beq+ major_0x02964 @@ -572,10 +585,10 @@ major_0x02ccc_0x430 stw r30, 0x0018(r26) mr r8, r26 addi r31, r1, -0xa24 - bl major_0x0c8b4 + bl EnqueueMessage ; Message *r8, Queue *r31 lwz r8, -0x0410(r1) - bl major_0x0dce8 - b AlternateMPCallReturnPath + bl UnblockBlueIfCouldBePolling + b BlockMPCall major_0x02ccc_0x4a8 mr r8, r31 @@ -606,7 +619,7 @@ major_0x02ccc_0x50c mr r8, r31 bl TaskReadyAsPrev bl major_0x14af8_0xa0 - b AlternateMPCallReturnPath + b BlockMPCall major_0x02ccc_0x524 b FuncExportedFromTasks @@ -635,24 +648,27 @@ IntDecrementer ; OUTSIDE REFERER ; r12 = sprg2 ; r13 = cr - lwz r8, 0x05a0(r1) + lwz r8, KDP.OldKDP(r1) rlwinm. r9, r11, 0, 16, 16 cmpwi cr1, r8, 0x00 beq- MaskedInterruptTaken beq- cr1, IntDecrementer_0x54 - stw r16, 0x0184(r6) - stw r17, 0x018c(r6) - stw r18, 0x0194(r6) - stw r25, 0x01cc(r6) + stw r16, ContextBlock.r16(r6) + stw r17, ContextBlock.r17(r6) + stw r18, ContextBlock.r18(r6) + stw r25, ContextBlock.r25(r6) + bl major_0x14a98 ble- IntDecrementer_0x48 - lwz r8, -0x09d4(r1) + + lwz r8, PSA.CriticalReadyQ + ReadyQueue.Timecake + 4(r1) mtspr dec, r8 - lwz r16, 0x0184(r6) - lwz r17, 0x018c(r6) - lwz r18, 0x0194(r6) - b skeleton_key + + lwz r16, ContextBlock.r16(r6) + lwz r17, ContextBlock.r17(r6) + lwz r18, ContextBlock.r18(r6) + b IntReturn IntDecrementer_0x48 lwz r16, 0x0184(r6) @@ -673,9 +689,8 @@ IntDecrementer_0x54 bl TimerDispatch _AssertAndRelease PSA.SchLock, scratch=r8 -; r6 = ewa bl Restore_r14_r31 - b skeleton_key + b IntReturn @@ -698,7 +713,7 @@ IntDSI ; OUTSIDE REFERER mfsprg r12, 2 mfcr r13 mfsprg r24, 3 - lwz r16, -0x0010(r1) + lwz r16, EWA.Flags(r1) lwz r1, -0x0004(r1) mfspr r26, dsisr addi r23, r1, 0x4e0 @@ -731,7 +746,7 @@ major_0x03324 ; OUTSIDE REFERER major_0x03324_0x18 andis. r26, r27, 0xec00 - lwz r16, -0x0010(r1) + lwz r16, EWA.Flags(r1) rlwinm r17, r27, 0, 6, 15 rlwimi r16, r16, 27, 26, 26 bge- major_0x03324_0x58 @@ -831,7 +846,7 @@ IntAlignment ; OUTSIDE REFERER lwz r11, EWA.PA_CurTask(r1) lwz r16, EWA.Flags(r1) - lwz r21, Task.ThingThatAlignVecHits(r11) + lwz r21, Task.Flags(r11) lwz r1, -0x0004(r1) ; wha??? lwz r11, KDP.NanoKernelInfo + NKNanoKernelInfo.MisalignmentCount(r1) @@ -846,7 +861,7 @@ IntAlignment ; OUTSIDE REFERER mfspr r27, dsisr mfspr r18, dar - rlwinm. r21, r21, 0, 9, 9 ; KDP.ThingThatAlignVecHits + rlwinm. r21, r21, 0, Task.kFlag9, Task.kFlag9 addi r23, r1, KDP.RedVecBase @@ -1223,7 +1238,7 @@ IntISI ; OUTSIDE REFERER mfsprg r8, 0 mtsprg 3, r24 lmw r14, 0x0038(r8) - b skeleton_key + b IntReturn @@ -1289,7 +1304,7 @@ IntMachineCheck ; OUTSIDE REFERER rlwinm. r8, r11, 0, 2, 2 beq- IntMachineCheck_0xa4 bl kcCacheDispatch_0x39c - b skeleton_key + b IntReturn IntMachineCheck_0xa4 li r8, 0x07 @@ -1393,14 +1408,14 @@ major_0x03be0_0x58 rlwimi r7, r8, 0, 17, 7 lwz r8, 0x0044(r6) rlwimi r11, r7, 0, 20, 23 - stw r8, -0x000c(r1) + stw r8, EWA.Enables(r1) andi. r8, r11, 0x900 lwz r12, 0x008c(r6) lwz r3, 0x0094(r6) lwz r4, 0x009c(r6) bnel- major_0x03e18 addi r9, r6, 0x40 - b skeleton_key + b IntReturn major_0x03be0_0x90 lwz r9, 0x0ea8(r1) @@ -1413,7 +1428,7 @@ major_0x03be0_0x90 lwz r8, 0x0044(r6) mtcrf 0x0f, r7 rlwimi r11, r7, 0, 20, 23 - stw r8, -0x000c(r1) + stw r8, EWA.Enables(r1) lwz r12, 0x008c(r6) lwz r3, 0x0094(r6) lwz r4, 0x009c(r6) @@ -1462,7 +1477,7 @@ save_all_registers ; OUTSIDE REFERER mfspr r11, srr1 mfcr r13 mfsprg r12, 2 - lwz r7, -0x0010(r1) + lwz r7, EWA.Flags(r1) lwz r1, -0x0004(r1) ; r6 = ewa @@ -1495,7 +1510,7 @@ save_all_registers ; OUTSIDE REFERER ; r4 (itself) ; r5 (itself) ; r6 ContextBlock EWA -; r7 AllCpuFeatures ContextBlock +; r7 Flags ContextBlock ; r8 EWA ContextBlock ; r9 (itself) ContextBlock ; r10 SRR0 ContextBlock @@ -1833,21 +1848,18 @@ IntPerfMonitor ; OUTSIDE REFERER stw r16, 0x0014(r30) mfspr r16, 955 stw r16, 0x0018(r30) - bl major_0x0db04 + bl CauseNotification IntPerfMonitor_0x88 _AssertAndRelease PSA.SchLock, scratch=r8 ; r6 = ewa bl Restore_r14_r31 - b skeleton_key + b IntReturn -; IntThermalEvent - -; Xrefs: -; "vec" +; Notify the Thermal Handler align kIntAlign @@ -1860,24 +1872,20 @@ IntThermalEvent ; OUTSIDE REFERER _Lock PSA.SchLock, scratch1=r8, scratch2=r9 - lwz r8, -0x0418(r1) - -; r8 = id + lwz r8, PSA.ThermalHandlerID(r1) bl LookupID cmpwi r9, Notification.kIDClass - mr r30, r8 - bne- IntThermalEvent_0x68 - lwz r16, -0x0340(r28) - stw r16, 0x0010(r30) - bl major_0x0db04 + bne- @no_thermal_handler + + lwz r16, EWA.CPUBase + CPU.ID(r28) + stw r16, Notification.MsgWord1(r30) + bl CauseNotification +@no_thermal_handler -IntThermalEvent_0x68 _AssertAndRelease PSA.SchLock, scratch=r8 - -; r6 = ewa bl Restore_r14_r31 - b skeleton_key + b IntReturn @@ -1890,12 +1898,12 @@ IntThermalEvent_0x68 kcRunAlternateContext ; OUTSIDE REFERER mtcrf 0x3f, r7 - bnel+ cr2, skeleton_key + bnel+ cr2, IntReturn and. r8, r4, r13 lwz r9, 0x0340(r1) rlwinm r8, r3, 0, 0, 25 cmpw cr1, r8, r9 - bne+ skeleton_key + bne+ IntReturn lwz r9, 0x0344(r1) bne- cr1, major_0x043a0_0x48 @@ -2014,20 +2022,11 @@ wordfill ; OUTSIDE REFERER -; kcResetSystem - ; 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: -; "sup" +; If A0(r3)/A1(r4) == 'Gary'/$05051955, load the register list in A3? Or is this now disabled? -; > r3 = a0 -; > r4 = a1 +; New SRR0 = SRR0 & ~r5(D0) | r7(D2) align kIntAlign @@ -2056,12 +2055,12 @@ kcResetSystem ; OUTSIDE REFERER andis. r9, r9, 0xffff cmplwi r8, 'ry' - bne- non_skeleton_reset_trap + bne- NonGaryReset ; r4 (i.e. A1) == 5 May 1956? xoris r8, r4, 0x0505 cmplwi r8, 0x1956 - bne- non_skeleton_reset_trap + bne- NonGaryReset andc r11, r11, r5 lwz r8, ContextBlock.r7(r6) @@ -2077,18 +2076,18 @@ kcResetSystem ; OUTSIDE REFERER _log '^n' - b skeleton_key + b IntReturn -; non_skeleton_reset_trap +; NonGaryReset ; A 68k reset trap without Gary Davidian's magic numbers. ; Xrefs: ; kcResetSystem -non_skeleton_reset_trap +NonGaryReset _log 'ResetSystem trap entered^n' @@ -2114,7 +2113,7 @@ non_skeleton_reset_trap stw r6, 0x065c(r8) stw r7, 0x0660(r8) ; ?????????? - lwz r9, -0x000c(r1) + lwz r9, EWA.Enables(r1) stw r9, 0x0664(r8) ; r6 = ewa @@ -2130,7 +2129,7 @@ non_skeleton_reset_trap ; r11 = new srr1 ; r12 = lr restore ; r13 = cr restore - b int_teardown + b ReturnFromInterrupt @@ -2338,7 +2337,7 @@ IntProgram_0xd0 xoris r13, r13, 0x2000 lwz r8, 0x00ec(r9) stw r8, 0x0104(r6) - b skeleton_key + b IntReturn IntProgram_0x110 mtcr r7 @@ -2435,13 +2434,13 @@ IntExternalYellow ; OUTSIDE REFERER cmpwi cr2, r8, -0x725f beq+ kcPrioritizeInterrupts - beq+ cr1, skeleton_key + beq+ cr1, IntReturn bne+ cr2, kcPrioritizeInterrupts mfsprg r9, 0 li r8, 0x01 - stb r8, EWA.BinaryFlag(r9) - b skeleton_key + stb r8, EWA.SchEvalFlag(r9) + b IntReturn @@ -2454,7 +2453,7 @@ IntExternalYellow ; OUTSIDE REFERER ; MPCall_43 ; KCStartCPU ; KCCpuPlugin -; major_0x14af8 +; FlagSchEvaluationIfTaskRequires ; MPCall_103 ; > r7 = flags @@ -2501,7 +2500,7 @@ SIGP_0x28 lwz r8, 0x004c(r22) cmpw r9, r8 beq- SIGP_0x94 - bl SetAddrSpcRegisters + bl SetSpaceSRsAndBATs SIGP_0x94 lwz r16, 0x0004(r23) @@ -2513,7 +2512,7 @@ SIGP_0x94 stw r5, 0x012c(r6) stw r17, 0x0134(r6) lwz r17, 0x0648(r1) - lhz r16, -0x0116(r23) + lhz r16, EWA.CPUIndex(r23) lwz r19, -0x0964(r1) slwi r16, r16, 2 rlwinm r19, r19, 0, 18, 15 @@ -2581,7 +2580,7 @@ major_0x04a20_0x30 lwz r9, -0x001c(r23) cmpw r9, r8 beq- major_0x04a20_0x44 - bl SetAddrSpcRegisters + bl SetSpaceSRsAndBATs major_0x04a20_0x44 lwz r10, -0x02d0(r23) @@ -2648,7 +2647,7 @@ IntSyscall ; OUTSIDE REFERER ; sc -1: mess around with flags - lwz r0, -0x0010(r1) + lwz r0, EWA.Flags(r1) mfsprg r1, 2 rlwinm. r0, r0, 0, 10, 10 mtlr r1 @@ -2661,7 +2660,7 @@ IntSyscall ; OUTSIDE REFERER ; sc -2: more flag nonsense? - lwz r0, -0x0010(r1) + lwz r0, EWA.Flags(r1) lwz r1, -0x0008(r1) rlwinm. r0, r0, 0, 10, 10 lwz r0, 0x00ec(r1) diff --git a/NanoKernel/NKMPCalls.s b/NanoKernel/NKMPCalls.s index a6ef712..84f24ee 100644 --- a/NanoKernel/NKMPCalls.s +++ b/NanoKernel/NKMPCalls.s @@ -267,7 +267,7 @@ ReturnZeroFromMPCall ; OUTSIDE REFERER -; major_0x0af60 +; ReleaseAndScrambleMPCall ; Xrefs: ; KCRegisterCpuPlugin @@ -326,14 +326,14 @@ ReturnZeroFromMPCall ; OUTSIDE REFERER ; MPCall_94 ; MPCall_95 -major_0x0af60 ; OUTSIDE REFERER +ReleaseAndScrambleMPCall ; OUTSIDE REFERER _AssertAndRelease PSA.SchLock, scratch=r16 ; I'd really live a name for this. -major_0x0af60_0x20 ; OUTSIDE REFERER +ScrambleMPCall ; OUTSIDE REFERER mfspr r16, pvr rlwinm. r16, r16, 0, 0, 14 @@ -348,7 +348,7 @@ major_0x0af60_0x20 ; OUTSIDE REFERER xoris r16, r16, 0x1950 stw r16, PSA.ScrambledMPCallTime(r1) - li r3, -0x726e + li r3, -29294 b CommonMPCallReturnPath @@ -382,7 +382,7 @@ ReleaseAndReturnMPCallOOM ; OUTSIDE REFERER ; ReturnMPCallOOM ; Xrefs: -; major_0x0af60 +; ReleaseAndScrambleMPCall ; MPCall_0 ; KCRegisterCpuPlugin ; MPCall_47 @@ -428,7 +428,7 @@ ReturnMPCallBlueBlocking ; OUTSIDE REFERER -; major_0x0b054 +; ReleaseAndReturnParamErrFromMPCall ; Xrefs: ; MPCall_128 @@ -456,7 +456,7 @@ ReturnMPCallBlueBlocking ; OUTSIDE REFERER ; MPCall_94 ; MPCall_129 -major_0x0b054 ; OUTSIDE REFERER +ReleaseAndReturnParamErrFromMPCall ; OUTSIDE REFERER _AssertAndRelease PSA.SchLock + Lock.Count, scratch=r16 @@ -464,7 +464,7 @@ major_0x0b054 ; OUTSIDE REFERER ; ReturnParamErrFromMPCall ; Xrefs: -; major_0x0b054 +; ReleaseAndReturnParamErrFromMPCall ; KCGetNextIDOwnedByProcess ; NKLocateInfoRecord ; MPCall_108 @@ -624,7 +624,7 @@ ReturnZeroFromMPCall_again ; OUTSIDE REFERER -; AlternateMPCallReturnPath +; BlockMPCall ; Xrefs: ; major_0x02964 @@ -645,8 +645,8 @@ ReturnZeroFromMPCall_again ; OUTSIDE REFERER ; MPCall_81 ; MPCall_98 -AlternateMPCallReturnPath ; OUTSIDE REFERER - crclr cr2_eq +BlockMPCall ; OUTSIDE REFERER + crclr 10 b TrulyCommonMPCallReturnPath ReleaseAndReturnMPCall ; OUTSIDE REFERER @@ -659,7 +659,7 @@ ReleaseAndReturnMPCall ; OUTSIDE REFERER ; Xrefs: ; MPCallBad ; ReturnZeroFromMPCall -; major_0x0af60 +; ReleaseAndScrambleMPCall ; ReturnMPCallOOM ; ReturnMPCallBlueBlocking ; ReturnParamErrFromMPCall @@ -667,7 +667,7 @@ ReleaseAndReturnMPCall ; OUTSIDE REFERER ; ReturnMPCallInvalidIDErr ; major_0x0b0cc ; ReturnZeroFromMPCall_again -; AlternateMPCallReturnPath +; BlockMPCall ; KCGetCpuCount ; MPCall_6 ; KCYieldWithHint @@ -689,19 +689,21 @@ ReleaseAndReturnMPCall ; OUTSIDE REFERER ; major_0x16b80 CommonMPCallReturnPath ; OUTSIDE REFERER - crset cr2_eq + crset 10 TrulyCommonMPCallReturnPath ; OUTSIDE REFERER mfsprg r8, 0 lwz r9, 0x0134(r6) stw r9, 0x0018(r8) - bne- cr2, @do_the_other_thing_instead - bl Restore_r14_r31 - b skeleton_key -@do_the_other_thing_instead + bc BO_IF_NOT, 10, @block - b major_0x142dc +;return immediately + bl Restore_r14_r31 + b IntReturn + +@block + b RescheduleAndReturn @@ -917,7 +919,7 @@ KCCreateProcess ; OUTSIDE REFERER bl PoolAlloc mr. r31, r8 - beq+ major_0x0af60 + beq+ ReleaseAndScrambleMPCall li r9, Process.kIDClass bl MakeID @@ -926,7 +928,7 @@ KCCreateProcess ; OUTSIDE REFERER bne- @did_not_fail mr r8, r31 bl PoolFree - b major_0x0af60 + b ReleaseAndScrambleMPCall @did_not_fail stw r8, Process.ID(r31) @@ -974,63 +976,67 @@ MPCall_5 ; OUTSIDE REFERER -; MPCall_6 +; ARG ProcessID r3 +; RET OSStatus r3 -; Xrefs: -; kcMPDispatch -; KCStopScheduling -; MPCall_9 -; KCThrowException + DeclareMPCall 6, MPDeleteProcess - 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 - -; r8 = id bl LookupID cmpwi r9, Process.kIDClass - bne+ ReleaseAndReturnMPCallInvalidIDErr mr r31, r8 - lwz r16, 0x0008(r31) - lwz r17, 0x0010(r31) - rlwinm. r8, r16, 0, 30, 30 - cmpwi cr1, r17, 0x00 + + lwz r16, Process.Flags(r31) + lwz r17, Process.TaskCount(r31) + rlwinm. r8, r16, 0, Process.kFlag30, Process.kFlag30 + cmpwi cr1, r17, 0 beq+ ReleaseAndReturnMPCallOOM bne+ cr1, ReleaseAndReturnMPCallOOM + mr r8, r3 bl DeleteID + _AssertAndRelease PSA.SchLock + Lock.Count, scratch=r16 + mr r8, r31 bl PoolFree + b ReturnZeroFromMPCall + + MPCall_6_0x78 ; OUTSIDE REFERER _Lock PSA.SchLock, scratch1=r16, scratch2=r17 mfsprg r16, 0 - rlwinm. r8, r7, 0, 10, 10 - lwz r17, 0x0658(r1) - lwz r31, -0x0008(r16) + rlwinm. r8, r7, 0, 10, 10 + lwz r17, KDP.PA_ECB(r1) + lwz r31, EWA.PA_CurTask(r16) + beq- MPCall_6_0xb4 - lwz r8, 0x00cc(r17) + lwz r8, ContextBlock.PriorityShifty(r17) rlwinm r8, r8, 0, 24, 21 oris r8, r8, 0x8000 - stw r8, 0x00cc(r17) - + stw r8, ContextBlock.PriorityShifty(r17) MPCall_6_0xb4 + mr r8, r31 - bl DequeueTask - li r16, 0x02 - stb r16, 0x0019(r31) + + bl TaskUnready + + li r16, Task.kNominalPriority + stb r16, Task.Priority(r31) + bl TaskReadyAsPrev + mr r8, r31 - bl major_0x14af8 + bl FlagSchEvaluationIfTaskRequires _AssertAndRelease PSA.SchLock + Lock.Count, scratch=r16 b CommonMPCallReturnPath @@ -1047,20 +1053,20 @@ KCYieldWithHint ; OUTSIDE REFERER mfsprg r16, 0 rlwinm. r8, r7, 0, 10, 10 - lwz r17, 0x0658(r1) + lwz r17, KDP.PA_ECB(r1) lwz r31, -0x0008(r16) beq- KCYieldWithHint_0x68 clrlwi. r8, r3, 0x1f - lwz r8, 0x00cc(r17) + lwz r8, ContextBlock.PriorityShifty(r17) rlwinm r8, r8, 0, 24, 21 oris r8, r8, 0x8000 - stw r8, 0x00cc(r17) + stw r8, ContextBlock.PriorityShifty(r17) beq- KCYieldWithHint_0x68 lbz r16, 0x0019(r31) cmpwi r16, 0x02 bge- KCYieldWithHint_0x7c mr r8, r31 - bl DequeueTask + bl TaskUnready li r16, 0x02 stb r16, 0x0019(r31) bl TaskReadyAsNext @@ -1068,14 +1074,14 @@ KCYieldWithHint ; OUTSIDE REFERER KCYieldWithHint_0x68 mr r8, r31 - bl DequeueTask + bl TaskUnready li r16, 0x02 stb r16, 0x0019(r31) bl TaskReadyAsPrev KCYieldWithHint_0x7c mr r8, r31 - bl major_0x14af8 + bl FlagSchEvaluationIfTaskRequires _AssertAndRelease PSA.SchLock + Lock.Count, scratch=r16 b CommonMPCallReturnPath @@ -1120,12 +1126,11 @@ MPCall_55 ; OUTSIDE REFERER _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - ; if(-0x0410(r1) == -1) {-0x0410(r1) = 0; return 0;} - lwz r16, -0x0410(r1) - cmpwi r16, -0x01 - li r16, 0x00 + lwz r16, PSA.BlueSpinningOn(r1) + cmpwi r16, -1 + li r16, 0 bne- MPCall_55_0x60 - stw r16, -0x0410(r1) + stw r16, PSA.BlueSpinningOn(r1) b ReleaseAndReturnZeroFromMPCall @@ -1135,9 +1140,9 @@ MPCall_55_0x60 ; OUTSIDE REFERER li r17, 1 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? clrlwi r3, r3, 1 @@ -1150,7 +1155,7 @@ MPCall_55_0x60 ; OUTSIDE REFERER bl EnqueueTimer mr r8, r31 - bl DequeueTask + bl TaskUnready addi r16, r1, PSA.DelayQueue addi r17, r31, Timer.QueueLLL @@ -1159,7 +1164,7 @@ MPCall_55_0x60 ; OUTSIDE REFERER InsertAsPrev r17, r16, scratch=r18 li r3, 0 - b AlternateMPCallReturnPath + b BlockMPCall @@ -1173,7 +1178,7 @@ MPCall_34 ; OUTSIDE REFERER ; r9 = kind bl MakeID cmpwi r8, 0x00 - beq+ major_0x0af60_0x20 + beq+ ScrambleMPCall mr r5, r8 b ReturnZeroFromMPCall @@ -1307,7 +1312,7 @@ KCGetNextIDOwnedByProcess ; OUTSIDE REFERER b ReturnParamErrFromMPCall @task - lwz r17, Task.ThingThatAlignVecHits(r8) + lwz r17, Task.Flags(r8) lwz r9, Task.ProcessID(r8) rlwinm. r17, r17, 0, 15, 15 @@ -1479,7 +1484,7 @@ KCCreateCpuStruct_0x24 ; r8 = ptr mr. r31, r8 - beq+ major_0x0af60_0x20 + beq+ ScrambleMPCall _Lock PSA.SchLock, scratch1=r16, scratch2=r17 @@ -1492,7 +1497,7 @@ KCCreateCpuStruct_0x24 bne+ KCCreateCpuStruct_0x68 mr r8, r31 bl PoolFree - b major_0x0af60 + b ReleaseAndScrambleMPCall KCCreateCpuStruct_0x68 @@ -1584,7 +1589,7 @@ MPCall_43 ; OUTSIDE REFERER mfsprg r15, 0 li r16, 0x04 stw r16, -0x0238(r15) - lhz r16, 0x022a(r31) + lhz r16, CPU.EWA + EWA.CPUIndex(r31) stw r16, -0x0234(r15) li r8, 0x02 @@ -1628,7 +1633,7 @@ KCStartCPU ; OUTSIDE REFERER mfsprg r15, 0 li r16, 0x04 stw r16, -0x0238(r15) - lhz r16, 0x022a(r30) + lhz r16, CPU.EWA + EWA.CPUIndex(r30) stw r16, -0x0234(r15) @@ -1650,21 +1655,21 @@ KCStartCPU ; OUTSIDE REFERER rlwinm r7, r7, 0, 13, 11 lwz r8, PSA.blueProcessPtr(r1) -; ARG EmpiricalCpuFeatures r7, Process *r8 +; ARG GlobalCPUFlags r7, Process *r8 bl CreateTask ; RET Task *r8 mr r7, r31 mr. r31, r8 - beq+ major_0x0af60 + beq+ ReleaseAndScrambleMPCall stw r31, CPU.IdleTaskPtr(r30) lisori r8, 'idle' stw r8, Task.Name(r31) - lisori r8, 0x00080040 ; clearly flags - stw r8, Task.ThingThatAlignVecHits(r31) + lisori r8, 0x80040 ; (Z>>Task.kFlag12)| (Z>>Task.kFlag25) + stw r8, Task.Flags(r31) li r8, 1 stw r8, Task.Weight(r31) @@ -1673,12 +1678,12 @@ KCStartCPU ; OUTSIDE REFERER stb r8, Task.Priority(r31) ; whoa -- cpu structs arent this big? - lhz r8, 0x022a(r30) - sth r8, Task.MysteryHalf(r31) + lhz r8, CPU.EWA + EWA.CPUIndex(r30) + sth r8, Task.CPUIndex(r31) - lwz r8, Task.ContextBlock + ContextBlock.EmpiricalCpuFeatures(r31) + lwz r8, Task.ContextBlock + ContextBlock.Flags(r31) _bset r8, r8, 9 - stw r8, Task.ContextBlock + ContextBlock.EmpiricalCpuFeatures(r31) + stw r8, Task.ContextBlock + ContextBlock.Flags(r31) lwz r8, KDP.PA_NanoKernelCode(r1) @@ -1699,7 +1704,7 @@ KCStartCPU ; OUTSIDE REFERER mfsprg r15, 0 li r16, 0x08 stw r16, -0x0238(r15) - lhz r16, 0x022a(r30) + lhz r16, CPU.EWA + EWA.CPUIndex(r30) stw r16, -0x0234(r15) MPCall_44_0x15c @@ -1718,7 +1723,7 @@ MPCall_44_0x15c mfsprg r15, 0 li r16, 0x01 stw r16, -0x0238(r15) - lhz r16, 0x022a(r30) + lhz r16, CPU.EWA + EWA.CPUIndex(r30) stw r16, -0x0234(r15) lwz r16, 0x064c(r1) llabel r17, major_0x14bcc @@ -1774,7 +1779,7 @@ KCStopScheduling ; OUTSIDE REFERER oris r17, r17, 0x80 stw r17, 0x0064(r31) mr r8, r31 - bl DequeueTask + bl TaskUnready li r17, 0x00 stb r17, 0x0019(r31) mr r8, r31 @@ -1991,9 +1996,9 @@ KCMarkPMFTask ; OUTSIDE REFERER @use_blue_task_instead ; 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 - stw r17, Task.ThingThatAlignVecHits(r31) + stw r17, Task.Flags(r31) ; Don't know what this does! @@ -2155,7 +2160,7 @@ NKSetClockStep ; OUTSIDE REFERER ; r1 = kdp beq+ ReleaseAndReturnZeroFromMPCall mr r8, r31 - bl major_0x136c8 + bl DequeueTimer ; r1 = kdp b ReleaseAndReturnZeroFromMPCall @@ -2265,7 +2270,7 @@ NKSetClockDriftCorrection_0x12c ; r1 = kdp beq+ ReleaseAndReturnZeroFromMPCall mr r8, r31 - bl major_0x136c8 + bl DequeueTimer ; r1 = kdp b ReleaseAndReturnZeroFromMPCall diff --git a/NanoKernel/NKMacros.s b/NanoKernel/NKMacros.s index 07e4db5..dc4630b 100644 --- a/NanoKernel/NKMacros.s +++ b/NanoKernel/NKMacros.s @@ -86,7 +86,7 @@ MACRO - StartLoadingWord ®, &val + _lstart ®, &val LHHI (®), (&val) HalfLoadedWord set (&val) HalfLoadedReg set (®) @@ -94,16 +94,16 @@ HalfLoadedReg set (®) MACRO - FinishLoadingWord + _lfinish LLHI HalfLoadedReg, HalfLoadedWord ENDM MACRO InitList &ptr, &sig, &scratch==r8 - StartLoadingWord &scratch, &sig + _lstart &scratch, &sig stw &ptr, LLL.Next(&ptr) - FinishLoadingWord + _lfinish stw &ptr, LLL.Prev(&ptr) stw &scratch, LLL.Signature(&ptr) ENDM @@ -203,3 +203,30 @@ HalfLoadedReg set (®) ENDIF 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 + diff --git a/NanoKernel/NKPoolAllocator.s b/NanoKernel/NKPoolAllocator.s index 29b4ab1..1db019a 100644 --- a/NanoKernel/NKPoolAllocator.s +++ b/NanoKernel/NKPoolAllocator.s @@ -83,7 +83,7 @@ InitPool ; OUTSIDE REFERER ; MPCall_40 ; MPCall_31 ; MPCall_64 -; major_0x0db04 +; CauseNotification ; CreateTask ; MPCall_58 ; convert_pmdts_to_areas diff --git a/NanoKernel/NKPowerCalls.s b/NanoKernel/NKPowerCalls.s index c9c461a..40228b6 100644 --- a/NanoKernel/NKPowerCalls.s +++ b/NanoKernel/NKPowerCalls.s @@ -138,7 +138,7 @@ major_0x09e28_0x4 lwz r29, 0x01ec(r6) lwz r30, 0x01f4(r6) lwz r31, 0x01fc(r6) - b skeleton_key + b IntReturn major_0x09e28_0x24 ; OUTSIDE REFERER li r3, -0x7267 @@ -146,11 +146,11 @@ major_0x09e28_0x24 ; OUTSIDE REFERER major_0x09e28_0x2c ; OUTSIDE REFERER li r3, 0x00 - b skeleton_key + b IntReturn major_0x09e28_0x34 ; OUTSIDE REFERER li r3, -0x01 - b skeleton_key + b IntReturn major_0x09e28_0x3c ; OUTSIDE REFERER mfsprg r9, 0 @@ -158,7 +158,7 @@ major_0x09e28_0x3c ; OUTSIDE REFERER lwz r9, 0x0024(r8) cmpwi r9, 0x01 li r3, -0x7267 - bgt+ skeleton_key + bgt+ IntReturn stw r26, 0x01d4(r6) stw r27, 0x01dc(r6) stw r28, 0x01e4(r6) @@ -510,7 +510,7 @@ major_0x09e28_0x4a8 mtspr ibat3l, r9 lwz r16, 0x0184(r6) li r3, 0x00 - b skeleton_key + b IntReturn major_0x09e28_0x59c mflr r9 @@ -573,7 +573,7 @@ major_0x0a600 ; OUTSIDE REFERER major_0x0a600_0x10 ; OUTSIDE REFERER mtspr 1019, r5 li r3, 0x00 - b skeleton_key + b IntReturn major_0x0a600_0x1c ; OUTSIDE REFERER b major_0x0a600_0x1c diff --git a/NanoKernel/NKPrimaryIntHandlers.s b/NanoKernel/NKPrimaryIntHandlers.s index 0836690..020ff48 100644 --- a/NanoKernel/NKPrimaryIntHandlers.s +++ b/NanoKernel/NKPrimaryIntHandlers.s @@ -64,17 +64,19 @@ PIHTableEnd ; > r1 = kdp +; ARG r28 = 68k int number + ; Alignment probably to fit a cache block (very oft-run code). align 5 CommonPIHPath ; OUTSIDE REFERER mtsprg 3, r30 lwz r23, KDP.PA_EmulatorIplValue(r1) - lwz r27, -0x0428(r1) + lwz r27, PSA.ExternalHandlerID(r1) CommonPIHPath_0xc ; OUTSIDE REFERER cmpwi cr7, r28, 0 - li r31, 0x00 + li r31, 0 blt- cr7, @negative beq- cr7, @zero_rupt @@ -83,7 +85,7 @@ CommonPIHPath_0xc ; OUTSIDE REFERER @zero_rupt andis. r8, r11, 0x8000 >> 14 ; some kind of perfmon bit - cmpwi cr1, r27, 0x00 + cmpwi cr1, r27, 0 lwz r29, KDP.ClearIntMaskInit(r1) bne- @noperf @@ -100,7 +102,7 @@ CommonPIHPath_0xc ; OUTSIDE REFERER @negative _AssertAndRelease PSA.PIHLock, scratch=r8 bl Restore_r20_r31 - b skeleton_key + b IntReturn CommonPIHPath_0x78 _AssertAndRelease PSA.PIHLock, scratch=r8 @@ -109,24 +111,21 @@ CommonPIHPath_0x78 _Lock PSA.SchLock, scratch1=r8, scratch2=r9 mr r8, r27 - -; r8 = id bl LookupID cmpwi r9, Notification.kIDClass - mr r30, r8 - bne- CommonPIHPath_0x100 - clrlwi r9, r28, 0x11 - stw r9, 0x0010(r30) - stw r22, 0x0014(r30) - bl major_0x0db04 + bne- @no_handler_notification + + clrlwi r9, r28, 17 + stw r9, Notification.MsgWord1(r30) + stw r22, Notification.MsgWord2(r30) + bl CauseNotification _AssertAndRelease PSA.SchLock, scratch=r8 -; r6 = ewa bl Restore_r14_r31 - b skeleton_key + b IntReturn -CommonPIHPath_0x100 +@no_handler_notification li r27, 0x00 lwz r23, 0x067c(r1) stw r27, -0x0428(r1) @@ -156,7 +155,7 @@ CommonPIHPath_0x14c cmpwi r29, 0x00 lhz r16, 0x001a(r31) beq- CommonPIHPath_0x1dc - lhz r17, -0x0116(r30) + lhz r17, EWA.CPUIndex(r30) cmpw cr1, r16, r17 rlwinm. r8, r28, 0, 26, 26 beq- cr1, CommonPIHPath_0x1d0 @@ -164,7 +163,7 @@ CommonPIHPath_0x14c CommonPIHPath_0x1d0 mr r8, r31 - bl DequeueTask + bl TaskUnready b CommonPIHPath_0x218 CommonPIHPath_0x1dc @@ -174,7 +173,7 @@ CommonPIHPath_0x1dc cmpwi r17, 0x01 bne- CommonPIHPath_0x210 addi r8, r31, 0x20 - bl major_0x136c8 + bl DequeueTimer CommonPIHPath_0x210 lwz r16, 0x0e80(r1) @@ -190,12 +189,12 @@ CommonPIHPath_0x218 CommonPIHPath_0x230 mr r8, r31 - bl major_0x14af8 + bl FlagSchEvaluationIfTaskRequires _AssertAndRelease PSA.SchLock, scratch=r16 ; r6 = ewa bl Restore_r14_r31 - b skeleton_key + b IntReturn diff --git a/NanoKernel/NKQueues.s b/NanoKernel/NKQueues.s deleted file mode 100644 index 6f74081..0000000 --- a/NanoKernel/NKQueues.s +++ /dev/null @@ -1,2477 +0,0 @@ - DeclareMPCall 15, MPCall_15 - -MPCall_15 ; OUTSIDE REFERER - li r8, 0x34 - bl PoolAlloc_with_crset - mr. r31, r8 - beq+ major_0x0af60_0x20 - lis r16, 'MS' - stw r8, 0x0008(r8) - ori r16, r16, 'GQ' - stw r8, 0x000c(r8) - stw r16, 0x0004(r8) - addi r9, r8, 0x10 - lis r16, 'NO' - stw r9, 0x0008(r9) - ori r16, r16, 'TQ' - stw r9, 0x000c(r9) - stw r16, 0x0004(r9) - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - li r9, 0x04 - -; r1 = kdp -; r9 = kind - bl MakeID - cmpwi r8, 0x00 - bne+ MPCall_15_0x70 - mr r8, r31 - bl PoolFree - b major_0x0af60 - -MPCall_15_0x70 - mfsprg r30, 0 - lwz r30, -0x0008(r30) - stw r8, 0x0000(r31) - lwz r17, 0x0060(r30) - stw r17, 0x0020(r31) - mr r4, r8 - li r17, 0x00 - stw r17, 0x0024(r31) - stw r17, 0x0028(r31) - stw r17, 0x002c(r31) - stw r17, 0x0030(r31) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 16, MPCall_16 - -MPCall_16 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Queue.kIDClass - - mr r31, r8 - bne+ ReleaseAndReturnMPCallInvalidIDErr - -MPCall_16_0x2c - addi r30, r31, 0x10 - lwz r8, 0x0018(r31) - cmpw r8, r30 - beq- MPCall_16_0x60 - RemoveFromList r8, scratch1=r16, scratch2=r17 - bl PoolFree - b MPCall_16_0x2c - -MPCall_16_0x60 - lwz r30, 0x0028(r31) - -MPCall_16_0x64 - mr. r8, r30 - beq- MPCall_16_0x78 - lwz r30, 0x0008(r30) - bl PoolFree - b MPCall_16_0x64 - -MPCall_16_0x78 - mr r8, r3 - bl major_0x0dce8 - -MPCall_16_0x80 - addi r30, r31, 0x00 - lwz r16, 0x0008(r31) - cmpw r16, r30 - addi r8, r16, -0x08 - beq- MPCall_16_0xe4 - lwz r17, 0x0088(r8) - li r18, -0x726f - stw r18, 0x011c(r17) - lbz r17, 0x0037(r8) - cmpwi r17, 0x01 - bne- MPCall_16_0xb4 - addi r8, r8, 0x20 - bl major_0x136c8 - -MPCall_16_0xb4 - lwz r16, 0x0008(r31) - RemoveFromList r16, scratch1=r17, scratch2=r18 - addi r8, r16, -0x08 - bl TaskReadyAsPrev - bl major_0x14af8 - b MPCall_16_0x80 - -MPCall_16_0xe4 - mr r8, r31 - bl PoolFree - mr r8, r3 - bl DeleteID - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 39, MPCall_39 - -MPCall_39 ; OUTSIDE REFERER - cmpwi r4, 0x00 - blt+ ReturnMPCallOOM - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Queue.kIDClass - - mr r31, r8 - bne+ ReleaseAndReturnMPCallInvalidIDErr - lwz r29, 0x0024(r31) - lwz r30, 0x0028(r31) - cmpw r29, r4 - -; r1 = kdp - beq+ ReleaseAndReturnZeroFromMPCall - blt- MPCall_39_0x7c - -MPCall_39_0x48 - mr. r8, r30 - beq- MPCall_39_0x70 - addi r29, r29, -0x01 - lwz r30, 0x0008(r30) - bl PoolFree - cmpw r29, r4 - bgt+ MPCall_39_0x48 - stw r4, 0x0024(r31) - stw r30, 0x0028(r31) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_39_0x70 - stw r29, 0x0024(r31) - stw r30, 0x0028(r31) - b ReleaseAndReturnMPCallOOM - -MPCall_39_0x7c - li r8, 0x1c - bl PoolAlloc_with_crset - cmpwi r8, 0x00 - beq+ major_0x0af60 - addi r29, r29, 0x01 - lis r17, 0x6e6f - ori r17, r17, 0x7472 - stw r17, 0x0004(r8) - stw r30, 0x0008(r8) - stw r29, 0x0024(r31) - cmpw r29, r4 - stw r8, 0x0028(r31) - mr r30, r8 - blt+ MPCall_39_0x7c - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 17, MPCall_17 - -MPCall_17 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Queue.kIDClass - - mr r31, r8 - bne+ ReleaseAndReturnMPCallInvalidIDErr - lwz r16, 0x0024(r31) - li r8, 0x1c - cmpwi r16, 0x00 - bne- MPCall_17_0x58 - bl PoolAlloc_with_crset - cmpwi r8, 0x00 - beq+ major_0x0af60 - lis r17, 0x6e6f - ori r17, r17, 0x7465 - stw r17, 0x0004(r8) - b MPCall_17_0x6c - -MPCall_17_0x58 - lwz r17, 0x0028(r31) - mr. r8, r17 - beq+ ReleaseAndReturnMPCallOOM - lwz r17, 0x0008(r17) - stw r17, 0x0028(r31) - -MPCall_17_0x6c - lwz r16, 0x0134(r6) - stw r4, 0x0010(r8) - stw r5, 0x0014(r8) - stw r16, 0x0018(r8) - bl major_0x0c8b4 - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - -; major_0x0c8b4 - -; Xrefs: -; major_0x02ccc -; MPCall_17 -; major_0x0db04 -; MPCall_9 -; MPCall_58 - -major_0x0c8b4 ; OUTSIDE REFERER - addi r17, r31, 0x10 - stw r17, 0x0000(r8) - InsertAsPrev r8, r17, scratch=r16 - lwz r18, 0x0030(r31) - addi r18, r18, 0x01 - stw r18, 0x0030(r31) - mflr r27 - lwz r8, 0x0000(r31) - bl major_0x0dce8 - lwz r16, 0x0008(r31) - cmpw r16, r31 - addi r8, r16, -0x08 - beq- major_0x0c8b4_0xac - lwz r17, 0x0088(r8) - lwz r18, 0x00fc(r17) - subi r18, r18, 4 - stw r18, 0x00fc(r17) - lbz r17, 0x0037(r8) - cmpwi r17, 0x01 - bne- major_0x0c8b4_0x68 - addi r8, r8, 0x20 - bl major_0x136c8 - -major_0x0c8b4_0x68 - lwz r16, 0x0008(r31) - RemoveFromList r16, scratch1=r17, scratch2=r18 - lwz r18, 0x002c(r31) - addi r18, r18, -0x01 - stw r18, 0x002c(r31) - addi r8, r16, -0x08 - li r17, 0x01 - stb r17, 0x0019(r8) - bl TaskReadyAsPrev - bl CalculateTimeslice - bl major_0x14af8 - -major_0x0c8b4_0xac - mtlr r27 - blr - - - - DeclareMPCall 18, MPCall_18 - -MPCall_18 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Queue.kIDClass - - bne+ ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - lwz r16, 0x0018(r31) - addi r17, r31, 0x10 - cmpw r16, r17 - beq- MPCall_18_0x9c - lwz r4, 0x0010(r16) - lwz r5, 0x0014(r16) - lwz r17, 0x0018(r16) - stw r17, 0x0134(r6) - RemoveFromList r16, scratch1=r17, scratch2=r18 - lwz r18, 0x0030(r31) - addi r18, r18, -0x01 - stw r18, 0x0030(r31) - lbz r17, 0x0007(r16) - mr r8, r16 - cmpwi r17, 0x72 - beq- MPCall_18_0x8c - bl PoolFree - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_18_0x8c - lwz r17, 0x0028(r31) - stw r16, 0x0028(r31) - stw r17, 0x0008(r16) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_18_0x9c - lwz r17, 0x013c(r6) - mfsprg r30, 0 - cmpwi r17, 0x00 - lwz r19, -0x0008(r30) - beq+ ReleaseAndTimeoutMPCall - lwz r16, 0x0064(r19) - rlwinm. r16, r16, 0, 15, 15 - beq- MPCall_18_0xc4 - stw r3, -0x0410(r1) - b ReleaseAndReturnMPCallBlueBlocking - -MPCall_18_0xc4 - mr r8, r19 - bl DequeueTask - lwz r19, -0x0008(r30) - addi r16, r31, 0x00 - addi r17, r19, 0x08 - stw r16, 0x0000(r17) - InsertAsPrev r17, r16, scratch=r18 - lwz r18, 0x002c(r31) - addi r18, r18, 0x01 - stw r18, 0x002c(r31) - lis r16, 0x7fff - lwz r17, 0x013c(r6) - ori r16, r16, 0xffff - addi r30, r19, 0x20 - cmpw r17, r16 - li r16, 0x02 - beq- MPCall_18_0x154 - stb r16, 0x0014(r30) - stw r19, 0x0018(r30) - mr r8, r17 - -; r1 = kdp -; r8 = multiple (pos: /250; neg: /250000) - bl TimebaseTicksPerPeriod -; r8 = hi -; r9 = lo - - mr r27, r8 - mr r28, r9 - bl GetTime - mfxer r16 - addc r9, r9, r28 - adde r8, r8, r27 - mtxer r16 - stw r8, 0x0038(r30) - stw r9, 0x003c(r30) - mr r8, r30 - bl EnqueueTimer - -MPCall_18_0x154 - b AlternateMPCallReturnPath - - - - DeclareMPCall 19, MPCall_19 - -MPCall_19 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Queue.kIDClass - - bne+ ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - lwz r16, 0x0018(r31) - addi r17, r31, 0x10 - cmpw r16, r17 - beq+ ReleaseAndTimeoutMPCall - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 20, MPCall_20 - -MPCall_20 ; OUTSIDE REFERER - cmpw r4, r3 - bgt+ ReturnMPCallOOM - li r8, 0x20 - bl PoolAlloc_with_crset - mr. r31, r8 - beq+ major_0x0af60_0x20 - InitList r31, Semaphore.kSignature, scratch=r16 - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - li r9, 0x05 - -; r1 = kdp -; r9 = kind - bl MakeID - cmpwi r8, 0x00 - bne+ MPCall_20_0x60 - mr r8, r31 - bl PoolFree - b major_0x0af60 - -MPCall_20_0x60 - li r18, 0x00 - stw r8, 0x0000(r31) - mfsprg r30, 0 - lwz r30, -0x0008(r30) - stw r3, 0x0014(r31) - stw r4, 0x0010(r31) - lwz r17, 0x0060(r30) - stw r18, 0x001c(r31) - stw r17, 0x0018(r31) - mr r5, r8 - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 23, MPCall_23 - -MPCall_23 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Semaphore.kIDClass - - bne+ ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - lwz r16, 0x0010(r31) - cmpwi r16, 0x00 - addi r16, r16, -0x01 - ble- MPCall_23_0x44 - stw r16, 0x0010(r31) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_23_0x44 - cmpwi r4, 0x00 - mfsprg r30, 0 - beq+ ReleaseAndTimeoutMPCall - lwz r8, -0x0008(r30) - lwz r16, 0x0064(r8) - rlwinm. r16, r16, 0, 15, 15 - beq- MPCall_23_0x68 - stw r3, -0x0410(r1) - b ReleaseAndReturnMPCallBlueBlocking - -MPCall_23_0x68 - bl DequeueTask - addi r16, r31, 0x00 - addi r17, r8, 0x08 - stw r16, 0x0000(r17) - InsertAsPrev r17, r16, scratch=r18 - lwz r18, 0x001c(r31) - addi r18, r18, 0x01 - stw r18, 0x001c(r31) - lis r16, 0x7fff - addi r30, r8, 0x20 - ori r16, r16, 0xffff - cmpw r4, r16 - li r17, 0x02 - beq- MPCall_23_0xec - stb r17, 0x0014(r30) - stw r8, 0x0018(r30) - mr r8, r4 - -; r1 = kdp -; r8 = multiple (pos: /250; neg: /250000) - bl TimebaseTicksPerPeriod -; r8 = hi -; r9 = lo - - mr r27, r8 - mr r28, r9 - bl GetTime - mfxer r16 - addc r9, r9, r28 - adde r8, r8, r27 - mtxer r16 - stw r8, 0x0038(r30) - stw r9, 0x003c(r30) - mr r8, r30 - bl EnqueueTimer - -MPCall_23_0xec - li r3, 0x00 - b AlternateMPCallReturnPath - - - - DeclareMPCall 24, MPCall_24 - -MPCall_24 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Semaphore.kIDClass - - bne+ ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - lwz r16, 0x0010(r31) - cmpwi r16, 0x00 - ble+ ReleaseAndTimeoutMPCall - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 22, MPCall_22 - -MPCall_22 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Semaphore.kIDClass - - mr r31, r8 - bne+ ReleaseAndReturnMPCallInvalidIDErr - bl major_0x0ccf4 - mr r3, r8 - b ReleaseAndReturnMPCall - - - -; major_0x0ccf4 - -; Xrefs: -; MPCall_22 -; major_0x0db04 - -major_0x0ccf4 ; OUTSIDE REFERER - mflr r27 - lwz r8, 0x0000(r31) - bl major_0x0dce8 - lwz r16, 0x0008(r31) - cmpw r16, r31 - beq- major_0x0ccf4_0x80 - addi r8, r16, -0x08 - lbz r17, 0x0037(r8) - cmpwi r17, 0x01 - bne- major_0x0ccf4_0x30 - addi r8, r8, 0x20 - bl major_0x136c8 - -major_0x0ccf4_0x30 - lwz r16, 0x0008(r31) - RemoveFromList r16, scratch1=r17, scratch2=r18 - lwz r18, 0x001c(r31) - addi r18, r18, -0x01 - stw r18, 0x001c(r31) - addi r8, r16, -0x08 - li r17, 0x01 - stb r17, 0x0019(r8) - bl TaskReadyAsPrev - bl CalculateTimeslice - bl major_0x14af8 - mtlr r27 - li r8, 0x00 - blr - -major_0x0ccf4_0x80 - mtlr r27 - lwz r16, 0x0010(r31) - lwz r17, 0x0014(r31) - cmpw r16, r17 - addi r16, r16, 0x01 - li r8, -0x7272 - bgelr- - stw r16, 0x0010(r31) - li r8, 0x00 - blr - - - - DeclareMPCall 21, MPCall_21 - -MPCall_21 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Semaphore.kIDClass - - mr r31, r8 - bne+ ReleaseAndReturnMPCallInvalidIDErr - mr r8, r3 - bl major_0x0dce8 - -MPCall_21_0x34 - addi r30, r31, 0x00 - lwz r16, 0x0008(r31) - cmpw r16, r30 - addi r8, r16, -0x08 - beq- MPCall_21_0x98 - lwz r17, 0x0088(r8) - li r18, -0x726f - stw r18, 0x011c(r17) - lbz r17, 0x0037(r8) - cmpwi r17, 0x01 - bne- MPCall_21_0x68 - addi r8, r8, 0x20 - bl major_0x136c8 - -MPCall_21_0x68 - lwz r16, 0x0008(r31) - RemoveFromList r16, scratch1=r17, scratch2=r18 - addi r8, r16, -0x08 - bl TaskReadyAsPrev - bl major_0x14af8 - b MPCall_21_0x34 - -MPCall_21_0x98 - mr r8, r31 - bl PoolFree - mr r8, r3 - bl DeleteID - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 25, MPCall_25 - -MPCall_25 ; OUTSIDE REFERER - li r8, 0x24 - bl PoolAlloc_with_crset - mr. r31, r8 - beq+ major_0x0af60_0x20 - InitList r31, CriticalRegion.kSignature, scratch=r16 - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - li r9, 0x06 - -; r1 = kdp -; r9 = kind - bl MakeID - cmpwi r8, 0x00 - bne+ MPCall_25_0x58 - mr r8, r31 - bl PoolFree - b major_0x0af60 - -MPCall_25_0x58 - li r18, 0x00 - mfsprg r30, 0 - lwz r30, -0x0008(r30) - li r16, 0x00 - stw r8, 0x0000(r31) - stw r16, 0x0014(r31) - stw r16, 0x001c(r31) - stw r16, 0x0018(r31) - lwz r17, 0x0060(r30) - stw r18, 0x0020(r31) - stw r17, 0x0010(r31) - mr r4, r8 - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 27, MPCall_27 - -MPCall_27 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, CriticalRegion.kIDClass - - bne+ ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - mfsprg r17, 0 - lwz r18, 0x0014(r31) - lwz r30, -0x0008(r17) - cmpwi r18, 0x00 - lwz r16, 0x0018(r31) - beq- MPCall_27_0x64 - lwz r17, 0x001c(r31) - cmpw r16, r30 - cmpw cr1, r17, r5 - bne- MPCall_27_0x78 - bne- cr1, MPCall_27_0x78 - addi r18, r18, 0x01 - stw r18, 0x0014(r31) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_27_0x64 - addi r18, r18, 0x01 - stw r30, 0x0018(r31) - stw r5, 0x001c(r31) - stw r18, 0x0014(r31) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_27_0x78 - lwz r8, 0x0000(r16) - -; r8 = id - bl LookupID - cmpwi r9, Task.kIDClass - - bne+ ReleaseAndReturnMPCallTaskAborted - lwz r8, 0x001c(r31) - -; r8 = id - bl LookupID - cmpwi r9, Process.kIDClass - - bne+ ReleaseAndReturnMPCallTaskAborted - cmpwi r4, 0x00 - lwz r16, 0x0064(r30) - beq+ ReleaseAndTimeoutMPCall - rlwinm. r16, r16, 0, 15, 15 - beq- MPCall_27_0xb4 - stw r3, -0x0410(r1) - b ReleaseAndReturnMPCallBlueBlocking - -MPCall_27_0xb4 - mr r8, r30 - bl DequeueTask - lis r16, 0x7fff - addi r18, r30, 0x08 - ori r16, r16, 0xffff - stw r31, 0x0000(r18) - InsertAsPrev r18, r31, scratch=r19 - lwz r18, 0x0020(r31) - addi r18, r18, 0x01 - stw r18, 0x0020(r31) - cmpw r4, r16 - beq- MPCall_27_0x138 - addi r29, r30, 0x20 - li r8, 0x02 - stw r30, 0x0018(r29) - stb r8, 0x0014(r29) - mr r8, r4 - -; r1 = kdp -; r8 = multiple (pos: /250; neg: /250000) - bl TimebaseTicksPerPeriod -; r8 = hi -; r9 = lo - - mr r27, r8 - mr r28, r9 - bl GetTime - mfxer r16 - addc r9, r9, r28 - adde r8, r8, r27 - mtxer r16 - stw r8, 0x0038(r29) - stw r9, 0x003c(r29) - mr r8, r29 - bl EnqueueTimer - -MPCall_27_0x138 - b AlternateMPCallReturnPath - - - - DeclareMPCall 29, MPCall_29 - -MPCall_29 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, CriticalRegion.kIDClass - - bne+ ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - mfsprg r17, 0 - lwz r18, 0x0014(r31) - cmpwi r18, 0x00 - -; r1 = kdp - beq+ ReleaseAndReturnZeroFromMPCall - lwz r30, -0x0008(r17) - lwz r16, 0x0018(r31) - lwz r17, 0x001c(r31) - cmpw r16, r30 - cmpw cr1, r17, r4 - bne+ ReleaseAndTimeoutMPCall - bne+ cr1, ReleaseAndTimeoutMPCall - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 28, MPCall_28 - -MPCall_28 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, CriticalRegion.kIDClass - - bne+ ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - mfsprg r17, 0 - lwz r16, 0x0018(r31) - lwz r30, -0x0008(r17) - lwz r18, 0x0014(r31) - lwz r17, 0x001c(r31) - cmpw r16, r30 - cmpw cr1, r17, r4 - bne+ ReleaseAndReturnMPCallOOM - bne+ cr1, ReleaseAndReturnMPCallOOM - addi r18, r18, -0x01 - cmpwi r18, 0x00 - stw r18, 0x0014(r31) - -; r1 = kdp - bne+ ReleaseAndReturnZeroFromMPCall - stw r18, 0x0018(r31) - stw r18, 0x001c(r31) - mr r8, r3 - bl major_0x0dce8 - lwz r16, 0x0008(r31) - cmpw r16, r31 - -; r1 = kdp - beq+ ReleaseAndReturnZeroFromMPCall - addi r8, r16, -0x08 - lbz r17, 0x0037(r8) - cmpwi r17, 0x01 - bne- MPCall_28_0x94 - addi r8, r8, 0x20 - bl major_0x136c8 - -MPCall_28_0x94 - lwz r16, 0x0008(r31) - RemoveFromList r16, scratch1=r17, scratch2=r18 - lwz r18, 0x0020(r31) - addi r18, r18, -0x01 - stw r18, 0x0020(r31) - addi r8, r16, -0x08 - lwz r17, 0x0088(r8) - lwz r18, 0x00fc(r17) - subi r18, r18, 4 - stw r18, 0x00fc(r17) - li r17, 0x01 - stb r17, 0x0019(r8) - bl TaskReadyAsPrev - bl CalculateTimeslice - bl major_0x14af8 - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 26, MPCall_26 - -MPCall_26 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, CriticalRegion.kIDClass - - mr r31, r8 - bne+ ReleaseAndReturnMPCallInvalidIDErr - mr r8, r3 - bl major_0x0dce8 - -MPCall_26_0x34 - addi r30, r31, 0x00 - lwz r16, 0x0008(r31) - cmpw r16, r30 - addi r8, r16, -0x08 - beq- MPCall_26_0x98 - lwz r17, 0x0088(r8) - li r18, -0x726f - stw r18, 0x011c(r17) - lbz r17, 0x0037(r8) - cmpwi r17, 0x01 - bne- MPCall_26_0x68 - addi r8, r8, 0x20 - bl major_0x136c8 - -MPCall_26_0x68 - lwz r16, 0x0008(r31) - RemoveFromList r16, scratch1=r17, scratch2=r18 - addi r8, r16, -0x08 - bl TaskReadyAsPrev - bl major_0x14af8 - b MPCall_26_0x34 - -MPCall_26_0x98 - mr r8, r31 - bl PoolFree - mr r8, r3 - bl DeleteID - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - -;_______________________________________________________________________ -; EVENT GROUP MP CALLS (49-54) -; -; Corresponding with MPLibrary functions, although signatures differ -; -; 49* MPCreateEvent -; 50 MPDeleteEvent -; 51 MPSetEvent -; 52* MPWaitForEvent -; 53 MPQueryEvent -; 54* MPSetSWIEvent -; * also called using the FE1F trap by the 68k ROM -; -; Lifted from docs: -; An event group is essentially a group of binary semaphores. You can use -; event groups to indicate a number of simple events. For example, a task -; running on a server may need to be aware of multiple message queues. -; Instead of trying to poll each one in turn, the server task can wait on -; an event group. Whenever a message is posted on a queue, the poster can -; also set the bit corresponding to that queue in the event group. Doing -; so notifies the task, and it then knows which queue to access to extract -; the message. In Multiprocessing Services, an event group consists of -; thirty-two 1-bit flags, each of which may be set independently. When a -; task receives an event group, it receives all 32-bits at once (that is, -; it cannot poll individual bits), and all the bits in the event group are -; subsequently cleared. -;_______________________________________________________________________ - - DeclareMPCall 49, MPCreateEvent - -; RET OSStatus r3, MPEventID r4 - -MPCreateEvent - - li r8, EventGroup.Size - bl PoolAlloc - mr. r31, r8 - beq+ major_0x0af60_0x20 - - InitList r8, EventGroup.kSignature, scratch=r16 - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - li r9, EventGroup.kIDClass - bl MakeID - cmpwi r8, 0 - bne+ @success - - mr r8, r31 - bl PoolFree - b major_0x0af60 - -@success - mfsprg r30, 0 - lwz r30, EWA.PA_CurTask(r30) - - stw r8, EventGroup.LLL + LLL.Freeform(r31) - - lwz r17, Task.ProcessID(r30) - stw r17, EventGroup.ProcessID(r31) - - mr r4, r8 - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 50, MPDeleteEvent - -; ARG MPEventID r3 -; RET OSStatus r3 - -MPDeleteEvent - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, EventGroup.kIDClass - mr r31, r8 - bne+ ReleaseAndReturnMPCallInvalidIDErr - - mr r8, r3 - bl major_0x0dce8 - -MPDeleteEvent_0x34 - addi r30, r31, 0x00 - lwz r16, 0x0008(r31) - cmpw r16, r30 - addi r8, r16, -0x08 - beq- MPDeleteEvent_0x98 - lwz r17, 0x0088(r8) - li r18, -0x726f - stw r18, 0x011c(r17) - lbz r17, 0x0037(r8) - cmpwi r17, 0x01 - bne- MPDeleteEvent_0x68 - addi r8, r8, 0x20 - bl major_0x136c8 - -MPDeleteEvent_0x68 - lwz r16, 0x0008(r31) - RemoveFromList r16, scratch1=r17, scratch2=r18 - addi r8, r16, -0x08 - bl TaskReadyAsPrev - bl major_0x14af8 - b MPDeleteEvent_0x34 - -MPDeleteEvent_0x98 - mr r8, r31 - bl PoolFree - mr r8, r3 - bl DeleteID - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 51, MPSetEvent - -; ARG MPEventID r3, MPEventFlags r4 -; RET OSStatus r3 - -MPSetEvent - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - bl LookupID - cmpwi r9, EventGroup.kIDClass - mr r31, r8 - bne+ ReleaseAndReturnMPCallInvalidIDErr - - mr r8, r4 - bl major_0x0d35c - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - -; major_0x0d35c - -; Xrefs: -; MPCall_51 -; major_0x0db04 -; MPCall_83 - -major_0x0d35c ; OUTSIDE REFERER - lwz r16, 0x0010(r31) - or r16, r16, r8 - stw r16, 0x0010(r31) - mflr r27 - lwz r8, 0x0000(r31) - bl major_0x0dce8 - lwz r16, 0x0008(r31) - cmpw r16, r31 - addi r8, r16, -0x08 - beq- major_0x0d35c_0x90 - lwz r17, 0x0088(r8) - lwz r18, 0x00fc(r17) - subi r18, r18, 4 - stw r18, 0x00fc(r17) - lbz r17, 0x0037(r8) - cmpwi r17, 0x01 - bne- major_0x0d35c_0x4c - addi r8, r8, 0x20 - bl major_0x136c8 - -major_0x0d35c_0x4c - lwz r16, 0x0008(r31) - RemoveFromList r16, scratch1=r17, scratch2=r18 - lwz r18, 0x001c(r31) - addi r18, r18, -0x01 - stw r18, 0x001c(r31) - addi r8, r16, -0x08 - li r17, 0x01 - stb r17, 0x0019(r8) - bl TaskReadyAsPrev - bl CalculateTimeslice - bl major_0x14af8 - -major_0x0d35c_0x90 - lwz r16, 0x0018(r31) - rlwinm. r17, r16, 0, 27, 27 - beq- major_0x0d35c_0x1a0 - lwz r17, 0x0658(r1) - lwz r26, -0x08f0(r1) - lwz r18, 0x00c8(r17) - lwz r19, 0x00d0(r17) - cmpwi cr1, r18, 0x00 - cmpwi r19, 0x00 - bne- cr1, major_0x0d35c_0xc8 - bne- major_0x0d35c_0x1a0 - lwz r8, 0x0000(r31) - stw r8, 0x00d0(r17) - b major_0x0d35c_0x118 - -major_0x0d35c_0xc8 - lwz r9, 0x0634(r1) - rlwinm r16, r16, 2, 26, 29 - add r18, r18, r9 - lwzx r19, r16, r18 - cmpwi r19, 0x00 - bne- major_0x0d35c_0x1a0 - lwz r8, 0x0000(r31) - stwx r8, r16, r18 - li r19, 0x1c - li r9, 0x04 - -major_0x0d35c_0xf0 - lwzx r8, r19, r18 - cmpwi r8, 0x00 - bne- major_0x0d35c_0x108 - subf. r19, r9, r19 - bgt+ major_0x0d35c_0xf0 - bl panic - -major_0x0d35c_0x108 - cmplw r16, r19 - srwi r16, r16, 2 - blt- major_0x0d35c_0x1a0 - stw r16, 0x00d0(r17) - -major_0x0d35c_0x118 - lwz r16, 0x0064(r26) - lbz r19, 0x0018(r26) - ori r16, r16, 0x10 - stw r16, 0x0064(r26) - lwz r17, -0x0440(r1) - lwz r16, 0x0674(r1) - lwz r8, 0x0678(r1) - and r16, r16, r8 - or r17, r17, r16 - stw r17, -0x0440(r1) - cmpwi r19, 0x00 - addi r16, r26, 0x08 - bne- major_0x0d35c_0x198 - RemoveFromList r16, scratch1=r17, scratch2=r18 - lbz r17, 0x0037(r26) - cmpwi r17, 0x01 - bne- major_0x0d35c_0x17c - addi r8, r26, 0x20 - bl major_0x136c8 - -major_0x0d35c_0x17c - lwz r18, -0x08f0(r1) - li r16, 0x00 - stb r16, 0x0019(r26) - mr r8, r26 - bl TaskReadyAsNext - mr r8, r26 - bl CalculateTimeslice - -major_0x0d35c_0x198 - mr r8, r26 - bl major_0x14af8 - -major_0x0d35c_0x1a0 - mtlr r27 - blr - - - - DeclareMPCall 52, MPWaitForEvent - -; ARG MPEventID r3, Duration r5 -; RET OSStatus r3, MPEventFlags r4 - -MPWaitForEvent - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - - ; Check that the Event Group ID in r3 is valid. - bl LookupID - cmpwi r9, EventGroup.kIDClass - bne+ ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - - lwz r16, 0x0010(r31) - cmpwi r16, 0 - beq- MPWaitForEvent_field_10_was_zero - - mr r4, r16 - - li r16, 0 - stw r16, 0x0010(r31) - - lwz r16, 0x0018(r31) - lwz r17, KDP.PA_ECB(r1) - rlwinm. r18, r16, 0, 27, 27 - rlwinm r16, r16, 2, 26, 29 - beq+ ReleaseAndReturnZeroFromMPCall - - lwz r18, 0x00c8(r17) - lwz r9, 0x0634(r1) - cmpwi r18, 0x00 - add r18, r18, r9 - bne- MPWaitForEvent_0x84 - lwz r18, 0x00d0(r17) - cmpw r18, r3 - li r18, 0x00 - -; r1 = kdp - bne+ ReleaseAndReturnZeroFromMPCall - stw r18, 0x00d0(r17) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPWaitForEvent_0x84 - lwzx r19, r16, r18 - cmpw r19, r3 - li r19, 0x00 - -; r1 = kdp - bne+ ReleaseAndReturnZeroFromMPCall - stwx r19, r16, r18 - li r19, 0x1c - li r9, 0x04 - -MPWaitForEvent_0xa0 - lwzx r8, r19, r18 - cmpwi r8, 0x00 - bne- MPWaitForEvent_0xb4 - subf. r19, r9, r19 - bgt+ MPWaitForEvent_0xa0 - -MPWaitForEvent_0xb4 - srwi r19, r19, 2 - stw r19, 0x00d0(r17) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPWaitForEvent_field_10_was_zero - mfsprg r30, 0 - cmpwi r5, 0 - lwz r19, EWA.PA_CurTask(r30) - beq+ ReleaseAndTimeoutMPCall - lwz r16, Task.ThingThatAlignVecHits(r19) - rlwinm. r16, r16, 0, 15, 15 - - beq- @bit_15_was_unset - stw r3, PSA.SomeEvtGrpID(r1) - b ReleaseAndReturnMPCallBlueBlocking -@bit_15_was_unset - - ; MOVE TASK OUT OF QUEUE AND INTO EVENT GROUP - mr r8, r19 - bl DequeueTask - - lwz r19, EWA.PA_CurTask(r30) - addi r16, r31, EventGroup.LLL - addi r17, r19, Task.QueueMember - stw r16, LLL.FreeForm(r17) - - InsertAsPrev r17, r16, scratch=r18 - - lwz r18, EventGroup.Counter(r31) - addi r18, r18, 1 - stw r18, EventGroup.Counter(r31) - - lisori r16, 0x7fffffff ; LONG_MAX - addi r30, r19, Task.Timer - cmpw r5, r16 - li r16, 2 - beq- @wait_forever ; never trigger max-wait timers - - stb r16, Timer.Byte0(r30) - stw r19, Timer.ParentTaskPtr(r30) - mr r8, r5 - - bl TimebaseTicksPerPeriod - mr r27, r8 - mr r28, r9 - - bl GetTime - mfxer r16 - addc r9, r9, r28 - adde r8, r8, r27 - mtxer r16 - - stw r8, Timer.Time(r30) - stw r9, Timer.Time+4(r30) - - mr r8, r30 - bl EnqueueTimer - -@wait_forever - b AlternateMPCallReturnPath - - - - DeclareMPCall 53, MPQueryEvent - -; Returns Timeout if no flags are set, otherwise NoErr - -; ARG MPEventID r3 -; RET OSStatus r3 - -MPQueryEvent - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, EventGroup.kIDClass - bne+ ReleaseAndReturnMPCallInvalidIDErr - - mr r31, r8 - lwz r16, 0x0010(r31) - cmpwi r16, 0x00 - beq+ ReleaseAndTimeoutMPCall - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 54, MPSetSWIEvent - -; ARG MPEventID r3, int r4 swi - -MPSetSWIEvent - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - bl LookupID - cmpwi r9, EventGroup.kIDClass - bne+ ReleaseAndReturnMPCallInvalidIDErr - - mr r31, r8 - li r17, 1 - - cmpwi r4, 0 - cmplwi cr1, r4, 8 - - lwz r16, EventGroup.SWI(r31) - - beq- @use_1 - bgt- cr1, @use_1 - - mr r17, r4 -@use_1 - - ; r17 = 1 if outside 1-8 (inc) range - - ori r16, r16, 0x10 - rlwimi r16, r17, 0, 28, 31 - stw r16, EventGroup.SWI(r31) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - - - - - - - - - - - - DeclareMPCall 40, NKCreateTimer - -NKCreateTimer ; OUTSIDE REFERER - li r8, 0x40 - -; r1 = kdp -; r8 = size - bl PoolAlloc -; r8 = ptr - - mr. r31, r8 - beq+ major_0x0af60_0x20 - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r31 - li r9, 0x03 - -; r1 = kdp -; r9 = kind - bl MakeID - cmpwi r8, 0x00 - bne- NKCreateTimer_0x48 - mr r8, r31 - bl PoolFree - b major_0x0af60 - -NKCreateTimer_0x48 - mfsprg r30, 0 - stw r8, 0x0000(r31) - lwz r30, -0x0008(r30) - mr r4, r8 - lwz r17, 0x0060(r30) - stw r17, 0x0010(r31) - bl GetTime - stw r8, 0x0038(r31) - stw r9, 0x003c(r31) - lis r17, 0x5449 - ori r17, r17, 0x4d45 - stw r17, 0x0004(r31) - li r17, 0x03 - stb r17, 0x0014(r31) - li r17, 0x00 - stb r17, 0x0016(r31) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 41, NKDeleteTimer - -NKDeleteTimer ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Timer.kIDClass - - mr r31, r8 - bne+ ReleaseAndReturnMPCallInvalidIDErr - mr r8, r3 - bl DeleteID - lwz r16, 0x0008(r31) - cmpwi r16, 0x00 - beq- NKDeleteTimer_0x48 - mr r8, r31 - bl major_0x136c8 - -NKDeleteTimer_0x48 - _AssertAndRelease PSA.SchLock, scratch=r16 - lwz r8, 0x001c(r31) - cmpwi r8, 0x00 - bnel- PoolFree - mr r8, r31 - bl PoolFree - b ReturnZeroFromMPCall - - - - DeclareMPCall 30, NKSetTimerNotify - -NKSetTimerNotify ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Timer.kIDClass - - mr r31, r8 - bne+ ReleaseAndReturnMPCallInvalidIDErr - lbz r16, 0x0014(r31) - cmpwi r16, 0x03 - bne+ ReleaseAndReturnMPCallInvalidIDErr - mr r8, r4 - -; r8 = id - bl LookupID - cmpwi r9, Semaphore.kIDClass - - cmpwi cr2, r9, 0x04 - beq- NKSetTimerNotify_0x80 - cmpwi r9, 0x09 - beq- cr2, NKSetTimerNotify_0x64 - bne+ ReleaseAndReturnMPCallInvalidIDErr - stw r4, 0x002c(r31) - stw r5, 0x0030(r31) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -NKSetTimerNotify_0x64 - stw r4, 0x0018(r31) - lwz r16, 0x0134(r6) - lwz r17, 0x013c(r6) - stw r5, 0x0020(r31) - stw r16, 0x0024(r31) - stw r17, 0x0028(r31) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -NKSetTimerNotify_0x80 - stw r4, 0x0034(r31) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 31, MPCall_31 - -MPCall_31 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Timer.kIDClass - - mr r31, r8 - bne+ ReleaseAndReturnMPCallInvalidIDErr - lbz r16, 0x0014(r31) - cmpwi r16, 0x03 - bne+ ReleaseAndReturnMPCallInvalidIDErr - lwz r16, 0x0008(r31) - cmpwi r16, 0x00 - mr r8, r31 - beq- MPCall_31_0x4c - bl major_0x136c8 - -MPCall_31_0x4c - lwz r9, 0x001c(r31) - lwz r8, 0x0018(r31) - cmpwi r9, 0x00 - cmpwi cr1, r8, 0x00 - bne- MPCall_31_0x9c - beq- cr1, MPCall_31_0x9c - -; r8 = id - bl LookupID - cmpwi r9, Queue.kIDClass - - bne- MPCall_31_0x9c - lwz r9, 0x0024(r8) - li r8, 0x1c - cmpwi r9, 0x00 - bne- MPCall_31_0x9c - -; r1 = kdp -; r8 = size - bl PoolAlloc -; r8 = ptr - - mr. r30, r8 - beq+ major_0x0af60 - lis r8, 0x6e6f - ori r8, r8, 0x7465 - stw r8, 0x0004(r30) - stw r30, 0x001c(r31) - -MPCall_31_0x9c - lwz r16, 0x0134(r6) - rlwinm. r9, r16, 0, 29, 29 - mr r8, r4 - beq- MPCall_31_0xb8 - -; r1 = kdp -; r8 = multiple (pos: /250; neg: /250000) - bl TimebaseTicksPerPeriod -; r8 = hi -; r9 = lo - - mr r4, r8 - mr r5, r9 - -MPCall_31_0xb8 - lwz r16, 0x0134(r6) - rlwinm. r8, r16, 0, 30, 30 - mfxer r17 - beq- MPCall_31_0xdc - lwz r19, 0x003c(r31) - lwz r18, 0x0038(r31) - addc r5, r5, r19 - adde r4, r4, r18 - mtxer r17 - -MPCall_31_0xdc - stw r4, 0x0038(r31) - stw r5, 0x003c(r31) - lwz r16, 0x0134(r6) - clrlwi. r16, r16, 0x1f - li r17, 0x00 - beq- MPCall_31_0xf8 - li r17, 0x01 - -MPCall_31_0xf8 - stb r17, 0x0016(r31) - mr r8, r31 - bl EnqueueTimer - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 32, MPCall_32 - -MPCall_32 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Timer.kIDClass - - mr r31, r8 - bne+ ReleaseAndReturnMPCallInvalidIDErr - lbz r16, 0x0017(r31) - cmpwi r16, 0x01 - bne- MPCall_32_0x58 - lwz r4, 0x0038(r31) - lwz r5, 0x003c(r31) - bl GetTime - mfxer r16 - subfc r5, r9, r5 - subfe. r4, r8, r4 - mtxer r16 - bge+ MPCall_32_0x60 - -MPCall_32_0x58 - li r4, 0x00 - li r5, 0x00 - -MPCall_32_0x60 - lwz r16, 0x0008(r31) - cmpwi r16, 0x00 - mr r8, r31 - beq- MPCall_32_0x74 - bl major_0x136c8 - -MPCall_32_0x74 -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 64, MPCall_64 - -MPCall_64 ; OUTSIDE REFERER - li r8, 0x28 - -; r1 = kdp -; r8 = size - bl PoolAlloc -; r8 = ptr - - mr. r31, r8 - beq+ major_0x0af60_0x20 - lis r16, 0x4b4e - ori r16, r16, 0x4f54 - stw r16, 0x0004(r31) - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - li r9, 0x0c - -; r1 = kdp -; r9 = kind - bl MakeID - cmpwi r8, 0x00 - bne+ MPCall_64_0x50 - mr r8, r31 - bl PoolFree - b major_0x0af60 - -MPCall_64_0x50 - mfsprg r30, 0 - lwz r30, -0x0008(r30) - stw r8, 0x0000(r31) - lwz r17, 0x0060(r30) - stw r17, 0x0008(r31) - mr r4, r8 - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 65, MPCall_65 - -MPCall_65 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Notification.kIDClass - - mr r31, r8 - bne+ ReleaseAndReturnMPCallInvalidIDErr - mr r8, r31 - bl PoolFree - mr r8, r3 - bl DeleteID - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 67, MPCall_67 - -MPCall_67 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Notification.kIDClass - - mr r30, r8 - bne+ ReleaseAndReturnMPCallInvalidIDErr - bl major_0x0db04 - mr r3, r8 - b ReleaseAndReturnMPCall - - - -; major_0x0db04 - -; Xrefs: -; major_0x02ccc -; IntPerfMonitor -; IntThermalEvent -; MPCall_67 -; major_0x102c8 -; CommonPIHPath - -major_0x0db04 ; OUTSIDE REFERER - mflr r29 - lwz r16, 0x000c(r30) - lwz r17, 0x0024(r30) - cmplwi r16, 0x00 - cmplwi cr1, r17, 0x00 - bne- major_0x0db04_0x28 - bne- cr1, major_0x0db04_0x28 - lwz r18, 0x001c(r30) - cmplwi r18, 0x00 - beq- major_0x0db04_0xf0 - -major_0x0db04_0x28 - lwz r8, 0x000c(r30) - cmplwi r8, 0x00 - beq- major_0x0db04_0x94 - -; r8 = id - bl LookupID - cmpwi r9, Queue.kIDClass - - mr r31, r8 - bne- major_0x0db04_0xfc - lwz r16, 0x0024(r31) - cmpwi r16, 0x00 - lwz r17, 0x0028(r31) - beq- major_0x0db04_0x68 - mr. r8, r17 - lwz r17, 0x0008(r17) - beq- major_0x0db04_0xf0 - stw r17, 0x0028(r31) - b major_0x0db04_0x78 - -major_0x0db04_0x68 - li r8, 0x1c - bl PoolAlloc_with_crset - cmpwi r8, 0x00 - beq- major_0x0db04_0xe4 - -major_0x0db04_0x78 - lwz r16, 0x0010(r30) - lwz r17, 0x0014(r30) - lwz r18, 0x0018(r30) - stw r16, 0x0010(r8) - stw r17, 0x0014(r8) - stw r18, 0x0018(r8) - bl major_0x0c8b4 - -major_0x0db04_0x94 - lwz r8, 0x0024(r30) - cmplwi r8, 0x00 - beq- major_0x0db04_0xb4 - -; r8 = id - bl LookupID - cmpwi r9, Semaphore.kIDClass - - mr r31, r8 - bne- major_0x0db04_0xfc - bl major_0x0ccf4 - -major_0x0db04_0xb4 - lwz r8, 0x001c(r30) - cmplwi r8, 0x00 - beq- major_0x0db04_0xd8 - -; r8 = id - bl LookupID - cmpwi r9, EventGroup.kIDClass - - mr r31, r8 - bne- major_0x0db04_0xfc - lwz r8, 0x0020(r30) - bl major_0x0d35c - -major_0x0db04_0xd8 - mtlr r29 - li r8, 0x00 - blr - -major_0x0db04_0xe4 - mtlr r29 - li r8, -0x726e - blr - -major_0x0db04_0xf0 - mtlr r29 - li r8, -0x7272 - blr - -major_0x0db04_0xfc - mtlr r29 - li r8, -0x7273 - blr - - - - DeclareMPCall 66, MPCall_66 - -MPCall_66 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Notification.kIDClass - - mr r31, r8 - bne+ ReleaseAndReturnMPCallInvalidIDErr - mr r8, r4 - -; r8 = id - bl LookupID - cmpwi r9, Semaphore.kIDClass - - cmpwi cr2, r9, 0x04 - beq- MPCall_66_0x74 - cmpwi r9, 0x09 - beq- cr2, MPCall_66_0x58 - bne+ ReleaseAndReturnMPCallInvalidIDErr - stw r4, 0x001c(r31) - stw r5, 0x0020(r31) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_66_0x58 - stw r4, 0x000c(r31) - lwz r16, 0x0134(r6) - lwz r17, 0x013c(r6) - stw r5, 0x0010(r31) - stw r16, 0x0014(r31) - stw r17, 0x0018(r31) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_66_0x74 - stw r4, 0x0024(r31) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 128, MPCall_128 - -MPCall_128 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Notification.kIDClass - - mr r31, r8 - bne+ ReleaseAndReturnMPCallInvalidIDErr - cmpwi r4, 0x04 - cmpwi cr1, r4, 0x09 - beq- MPCall_128_0x40 - beq- cr1, MPCall_128_0x58 - b major_0x0b054 - -MPCall_128_0x40 - lwz r16, 0x0134(r6) - lwz r17, 0x013c(r6) - stw r5, 0x0010(r31) - stw r16, 0x0014(r31) - stw r17, 0x0018(r31) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_128_0x58 - stw r5, 0x0020(r31) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - -; major_0x0dce8 - -; Xrefs: -; major_0x02ccc -; MPCall_16 -; major_0x0c8b4 -; major_0x0ccf4 -; MPCall_21 -; MPCall_28 -; MPCall_26 -; MPDeleteEvent -; major_0x0d35c - -major_0x0dce8 ; OUTSIDE REFERER - lwz r9, -0x0410(r1) - lwz r19, -0x08f0(r1) - cmpw r8, r9 - bnelr- - li r9, -0x01 - mflr r24 - stw r9, -0x0410(r1) - lbz r17, 0x0018(r19) - cmpwi r17, 0x00 - addi r16, r19, 0x08 - bne- major_0x0dce8_0x70 - RemoveFromList r16, scratch1=r17, scratch2=r18 - lbz r17, 0x0037(r19) - cmpwi r17, 0x01 - bne- major_0x0dce8_0x60 - addi r8, r19, 0x20 - bl major_0x136c8 - lwz r19, -0x08f0(r1) - -major_0x0dce8_0x60 - li r16, 0x01 - stb r16, 0x0019(r19) - lwz r8, -0x08f0(r1) - bl TaskReadyAsPrev - -major_0x0dce8_0x70 - lwz r8, -0x08f0(r1) - mtlr r24 - b major_0x14af8 - - - - DeclareMPCall 120, MPCall_120 - -MPCall_120 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID -; r8 = something not sure what -; r9 = 0:inval, 1:proc, 2:task, 3:timer, 4:q, 5:sema, 6:cr, 7:cpu, 8:addrspc, 9:evtg, 10:cohg, 11:area, 12:not, 13:log - - mr r31, r8 - cmpwi r9, 0x05 - cmpwi cr1, r9, 0x04 - beq- MPCall_120_0x33c - beq- cr1, MPCall_120_0x248 - cmpwi r9, 0x09 - cmpwi cr1, r9, 0x06 - beq- MPCall_120_0x1b4 - beq- cr1, MPCall_120_0x10c - cmpwi r9, 0x0c - cmpwi cr1, r9, 0x08 - beq- MPCall_120_0x58 - beq- cr1, MPCall_120_0x3d8 - b major_0x0b054 - -MPCall_120_0x58 - lis r8, 0x0c - ori r8, r8, 0x01 - cmpw r8, r4 - bne+ major_0x0b054 - cmplwi r5, 0x00 - bne- MPCall_120_0xa0 - lis r16, 0x0c - ori r16, r16, 0x01 - stw r16, 0x0134(r6) - lwz r16, 0x0008(r31) - stw r16, 0x013c(r6) - lwz r16, 0x0004(r31) - stw r16, 0x0144(r6) - lwz r16, 0x000c(r31) - stw r16, 0x014c(r6) - li r16, 0x10 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_120_0xa0 - cmplwi r5, 0x10 - bne- MPCall_120_0xd4 - lwz r16, 0x0010(r31) - stw r16, 0x0134(r6) - lwz r16, 0x0014(r31) - stw r16, 0x013c(r6) - lwz r16, 0x0018(r31) - stw r16, 0x0144(r6) - lwz r16, 0x001c(r31) - stw r16, 0x014c(r6) - li r16, 0x10 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_120_0xd4 - cmplwi r5, 0x20 - bne- MPCall_120_0xf8 - lwz r16, 0x0020(r31) - stw r16, 0x0134(r6) - lwz r16, 0x0024(r31) - stw r16, 0x013c(r6) - li r16, 0x08 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_120_0xf8 - cmpwi r5, 0x28 - bne+ major_0x0b054 - li r16, 0x00 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_120_0x10c - lis r8, 0x06 - ori r8, r8, 0x01 - cmpw r8, r4 - bne+ major_0x0b054 - cmplwi r5, 0x00 - bne- MPCall_120_0x154 - lis r16, 0x06 - ori r16, r16, 0x01 - stw r16, 0x0134(r6) - lwz r16, 0x0010(r31) - stw r16, 0x013c(r6) - lwz r16, 0x0004(r31) - stw r16, 0x0144(r6) - lwz r16, 0x0020(r31) - stw r16, 0x014c(r6) - li r16, 0x10 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_120_0x154 - cmplwi r5, 0x10 - bne- MPCall_120_0x1a0 - addi r17, r31, 0x00 - lwz r18, 0x0008(r31) - li r16, 0x00 - cmpw r17, r18 - beq- MPCall_120_0x174 - lwz r16, -0x0008(r18) - -MPCall_120_0x174 - stw r16, 0x0134(r6) - lwz r16, 0x0018(r31) - cmpwi r16, 0x00 - beq- MPCall_120_0x188 - lwz r16, 0x0000(r16) - -MPCall_120_0x188 - stw r16, 0x013c(r6) - lwz r16, 0x0014(r31) - stw r16, 0x0144(r6) - li r16, 0x0c - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_120_0x1a0 - cmpwi r5, 0x1c - bne+ major_0x0b054 - li r16, 0x00 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_120_0x1b4 - lis r8, 0x09 - ori r8, r8, 0x01 - cmpw r8, r4 - bne+ major_0x0b054 - cmplwi r5, 0x00 - bne- MPCall_120_0x1fc - lis r16, 0x09 - ori r16, r16, 0x01 - stw r16, 0x0134(r6) - lwz r16, 0x0014(r31) - stw r16, 0x013c(r6) - lwz r16, 0x0004(r31) - stw r16, 0x0144(r6) - lwz r16, 0x001c(r31) - stw r16, 0x014c(r6) - li r16, 0x10 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_120_0x1fc - cmplwi r5, 0x10 - bne- MPCall_120_0x234 - addi r17, r31, 0x00 - lwz r18, 0x0008(r31) - li r16, 0x00 - cmpw r17, r18 - beq- MPCall_120_0x21c - lwz r16, -0x0008(r18) - -MPCall_120_0x21c - stw r16, 0x0134(r6) - lwz r16, 0x0010(r31) - stw r16, 0x013c(r6) - li r16, 0x08 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_120_0x234 - cmpwi r5, 0x18 - bne+ major_0x0b054 - li r16, 0x00 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_120_0x248 - lis r8, 0x04 - ori r8, r8, 0x01 - cmpw r8, r4 - bne+ major_0x0b054 - cmplwi r5, 0x00 - bne- MPCall_120_0x290 - lis r16, 0x04 - ori r16, r16, 0x01 - stw r16, 0x0134(r6) - lwz r16, 0x0020(r31) - stw r16, 0x013c(r6) - lwz r16, 0x0004(r31) - stw r16, 0x0144(r6) - lwz r16, 0x002c(r31) - stw r16, 0x014c(r6) - li r16, 0x10 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_120_0x290 - cmplwi r5, 0x10 - bne- MPCall_120_0x2ec - addi r17, r31, 0x00 - lwz r18, 0x0008(r31) - li r16, 0x00 - cmpw r17, r18 - beq- MPCall_120_0x2b0 - lwz r16, -0x0008(r18) - -MPCall_120_0x2b0 - stw r16, 0x0134(r6) - lwz r16, 0x0030(r31) - stw r16, 0x013c(r6) - lwz r16, 0x0024(r31) - stw r16, 0x0144(r6) - lwz r18, 0x0018(r31) - addi r17, r31, 0x10 - li r16, 0x00 - cmpw r17, r18 - beq- MPCall_120_0x2dc - lwz r16, 0x0010(r18) - -MPCall_120_0x2dc - stw r16, 0x014c(r6) - li r16, 0x10 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_120_0x2ec - cmplwi r5, 0x20 - bne- MPCall_120_0x328 - lwz r18, 0x0018(r31) - addi r17, r31, 0x10 - li r16, 0x00 - cmpw r17, r18 - li r17, 0x00 - beq- MPCall_120_0x314 - lwz r16, 0x0014(r18) - lwz r17, 0x0018(r18) - -MPCall_120_0x314 - stw r16, 0x0134(r6) - stw r17, 0x013c(r6) - li r16, 0x08 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_120_0x328 - cmpwi r5, 0x28 - bne+ major_0x0b054 - li r16, 0x00 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_120_0x33c - lis r8, 0x05 - ori r8, r8, 0x01 - cmpw r8, r4 - bne+ major_0x0b054 - cmplwi r5, 0x00 - bne- MPCall_120_0x384 - lis r16, 0x05 - ori r16, r16, 0x01 - stw r16, 0x0134(r6) - lwz r16, 0x0018(r31) - stw r16, 0x013c(r6) - lwz r16, 0x0004(r31) - stw r16, 0x0144(r6) - lwz r16, 0x001c(r31) - stw r16, 0x014c(r6) - li r16, 0x10 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_120_0x384 - cmplwi r5, 0x10 - bne- MPCall_120_0x3c4 - addi r17, r31, 0x00 - lwz r18, 0x0008(r31) - li r16, 0x00 - cmpw r17, r18 - beq- MPCall_120_0x3a4 - lwz r16, -0x0008(r18) - -MPCall_120_0x3a4 - stw r16, 0x0134(r6) - lwz r16, 0x0014(r31) - stw r16, 0x013c(r6) - lwz r16, 0x0010(r31) - stw r16, 0x0144(r6) - li r16, 0x0c - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_120_0x3c4 - cmpwi r5, 0x1c - bne+ major_0x0b054 - li r16, 0x00 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_120_0x3d8 - lis r8, 0x08 - ori r8, r8, 0x01 - cmpw r8, r4 - bne+ major_0x0b054 - cmplwi r5, 0x00 - bne- MPCall_120_0x420 - lis r16, 0x08 - ori r16, r16, 0x01 - stw r16, 0x0134(r6) - lwz r16, 0x0074(r31) - stw r16, 0x013c(r6) - lwz r16, 0x0070(r31) - stw r16, 0x0144(r6) - lwz r16, 0x000c(r31) - stw r16, 0x014c(r6) - li r16, 0x10 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_120_0x420 - cmplwi r5, 0x10 - bne- MPCall_120_0x454 - lwz r16, 0x0030(r31) - stw r16, 0x0134(r6) - lwz r16, 0x0034(r31) - stw r16, 0x013c(r6) - lwz r16, 0x0038(r31) - stw r16, 0x0144(r6) - lwz r16, 0x003c(r31) - stw r16, 0x014c(r6) - li r16, 0x10 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_120_0x454 - cmplwi r5, 0x20 - bne- MPCall_120_0x488 - lwz r16, 0x0040(r31) - stw r16, 0x0134(r6) - lwz r16, 0x0044(r31) - stw r16, 0x013c(r6) - lwz r16, 0x0048(r31) - stw r16, 0x0144(r6) - lwz r16, 0x004c(r31) - stw r16, 0x014c(r6) - li r16, 0x10 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_120_0x488 - cmplwi r5, 0x30 - bne- MPCall_120_0x4bc - lwz r16, 0x0050(r31) - stw r16, 0x0134(r6) - lwz r16, 0x0054(r31) - stw r16, 0x013c(r6) - lwz r16, 0x0058(r31) - stw r16, 0x0144(r6) - lwz r16, 0x005c(r31) - stw r16, 0x014c(r6) - li r16, 0x10 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_120_0x4bc - cmplwi r5, 0x40 - bne- MPCall_120_0x4f0 - lwz r16, 0x0060(r31) - stw r16, 0x0134(r6) - lwz r16, 0x0064(r31) - stw r16, 0x013c(r6) - lwz r16, 0x0068(r31) - stw r16, 0x0144(r6) - lwz r16, 0x006c(r31) - stw r16, 0x014c(r6) - li r16, 0x10 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_120_0x4f0 - cmpwi r5, 0x50 - bne+ major_0x0b054 - li r16, 0x00 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall diff --git a/NanoKernel/NKRTASCalls.s b/NanoKernel/NKRTASCalls.s index bd7b74f..4d00fa2 100644 --- a/NanoKernel/NKRTASCalls.s +++ b/NanoKernel/NKRTASCalls.s @@ -22,15 +22,15 @@ kcRTASDispatch ; OUTSIDE REFERER cmpwi r8, 0x00 bne- rtas_is_available li r3, -0x01 - b skeleton_key + b IntReturn rtas_is_available _Lock PSA.RTASLock, scratch1=r8, scratch2=r9 mtcrf 0x3f, r7 - lwz r9, 0x0658(r1) - lwz r8, -0x000c(r1) + lwz r9, KDP.PA_ECB(r1) + lwz r8, EWA.Enables(r1) stw r7, 0x0000(r6) stw r8, 0x0004(r6) bns- cr6, kcRTASDispatch_0x5c @@ -138,7 +138,7 @@ kcRTASDispatch_0x190 andi. r8, r11, 0x900 lwz r8, 0x0004(r6) lwz r13, 0x00dc(r6) - stw r8, -0x000c(r1) + stw r8, EWA.Enables(r1) lwz r8, 0x00d4(r6) lwz r12, 0x00ec(r6) mtxer r8 @@ -174,7 +174,7 @@ kcRTASDispatch_0x190 lwz r31, 0x01fc(r6) _AssertAndRelease PSA.RTASLock, scratch=r8 li r3, 0x00 - b skeleton_key + b IntReturn rtas_make_actual_call mtctr r9 diff --git a/NanoKernel/NKReplacementInit.s b/NanoKernel/NKReplacementInit.s index 2d173be..e2d7ef7 100644 --- a/NanoKernel/NKReplacementInit.s +++ b/NanoKernel/NKReplacementInit.s @@ -111,7 +111,7 @@ InitReplacement ; Do something terrible with the CPU features - lwz r12, -0x0010(r1) + lwz r12, EWA.Flags(r1) li r10, 0x00 rlwimi r10, r12, 0, 12, 15 rlwimi r10, r12, 0, 28, 30 @@ -161,7 +161,7 @@ InitReplacement stw r12, EWA.Flags(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 @replaces_later_than_0101 @@ -178,7 +178,7 @@ InitReplacement stw r12, EWA.Flags(r1) lwz r12, -0x000c(r11) - stw r12, -0x000c(r1) + stw r12, EWA.Enables(r1) @endif diff --git a/NanoKernel/NKScheduler.s b/NanoKernel/NKScheduler.s index a215f3c..2359b61 100644 --- a/NanoKernel/NKScheduler.s +++ b/NanoKernel/NKScheduler.s @@ -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 li r16, 0 stw r16, KDP.NanoKernelInfo + NKNanoKernelInfo.TaskCount(r1) - - ; Get a time doubleword approximating 1ms (for critical priority) mflr r20 + ; Get a time doubleword approximating 1ms (for critical priority) li r8, -1042 ; negative args are in usec bl TimebaseTicksPerPeriod mr r16, r8 ; hi @@ -23,42 +37,37 @@ InitRDYQs mtlr r20 - - ; Zero out the KDP priority flags (a full value would be 0xf0000000) + ; These priority flags (top 4 bits) denote the state of each queue li r23, 0 stw r23, PSA.PriorityFlags(r1) + + + ; Populate one RDYQ for each of the four task priorities addi r9, r1, PSA.ReadyQueues - - -; Populate one RDYQ for each of the four task priorities - + ; r23 = index of queue, r16/r17 = time cake @loop + + ; Empty linked list lisori r8, ReadyQueue.kSignature stw r8, LLL.Signature(r9) - stw r9, LLL.Next(r9) stw r9, LLL.Prev(r9) - - ; Set one word in the structure in the format of KDP PriorityFlags, - ; with the bit SET that corresponds with this queue + ; ... with a priority flag in its freeform field! lis r8, 0x8000 ; ...0000 srw r8, r8, r23 stw r8, LLL.Freeform(r9) - ; Zero some shit 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) - - ; Save the doubleword (1ms, 8ms...) for this priority + ; 1ms for critical, successively 8x for other queues stw r16, ReadyQueue.Timecake(r9) stw r17, ReadyQueue.Timecake + 4(r9) - ; Show off a bit mflr r20 @@ -67,7 +76,7 @@ InitRDYQs mr r8, r23 ; the priority (1,2,3,4) bl printw - mr r8, r16 ; the Timeslice + mr r8, r16 ; the time cake bl printw mr r8, r17 @@ -77,8 +86,7 @@ InitRDYQs mtlr r20 - - ; Multiply Timeslice by 8 for the next iteration + ; Multiply time by 8 for the next iteration slwi r16, r16, 3 rlwimi r16, r17, 3, 29, 31 slwi r17, r17, 3 @@ -89,11 +97,10 @@ InitRDYQs addi r9, r9, 32 ;ReadyQueue.Size blt+ @loop - ; If the low nybble is empty, set ContextBlock.PriorityShifty to 2. lwz r16, KDP.PA_ECB(r1) lwz r17, ContextBlock.PriorityShifty(r16) - andi. r9, r17, (1<<4)-1 + andi. r9, r17, 0xF li r17, 2 bnelr- @@ -102,6 +109,14 @@ InitRDYQs + ###### ### ## ## ######## ###### ######## ######## ###### +## ## ## ## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## + ###### ## ## ## ## ###### ## #### ######## ######## ###### + ## ######### ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## ## ## + ###### ## ## ### ######## ###### ## ## ## ###### + ; ...to (ECB *)r6 ; (and also copy SPRG0 to r8) @@ -144,6 +159,14 @@ Save_r24_r31 +## ####### ### ######## ###### ######## ######## ###### +## ## ## ## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## #### ######## ######## ###### +## ## ## ######### ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## ## ## +######## ####### ## ## ######## ###### ## ## ## ###### + ; ...from (ECB *)r6 Restore_r14_r31 @@ -184,6 +207,14 @@ Restore_r24_r31 + ###### ### ## ## ######## ######## ######## ######## ###### +## ## ## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## + ###### ## ## ## ## ###### ###### ######## ######## ###### + ## ######### ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## ## + ###### ## ## ### ######## ## ## ## ## ###### + ; ...to (ECB *)r6 ; (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 li r8, 0x200 @@ -452,6 +490,14 @@ major_0x13988_0x2f8 + ###### ### ## ## ######## ## ## ######## ###### +## ## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## + ###### ## ## ## ## ###### ## ## ######## ###### + ## ######### ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## ## + ###### ## ## ### ######## ### ## ## ###### + ; Save_v0_v31 ; 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 -; PSA.PriorityFlags (presumably has no effect with non-ready queues). -; Also set the mysterious EWA.BinaryFlag to 1. +; PSA.PriorityFlags. Also set the mysterious EWA.SchEvalFlag to 1. ; ARG Task *r8 ; CLOB r16, r17, r18 -DequeueTask +TaskUnready lwz r17, Task.QueueMember + LLL.Next( r8) lbz r18, Task.MysteryByte1( r8) @@ -691,32 +744,18 @@ DequeueTask mfsprg r17, 0 li r16, 1 - stb r16, EWA.BinaryFlag(r17) + stb r16, EWA.SchEvalFlag(r17) 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 @@ -787,6 +826,13 @@ TaskReadyCommonPath + ###### ######## ######## ### ######## ###### ######## ######## +## ## ## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## + ###### ######## ###### ######## ## ## ## ###### ###### ## + ## ## ## ## ## ## ######### ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## ## ## + ###### ## ## ######## ## ## ## ###### ######## ## ; Set the segment and block allocation table registers according to the ; 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?) -SetAddrSpcRegisters +SetSpaceSRsAndBATs ; This is the only function that hits this counter lwz r17, KDP.NanoKernelInfo + NKNanoKernelInfo.AddrSpcSetCtr(r1) @@ -1084,59 +1130,41 @@ SetAddrSpcRegisters_0x314: -; major_0x142a8 +######## ######## ######## ## ### ## ## ## ## +## ## ## ## ## ## ## ### ## ## ## +## ## ## ## ## ## ## #### ## #### +######## ###### ## ## ## ## ## ## ## ## +## ## ## ## ## ######### ## #### ## +## ## ## ## ## ## ## ## ### ## +## ## ######## ## ## ## ## ## ## ## -; Xrefs: -; skeleton_key - -major_0x142a8 ; OUTSIDE REFERER - lbz r8, EWA.BinaryFlag(r1) - rlwinm. r9, r7, 0, 16, 16 - lwz r1, -0x0004(r1) +ReturnToAnyTask ; OUTSIDE REFERER + lbz r8, EWA.SchEvalFlag(r1) + rlwinm. r9, r7, 0, 16, 16 + lwz r1, EWA.PA_KDP(r1) cmpwi cr1, r8, 0x00 -; 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 - bne- int_teardown + bne- ReturnFromInterrupt + beq+ cr1, ReturnFromInterrupt -; 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 -; r8 = sprg0 (not used by me) - - - _Lock PSA.SchLock, scratch1=r27, scratch2=r28 + _Lock PSA.SchLock, scratch1=r27, scratch2=r28 -; major_0x142dc +######## ######## ######## ## ####### ######## ## ## ######## ######## +## ## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## ## +######## ###### ## ## ## ## ## ######### ###### ######## +## ## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## ## +## ## ######## ## ## ####### ## ## ## ######## ## ## -; Xrefs: -; major_0x02ccc -; CommonMPCallReturnPath -; major_0x142a8 -; major_0x14bcc - -major_0x142dc ; OUTSIDE REFERER +RescheduleAndReturn ; OUTSIDE REFERER mfsprg r14, 0 li r8, 0x00 - stb r8, EWA.BinaryFlag(r14) + stb r8, EWA.SchEvalFlag(r14) lwz r31, -0x0008(r14) lwz r1, -0x0004(r14) lwz r9, 0x0ee4(r1) @@ -1153,7 +1181,7 @@ major_0x142dc_0x38 cmpw r27, r26 mr r8, r31 beq- major_0x142dc_0x58 - bl DequeueTask + bl TaskUnready stb r26, 0x0019(r31) mr r8, r31 bl TaskReadyAsPrev @@ -1174,7 +1202,7 @@ major_0x142dc_0x5c addi r30, r29, -0x08 major_0x142dc_0x80 - lhz r28, -0x0116(r14) + lhz r28, EWA.CPUIndex(r14) lwz r24, 0x0064(r30) lhz r25, 0x001a(r30) rlwinm. r8, r24, 0, 25, 26 @@ -1264,7 +1292,15 @@ major_0x142dc_0x1bc -; int_teardown +######## ######## #### +## ## ## ## +## ## ## ## +######## ###### ## +## ## ## ## +## ## ## ## +## ## ## #### + +; ReturnFromInterrupt ; All MPCalls get here? ; r0,7,8,9,10,11,12,13 restored from r6 area @@ -1276,8 +1312,8 @@ major_0x142dc_0x1bc ; Xrefs: ; non_skeleton_reset_trap -; major_0x142a8 -; major_0x142dc +; ReturnToAnyTask +; RescheduleAndReturn ; major_0x14548 ; > sprg0 = for r1 and r6 @@ -1289,20 +1325,20 @@ major_0x142dc_0x1bc ; > r12 = lr restore ; > r13 = cr restore -int_teardown ; OUTSIDE REFERER +ReturnFromInterrupt ; OUTSIDE REFERER lwz r8, 0x0edc(r1) mfsprg r1, 0 mtlr r12 mtspr srr0, r10 mtspr srr1, r11 rlwinm. r8, r8, 0, 27, 27 - beq- int_teardown_0x2c + beq- ReturnFromInterrupt_0x2c mfxer r8 rlwinm r8, r8, 0, 23, 21 rlwimi r8, r7, 19, 23, 23 mtxer r8 -int_teardown_0x2c +ReturnFromInterrupt_0x2c mtcr r13 lwz r10, 0x0154(r6) lwz r11, 0x015c(r6) @@ -1323,7 +1359,7 @@ int_teardown_0x2c ; major_0x14548 ; Xrefs: -; major_0x142dc +; RescheduleAndReturn major_0x14548 ; OUTSIDE REFERER lwz r16, 0x0064(r31) @@ -1381,12 +1417,12 @@ major_0x14548_0x58 cmpwi r16, 0x00 mr r8, r31 beql+ TaskReadyAsPrev - major_0x14548_0xd4 + mfsprg r19, 0 li r8, 0x00 - stb r8, EWA.BinaryFlag(r19) - lhz r8, -0x0116(r19) + stb r8, EWA.SchEvalFlag(r19) + lhz r8, EWA.CPUIndex(r19) lwz r6, 0x0088(r30) lwz r28, -0x0340(r19) sth r8, 0x001a(r30) @@ -1411,7 +1447,7 @@ major_0x14548_0xd4 cmpw r18, r9 beq- major_0x14548_0x148 mr r8, r18 - bl SetAddrSpcRegisters + bl SetSpaceSRsAndBATs major_0x14548_0x148 mfsprg r19, 0 @@ -1430,7 +1466,7 @@ major_0x14548_0x148 bsol+ cr6, Local_Panic clrlwi r8, r7, 0x08 stw r8, 0x0000(r6) - lwz r6, 0x0658(r1) + lwz r6, KDP.PA_ECB(r1) addi r26, r1, 0x360 mtsprg 3, r26 stw r26, 0x00f0(r30) @@ -1449,9 +1485,9 @@ major_0x14548_0x148 stw r7, -0x0010(r19) major_0x14548_0x1cc - lwz r17, 0x00cc(r6) + lwz r17, ContextBlock.PriorityShifty(r6) ori r17, r17, 0x100 - stw r17, 0x00cc(r6) + stw r17, ContextBlock.PriorityShifty(r6) lhz r17, -0x043c(r1) lwz r18, 0x067c(r1) cmplwi r17, 0xffff @@ -1578,14 +1614,14 @@ major_0x14548_0x380 ; r11 = new srr1 ; r12 = lr restore ; r13 = cr restore - b int_teardown + b ReturnFromInterrupt ; major_0x148ec ; Xrefs: -; major_0x142dc +; RescheduleAndReturn ; major_0x14548 major_0x148ec ; OUTSIDE REFERER @@ -1666,18 +1702,20 @@ major_0x148ec_0xc8 ; setup ; KCStopScheduling ; major_0x0c8b4 -; major_0x0ccf4 +; SignalSemaphore ; MPCall_28 -; major_0x0d35c +; SetEvent ; MPCall_8 ; major_0x130f0 -; major_0x142dc +; RescheduleAndReturn ; major_0x14bcc ; CommonPIHPath ; Almost certain this was hand-written. Has a typo, and some ; instructions the compiler rarely touched, and is in hot path. +; ARG Task *r8 + major_0x149d4 ; OUTSIDE REFERER crset cr1_eq b major_0x149d4_0xc @@ -1688,61 +1726,58 @@ CalculateTimeslice ; OUTSIDE REFERER major_0x149d4_0xc: + ; CALCULATE TASK'S TIMESLICE + + ; Get task info lwz r18, Task.QueueMember + LLL.Next(r8) lwz r16, Task.QueueMember + LLL.Freeform(r8) ; points to RDYQ cmpwi r18, 0 lwz r17, Task.Weight(r8) beq+ Local_Panic - + ; Get queue info lwz r18, ReadyQueue.TotalWeight(r16) - lwz r19, ReadyQueue.Timecake(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 - 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 - 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 - - ; r19 || r20 = (r19 || r20) * r18 = ticks owed to this task in 1024 slices + ; t = t * r18 = my share of queue's time, out of 1024 mulhw r17, r20, r18 mullw r19, r19, r18 mullw r20, r20, r18 add r19, r19, r17 @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 rlwimi r20, r19, 22, 0, 9 srwi r19, r19, 10 @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) cmpwi r18, Task.kNominalPriority - ori r20, r20, 1 ; why make this odd? + bge- @nominal_or_idle - bge- @priority_nominal_or_idle - - ; Critical or latency protection: save the low word of (ticks per round) +;critical or latency protected stw r20, 0x00fc(r8) blr -@priority_nominal_or_idle - +@nominal_or_idle lwz r16, 0x00d8(r8) lwz r17, 0x00dc(r8) - beq- cr1, @definitely_do_the_thing + bc BO_IF, cr1_eq, @definitely_do_the_thing + cmpwi r16, 0 cmplwi cr2, r17, 0 blt- @definitely_do_the_thing @@ -1750,6 +1785,7 @@ major_0x149d4_0xc: bgtlr- cr2 @definitely_do_the_thing +;double-int is negative or zero mfxer r18 addc r20, r20, r17 adde r19, r19, r16 @@ -1780,130 +1816,114 @@ clear_cr0_lt ; OUTSIDE REFERER ; Xrefs: ; IntDecrementer -; major_0x142dc +; RescheduleAndReturn major_0x14a98 ; OUTSIDE REFERER rlwinm r8, r7, 10, 0, 0 - lwz r18, 0x0658(r1) + lwz r18, KDP.PA_ECB(r1) nand. r8, r8, r8 - lwz r17, 0x00cc(r18) + lwz r17, ContextBlock.PriorityShifty(r18) bltlr- - cmpwi r17, 0x00 + cmpwi r17, 0 rlwinm r9, r17, 0, 22, 22 blt- major_0x14a98_0x54 cmpwi r9, 0x200 - lwz r16, 0x01cc(r18) + lwz r16, ContextBlock.r25(r18) beq- major_0x14a98_0x48 - clrlwi r8, r16, 0x1d - clrlwi r9, r17, 0x1c - cmpwi r8, 0x06 + clrlwi r8, r16, 29 + clrlwi r9, r17, 28 + cmpwi r8, 6 bgt- major_0x14a98_0x48 cmpw r8, r9 bltlr- cmpw r8, r8 major_0x14a98_0x48 - ori r17, r17, 0x100 - stw r17, 0x00cc(r18) + ori r17, r17, 0x100 + stw r17, ContextBlock.PriorityShifty(r18) blr major_0x14a98_0x54 - clrlwi r17, r17, 0x01 - stw r17, 0x00cc(r18) + clrlwi r17, r17, 1 + stw r17, ContextBlock.PriorityShifty(r18) blr -; major_0x14af8 +######## ## ### ###### ######## ## ## ### ## +## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## +###### ## ## ## ## #### ###### ## ## ## ## ## +## ## ######### ## ## ## ## ## ######### ## +## ## ## ## ## ## ## ## ## ## ## ## +## ######## ## ## ###### ######## ### ## ## ######## -; Xrefs: -; setup -; 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) +FlagSchEvaluationIfTaskRequires ; OUTSIDE REFERER + lwz r16, Task.Flags(r8) mfsprg r15, 0 - rlwinm. r16, r16, 0, 25, 26 + rlwinm. r16, r16, 0, Task.kFlag25, Task.kFlag26 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) -major_0x14af8_0x38 +@38 addi r16, r16, -0x08 -major_0x14af8_0x3c +@loopentry addi r14, r14, -0x01 lbz r20, 0x0229(r16) lwz r21, 0x0018(r16) cmpw cr1, r17, r20 rlwinm. r21, r21, 0, 28, 28 - bge- cr1, major_0x14af8_0x60 - beq- major_0x14af8_0x60 + bge- cr1, @60 + beq- @60 mr r17, r20 mr r18, r16 -major_0x14af8_0x60 +@60 lwz r16, 0x0010(r16) cmpwi cr1, r14, 0x00 cmpw r16, r19 - ble- cr1, major_0x14af8_0x78 - beq+ major_0x14af8_0x34 - b major_0x14af8_0x38 + ble- cr1, @78 + beq+ @34 + b @38 -major_0x14af8_0x78 +@78 lbz r16, 0x0019(r8) cmpw r17, r16 blelr- - lhz r17, -0x0116(r15) - lhz r18, 0x022a(r18) + lhz r17, EWA.CPUIndex(r15) + lhz r18, CPU.EWA + EWA.CPUIndex(r18) cmpw r18, r17 - bne- major_0x14af8_0xb4 + bne- BEFOUR -major_0x14af8_0x94 +NINETYFOUR li r16, 0x01 - stb r16, EWA.BinaryFlag(r15) + stb r16, EWA.SchEvalFlag(r15) blr -major_0x14af8_0xa0 ; OUTSIDE REFERER +major_0x14af8_0xa0 mfsprg r15, 0 - lhz r18, Task.MysteryHalf(r8) - lhz r17, -0x0116(r15) ; somewhere in EWA + lhz r18, Task.CPUIndex(r8) + lhz r17, EWA.CPUIndex(r15) cmpw r17, r18 - beq+ major_0x14af8_0x94 + beq+ NINETYFOUR -major_0x14af8_0xb4 +BEFOUR lwz r9, 0x0ee0(r1) addi r9, r9, 0x01 stw r9, 0x0ee0(r1) @@ -1945,7 +1965,7 @@ major_0x14bcc _log 'Sch: Symmetric Multiprocessing^n' _log 'Sch: On CPU ' - lhz r8, 0x022a(r3) + lhz r8, CPU.EWA + EWA.CPUIndex(r3) bl Printh _log ' ID-' lwz r8, -0x0340(r3) @@ -1967,75 +1987,101 @@ major_0x14bcc bl PagingFlushTLB + + ; This is important to figure out: + _log 'Sch: Starting SMP idle task^n' _Lock PSA.SchLock, scratch1=r27, scratch2=r28 mfsprg r14, 0 - lwz r31, 0x001c(r3) - li r8, 0x00 - stb r8, EWA.BinaryFlag(r14) - lwz r6, 0x0088(r31) - stw r31, -0x0008(r14) - stw r6, -0x0014(r14) - lwz r7, 0x0000(r6) - lwz r28, 0x0004(r6) - stw r7, -0x0010(r14) - stw r28, -0x000c(r14) - lwz r8, 0x00f0(r31) + lwz r31, CPU.IdleTaskPtr(r3) + + li r8, 0 + stb r8, EWA.SchEvalFlag(r14) + + lwz r6, Task.ContextBlockPtr(r31) + + stw r31, EWA.PA_CurTask(r14) + + stw r6, EWA.PA_ContextBlock(r14) + + 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 - lwz r10, 0x00fc(r6) - lwz r11, 0x00a4(r6) - lwz r13, 0x00dc(r6) - lwz r12, 0x00ec(r6) + + lwz r10, ContextBlock.CodePtr(r6) + lwz r11, ContextBlock.MSR(r6) + lwz r13, 0x00dc(r6) + lwz r12, 0x00ec(r6) + _log 'EWA ' mr r8, r14 bl Printw + _log 'ContextPtr ' mr r8, r6 bl Printw + _log 'Flags ' mr r8, r7 bl Printw + _log 'Enables ' mr r8, r28 bl Printw _log '^n' - addi r16, r31, 0x08 + + addi r16, r31, Task.QueueMember RemoveFromList r16, scratch1=r17, scratch2=r18 - li r16, 0x02 - stb r16, 0x0018(r31) - lwz r16, 0x0064(r31) - ori r16, r16, 0x20 - stw r16, 0x0064(r31) + + li r16, 2 + stb r16, Task.MysteryByte1(r31) + + lwz r16, Task.Flags(r31) + ori r16, r16, 0x20 + stw r16, Task.Flags(r31) + mfsprg r14, 0 - lbz r8, 0x0019(r31) - stb r8, -0x0117(r14) - lwz r8, 0x0070(r31) - li r9, 0x00 - bl SetAddrSpcRegisters + + lbz r8, Task.Priority(r31) + stb r8, EWA.TaskPriority(r14) + + lwz r8, Task.AddressSpacePtr(r31) + li r9, 0 + bl SetSpaceSRsAndBATs + _log 'Adding idle task 0x' mr r8, r31 bl Printw _log 'to the ready queue^n' + mr r8, r31 bl TaskReadyAsPrev bl CalculateTimeslice - lwz r16, 0x0018(r3) - ori r16, r16, 0x08 - stw r16, 0x0018(r3) - lwz r17, 0x0008(r3) + lwz r16, CPU.Eff(r3) + ori r16, r16, 8 + stw r16, CPU.Eff(r3) + + lwz r17, Task.QueueMember + LLL.Freeform(r3) lwz r16, 0x0024(r17) addi r16, r16, 0x01 stw r16, 0x0024(r17) - li r8, 0x01 + + li r8, 1 mtspr dec, r8 + _log 'Sch: Going to ' - mr r8, r11 + mr r8, r11 ; MSR bl Printw - mr r8, r10 + mr r8, r10 ; PC bl Printw _log '^n' + mr r30, r31 b major_0x142dc_0xd8 b major_0x142dc_0x58 @@ -2138,7 +2184,7 @@ StopProcessor lwz r8, 0x001c(r31) li r9, 0x00 stw r9, 0x001c(r31) - bl DequeueTask + bl TaskUnready addi r16, r1, -0xa44 addi r17, r8, 0x08 stw r16, 0x0000(r17) @@ -2147,7 +2193,7 @@ StopProcessor _AssertAndRelease PSA.SchLock, scratch=r16 _log 'SIGP kStopProcessor^n' li r3, 0x03 - lhz r4, 0x022a(r31) + lhz r4, CPU.EWA + EWA.CPUIndex(r31) li r0, 0x2e twi 31, r31, 0x08 _log 'Stop didn''t work - going to sleep.^n' diff --git a/NanoKernel/NKSleep.s b/NanoKernel/NKSleep.s index 7e1d680..c542341 100644 --- a/NanoKernel/NKSleep.s +++ b/NanoKernel/NKSleep.s @@ -122,7 +122,7 @@ MPCall_103_0x10c mr r29, r17 li r16, 0x06 stw r16, -0x0238(r15) - lhz r16, -0x0116(r15) + lhz r16, EWA.CPUIndex(r15) stw r16, -0x0234(r15) li r8, 0x02 @@ -259,7 +259,7 @@ MPCall_103_0x270 mfsprg r15, 0 li r16, 0x11 stw r16, -0x0238(r15) - lhz r16, -0x0116(r15) + lhz r16, EWA.CPUIndex(r15) stw r16, -0x0234(r15) li r8, 0x02 @@ -359,12 +359,12 @@ RestoreKernelState_0x144 mfsprg r15, 0 lwz r8, -0x001c(r15) li r9, 0x00 - bl SetAddrSpcRegisters + bl SetSpaceSRsAndBATs isync mfsprg r15, 0 li r16, 0x07 stw r16, -0x0238(r15) - lhz r16, -0x0116(r15) + lhz r16, EWA.CPUIndex(r15) stw r16, -0x0234(r15) li r8, 0x02 @@ -374,7 +374,7 @@ RestoreKernelState_0x144 mfsprg r15, 0 li r16, 0x11 stw r16, -0x0238(r15) - lhz r16, -0x0116(r15) + lhz r16, EWA.CPUIndex(r15) stw r16, -0x0234(r15) li r8, 0x02 diff --git a/NanoKernel/NKSync.s b/NanoKernel/NKSync.s new file mode 100644 index 0000000..1c6689d --- /dev/null +++ b/NanoKernel/NKSync.s @@ -0,0 +1,3031 @@ + ####### ## ## ######## ## ## ######## ###### +## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## +## ## ## ## ###### ## ## ###### ###### +## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## + ##### ## ####### ######## ####### ######## ###### + + + + ## ######## ####### ###### ######## ######## ### ######## ######## + #### ## ## ## ## ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## ## ## ## ## ## + ## ####### ## ## ## ######## ###### ## ## ## ###### + ## ## ## ## ## ## ## ## ## ######### ## ## + ## ## ## ## ## ## ## ## ## ## ## ## ## ## + ###### ###### ##### ## ###### ## ## ######## ## ## ## ######## + +; RET OSStatus r3, QueueID r4 + + DeclareMPCall 15, MPCreateQueue + +MPCreateQueue + + li r8, Queue.Size + bl PoolAlloc_with_crset + mr. r31, r8 + beq+ ScrambleMPCall + + ; List of messages waiting for tasks + InitList r8, 'MSGQ', scratch=r16 + + ; List of blocked tasks waiting to be notified of messages + addi r9, r8, Queue.Messages + InitList r9, 'NOTQ', scratch=r16 + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + li r9, Queue.kIDClass + bl MakeID + + cmpwi r8, 0 + bne+ @nofail + mr r8, r31 + bl PoolFree + b ReleaseAndScrambleMPCall +@nofail + + mfsprg r30, 0 + lwz r30, EWA.PA_CurTask(r30) + + stw r8, Queue.BlockedTasks + LLL.Freeform(r31) + + lwz r17, Task.ProcessID(r30) + stw r17, Queue.ProcessID(r31) + + mr r4, r8 + + li r17, 0 + stw r17, Queue.ReserveCount(r31) + stw r17, Queue.ReservePtr(r31) + stw r17, Queue.BlockedTaskCount(r31) + stw r17, Queue.MessageCount(r31) + + b ReleaseAndReturnZeroFromMPCall + + + + ## ####### ####### ######## ######## ## ######## ######## ######## + #### ## ## ## ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## ## ## ## ## + ## ######## ## ## ## ## ###### ## ###### ## ###### + ## ## ## ## ## ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## ## ## ## ## ## + ###### ####### ##### ## ######## ######## ######## ######## ## ######## + +; Delete a message queue: +; 1. Delete its messages. +; 2. Call UnblockBlueIfCouldBePolling on the queue? +; 3. Unblock waiting tasks with kMPDeletedErr, calling FlagSchEvaluationIfTaskRequires on each. +; 4. Delete the queue structure and its ID. + +; ARG QueueID r3 +; RET OSStatus r3 + + DeclareMPCall 16, MPDeleteQueue + +MPDeleteQueue + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Queue.kIDClass + + mr r31, r8 + bne+ ReleaseAndReturnMPCallInvalidIDErr + + + ; Delete all auto-allocated messages +@note_free_loop + addi r30, r31, Queue.Messages + lwz r8, Queue.Messages + LLL.Next(r31) + cmpw r8, r30 + beq- @exit_note_free_loop + RemoveFromList r8, scratch1=r16, scratch2=r17 + bl PoolFree + b @note_free_loop +@exit_note_free_loop + + + ; Delete all pre-allocated messages + lwz r30, Queue.ReservePtr(r31) +@notr_free_loop + mr. r8, r30 + beq- @exit_notr_free_loop + lwz r30, Message.LLL + LLL.Next(r30) + bl PoolFree + b @notr_free_loop +@exit_notr_free_loop + + + mr r8, r3 + bl UnblockBlueIfCouldBePolling + + + ; UNBLOCK the tasks that are blocked waiting on this queue. + ; From the task's perspective, MPWaitOnQueue will return + ; kMPDeletedErr, because we tweak the task's ContextBlock. +@task_unblock_loop + + ; Peek at our MSGQ queue of blocked tasks + addi r30, r31, Queue.BlockedTasks + lwz r16, Queue.BlockedTasks + LLL.Next(r31) + cmpw r16, r30 + subi r8, r16, Task.QueueMember + beq- @exit_task_loop + + ; Manipulate its r3 from afar + lwz r17, Task.ContextBlockPtr(r8) + li r18, kMPDeletedErr + stw r18, ContextBlock.r3(r17) + + ; If blocked with timeout, dequeue task's internal timer + lbz r17, Task.Timer + Timer.Byte3(r8) + cmpwi r17, 1 + bne- @no_timeout + addi r8, r8, Task.Timer + bl DequeueTimer +@no_timeout + + ; Remove from this MSGQ + lwz r16, Queue.BlockedTasks + LLL.Next(r31) + RemoveFromList r16, scratch1=r17, scratch2=r18 + + ; Put RDYQ + subi r8, r16, Task.QueueMember + bl TaskReadyAsPrev + + bl FlagSchEvaluationIfTaskRequires + + b @task_unblock_loop +@exit_task_loop + + + ; Delete the actual Queue structure and its ID + mr r8, r31 + bl PoolFree + mr r8, r3 + bl DeleteID + + + b ReleaseAndReturnZeroFromMPCall + + + + ####### ####### ####### ######## ######## ###### ######## ######## ## ## ######## +## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## + ####### ######## ## ## ######## ###### ###### ###### ######## ## ## ###### + ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## + ####### ####### ##### ## ## ## ######## ###### ######## ## ## ### ######## + +; Reserve space for messages for this queue. +; (guarantees message delivery) + +; Reserved messages have signature 'notr' (vs. 'note'). + +; ARG QueueID r3, ItemCount r4 +; RET OSStatus r3 + + DeclareMPCall 39, MPSetQueueReserve + +MPSetQueueReserve + + cmpwi r4, 0 + blt+ ReturnMPCallOOM + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Queue.kIDClass + mr r31, r8 + bne+ ReleaseAndReturnMPCallInvalidIDErr + + lwz r29, Queue.ReserveCount(r31) + lwz r30, Queue.ReservePtr(r31) + + cmpw r29, r4 + beq+ ReleaseAndReturnZeroFromMPCall + blt- @make_more + + + ; NEW < OLD +@free_loop + mr. r8, r30 + beq- @free_loop_failed + subi r29, r29, 1 + lwz r30, LLL.Next(r30) + bl PoolFree + cmpw r29, r4 + bgt+ @free_loop + +;free loop succeeded + stw r4, Queue.ReserveCount(r31) + stw r30, Queue.ReservePtr(r31) + b ReleaseAndReturnZeroFromMPCall + +@free_loop_failed + stw r29, Queue.ReserveCount(r31) + stw r30, Queue.ReservePtr(r31) + b ReleaseAndReturnMPCallOOM + + + ; NEW > OLD +@make_more +@alloc_loop + li r8, Message.Size + bl PoolAlloc_with_crset + cmpwi r8, 0 + beq+ ReleaseAndScrambleMPCall + + addi r29, r29, 1 + + lisori r17, Message.kReservedSignature + stw r17, Message.LLL + LLL.Signature(r8) + + stw r30, Message.LLL + LLL.Next(r8) + + stw r29, Queue.ReserveCount(r31) + + cmpw r29, r4 + stw r8, Queue.ReservePtr(r31) + mr r30, r8 + blt+ @alloc_loop + + + b ReleaseAndReturnZeroFromMPCall + + + + ## ######## ####### ## ## ####### ######## #### ######## ## ## + #### ## ## ## ## ### ## ## ## ## ## ## ## ## + ## ## ## ## #### ## ## ## ## ## ## #### + ## ## ## ## ## ## ## ## ## ## ## ###### ## + ## ## ## ## ## ## #### ## ## ## ## ## ## + ## ## ## ## ## ### ## ## ## ## ## ## + ###### ## ##### ## ## ## ####### ## #### ## ## + +; Sends a 12-byte message to the specified queue + +; ARG QueueID r3, long r4, long r5, long r6 + + DeclareMPCall 17, MPNotifyQueue + +MPNotifyQueue + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Queue.kIDClass + + mr r31, r8 + bne+ ReleaseAndReturnMPCallInvalidIDErr + + lwz r16, Queue.ReserveCount(r31) + li r8, Message.Size + cmpwi r16, 0 + bne- @try_reserve + +;no reservation available + bl PoolAlloc_with_crset + + cmpwi r8, 0 + beq+ ReleaseAndScrambleMPCall + + lisori r17, Message.kSignature + stw r17, Message.LLL + LLL.Signature(r8) + + b @common + +@try_reserve + lwz r17, Queue.ReservePtr(r31) + mr. r8, r17 + beq+ ReleaseAndReturnMPCallOOM + + lwz r17, Message.LLL + LLL.Next(r17) + stw r17, Queue.ReservePtr(r31) + +@common + ; Got a message ptr in r8! + + ; Fill it with lies + lwz r16, ContextBlock.r6(r6) + stw r4, Message.Word1(r8) + stw r5, Message.Word2(r8) + stw r16, Message.Word3(r8) + + bl EnqueueMessage ; Message *r8, Queue *r31 + + + b ReleaseAndReturnZeroFromMPCall + + + + ### ####### ## ## ###### ###### ### + ## ## ## ### ### ## ## ## ## ## +## ## ## #### #### ## ## ## +## ## ## ## ### ## ###### ## #### ## +## ## ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## ## ## ## + ### ##### ## ## ## ###### ###### ### + +; Enqueue a note/notr object. + +; Odd way of unblocking task (does not touch r3 directly): +; 1. Add message to queue. +; 2. If task waiting, unblock with rewound PC to retry syscall. + +; ARG Message *r8, Queue *r31 + +EnqueueMessage + + addi r17, r31, Queue.Messages + stw r17, LLL.Freeform(r8) + + InsertAsPrev r8, r17, scratch=r16 + + lwz r18, Queue.MessageCount(r31) + addi r18, r18, 1 + stw r18, Queue.MessageCount(r31) + + mflr r27 + + lwz r8, Queue.BlockedTasks + LLL.Freeform(r31) + bl UnblockBlueIfCouldBePolling + + ; Got a task to unblock straight away? + lwz r16, Queue.BlockedTasks + LLL.Next(r31) + cmpw r16, r31 + subi r8, r16, Task.QueueMember + beq- @no_task + + ; Saves us special-casing + lwz r17, Task.ContextBlockPtr(r8) + lwz r18, ContextBlock.CodePtr(r17) + subi r18, r18, 4 + stw r18, ContextBlock.CodePtr(r17) + + ; De-fang the task's blocking timeout + lbz r17, Task.Timer + Timer.Byte3(r8) + cmpwi r17, 1 + bne- @no_timeout + addi r8, r8, Task.Timer + bl DequeueTimer +@no_timeout + + ; Remove the task from this MSGQ + lwz r16, Queue.BlockedTasks + LLL.Next(r31) + RemoveFromList r16, scratch1=r17, scratch2=r18 + + lwz r18, Queue.BlockedTaskCount(r31) + subi r18, r18, 1 + stw r18, Queue.BlockedTaskCount(r31) + + subi r8, r16, Task.QueueMember + + ; And add it back to the latency-protection RDYQ + li r17, Task.kLatencyProtectPriority + stb r17, Task.Priority(r8) + + bl TaskReadyAsPrev + bl CalculateTimeslice + + bl FlagSchEvaluationIfTaskRequires +@no_task + + mtlr r27 + blr + + + + ## ####### ####### ## ## ### #### ######## + #### ## ## ## ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## ## ## ## ## ## + ## ####### ## ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## ## ## ######### ## ## + ## ## ## ## ## ## ## ## ## ## ## ## + ###### ####### ##### ## ### ### ## ## #### ## + +; Get a message from the specified queue, or fail. + +; Abbreviated summary of cases: +; 1. Return a pending message +; 2. Time out instantly +; 3. Move task to MSGQ from RDYQ and arm timer +; 4. Move task to MSGQ from RDYQ, no timeout + +; ARG QueueID r3, Duration r7 +; RET OSStatus r3, long r4, long r5, long r6 + + DeclareMPCall 18, MPWaitOnQueue + +MPWaitOnQueue + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Queue.kIDClass + bne+ ReleaseAndReturnMPCallInvalidIDErr + + mr r31, r8 + + lwz r16, Queue.Messages + LLL.Next(r31) + addi r17, r31, Queue.Messages + cmpw r16, r17 + beq- @no_messages_pending + +;messages pending + lwz r4, Message.Word1(r16) + lwz r5, Message.Word2(r16) + lwz r17, Message.Word3(r16) + stw r17, ContextBlock.r6(r6) + + RemoveFromList r16, scratch1=r17, scratch2=r18 + + lwz r18, Queue.MessageCount(r31) + subi r18, r18, 1 + stw r18, Queue.MessageCount(r31) + + lbz r17, Message.LLL + LLL.Signature + 3(r16) ; 'r' if mem-reserved message, else 'e' + mr r8, r16 + cmpwi r17, Message.kReservedSignature & 0xFF + beq- @immediate_msg_was_reserved + +;immediate message was not reserved ... return noErr + bl PoolFree + b ReleaseAndReturnZeroFromMPCall + +@immediate_msg_was_reserved ; ... return noErr + lwz r17, Queue.ReservePtr(r31) + stw r16, Queue.ReservePtr(r31) + stw r17, LLL.Next(r16) + b ReleaseAndReturnZeroFromMPCall + + +; The blocking case (eew!) + +@no_messages_pending + lwz r17, ContextBlock.r7(r6) + mfsprg r30, 0 + +;special case: zero timeout ... return + cmpwi r17, 0 + lwz r19, EWA.PA_CurTask(r30) + beq+ ReleaseAndTimeoutMPCall + +;special case: blue may not block + lwz r16, Task.Flags(r19) + rlwinm. r16, r16, 0, Task.kFlagBlue, Task.kFlagBlue + beq- @bot_blue + stw r3, PSA.BlueSpinningOn(r1) + b ReleaseAndReturnMPCallBlueBlocking +@bot_blue + +;committed to blocking the calling task + + ; Remove from ready queue + mr r8, r19 + bl TaskUnready + + ; Add to this queue + lwz r19, EWA.PA_CurTask(r30) + + addi r16, r31, Queue.BlockedTasks + addi r17, r19, Task.QueueMember + + stw r16, LLL.FreeForm(r17) + InsertAsPrev r17, r16, scratch=r18 + + lwz r18, Queue.BlockedTaskCount(r31) + addi r18, r18, 1 + stw r18, Queue.BlockedTaskCount(r31) + + ; Decide whether call can time out + _lstart r16, 0x7fffffff ; "forever" + lwz r17, ContextBlock.r7(r6) + _lfinish + + addi r30, r19, Task.Timer + cmpw r17, r16 + + li r16, 2 + beq- @wait_forever + +;committed to arming task's built-in timer (finite timeout) + stb r16, Timer.Kind(r30) + stw r19, Timer.ParentTaskPtr(r30) + mr r8, r17 + + ; Convert that timeout to a tick count + bl TimebaseTicksPerPeriod + mr r27, r8 + mr r28, r9 + + bl GetTime + mfxer r16 + addc r9, r9, r28 + adde r8, r8, r27 + mtxer r16 + + ; Now r8/r9 = absolute timeout date + stw r8, Timer.Time(r30) + stw r9, Timer.Time+4(r30) + + mr r8, r30 + bl EnqueueTimer + +@wait_forever + b BlockMPCall + + + + ## ####### ####### ####### ## ## ######## ######## ## ## + #### ## ## ## ## ## ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## ## ## ## ## ## #### + ## ######## ## ## ## ## ## ## ###### ######## ## + ## ## ## ## ## ## ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## ## ## ## ## ## ## + ###### ####### ##### ## ##### ## ####### ######## ## ## ## + +; Non-blocking peek at contents of queue (undocumented) +; Returns timeout if empty, noErr if non-empty + +; ARG QueueID r3 +; RET OSStatus r3 + + DeclareMPCall 19, MPQueryQueue + +MPQueryQueue + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + + cmpwi r9, Queue.kIDClass + bne+ ReleaseAndReturnMPCallInvalidIDErr + + mr r31, r8 + lwz r16, Queue.Messages + LLL.Next(r31) + addi r17, r31, Queue.Messages + cmpw r16, r17 + + beq+ ReleaseAndTimeoutMPCall + + b ReleaseAndReturnZeroFromMPCall + + + + + + + + + + ###### ######## ## ## ### ######## ## ## ####### ######## ######## ###### +## ## ## ### ### ## ## ## ## ## ## ## ## ## ## ## ## ## +## ## #### #### ## ## ## ## ## ## ## ## ## ## ## ## + ###### ###### ## ### ## ## ## ######## ######### ## ## ######## ###### ###### + ## ## ## ## ######### ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## + ###### ######## ## ## ## ## ## ## ## ####### ## ## ######## ###### + + + + ####### ##### ###### ###### ######## ######## ### ######## ######## +## ## ## ## ## ## ## ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## ## ## ## ## ## + ####### ## ## ###### ## ######## ###### ## ## ## ###### +## ## ## ## ## ## ## ## ######### ## ## +## ## ## ## ## ## ## ## ## ## ## ## ## ## +######### ##### ###### ###### ## ## ######## ## ## ## ######## + +; ARG maxValue r3, initialValue r4 +; RET OSStatus r3, SemaphoreID r5 + + DeclareMPCall 20, MPCreateSemaphore + +MPCreateSemaphore + + cmpw r4, r3 + bgt+ ReturnMPCallOOM + + li r8, Semaphore.Size + bl PoolAlloc_with_crset + mr. r31, r8 + beq+ ScrambleMPCall + + InitList r31, Semaphore.kSignature, scratch=r16 + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + li r9, Semaphore.kIDClass + bl MakeID + cmpwi r8, 0 + bne+ @nofail + + mr r8, r31 + bl PoolFree + b ReleaseAndScrambleMPCall +@nofail + + li r18, 0x00 + stw r8, 0x0000(r31) + + mfsprg r30, 0 + lwz r30, EWA.PA_CurTask(r30) + + stw r3, Semaphore.MaxValue(r31) + stw r4, Semaphore.Value(r31) + lwz r17, Task.ProcessID(r30) + stw r18, Semaphore.BlockedTaskCount(r31) + stw r17, Semaphore.ProcessID(r31) + + mr r5, r8 + + b ReleaseAndReturnZeroFromMPCall + + + + ####### ####### ###### ## ## ### #### ######## +## ## ## ## ## ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## ## ## ## + ####### ####### ###### ## ## ## ## ## ## ## +## ## ## ## ## ## ######### ## ## +## ## ## ## ## ## ## ## ## ## ## ## +######### ####### ###### ### ### ## ## #### ## + +; Wait on a semaphore, or fail (similar to MPWaitOnQueue) + +; Abbreviated summary of cases: +; 1. Decrement and return instantly +; 2. Time out instantly +; 3. Move task to SEMA from RDYQ and arm timer +; 4. Move task to SEMA from RDYQ, no timeout + +; ARG SemaphoreID r3, Duration r4 + + DeclareMPCall 23, MPWaitOnSemaphore + +MPWaitOnSemaphore + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Semaphore.kIDClass + bne+ ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + + lwz r16, Semaphore.Value(r31) + cmpwi r16, 0 + subi r16, r16, 1 + ble- @must_wait + +;easiest case ... decrement and return + stw r16, Semaphore.Value(r31) + b ReleaseAndReturnZeroFromMPCall +@must_wait + +;next easiest case ... instant timeout + cmpwi r4, 0 + mfsprg r30, 0 + beq+ ReleaseAndTimeoutMPCall + + lwz r8, EWA.PA_CurTask(r30) + +;special case: blue may not block + lwz r16, Task.Flags(r8) + rlwinm. r16, r16, 0, Task.kFlagBlue, Task.kFlagBlue + beq- @bot_blue + stw r3, PSA.BlueSpinningOn(r1) + b ReleaseAndReturnMPCallBlueBlocking +@bot_blue + +;committed to blocking the calling task + + ; Remove from ready queue + bl TaskUnready + + ; Add to this queue + addi r16, r31, Semaphore.BlockedTasks + addi r17, r8, Task.QueueMember + + stw r16, LLL.FreeForm(r17) + InsertAsPrev r17, r16, scratch=r18 + + lwz r18, Semaphore.BlockedTaskCount(r31) + addi r18, r18, 1 + stw r18, Semaphore.BlockedTaskCount(r31) + + _lstart r16, 0x7fffffff + addi r30, r8, Task.Timer + _lfinish + cmpw r4, r16 + + li r17, 2 + beq- @wait_forever + +;committed to creating a timer (finite timeout) + stb r17, Timer.Kind(r30) + stw r8, Timer.ParentTaskPtr(r30) + mr r8, r4 + + ; Convert that timeout to a tick count + bl TimebaseTicksPerPeriod + mr r27, r8 + mr r28, r9 + + bl GetTime + mfxer r16 + addc r9, r9, r28 + adde r8, r8, r27 + mtxer r16 + + ; Now r8/r9 = absolute timeout date + stw r8, Timer.Time(r30) + stw r9, Timer.Time+4(r30) + + mr r8, r30 + bl EnqueueTimer + +@wait_forever + li r3, 0x00 + b BlockMPCall + + + + ####### ## ###### ####### ## ## ######## ######## ## ## +## ## ## ## ## ## ## ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## ## ## ## ## #### + ####### ## ## ###### ## ## ## ## ###### ######## ## +## ######### ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## +######### ## ###### ##### ## ####### ######## ## ## ## + +; Non-blocking peek at semaphore (undocumented) +; Returns timeout if empty, noErr if non-empty + +; ARG SemaphoreID r3 +; RET OSStatus r3 + + DeclareMPCall 24, MPQuerySemaphore + +MPQuerySemaphore + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + + cmpwi r9, Semaphore.kIDClass + bne+ ReleaseAndReturnMPCallInvalidIDErr + + mr r31, r8 + lwz r16, Semaphore.Value(r31) + cmpwi r16, 0 + + ble+ ReleaseAndTimeoutMPCall + + b ReleaseAndReturnZeroFromMPCall + + + + ####### ####### ###### ###### #### ###### ## ## ### ## +## ## ## ## ## ## ## ## ## ## ## ### ## ## ## ## + ## ## ## ## ## ## #### ## ## ## ## + ####### ####### ###### ###### ## ## #### ## ## ## ## ## ## +## ## ## ## ## ## ## ## #### ######### ## +## ## ## ## ## ## ## ## ## ## ### ## ## ## +######### ######### ###### ###### #### ###### ## ## ## ## ######## + +; ARG SemaphoreID r3 +; RET OSStatus r3 + + DeclareMPCall 22, MPSignalSemaphore + +MPSignalSemaphore + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + + cmpwi r9, Semaphore.kIDClass + mr r31, r8 + bne+ ReleaseAndReturnMPCallInvalidIDErr + + bl SignalSemaphore + + mr r3, r8 + b ReleaseAndReturnMPCall + + + + ### ###### ###### #### ###### ## ## ### ## ### + ## ## ## ## ## ## ## ## ### ## ## ## ## ## +## ## ## ## ## #### ## ## ## ## ## +## ###### ###### ## ## #### ## ## ## ## ## ## ## +## ## ## ## ## ## ## #### ######### ## ## + ## ## ## ## ## ## ## ## ## ### ## ## ## ## + ### ###### ###### #### ###### ## ## ## ## ######## ### + +; ARG Semaphore *r31 + +SignalSemaphore ; OUTSIDE REFERER + mflr r27 + lwz r8, Semaphore.BlockedTasks + LLL.Freeform(r31) + bl UnblockBlueIfCouldBePolling + lwz r16, 0x0008(r31) + cmpw r16, r31 + beq- SignalSemaphore_0x80 + addi r8, r16, -0x08 + lbz r17, 0x0037(r8) + cmpwi r17, 0x01 + bne- SignalSemaphore_0x30 + addi r8, r8, 0x20 + bl DequeueTimer + +SignalSemaphore_0x30 + lwz r16, 0x0008(r31) + RemoveFromList r16, scratch1=r17, scratch2=r18 + lwz r18, 0x001c(r31) + addi r18, r18, -0x01 + stw r18, 0x001c(r31) + addi r8, r16, -0x08 + li r17, 0x01 + stb r17, 0x0019(r8) + bl TaskReadyAsPrev + bl CalculateTimeslice + bl FlagSchEvaluationIfTaskRequires + mtlr r27 + li r8, 0x00 + blr + +SignalSemaphore_0x80 + mtlr r27 + lwz r16, 0x0010(r31) + lwz r17, 0x0014(r31) + cmpw r16, r17 + addi r16, r16, 0x01 + li r8, kMPInsufficientResourcesErr + bgelr- + stw r16, 0x0010(r31) + li r8, 0x00 + blr + + + + ####### ## ###### ######## ######## ## ######## ######## ######## +## ## #### ## ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## ## ## ## + ####### ## ###### ## ## ###### ## ###### ## ###### +## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## +######### ###### ###### ######## ######## ######## ######## ## ######## + + DeclareMPCall 21, MPDeleteSemaphore + +MPDeleteSemaphore + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Semaphore.kIDClass + mr r31, r8 + bne+ ReleaseAndReturnMPCallInvalidIDErr + + mr r8, r3 + bl UnblockBlueIfCouldBePolling + +MPCall_21_0x34 + addi r30, r31, Semaphore.BlockedTasks + lwz r16, LLL.Next(r31) + cmpw r16, r30 + addi r8, r16, -0x08 + beq- MPCall_21_0x98 + lwz r17, 0x0088(r8) + li r18, kMPDeletedErr + stw r18, 0x011c(r17) + lbz r17, 0x0037(r8) + cmpwi r17, 0x01 + bne- MPCall_21_0x68 + addi r8, r8, 0x20 + bl DequeueTimer + +MPCall_21_0x68 + lwz r16, 0x0008(r31) + RemoveFromList r16, scratch1=r17, scratch2=r18 + addi r8, r16, -0x08 + bl TaskReadyAsPrev + bl FlagSchEvaluationIfTaskRequires + b MPCall_21_0x34 + +MPCall_21_0x98 + mr r8, r31 + bl PoolFree + mr r8, r3 + bl DeleteID + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + + + + + + + + ###### ######## #### ######## #### ###### ### ## +## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## +## ######## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ######### ## +## ## ## ## ## ## ## ## ## ## ## ## + ###### ## ## #### ## #### ###### ## ## ######## + +######## ######## ###### #### ####### ## ## ###### +## ## ## ## ## ## ## ## ### ## ## ## +## ## ## ## ## ## ## #### ## ## +######## ###### ## #### ## ## ## ## ## ## ###### +## ## ## ## ## ## ## ## ## #### ## +## ## ## ## ## ## ## ## ## ### ## ## +## ## ######## ###### #### ####### ## ## ###### + + + + ####### ######## ######## ###### ######## ######## ### ######## ######## +## ## ## ## ## ## ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## ## ## ## ## ## + ####### ####### ######## ## ######## ###### ## ## ## ###### +## ## ## ## ## ## ## ## ######### ## ## +## ## ## ## ## ## ## ## ## ## ## ## ## ## +######### ###### ## ## ###### ## ## ######## ## ## ## ######## + + + + DeclareMPCall 25, MPCreateCriticalRegion + +MPCreateCriticalRegion + li r8, 0x24 + bl PoolAlloc_with_crset + mr. r31, r8 + beq+ ScrambleMPCall + InitList r31, CriticalRegion.kSignature, scratch=r16 + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + li r9, 0x06 + +; r1 = kdp +; r9 = kind + bl MakeID + cmpwi r8, 0x00 + bne+ MPCall_25_0x58 + mr r8, r31 + bl PoolFree + b ReleaseAndScrambleMPCall + +MPCall_25_0x58 + li r18, 0x00 + mfsprg r30, 0 + lwz r30, -0x0008(r30) + li r16, 0x00 + stw r8, 0x0000(r31) + stw r16, 0x0014(r31) + stw r16, 0x001c(r31) + stw r16, 0x0018(r31) + lwz r17, 0x0060(r30) + stw r18, 0x0020(r31) + stw r17, 0x0010(r31) + mr r4, r8 + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + + ####### ######## ######## ######## ## ## ######## ######## ######## +## ## ## ## ## ## ## ### ## ## ## ## ## + ## ## ## ## ## #### ## ## ## ## ## + ####### ## ######## ###### ## ## ## ## ###### ######## +## ## ## ## ## ## #### ## ## ## ## +## ## ## ## ## ## ### ## ## ## ## +######### ## ## ## ######## ## ## ## ######## ## ## + + DeclareMPCall 27, MPEnterCriticalRegion + +MPEnterCriticalRegion + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + +; r8 = id + bl LookupID + cmpwi r9, CriticalRegion.kIDClass + + bne+ ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + mfsprg r17, 0 + lwz r18, 0x0014(r31) + lwz r30, -0x0008(r17) + cmpwi r18, 0x00 + lwz r16, 0x0018(r31) + beq- MPCall_27_0x64 + lwz r17, 0x001c(r31) + cmpw r16, r30 + cmpw cr1, r17, r5 + bne- MPCall_27_0x78 + bne- cr1, MPCall_27_0x78 + addi r18, r18, 0x01 + stw r18, 0x0014(r31) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +MPCall_27_0x64 + addi r18, r18, 0x01 + stw r30, 0x0018(r31) + stw r5, 0x001c(r31) + stw r18, 0x0014(r31) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +MPCall_27_0x78 + lwz r8, 0x0000(r16) + +; r8 = id + bl LookupID + cmpwi r9, Task.kIDClass + + bne+ ReleaseAndReturnMPCallTaskAborted + lwz r8, 0x001c(r31) + +; r8 = id + bl LookupID + cmpwi r9, Process.kIDClass + + bne+ ReleaseAndReturnMPCallTaskAborted + cmpwi r4, 0x00 +;special case: blue may not block + lwz r16, Task.Flags(r30) + beq+ ReleaseAndTimeoutMPCall + rlwinm. r16, r16, 0, Task.kFlagBlue, Task.kFlagBlue + beq- @bot_blue + stw r3, PSA.BlueSpinningOn(r1) + b ReleaseAndReturnMPCallBlueBlocking +@bot_blue + +MPCall_27_0xb4 + mr r8, r30 + bl TaskUnready + lis r16, 0x7fff + addi r18, r30, 0x08 + ori r16, r16, 0xffff + stw r31, 0x0000(r18) + InsertAsPrev r18, r31, scratch=r19 + lwz r18, 0x0020(r31) + addi r18, r18, 0x01 + stw r18, 0x0020(r31) + cmpw r4, r16 + beq- MPCall_27_0x138 + addi r29, r30, 0x20 + li r8, 0x02 + stw r30, 0x0018(r29) + stb r8, 0x0014(r29) + mr r8, r4 + +; r1 = kdp +; r8 = multiple (pos: /250; neg: /250000) + bl TimebaseTicksPerPeriod +; r8 = hi +; r9 = lo + + mr r27, r8 + mr r28, r9 + bl GetTime + mfxer r16 + addc r9, r9, r28 + adde r8, r8, r27 + mtxer r16 + stw r8, 0x0038(r29) + stw r9, 0x003c(r29) + mr r8, r29 + bl EnqueueTimer + +MPCall_27_0x138 + b BlockMPCall + + + + ####### ####### ######## ####### ## ## ######## ######## ## ## +## ## ## ## ## ## ## ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## ## ## ## ## ## #### + ####### ######## ######## ## ## ## ## ###### ######## ## +## ## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## ## +######### ####### ## ## ##### ## ####### ######## ## ## ## + + DeclareMPCall 29, MPQueryCriticalRegion + +MPQueryCriticalRegion + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + +; r8 = id + bl LookupID + cmpwi r9, CriticalRegion.kIDClass + + bne+ ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + mfsprg r17, 0 + lwz r18, 0x0014(r31) + cmpwi r18, 0x00 + +; r1 = kdp + beq+ ReleaseAndReturnZeroFromMPCall + lwz r30, -0x0008(r17) + lwz r16, 0x0018(r31) + lwz r17, 0x001c(r31) + cmpw r16, r30 + cmpw cr1, r17, r4 + bne+ ReleaseAndTimeoutMPCall + bne+ cr1, ReleaseAndTimeoutMPCall + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + + ####### ####### ######## ######## ## ## #### ######## +## ## ## ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## ## ## ## + ####### ####### ######## ###### ### ## ## +## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## +######### ####### ## ## ######## ## ## #### ## + + DeclareMPCall 28, MPExitCriticalRegion + +MPExitCriticalRegion + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + +; r8 = id + bl LookupID + cmpwi r9, CriticalRegion.kIDClass + + bne+ ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + mfsprg r17, 0 + lwz r16, 0x0018(r31) + lwz r30, -0x0008(r17) + lwz r18, 0x0014(r31) + lwz r17, 0x001c(r31) + cmpw r16, r30 + cmpw cr1, r17, r4 + bne+ ReleaseAndReturnMPCallOOM + bne+ cr1, ReleaseAndReturnMPCallOOM + addi r18, r18, -0x01 + cmpwi r18, 0x00 + stw r18, 0x0014(r31) + +; r1 = kdp + bne+ ReleaseAndReturnZeroFromMPCall + stw r18, 0x0018(r31) + stw r18, 0x001c(r31) + mr r8, r3 + bl UnblockBlueIfCouldBePolling + lwz r16, 0x0008(r31) + cmpw r16, r31 + +; r1 = kdp + beq+ ReleaseAndReturnZeroFromMPCall + addi r8, r16, -0x08 + lbz r17, 0x0037(r8) + cmpwi r17, 0x01 + bne- MPCall_28_0x94 + addi r8, r8, 0x20 + bl DequeueTimer + +MPCall_28_0x94 + lwz r16, 0x0008(r31) + RemoveFromList r16, scratch1=r17, scratch2=r18 + lwz r18, 0x0020(r31) + addi r18, r18, -0x01 + stw r18, 0x0020(r31) + addi r8, r16, -0x08 + lwz r17, 0x0088(r8) + lwz r18, 0x00fc(r17) + subi r18, r18, 4 + stw r18, 0x00fc(r17) + li r17, 0x01 + stb r17, 0x0019(r8) + bl TaskReadyAsPrev + bl CalculateTimeslice + bl FlagSchEvaluationIfTaskRequires + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + + ####### ####### ######## ######## ######## ## ######## ######## ######## +## ## ## ## ## ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## ## ## ## ## + ####### ######## ######## ## ## ###### ## ###### ## ###### +## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## +######### ####### ## ## ######## ######## ######## ######## ## ######## + + DeclareMPCall 26, MPDeleteCriticalRegion + +MPDeleteCriticalRegion + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + +; r8 = id + bl LookupID + cmpwi r9, CriticalRegion.kIDClass + + mr r31, r8 + bne+ ReleaseAndReturnMPCallInvalidIDErr + mr r8, r3 + bl UnblockBlueIfCouldBePolling + +MPCall_26_0x34 + addi r30, r31, 0x00 + lwz r16, 0x0008(r31) + cmpw r16, r30 + addi r8, r16, -0x08 + beq- MPCall_26_0x98 + lwz r17, 0x0088(r8) + li r18, kMPDeletedErr + stw r18, 0x011c(r17) + lbz r17, 0x0037(r8) + cmpwi r17, 0x01 + bne- MPCall_26_0x68 + addi r8, r8, 0x20 + bl DequeueTimer + +MPCall_26_0x68 + lwz r16, 0x0008(r31) + RemoveFromList r16, scratch1=r17, scratch2=r18 + addi r8, r16, -0x08 + bl TaskReadyAsPrev + bl FlagSchEvaluationIfTaskRequires + b MPCall_26_0x34 + +MPCall_26_0x98 + mr r8, r31 + bl PoolFree + mr r8, r3 + bl DeleteID + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + + + + + + + +######## ## ## ######## ## ## ######## +## ## ## ## ### ## ## +## ## ## ## #### ## ## +###### ## ## ###### ## ## ## ## +## ## ## ## ## #### ## +## ## ## ## ## ### ## +######## ### ######## ## ## ## + + ###### ######## ####### ## ## ######## ###### +## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## +## #### ######## ## ## ## ## ######## ###### +## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## + ###### ## ## ####### ####### ## ###### + + + +;_______________________________________________________________________ +; Lifted from docs: +; +; An event group is essentially a group of binary semaphores. You can use +; event groups to indicate a number of simple events. For example, a task +; running on a server may need to be aware of multiple message queues. +; Instead of trying to poll each one in turn, the server task can wait on +; an event group. Whenever a message is posted on a queue, the poster can +; also set the bit corresponding to that queue in the event group. Doing +; so notifies the task, and it then knows which queue to access to extract +; the message. In Multiprocessing Services, an event group consists of +; thirty-two 1-bit flags, each of which may be set independently. When a +; task receives an event group, it receives all 32-bits at once (that is, +; it cannot poll individual bits), and all the bits in the event group are +; subsequently cleared. +;_______________________________________________________________________ + + + +## ####### ######## ###### ######## ######## ### ######## ######## +## ## ## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## ## +## ## ######## ###### ## ######## ###### ## ## ## ###### +######### ## ## ## ## ## ## ######### ## ## + ## ## ## ## ## ## ## ## ## ## ## ## ## + ## ####### ######## ###### ## ## ######## ## ## ## ######## + + DeclareMPCall 49, MPCreateEvent + +; RET OSStatus r3, MPEventID r4 + +; called using the FE1F trap by the 68k ROM + +MPCreateEvent + + li r8, EventGroup.Size + bl PoolAlloc + mr. r31, r8 + beq+ ScrambleMPCall + + InitList r8, EventGroup.kSignature, scratch=r16 + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + li r9, EventGroup.kIDClass + bl MakeID + cmpwi r8, 0 + bne+ @success + + mr r8, r31 + bl PoolFree + b ReleaseAndScrambleMPCall + +@success + mfsprg r30, 0 + lwz r30, EWA.PA_CurTask(r30) + + stw r8, EventGroup.LLL + LLL.Freeform(r31) + + lwz r17, Task.ProcessID(r30) + stw r17, EventGroup.ProcessID(r31) + + mr r4, r8 + b ReleaseAndReturnZeroFromMPCall + + + +######## ##### ######## ######## ######## ## ######## ######## ######## +## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## +####### ## ## ###### ## ## ###### ## ###### ## ###### + ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## + ###### ##### ######## ######## ######## ######## ######## ## ######## + + DeclareMPCall 50, MPDeleteEvent + +; ARG MPEventID r3 +; RET OSStatus r3 + +MPDeleteEvent + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + +; r8 = id + bl LookupID + cmpwi r9, EventGroup.kIDClass + mr r31, r8 + bne+ ReleaseAndReturnMPCallInvalidIDErr + + mr r8, r3 + bl UnblockBlueIfCouldBePolling + +MPDeleteEvent_0x34 + addi r30, r31, 0x00 + lwz r16, 0x0008(r31) + cmpw r16, r30 + addi r8, r16, -0x08 + beq- MPDeleteEvent_0x98 + lwz r17, 0x0088(r8) + li r18, kMPDeletedErr + stw r18, 0x011c(r17) + lbz r17, 0x0037(r8) + cmpwi r17, 0x01 + bne- MPDeleteEvent_0x68 + addi r8, r8, 0x20 + bl DequeueTimer + +MPDeleteEvent_0x68 + lwz r16, 0x0008(r31) + RemoveFromList r16, scratch1=r17, scratch2=r18 + addi r8, r16, -0x08 + bl TaskReadyAsPrev + bl FlagSchEvaluationIfTaskRequires + b MPDeleteEvent_0x34 + +MPDeleteEvent_0x98 + mr r8, r31 + bl PoolFree + mr r8, r3 + bl DeleteID + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + +######## ## ######## ###### ######## ######## +## #### ## ## ## ## ## +## ## ## ## ## ## +####### ## ###### ###### ###### ## + ## ## ## ## ## ## +## ## ## ## ## ## ## ## + ###### ###### ######## ###### ######## ## + + DeclareMPCall 51, MPSetEvent + +; ARG MPEventID r3, MPEventFlags r4 +; RET OSStatus r3 + +MPSetEvent + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, EventGroup.kIDClass + mr r31, r8 + bne+ ReleaseAndReturnMPCallInvalidIDErr + + mr r8, r4 + bl SetEvent + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + + ### ######## ###### ######## ######## ### + ## ## ## ## ## ## ## +## ## ## ## ## ## +## ###### ###### ###### ## ## +## ## ## ## ## ## + ## ## ## ## ## ## ## + ### ######## ###### ######## ## ### + +SetEvent ; OUTSIDE REFERER + lwz r16, 0x0010(r31) + or r16, r16, r8 + stw r16, 0x0010(r31) + mflr r27 + lwz r8, 0x0000(r31) + bl UnblockBlueIfCouldBePolling + lwz r16, 0x0008(r31) + cmpw r16, r31 + addi r8, r16, -0x08 + beq- SetEvent_0x90 + lwz r17, 0x0088(r8) + lwz r18, 0x00fc(r17) + subi r18, r18, 4 + stw r18, 0x00fc(r17) + lbz r17, 0x0037(r8) + cmpwi r17, 0x01 + bne- SetEvent_0x4c + addi r8, r8, 0x20 + bl DequeueTimer + +SetEvent_0x4c + lwz r16, 0x0008(r31) + RemoveFromList r16, scratch1=r17, scratch2=r18 + lwz r18, 0x001c(r31) + addi r18, r18, -0x01 + stw r18, 0x001c(r31) + addi r8, r16, -0x08 + li r17, 0x01 + stb r17, 0x0019(r8) + bl TaskReadyAsPrev + bl CalculateTimeslice + bl FlagSchEvaluationIfTaskRequires + +SetEvent_0x90 + lwz r16, 0x0018(r31) + rlwinm. r17, r16, 0, 27, 27 + beq- SetEvent_0x1a0 + lwz r17, KDP.PA_ECB(r1) + lwz r26, -0x08f0(r1) + lwz r18, 0x00c8(r17) + lwz r19, 0x00d0(r17) + cmpwi cr1, r18, 0x00 + cmpwi r19, 0x00 + bne- cr1, SetEvent_0xc8 + bne- SetEvent_0x1a0 + lwz r8, 0x0000(r31) + stw r8, 0x00d0(r17) + b SetEvent_0x118 + +SetEvent_0xc8 + lwz r9, 0x0634(r1) + rlwinm r16, r16, 2, 26, 29 + add r18, r18, r9 + lwzx r19, r16, r18 + cmpwi r19, 0x00 + bne- SetEvent_0x1a0 + lwz r8, 0x0000(r31) + stwx r8, r16, r18 + li r19, 0x1c + li r9, 0x04 + +SetEvent_0xf0 + lwzx r8, r19, r18 + cmpwi r8, 0x00 + bne- SetEvent_0x108 + subf. r19, r9, r19 + bgt+ SetEvent_0xf0 + bl panic + +SetEvent_0x108 + cmplw r16, r19 + srwi r16, r16, 2 + blt- SetEvent_0x1a0 + stw r16, 0x00d0(r17) + +SetEvent_0x118 + lwz r16, 0x0064(r26) + lbz r19, 0x0018(r26) + ori r16, r16, 0x10 + stw r16, 0x0064(r26) + lwz r17, -0x0440(r1) + lwz r16, 0x0674(r1) + lwz r8, 0x0678(r1) + and r16, r16, r8 + or r17, r17, r16 + stw r17, -0x0440(r1) + cmpwi r19, 0x00 + addi r16, r26, 0x08 + bne- SetEvent_0x198 + RemoveFromList r16, scratch1=r17, scratch2=r18 + lbz r17, 0x0037(r26) + cmpwi r17, 0x01 + bne- SetEvent_0x17c + addi r8, r26, 0x20 + bl DequeueTimer + +SetEvent_0x17c + lwz r18, -0x08f0(r1) + li r16, 0x00 + stb r16, 0x0019(r26) + mr r8, r26 + bl TaskReadyAsNext + mr r8, r26 + bl CalculateTimeslice + +SetEvent_0x198 + mr r8, r26 + bl FlagSchEvaluationIfTaskRequires + +SetEvent_0x1a0 + mtlr r27 + blr + + + +######## ####### ######## ## ## ### #### ######## +## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## +####### ####### ###### ## ## ## ## ## ## ## + ## ## ## ## ## ## ######### ## ## +## ## ## ## ## ## ## ## ## ## ## + ###### ######### ######## ### ### ## ## #### ## + + DeclareMPCall 52, MPWaitForEvent + +; ARG MPEventID r3, Duration r5 +; RET OSStatus r3, MPEventFlags r4 + +; called using the FE1F trap by the 68k ROM + +MPWaitForEvent + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + + ; Check that the Event Group ID in r3 is valid. + bl LookupID + cmpwi r9, EventGroup.kIDClass + bne+ ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + + lwz r16, 0x0010(r31) + cmpwi r16, 0 + beq- MPWaitForEvent_field_10_was_zero + + mr r4, r16 + + li r16, 0 + stw r16, 0x0010(r31) + + lwz r16, 0x0018(r31) + lwz r17, KDP.PA_ECB(r1) + rlwinm. r18, r16, 0, 27, 27 + rlwinm r16, r16, 2, 26, 29 + beq+ ReleaseAndReturnZeroFromMPCall + + lwz r18, 0x00c8(r17) + lwz r9, 0x0634(r1) + cmpwi r18, 0x00 + add r18, r18, r9 + bne- MPWaitForEvent_0x84 + lwz r18, 0x00d0(r17) + cmpw r18, r3 + li r18, 0x00 + +; r1 = kdp + bne+ ReleaseAndReturnZeroFromMPCall + stw r18, 0x00d0(r17) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +MPWaitForEvent_0x84 + lwzx r19, r16, r18 + cmpw r19, r3 + li r19, 0x00 + +; r1 = kdp + bne+ ReleaseAndReturnZeroFromMPCall + stwx r19, r16, r18 + li r19, 0x1c + li r9, 0x04 + +MPWaitForEvent_0xa0 + lwzx r8, r19, r18 + cmpwi r8, 0x00 + bne- MPWaitForEvent_0xb4 + subf. r19, r9, r19 + bgt+ MPWaitForEvent_0xa0 + +MPWaitForEvent_0xb4 + srwi r19, r19, 2 + stw r19, 0x00d0(r17) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +MPWaitForEvent_field_10_was_zero + mfsprg r30, 0 + cmpwi r5, 0 + lwz r19, EWA.PA_CurTask(r30) + beq+ ReleaseAndTimeoutMPCall + +;special case: blue may not block + lwz r16, Task.Flags(r19) + rlwinm. r16, r16, 0, Task.kFlagBlue, Task.kFlagBlue + beq- @bot_blue + stw r3, PSA.BlueSpinningOn(r1) + b ReleaseAndReturnMPCallBlueBlocking +@bot_blue + + ; MOVE TASK OUT OF QUEUE AND INTO EVENT GROUP + mr r8, r19 + bl TaskUnready + + lwz r19, EWA.PA_CurTask(r30) + addi r16, r31, EventGroup.LLL + addi r17, r19, Task.QueueMember + stw r16, LLL.FreeForm(r17) + + InsertAsPrev r17, r16, scratch=r18 + + lwz r18, EventGroup.Counter(r31) + addi r18, r18, 1 + stw r18, EventGroup.Counter(r31) + + lisori r16, 0x7fffffff ; LONG_MAX + addi r30, r19, Task.Timer + cmpw r5, r16 + li r16, 2 + beq- @wait_forever ; never trigger max-wait timers + + stb r16, Timer.Kind(r30) + stw r19, Timer.ParentTaskPtr(r30) + mr r8, r5 + + bl TimebaseTicksPerPeriod + mr r27, r8 + mr r28, r9 + + bl GetTime + mfxer r16 + addc r9, r9, r28 + adde r8, r8, r27 + mtxer r16 + + stw r8, Timer.Time(r30) + stw r9, Timer.Time+4(r30) + + mr r8, r30 + bl EnqueueTimer + +@wait_forever + b BlockMPCall + + + +######## ####### ######## ####### ## ## ######## ######## ## ## +## ## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## #### +####### ####### ###### ## ## ## ## ###### ######## ## + ## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## ## + ###### ####### ######## ##### ## ####### ######## ## ## ## + + DeclareMPCall 53, MPQueryEvent + +; Returns Timeout if no flags are set, otherwise NoErr + +; ARG MPEventID r3 +; RET OSStatus r3 + +MPQueryEvent + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + +; r8 = id + bl LookupID + cmpwi r9, EventGroup.kIDClass + bne+ ReleaseAndReturnMPCallInvalidIDErr + + mr r31, r8 + lwz r16, 0x0010(r31) + cmpwi r16, 0x00 + beq+ ReleaseAndTimeoutMPCall + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + +######## ## ######## ###### ######## ######## ###### ## ## #### +## ## ## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## +####### ## ## ###### ###### ###### ## ###### ## ## ## ## + ## ######### ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## ## ## + ###### ## ######## ###### ######## ## ###### ### ### #### + + DeclareMPCall 54, MPSetSWIEvent + +; ARG MPEventID r3, int r4 swi + +; called using the FE1F trap by the 68k ROM + +MPSetSWIEvent + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, EventGroup.kIDClass + bne+ ReleaseAndReturnMPCallInvalidIDErr + + mr r31, r8 + li r17, 1 + + cmpwi r4, 0 + cmplwi cr1, r4, 8 + + lwz r16, EventGroup.SWI(r31) + + beq- @use_1 + bgt- cr1, @use_1 + + mr r17, r4 +@use_1 + + ; r17 = 1 if outside 1-8 (inc) range + + ori r16, r16, 0x10 + rlwimi r16, r17, 0, 28, 31 + stw r16, EventGroup.SWI(r31) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + + + + + + + +######## #### ## ## ######## ######## ###### + ## ## ### ### ## ## ## ## ## + ## ## #### #### ## ## ## ## + ## ## ## ### ## ###### ######## ###### + ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## ## ## + ## #### ## ## ######## ## ## ###### + + + +## ##### ######## ###### ######## ######## ### ######## ######## +## ## ## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ######## ###### ## ## ## ###### +######### ## ## ## ## ## ## ## ######### ## ## + ## ## ## ## ## ## ## ## ## ## ## ## ## + ## ##### ## ###### ## ## ######## ## ## ## ######## + + DeclareMPCall 40, NKCreateTimer + +NKCreateTimer ; OUTSIDE REFERER + li r8, 0x40 + +; r1 = kdp +; r8 = size + bl PoolAlloc +; r8 = ptr + + mr. r31, r8 + beq+ ScrambleMPCall + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r31 + li r9, 0x03 + +; r1 = kdp +; r9 = kind + bl MakeID + cmpwi r8, 0x00 + bne- NKCreateTimer_0x48 + mr r8, r31 + bl PoolFree + b ReleaseAndScrambleMPCall + +NKCreateTimer_0x48 + mfsprg r30, 0 + stw r8, 0x0000(r31) + lwz r30, -0x0008(r30) + mr r4, r8 + lwz r17, 0x0060(r30) + stw r17, 0x0010(r31) + bl GetTime + stw r8, 0x0038(r31) + stw r9, 0x003c(r31) + lis r17, 0x5449 + ori r17, r17, 0x4d45 + stw r17, 0x0004(r31) + li r17, 0x03 + stb r17, 0x0014(r31) + li r17, 0x00 + stb r17, 0x0016(r31) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + +## ## ######## ######## ######## ## ######## ######## ######## +## ## #### ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ###### ## ###### ## ###### +######### ## ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## ## ## ## + ## ###### ## ######## ######## ######## ######## ## ######## + + DeclareMPCall 41, NKDeleteTimer + +NKDeleteTimer ; OUTSIDE REFERER + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + +; r8 = id + bl LookupID + cmpwi r9, Timer.kIDClass + + mr r31, r8 + bne+ ReleaseAndReturnMPCallInvalidIDErr + mr r8, r3 + bl DeleteID + lwz r16, 0x0008(r31) + cmpwi r16, 0x00 + beq- NKDeleteTimer_0x48 + mr r8, r31 + bl DequeueTimer + +NKDeleteTimer_0x48 + _AssertAndRelease PSA.SchLock, scratch=r16 + lwz r8, 0x001c(r31) + cmpwi r8, 0x00 + bnel- PoolFree + mr r8, r31 + bl PoolFree + b ReturnZeroFromMPCall + + + + ####### ##### ######## ###### ######## ######## ## ## ####### ######## #### ######## ## ## +## ## ## ## ## ## ## ## ## ### ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## #### ## ## ## ## ## ## #### + ####### ## ## ## ###### ###### ## ## ## ## ## ## ## ## ###### ## + ## ## ## ## ## ## ## ## #### ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ### ## ## ## ## ## ## + ####### ##### ## ###### ######## ## ## ## ####### ## #### ## ## + +; ARG TimerID r3, EventGroup/Queue/SemaphoreID r4, long r5, long r6, long r7 +; RET OSStatus r3 + + DeclareMPCall 30, NKSetTimerNotify + +NKSetTimerNotify + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Timer.kIDClass + mr r31, r8 + bne+ ReleaseAndReturnMPCallInvalidIDErr + + lbz r16, Timer.Kind(r31) + cmpwi r16, 3 + bne+ ReleaseAndReturnMPCallInvalidIDErr + + mr r8, r4 + bl LookupID + cmpwi r9, Semaphore.kIDClass + cmpwi cr2, r9, Queue.kIDClass + beq- @SEMAPHORE + cmpwi r9, EventGroup.kIDClass + beq- cr2, @QUEUE + bne+ ReleaseAndReturnMPCallInvalidIDErr + +@EVENTGROUP + stw r4, Timer.EventGroupID(r31) + stw r5, Timer.EventGroupFlags(r31) + + b ReleaseAndReturnZeroFromMPCall + +@QUEUE + stw r4, Timer.MessageQueueID(r31) + lwz r16, ContextBlock.r6(r6) + lwz r17, ContextBlock.r7(r6) + stw r5, Timer.Message1(r31) ; notifyParam1 + stw r16, Timer.Message2(r31) ; notifyParam2 + stw r17, Timer.Message3(r31) ; notifyParam3 + + b ReleaseAndReturnZeroFromMPCall + +@SEMAPHORE + stw r4, Timer.SemaphoreID(r31) + + + b ReleaseAndReturnZeroFromMPCall + + + + ####### ## ######## ### ######## ## ## +## ## #### ## ## ## ## ## ### ### + ## ## ## ## ## ## ## #### #### + ####### ## ## ## ## ######## ## ### ## + ## ## ## ######### ## ## ## ## +## ## ## ## ## ## ## ## ## ## + ####### ###### ## ## ## ## ## ## ## + +; Time can be absolute or delta, and a duration (r4) +; or timebase time (r4/r5). + +; ARG TimerID r3, long r4, long r5, OptionBits r6 +; RET OSStatus r3 + + DeclareMPCall 31, MPArmTimer + +MPArmTimer + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Timer.kIDClass + mr r31, r8 + bne+ ReleaseAndReturnMPCallInvalidIDErr + + lbz r16, Timer.Kind(r31) + cmpwi r16, Timer.kKind3 + bne+ ReleaseAndReturnMPCallInvalidIDErr + + + ; Disarm if armed + lwz r16, Timer.QueueLLL + LLL.Freeform(r31) + cmpwi r16, 0 + mr r8, r31 + beq- @no_disarm + bl DequeueTimer +@no_disarm + + + ; Ah... reserve a note if a message is to be sent + + lwz r9, Timer.ReservedMessage(r31) + lwz r8, Timer.MessageQueueID(r31) + cmpwi r9, 0 + cmpwi cr1, r8, 0 + bne- @already_got_note + beq- cr1, @no_queue + + bl LookupID + cmpwi r9, Queue.kIDClass + bne- @no_queue + + lwz r9, Queue.ReserveCount(r8) + li r8, Message.Size + cmpwi r9, 0 + bne- @already_got_notr + + bl PoolAlloc + mr. r30, r8 + beq+ ReleaseAndScrambleMPCall + + lisori r8, 'note' + stw r8, Message.LLL + LLL.Signature(r30) + stw r30, 0x001c(r31) +@already_got_note +@already_got_notr +@no_queue + + + ; Calculate firing solution + + lwz r16, ContextBlock.r6(r6) + rlwinm. r9, r16, 0, kMPTimeIsDurationMask + mr r8, r4 + beq- @not_duration + bl TimebaseTicksPerPeriod + mr r4, r8 + mr r5, r9 +@not_duration + + lwz r16, ContextBlock.r6(r6) + rlwinm. r8, r16, 0, kMPTimeIsDeltaMask + mfxer r17 + beq- @not_delta + lwz r19, Timer.Time + 4(r31) + lwz r18, Timer.Time(r31) + addc r5, r5, r19 + adde r4, r4, r18 + mtxer r17 +@not_delta + + stw r4, Timer.Time(r31) + stw r5, Timer.Time + 4(r31) + + + ; Teensy little option: keep after firing? + lwz r16, ContextBlock.r6(r6) + rlwinm. r16, r16, 0, kMPPreserveTimerIDMask + li r17, 0 + beq- @no_preserve + li r17, 1 +@no_preserve + stb r17, Timer.KeepAfterFiring(r31) + + + mr r8, r31 + bl EnqueueTimer + + + b ReleaseAndReturnZeroFromMPCall + + + + ####### ####### ######## ###### ### ## ## ###### ######## ## +## ## ## ## ## ## ## ## ## ### ## ## ## ## ## + ## ## ## ## ## ## #### ## ## ## ## + ####### ####### ## ## ## ## ## ## ## ## ###### ## + ## ## ## ## ######### ## #### ## ## ## +## ## ## ## ## ## ## ## ## ### ## ## ## ## + ####### ######### ## ###### ## ## ## ## ###### ######## ######## + +; ARG TimerID r3 +; RET OSStatus r3, AbsoluteTime r4/r5 + + DeclareMPCall 32, MPCancelTimer + +MPCancelTimer + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Timer.kIDClass + mr r31, r8 + bne+ ReleaseAndReturnMPCallInvalidIDErr + + lbz r16, Timer.Byte3(r31) + cmpwi r16, 1 + bne- @say_no_time_remained + + lwz r4, Timer.Time(r31) + lwz r5, Timer.Time + 4(r31) + bl GetTime + mfxer r16 + subfc r5, r9, r5 + subfe. r4, r8, r4 + mtxer r16 + bge+ @can_return_time_remaining +@say_no_time_remained + + li r4, 0 + li r5, 0 +@can_return_time_remaining + + lwz r16, Timer.QueueLLL + LLL.Freeform(r31) + cmpwi r16, 0 + mr r8, r31 + beq- @not_queued + bl DequeueTimer +@not_queued + + b ReleaseAndReturnZeroFromMPCall + + + + + + + + + +## ## ####### ######## #### ######## #### ###### ### ######## #### ####### ## ## ###### +### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ### ## ## ## +#### ## ## ## ## ## ## ## ## ## ## ## ## ## ## #### ## ## +## ## ## ## ## ## ## ###### ## ## ## ## ## ## ## ## ## ## ## ###### +## #### ## ## ## ## ## ## ## ######### ## ## ## ## ## #### ## +## ### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ### ## ## +## ## ####### ## #### ## #### ###### ## ## ## #### ####### ## ## ###### + + + + ####### ## ## ## ###### ######## ######## ### ######## ######## +## ## ## ## ### ## ## ## ## ## ## ## ## ## ## +## ## ## #### ## ## ## ## ## ## ## ## ## +######## ## ## ## ## ## ## ######## ###### ## ## ## ###### +## ## ######### ## #### ## ## ## ## ######### ## ## +## ## ## ## ### ## ## ## ## ## ## ## ## ## + ####### ## ## ## ###### ## ## ######## ## ## ## ######## + +; RET OSErr r3, NotificationID r4 + + DeclareMPCall 64, MPCreateNotification + +MPCreateNotification + li r8, Notification.Size + bl PoolAlloc + mr. r31, r8 + beq+ ScrambleMPCall + + lisori r16, Notification.kSignature + stw r16, Notification.Signature(r31) + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + li r9, Notification.kIDClass + bl MakeID + + cmpwi r8, 0 + bne+ @nofail + mr r8, r31 + bl PoolFree + b ReleaseAndScrambleMPCall +@nofail + + mfsprg r30, 0 + lwz r30, EWA.PA_CurTask(r30) + stw r8, Notification.TaskPtr(r31) + lwz r17, Task.ProcessID(r30) + stw r17, Notification.ProcessID(r31) + + mr r4, r8 + b ReleaseAndReturnZeroFromMPCall + + + + ####### ######## ## ## ######## ######## ## ######## ######## ######## +## ## ## ### ## ## ## ## ## ## ## ## +## ## #### ## ## ## ## ## ## ## ## +######## ####### ## ## ## ## ## ###### ## ###### ## ###### +## ## ## ## #### ## ## ## ## ## ## ## +## ## ## ## ## ### ## ## ## ## ## ## ## + ####### ###### ## ## ######## ######## ######## ######## ## ######## + +; ARG NotificationID r3 +; RET OSErr r3 + + DeclareMPCall 65, MPDeleteNotification + +MPDeleteNotification + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Notification.kIDClass + + mr r31, r8 + bne+ ReleaseAndReturnMPCallInvalidIDErr + mr r8, r31 + bl PoolFree + mr r8, r3 + bl DeleteID + + b ReleaseAndReturnZeroFromMPCall + + + + ####### ######## ## ## ###### ### ## ## ###### ######## +## ## ## ## ### ## ## ## ## ## ## ## ## ## ## +## ## #### ## ## ## ## ## ## ## ## +######## ## ## ## ## ## ## ## ## ## ###### ###### +## ## ## ## #### ## ######### ## ## ## ## +## ## ## ## ### ## ## ## ## ## ## ## ## ## + ####### ## ## ## ###### ## ## ####### ###### ######## + + DeclareMPCall 67, MPCauseNotification + +MPCauseNotification + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Notification.kIDClass + mr r30, r8 + bne+ ReleaseAndReturnMPCallInvalidIDErr + + bl CauseNotification + + mr r3, r8 + b ReleaseAndReturnMPCall + + + + ### ## ## ###### ### ## ## ###### ######## ### + ## ### ## ## ## ## ## ## ## ## ## ## ## +## #### ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ###### ###### ## +## ## #### ## ######### ## ## ## ## ## + ## ## ### ## ## ## ## ## ## ## ## ## ## + ### ## ## ###### ## ## ####### ###### ######## ### + +; ARG Notification *r30 +; RET OSStatus r8 + +CauseNotification + + mflr r29 + + lwz r16, 0x000c(r30) + lwz r17, 0x0024(r30) + cmplwi r16, 0x00 + cmplwi cr1, r17, 0x00 + bne- @0x28 + bne- cr1, @0x28 + lwz r18, 0x001c(r30) + cmplwi r18, 0x00 + beq- @fail_insufficient_resources +@0x28 + + + ; SEND MESSAGE TO QUEUE + + lwz r8, Notification.QueueID(r30) + cmplwi r8, 0 + beq- @NO_QUEUE + bl LookupID + cmpwi r9, Queue.kIDClass + mr r31, r8 + bne- @fail_invalid_id + + lwz r16, Queue.ReserveCount(r31) + cmpwi r16, 0 + lwz r17, Queue.ReservePtr(r31) + beq- @no_notr + +;use notr + mr. r8, r17 + lwz r17, Message.LLL + LLL.Next(r17) + beq- @fail_insufficient_resources + stw r17, Queue.ReservePtr(r31) + b @queue_common + +@no_notr ; ... allocate message anew + li r8, Message.Size + bl PoolAlloc_with_crset + cmpwi r8, 0 + beq- @fail_unknown_err + +@queue_common + lwz r16, Notification.MsgWord1(r30) + lwz r17, Notification.MsgWord2(r30) + lwz r18, Notification.MsgWord3(r30) + stw r16, Message.Word1(r8) + stw r17, Message.Word2(r8) + stw r18, Message.Word3(r8) + bl EnqueueMessage ; Message *r8, Queue *r31 +@NO_QUEUE + + + ; SIGNAL SEMAPHORE + + lwz r8, Notification.SemaphoreID(r30) + cmplwi r8, 0 + beq- @NO_SEMAPHORE + bl LookupID + cmpwi r9, Semaphore.kIDClass + mr r31, r8 + bne- @fail_invalid_id + + bl SignalSemaphore +@NO_SEMAPHORE + + + ; SET EVENT + + lwz r8, Notification.EventGroupID(r30) + cmplwi r8, 0 + beq- @NO_EVENT_GROUP + bl LookupID + cmpwi r9, EventGroup.kIDClass + mr r31, r8 + bne- @fail_invalid_id + + lwz r8, Notification.EventFlags(r30) + bl SetEvent +@NO_EVENT_GROUP ; ... fall thru to success + + +@succeed + mtlr r29 + li r8, 0x00 + blr + +@fail_unknown_err + mtlr r29 + li r8, -29294 + blr + +@fail_insufficient_resources + mtlr r29 + li r8, kMPInsufficientResourcesErr + blr + +@fail_invalid_id + mtlr r29 + li r8, kMPInvalidIDErr + blr + + + + ####### ####### ## ## ## ## ####### ######## #### ######## ## ## +## ## ## ## ### ## ### ### ## ## ## ## ## ## ## ## +## ## #### ## #### #### ## ## ## ## ## ## #### +######## ######## ## ## ## ## ### ## ## ## ## ## ## ###### ## +## ## ## ## ## #### ## ## ## ## ## ## ## ## ## +## ## ## ## ## ### ## ## ## ## ## ## ## ## ## + ####### ####### ## ## ## ## ####### ######## #### ## ## + + DeclareMPCall 66, MPModifyNotification + +MPModifyNotification + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + +; r8 = id + bl LookupID + cmpwi r9, Notification.kIDClass + + mr r31, r8 + bne+ ReleaseAndReturnMPCallInvalidIDErr + mr r8, r4 + +; r8 = id + bl LookupID + cmpwi r9, Semaphore.kIDClass + + cmpwi cr2, r9, 0x04 + beq- MPCall_66_0x74 + cmpwi r9, 0x09 + beq- cr2, MPCall_66_0x58 + bne+ ReleaseAndReturnMPCallInvalidIDErr + stw r4, 0x001c(r31) + stw r5, 0x0020(r31) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +MPCall_66_0x58 + stw r4, 0x000c(r31) + lwz r16, ContextBlock.r6(r6) + lwz r17, ContextBlock.r7(r6) + stw r5, 0x0010(r31) + stw r16, 0x0014(r31) + stw r17, 0x0018(r31) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +MPCall_66_0x74 + stw r4, 0x0024(r31) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + + ## ####### ####### ## ## ## ## ####### ######## ######## ### ######## ### ## ## ###### + #### ## ## ## ## ### ## ### ### ## ## ## ## ## ## ## ## ## ## ## ## ### ### ## ## + ## ## ## ## #### ## #### #### ## ## ## ## ## ## ## ## ## ## ## ## #### #### ## + ## ####### ####### ## ## ## ## ### ## ## ## ## ## ######## ## ## ######## ## ## ## ### ## ###### + ## ## ## ## ## #### ## ## ## ## ## ## ## ######### ## ## ######### ## ## ## + ## ## ## ## ## ### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## + ###### ######### ####### ## ## ## ## ####### ######## ## ## ## ## ## ## ## ## ## ###### + + DeclareMPCall 128, MPCall_128 + +MPCall_128 ; OUTSIDE REFERER + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + +; r8 = id + bl LookupID + cmpwi r9, Notification.kIDClass + + mr r31, r8 + bne+ ReleaseAndReturnMPCallInvalidIDErr + cmpwi r4, 0x04 + cmpwi cr1, r4, 0x09 + beq- MPCall_128_0x40 + beq- cr1, MPCall_128_0x58 + b ReleaseAndReturnParamErrFromMPCall + +MPCall_128_0x40 + lwz r16, ContextBlock.r6(r6) + lwz r17, ContextBlock.r7(r6) + stw r5, 0x0010(r31) + stw r16, 0x0014(r31) + stw r17, 0x0018(r31) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +MPCall_128_0x58 + stw r5, 0x0020(r31) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + + + + + + + + ### ######## ## ## ## ## ######## ## ## ## ######## ### + ## ## ## ## ## ### ## ## ## ## ## ## ## ## +## ## ## ## ## #### ## ## ## ## ## ## ## ## +## ######## ## ## ## ## ## ######## ## ## ## ###### ## +## ## ## ## ## ## #### ## ## ## ## ## ## ## + ## ## ## ## ## ## ### ## ## ## ## ## ## ## + ### ## ## ####### ## ## ######## ######## ####### ######## ### + +; ARG OpaqueID r8 + +; MP calls by blue return kMPBlueBlockingErr instead of blocking, +; in order to maintain system responsiveness. Blue might poll these +; calls, e.g. at SysTask time. This function, called when a +; blocking object becomes "available", unblocks blue to give it +; another shot. + +UnblockBlueIfCouldBePolling + + lwz r9, PSA.BlueSpinningOn(r1) + lwz r19, PSA.PA_BlueTask(r1) + cmpw r8, r9 + bnelr- + + li r9, -1 + mflr r24 + stw r9, PSA.BlueSpinningOn(r1) + + lbz r17, Task.MysteryByte1(r19) + cmpwi r17, 0 + + addi r16, r19, Task.QueueMember + bne- major_0x0dce8_0x70 + + RemoveFromList r16, scratch1=r17, scratch2=r18 + + lbz r17, Task.Timer + Timer.Byte3(r19) + cmpwi r17, 1 + bne- major_0x0dce8_0x60 + addi r8, r19, Task.Timer + bl DequeueTimer + lwz r19, -0x08f0(r1) +major_0x0dce8_0x60 + + li r16, 0x01 + stb r16, 0x0019(r19) + lwz r8, -0x08f0(r1) + bl TaskReadyAsPrev +major_0x0dce8_0x70 + + lwz r8, PSA.PA_BlueTask(r1) + mtlr r24 + b FlagSchEvaluationIfTaskRequires + + + + + + + + + + ## ####### ##### ######## #### ###### ###### ### ## ## + #### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## + ## ## ## ## ## ## ## ## ## ## ## ## ## + ## ####### ## ## ######## ## ## #### ## ## ## ## ## + ## ## ## ## ## ## ## ## ## ## ######### ## ## + ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## + ###### ######### ##### ######## #### ###### ###### ## ## ######## ######## + + DeclareMPCall 120, MPCall_120 + +MPCall_120 + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + mr r31, r8 + + cmpwi r9, Semaphore.kIDClass + cmpwi cr1, r9, Queue.kIDClass + beq- @SEMAPHORE + beq- cr1, @QUEUE + + cmpwi r9, EventGroup.kIDClass + cmpwi cr1, r9, CriticalRegion.kIDClass + beq- @EVENT_GROUP + beq- cr1, @CRITICAL_REGION + + cmpwi r9, Notification.kIDClass + cmpwi cr1, r9, AddressSpace.kIDClass + beq- @NOTIFICATION + beq- cr1, @ADDRESS_SPACE + + b ReleaseAndReturnParamErrFromMPCall + +@NOTIFICATION + lisori r8, Notification.kFirstID + cmpw r8, r4 + bne+ ReleaseAndReturnParamErrFromMPCall + + cmplwi r5, 0 + bne- @notification_not_0 + + ; r5 == 0 + lisori r16, Notification.kFirstID + + stw r16, ContextBlock.r6(r6) + lwz r16, Notification.ProcessID(r31) + stw r16, ContextBlock.r7(r6) + lwz r16, Notification.Signature(r31) + stw r16, ContextBlock.r8(r6) + lwz r16, 0x000c(r31) + stw r16, ContextBlock.r9(r6) + li r16, 16 + stw r16, ContextBlock.r10(r6) + + b ReleaseAndReturnZeroFromMPCall + +@notification_not_0 + cmplwi r5, 16 + bne- @notification_not_16 + + ; r5 == 16 + lwz r16, 0x0010(r31) + stw r16, ContextBlock.r6(r6) + lwz r16, 0x0014(r31) + stw r16, ContextBlock.r7(r6) + lwz r16, 0x0018(r31) + stw r16, ContextBlock.r8(r6) + lwz r16, 0x001c(r31) + stw r16, ContextBlock.r9(r6) + li r16, 16 + stw r16, ContextBlock.r10(r6) + + b ReleaseAndReturnZeroFromMPCall + +@notification_not_16 + + cmplwi r5, 32 + bne- @notification_not_32 + + ; r5 == 32 + lwz r16, 0x0020(r31) + stw r16, ContextBlock.r6(r6) + lwz r16, 0x0024(r31) + stw r16, ContextBlock.r7(r6) + li r16, 8 + stw r16, ContextBlock.r10(r6) + + b ReleaseAndReturnZeroFromMPCall + +@notification_not_32 + cmpwi r5, 40 + bne+ ReleaseAndReturnParamErrFromMPCall + + ; r5 == 40 + li r16, 0x00 + stw r16, ContextBlock.r10(r6) + + b ReleaseAndReturnZeroFromMPCall + + +@CRITICAL_REGION + lisori r8, 0x00060001 + cmpw r8, r4 + bne+ ReleaseAndReturnParamErrFromMPCall + cmplwi r5, 0x00 + bne- @154 + lis r16, 0x06 + ori r16, r16, 0x01 + stw r16, ContextBlock.r6(r6) + lwz r16, 0x0010(r31) + stw r16, ContextBlock.r7(r6) + lwz r16, 0x0004(r31) + stw r16, ContextBlock.r8(r6) + lwz r16, 0x0020(r31) + stw r16, ContextBlock.r9(r6) + li r16, 0x10 + stw r16, ContextBlock.r10(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +@154 + cmplwi r5, 0x10 + bne- @1a0 + addi r17, r31, 0x00 + lwz r18, 0x0008(r31) + li r16, 0x00 + cmpw r17, r18 + beq- @174 + lwz r16, -0x0008(r18) + +@174 + stw r16, ContextBlock.r6(r6) + lwz r16, 0x0018(r31) + cmpwi r16, 0x00 + beq- @188 + lwz r16, 0x0000(r16) + +@188 + stw r16, ContextBlock.r7(r6) + lwz r16, 0x0014(r31) + stw r16, ContextBlock.r8(r6) + li r16, 0x0c + stw r16, ContextBlock.r10(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +@1a0 + cmpwi r5, 0x1c + bne+ ReleaseAndReturnParamErrFromMPCall + li r16, 0x00 + stw r16, ContextBlock.r10(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +@EVENT_GROUP + lis r8, 0x09 + ori r8, r8, 0x01 + cmpw r8, r4 + bne+ ReleaseAndReturnParamErrFromMPCall + cmplwi r5, 0x00 + bne- @1fc + lis r16, 0x09 + ori r16, r16, 0x01 + stw r16, ContextBlock.r6(r6) + lwz r16, 0x0014(r31) + stw r16, ContextBlock.r7(r6) + lwz r16, 0x0004(r31) + stw r16, ContextBlock.r8(r6) + lwz r16, 0x001c(r31) + stw r16, ContextBlock.r9(r6) + li r16, 0x10 + stw r16, ContextBlock.r10(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +@1fc + cmplwi r5, 0x10 + bne- @234 + addi r17, r31, 0x00 + lwz r18, 0x0008(r31) + li r16, 0x00 + cmpw r17, r18 + beq- @21c + lwz r16, -0x0008(r18) + +@21c + stw r16, ContextBlock.r6(r6) + lwz r16, 0x0010(r31) + stw r16, ContextBlock.r7(r6) + li r16, 0x08 + stw r16, ContextBlock.r10(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +@234 + cmpwi r5, 0x18 + bne+ ReleaseAndReturnParamErrFromMPCall + li r16, 0x00 + stw r16, ContextBlock.r10(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +@QUEUE + lis r8, 0x04 + ori r8, r8, 0x01 + cmpw r8, r4 + bne+ ReleaseAndReturnParamErrFromMPCall + cmplwi r5, 0x00 + bne- @290 + lis r16, 0x04 + ori r16, r16, 0x01 + stw r16, ContextBlock.r6(r6) + lwz r16, 0x0020(r31) + stw r16, ContextBlock.r7(r6) + lwz r16, 0x0004(r31) + stw r16, ContextBlock.r8(r6) + lwz r16, 0x002c(r31) + stw r16, ContextBlock.r9(r6) + li r16, 0x10 + stw r16, ContextBlock.r10(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +@290 + cmplwi r5, 0x10 + bne- @2ec + addi r17, r31, 0x00 + lwz r18, 0x0008(r31) + li r16, 0x00 + cmpw r17, r18 + beq- @2b0 + lwz r16, -0x0008(r18) + +@2b0 + stw r16, ContextBlock.r6(r6) + lwz r16, 0x0030(r31) + stw r16, ContextBlock.r7(r6) + lwz r16, 0x0024(r31) + stw r16, ContextBlock.r8(r6) + lwz r18, 0x0018(r31) + addi r17, r31, 0x10 + li r16, 0x00 + cmpw r17, r18 + beq- @2dc + lwz r16, 0x0010(r18) + +@2dc + stw r16, ContextBlock.r9(r6) + li r16, 0x10 + stw r16, ContextBlock.r10(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +@2ec + cmplwi r5, 0x20 + bne- @328 + lwz r18, 0x0018(r31) + addi r17, r31, 0x10 + li r16, 0x00 + cmpw r17, r18 + li r17, 0x00 + beq- @314 + lwz r16, 0x0014(r18) + lwz r17, 0x0018(r18) + +@314 + stw r16, ContextBlock.r6(r6) + stw r17, ContextBlock.r7(r6) + li r16, 0x08 + stw r16, ContextBlock.r10(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +@328 + cmpwi r5, 0x28 + bne+ ReleaseAndReturnParamErrFromMPCall + li r16, 0x00 + stw r16, ContextBlock.r10(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +@SEMAPHORE + lis r8, 0x05 + ori r8, r8, 0x01 + cmpw r8, r4 + bne+ ReleaseAndReturnParamErrFromMPCall + cmplwi r5, 0x00 + bne- @384 + lis r16, 0x05 + ori r16, r16, 0x01 + stw r16, ContextBlock.r6(r6) + lwz r16, 0x0018(r31) + stw r16, ContextBlock.r7(r6) + lwz r16, 0x0004(r31) + stw r16, ContextBlock.r8(r6) + lwz r16, 0x001c(r31) + stw r16, ContextBlock.r9(r6) + li r16, 0x10 + stw r16, ContextBlock.r10(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +@384 + cmplwi r5, 0x10 + bne- @3c4 + addi r17, r31, 0x00 + lwz r18, 0x0008(r31) + li r16, 0x00 + cmpw r17, r18 + beq- @3a4 + lwz r16, -0x0008(r18) + +@3a4 + stw r16, ContextBlock.r6(r6) + lwz r16, 0x0014(r31) + stw r16, ContextBlock.r7(r6) + lwz r16, 0x0010(r31) + stw r16, ContextBlock.r8(r6) + li r16, 0x0c + stw r16, ContextBlock.r10(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +@3c4 + cmpwi r5, 0x1c + bne+ ReleaseAndReturnParamErrFromMPCall + li r16, 0x00 + stw r16, ContextBlock.r10(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +@ADDRESS_SPACE + lisori r8, 0x00080001 + cmpw r8, r4 + bne+ ReleaseAndReturnParamErrFromMPCall + cmplwi r5, 0x00 + bne- @420 + lisori r16, 0x00080001 + stw r16, ContextBlock.r6(r6) + lwz r16, 0x0074(r31) + stw r16, ContextBlock.r7(r6) + lwz r16, 0x0070(r31) + stw r16, ContextBlock.r8(r6) + lwz r16, 0x000c(r31) + stw r16, ContextBlock.r9(r6) + li r16, 0x10 + stw r16, ContextBlock.r10(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +@420 + cmplwi r5, 0x10 + bne- @454 + lwz r16, 0x0030(r31) + stw r16, ContextBlock.r6(r6) + lwz r16, 0x0034(r31) + stw r16, ContextBlock.r7(r6) + lwz r16, 0x0038(r31) + stw r16, ContextBlock.r8(r6) + lwz r16, 0x003c(r31) + stw r16, ContextBlock.r9(r6) + li r16, 0x10 + stw r16, ContextBlock.r10(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +@454 + cmplwi r5, 0x20 + bne- @488 + lwz r16, 0x0040(r31) + stw r16, ContextBlock.r6(r6) + lwz r16, 0x0044(r31) + stw r16, ContextBlock.r7(r6) + lwz r16, 0x0048(r31) + stw r16, ContextBlock.r8(r6) + lwz r16, 0x004c(r31) + stw r16, ContextBlock.r9(r6) + li r16, 0x10 + stw r16, ContextBlock.r10(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +@488 + cmplwi r5, 0x30 + bne- @4bc + lwz r16, 0x0050(r31) + stw r16, ContextBlock.r6(r6) + lwz r16, 0x0054(r31) + stw r16, ContextBlock.r7(r6) + lwz r16, 0x0058(r31) + stw r16, ContextBlock.r8(r6) + lwz r16, 0x005c(r31) + stw r16, ContextBlock.r9(r6) + li r16, 0x10 + stw r16, ContextBlock.r10(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +@4bc + cmplwi r5, 0x40 + bne- @4f0 + lwz r16, 0x0060(r31) + stw r16, ContextBlock.r6(r6) + lwz r16, 0x0064(r31) + stw r16, ContextBlock.r7(r6) + lwz r16, 0x0068(r31) + stw r16, ContextBlock.r8(r6) + lwz r16, 0x006c(r31) + stw r16, ContextBlock.r9(r6) + li r16, 0x10 + stw r16, ContextBlock.r10(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +@4f0 + cmpwi r5, 0x50 + bne+ ReleaseAndReturnParamErrFromMPCall + li r16, 0x00 + stw r16, ContextBlock.r10(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall diff --git a/NanoKernel/NKTasks.s b/NanoKernel/NKTasks.s index 6d0a6f5..3c9811a 100644 --- a/NanoKernel/NKTasks.s +++ b/NanoKernel/NKTasks.s @@ -8,6 +8,9 @@ Local_Panic set * +; ARG ProcessID r3 +; RET OSStatus r3, TaskID r10 + DeclareMPCall 7, MPCall_7 MPCall_7 ; OUTSIDE REFERER @@ -17,62 +20,71 @@ MPCall_7 ; OUTSIDE REFERER _Lock PSA.SchLock, scratch1=r16, scratch2=r17 mr r8, r3 - -; r8 = id bl LookupID cmpwi r9, Process.kIDClass - mr r30, r8 bne+ ReleaseAndReturnMPCallInvalidIDErr - lwz r16, 0x0008(r30) - rlwinm. r17, r16, 0, 30, 30 + + lwz r16, Process.Flags(r30) + rlwinm. r17, r16, 0, 30, 30 bne+ ReleaseAndReturnMPCallOOM + + ; ARG CPUFlags r7, Process *r8 bl CreateTask + ; RET Task *r8 + mr. r31, r8 - beq+ major_0x0af60 + beq+ ReleaseAndScrambleMPCall + + mfsprg r15, 0 - lwz r17, 0x0000(r31) - stw r17, 0x0154(r6) - lhz r16, -0x0116(r15) - sth r16, 0x001a(r31) - addi r16, r31, 0x100 - lwz r17, 0x013c(r6) - stw r17, 0x0164(r16) - lwz r17, 0x0144(r6) - stw r17, 0x00fc(r16) - lwz r17, 0x014c(r6) - stw r17, 0x0114(r16) + + lwz r17, Task.ID(r31) + stw r17, ContextBlock.r10(r6) + + lhz r16, EWA.CPUIndex(r15) + sth r16, Task.CPUIndex(r31) + + + addi r16, r31, Task.ContextBlock + + lwz r17, ContextBlock.r7(r6) + stw r17, ContextBlock.r12(r16) + + lwz r17, ContextBlock.r8(r6) + stw r17, ContextBlock.CodePtr(r16) + + lwz r17, ContextBlock.r9(r6) + stw r17, ContextBlock.r2(r16) + stw r4, 0x0098(r31) - lwz r17, 0x0134(r6) + + lwz r17, ContextBlock.r6(r6) stw r17, 0x00ec(r31) - lwz r16, 0x0064(r28) - rlwinm. r8, r5, 0, 30, 30 - beq- MPCall_7_0x98 - oris r16, r16, 0x40 -MPCall_7_0x98 - rlwinm. r8, r5, 0, 29, 29 - beq- MPCall_7_0xa4 - oris r16, r16, 0x02 -MPCall_7_0xa4 - stw r16, 0x0064(r28) + lwz r16, Task.Flags(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 -;Xrefs: -;setup -;major_0x0bb20 -;major_0x0e284 - - -; ARG EmpiricalCpuFeatures r7, Process *r8 +; ARG GlobalCPUFlags r7, Process *r8 ; RET Task *r8 - CreateTask ; Save arg and lr for later @@ -122,9 +134,9 @@ CreateTask ; (NOT a semaphore queue) addi r16, r28, Task.SemaphoreLLL - StartLoadingWord r17, 'SEMA' + _lstart r17, 'SEMA' stw r16, LLL.Next(r16) - FinishLoadingWord + _lfinish stw r16, LLL.Prev(r16) stw r17, LLL.Signature(r16) @@ -196,8 +208,8 @@ CreateTask li r16, 0 stb r16, Task.MysteryByte1(r28) - li r16, 9 - stw r16, 0x0064(r28) + li r16, 9 ; (Z>>Task.kFlag28) | (Z>>Task.kFlag31) + stw r16, Task.Flags(r28) lisori r16, 'time' stw r16, 0x0024(r28) @@ -217,8 +229,8 @@ CreateTask addi r16, r28, Task.ContextBlock stw r16, Task.ContextBlockPtr(r28) ; overridden to real ECB on blue - lwz r16, PSA.EmpiricalCpuFeatures(r1) - stw r16, Task.ContextBlock + ContextBlock.EmpiricalCpuFeatures(r28) + lwz r16, PSA.GlobalCPUFlags(r1) + stw r16, Task.ContextBlock + ContextBlock.Flags(r28) lwz r16, PSA.UserModeMSR(r1) stw r16, Task.ContextBlock + ContextBlock.MSR(r28) @@ -230,7 +242,7 @@ CreateTask lwz r17, Task.NotificationPtr(r28) stw r16, 0x0010(r17) stw r16, 0x0014(r17) - li r16, -0x7271 + li r16, kMPTaskAbortedErr stw r16, 0x0018(r17) li r16, 0 @@ -346,7 +358,7 @@ MPCall_8 ; OUTSIDE REFERER mr r8, r31 bl TaskReadyAsPrev bl CalculateTimeslice - bl major_0x14af8 + bl FlagSchEvaluationIfTaskRequires ; r1 = kdp b ReleaseAndReturnZeroFromMPCall @@ -383,7 +395,7 @@ MPCall_9 ; OUTSIDE REFERER beq- cr1, MPCall_9_0xb4 mfsprg r15, 0 lhz r18, 0x001a(r31) - lhz r17, -0x0116(r15) + lhz r17, EWA.CPUIndex(r15) cmpw r18, r17 beq- MPCall_9_0xe0 ori r16, r16, 0x400 @@ -401,7 +413,7 @@ MPCall_9_0x98 ; OUTSIDE REFERER ori r16, r16, 0x02 stw r16, 0x0064(r31) lwz r17, 0x009c(r31) - li r16, -0x7271 + li r16, kMPTaskAbortedErr stw r16, 0x0018(r17) b MPCall_9_0xfc @@ -416,7 +428,7 @@ MPCall_9_0xe0 ori r16, r16, 0x02 stw r16, 0x0064(r31) mr r8, r31 - bl DequeueTask + bl TaskUnready MPCall_9_0xf0 lwz r17, 0x009c(r31) @@ -432,7 +444,7 @@ MPCall_9_0xfc cmpwi r8, 0x01 bne- MPCall_9_0x130 addi r8, r31, 0x20 - bl major_0x136c8 + bl DequeueTimer MPCall_9_0x130 lwz r8, 0x0098(r31) @@ -447,7 +459,7 @@ MPCall_9_0x130 bne- MPCall_9_0x15c mr r31, r8 mr r8, r17 - bl major_0x0c8b4 + bl EnqueueMessage ; Message *r8, Queue *r31 b ReleaseAndReturnMPCall 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 mr r8, r3 - -; r8 = id bl LookupID cmpwi r9, Task.kIDClass - bne+ ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + mr r8, r4 - -; r8 = id bl LookupID - cmpwi r9, 0 ; invalid - cmpwi cr1, r9, 0x04 - beq- MPCall_56_0x44 + cmpwi r9, 0 + cmpwi cr1, r9, Queue.kIDClass + beq- @isnil bne+ cr1, ReleaseAndReturnMPCallInvalidIDErr +@isnil -MPCall_56_0x44 mr r30, r8 - stw r4, 0x00f4(r31) + stw r4, Task.ExceptionHandlerID(r31) -; r1 = kdp b ReleaseAndReturnZeroFromMPCall -; KCThrowException +; MPLibrary passthrough ; Throws an exception to a specified task. -; > r3 = MPTaskID task -; > r4 = MPExceptionKind kind +; ARG TaskID r3, ExceptionKind r4 +; RET OSStatus r3 -; < r3 = result code + DeclareMPCall 57, MPThrowException - DeclareMPCall 57, KCThrowException - -KCThrowException ; OUTSIDE REFERER +MPThrowException mfsprg r15, 0 _Lock PSA.SchLock, scratch1=r16, scratch2=r17 mr r8, r3 - -; r8 = id bl LookupID cmpwi r9, Task.kIDClass - bne+ ReleaseAndReturnMPCallInvalidIDErr mr r31, r8 - lwz r16, 0x0064(r31) - mtcr r16 - li r3, -0x7271 - beq+ cr7, ReleaseAndReturnMPCall - li r3, -0x726c - beq+ cr5, ReleaseAndReturnMPCall - beq+ cr3, ReleaseAndReturnMPCallOOM + + ; This is gold! + lwz r16, Task.Flags(r31) + mtcr r16 + + li r3, kMPTaskAbortedErr + bc BO_IF, 30, ReleaseAndReturnMPCall + + li r3, kMPTaskStoppedErr + bc BO_IF, 22, ReleaseAndReturnMPCall + + bc BO_IF, 14, ReleaseAndReturnMPCallOOM + lbz r17, 0x0018(r31) lhz r18, 0x001a(r31) cmpwi cr1, r17, 0x00 - bne- cr1, KCThrowException_0x70 + bc BO_IF_NOT, 6, KCThrowException_0x70 ori r16, r16, 0x600 stw r4, 0x00f8(r31) stw r16, 0x0064(r31) - li r3, -0x726b + + li r3, kMPTaskBlockedErr b ReleaseAndReturnMPCall KCThrowException_0x70 - lhz r19, -0x0116(r15) + lhz r19, EWA.CPUIndex(r15) cmpw r19, r18 bne- KCThrowException_0xb8 ori r16, r16, 0x200 stw r4, 0x00f8(r31) stw r16, 0x0064(r31) mr r8, r31 - bl DequeueTask + bl TaskUnready addi r16, r1, -0xa34 addi r17, r31, 0x08 stw r16, 0x0000(r17) InsertAsPrev r17, r16, scratch=r18 - li r3, -0x726c + li r3, kMPTaskStoppedErr b ReleaseAndReturnMPCall KCThrowException_0xb8 @@ -720,21 +740,24 @@ MPCall_58 ; OUTSIDE REFERER bne+ ReleaseAndReturnMPCallInvalidIDErr mr r31, r8 - lwz r29, 0x0064(r31) + + lwz r29, Task.Flags(r31) mtcr r29 - li r3, -0x7271 - beq+ cr7, ReleaseAndReturnMPCall - beq- cr4, MPCall_58_0x44 - bne+ cr5, ReleaseAndReturnMPCallOOM + + li r3, kMPTaskAbortedErr + bc BO_IF, 30, ReleaseAndReturnMPCall + + bc BO_IF, 18, MPCall_58_0x44 + bc BO_IF_NOT, 22, ReleaseAndReturnMPCallOOM MPCall_58_0x44 mtcr r4 lwz r30, 0x0088(r31) - bns- cr7, MPCall_58_0x68 + bc BO_IF_NOT, 31, MPCall_58_0x68 li r8, 0x1c bl PoolAlloc_with_crset cmpwi r8, 0x00 - beq+ major_0x0af60 + beq+ ReleaseAndScrambleMPCall li r3, 0x00 b MPCall_58_0x114 @@ -768,7 +791,7 @@ MPCall_58_0xb4 RemoveFromList r16, scratch1=r17, scratch2=r18 mr r8, r31 bl TaskReadyAsPrev - bl major_0x14af8 + bl FlagSchEvaluationIfTaskRequires MPCall_58_0xe0 ; r1 = kdp @@ -783,14 +806,14 @@ FuncExportedFromTasks ; OUTSIDE REFERER InsertAsPrev r17, r16, scratch=r18 li r8, 0x1c bl PoolAlloc_with_crset - lwz r29, 0x0064(r31) - ori r29, r29, 0x200 + lwz r29, Task.Flags(r31) + _bset r29, r29, 22 MPCall_58_0x114 mtcr r29 mr r28, r8 - beq- cr3, MPCall_58_0x13c - blt- cr5, MPCall_58_0x13c + bc BO_IF, 14, MPCall_58_0x13c + bc BO_IF, 20, MPCall_58_0x13c lwz r8, -0x08e8(r1) ; r8 = id @@ -802,7 +825,7 @@ MPCall_58_0x114 beq- MPCall_58_0x184 MPCall_58_0x13c - bso- cr4, MPCall_58_0x158 + bc BO_IF, 19, MPCall_58_0x158 lwz r8, 0x00f4(r31) ; r8 = id @@ -843,7 +866,7 @@ MPCall_58_0x1a4 stw r17, 0x0018(r8) stw r18, 0x00f8(r31) mr r31, r30 - bl major_0x0c8b4 + bl EnqueueMessage ; Message *r8, Queue *r31 b ReleaseAndReturnMPCall @@ -903,12 +926,15 @@ MPCall_60 ; OUTSIDE REFERER mr r31, r8 cmpwi r4, 0x05 beq- MPCall_60_0x288 - lwz r16, 0x0064(r31) + + lwz r16, Task.Flags(r31) mtcr r16 - li r3, -0x7271 - beq+ cr7, ReleaseAndReturnMPCall - beq- cr4, MPCall_60_0x4c - bne+ cr5, ReleaseAndReturnMPCallOOM + + li r3, kMPTaskAbortedErr + bc BO_IF, 30, ReleaseAndReturnMPCall + + bc BO_IF, 18, MPCall_60_0x4c + bc BO_IF_NOT, 22, ReleaseAndReturnMPCallOOM MPCall_60_0x4c lbz r16, 0x0018(r31) @@ -1226,12 +1252,15 @@ MPCall_61 ; OUTSIDE REFERER bne+ ReleaseAndReturnMPCallInvalidIDErr mr r31, r8 - lwz r16, 0x0064(r31) + + lwz r16, Task.Flags(r31) mtcr r16 - li r3, -0x7271 - beq+ cr7, ReleaseAndReturnMPCall - beq- cr4, MPCall_61_0x44 - bne+ cr5, ReleaseAndReturnMPCallOOM + + li r3, kMPTaskAbortedErr + bc BO_IF, 30, ReleaseAndReturnMPCall + + bc BO_IF, 18, MPCall_61_0x44 + bc BO_IF_NOT, 22, ReleaseAndReturnMPCallOOM MPCall_61_0x44 lbz r16, 0x0018(r31) @@ -1469,41 +1498,38 @@ MPCall_114 ; OUTSIDE REFERER cmplwi cr1, r17, 0x04 beq+ ReleaseAndReturnMPCallOOM lwz r16, 0x0064(r31) - lhz r17, 0x022a(r30) + lhz r17, CPU.EWA + EWA.CPUIndex(r30) ori r16, r16, 0x40 stw r16, 0x0064(r31) sth r17, 0x001a(r31) rlwinm. r8, r16, 0, 26, 26 mr r8, r31 bne- MPCall_114_0x90 - bl DequeueTask + bl TaskUnready bl TaskReadyAsPrev MPCall_114_0x90 - bl major_0x14af8 + bl FlagSchEvaluationIfTaskRequires ; r1 = kdp b ReleaseAndReturnZeroFromMPCall -; KCSetTaskType - +; ARG TaskID r3, OSType r4 +; RET OSStatus r3 DeclareMPCall 126, KCSetTaskType -KCSetTaskType ; OUTSIDE REFERER +KCSetTaskType _Lock PSA.SchLock, scratch1=r16, scratch2=r17 mr r8, r3 - -; r8 = id bl LookupID cmpwi r9, Task.kIDClass - bne+ ReleaseAndReturnMPCallInvalidIDErr - stw r4, 0x0074(r8) -; r1 = kdp + stw r4, Task.Name(r8) + b ReleaseAndReturnZeroFromMPCall diff --git a/NanoKernel/NKThud.s b/NanoKernel/NKThud.s index 80db563..5696820 100644 --- a/NanoKernel/NKThud.s +++ b/NanoKernel/NKThud.s @@ -20,12 +20,12 @@ ; kcRTASDispatch ; ReleaseAndMPCallWasBad ; ReleaseAndReturnZeroFromMPCall -; major_0x0af60 +; ReleaseAndScrambleMPCall ; ReleaseAndReturnMPCallBlueBlocking ; major_0x0b054 ; ReleaseAndReturnMPCallPrivilegedErr ; major_0x0b0cc -; AlternateMPCallReturnPath +; BlockMPCall ; MPCall_0 ; MPCall_6 ; KCYieldWithHint @@ -33,7 +33,7 @@ ; KCStopScheduling ; MPCall_115 ; Local_Panic -; major_0x0d35c +; SetEvent ; MPCall_41 ; Local_Panic ; MPCall_9 @@ -68,7 +68,7 @@ ; major_0x129cc ; Local_Panic ; Local_Panic -; major_0x142dc +; RescheduleAndReturn ; major_0x14548 ; Local_Panic ; CommonPIHPath @@ -695,7 +695,7 @@ panic_common bl Printw _log ' is CPU ' - lhz r8, -0x0116(r17) + lhz r8, EWA.CPUIndex(r17) bl Printh _log ' ID-' diff --git a/NanoKernel/NKTimers.s b/NanoKernel/NKTimers.s index 54c3f60..276fb1e 100644 --- a/NanoKernel/NKTimers.s +++ b/NanoKernel/NKTimers.s @@ -92,10 +92,11 @@ InitTMRQs_0xb4 mr. r31, r8 beq+ Local_Panic - li r9, 0x06 - stb r9, 0x0014(r31) - li r9, 0x01 - stb r9, 0x0016(r31) + li r9, Timer.kKind6 + stb r9, Timer.Kind(r31) + + li r9, 1 + stb r9, Timer.KeepAfterFiring(r31) bl GetTime stw r8, Timer.Time(r31) @@ -116,88 +117,91 @@ InitTMRQs_0xb4 ; Xrefs: ; IntDecrementer -; major_0x130f0 +; TimerFire0 TimerTable - dc.l major_0x130f0 - NKTop - dc.l major_0x13120 - NKTop - dc.l major_0x1318c - NKTop - dc.l major_0x1324c - NKTop - dc.l major_0x132e8 - NKTop - dc.l major_0x13350 - NKTop - dc.l major_0x135b8 - NKTop - dc.l major_0x134bc - NKTop - dc.l major_0x13524 - NKTop + dc.l TimerFireUnknownKind - NKTop ; Timer.kKind0 + dc.l TimerFire1 - NKTop ; Timer.kKind1 + dc.l TimerFire2 - NKTop ; Timer.kKind2 + dc.l TimerFire3 - NKTop ; Timer.kKind3 + dc.l TimerFire4 - NKTop ; Timer.kKind4 + dc.l TimerFire5 - NKTop ; Timer.kKind5 + dc.l TimerFire6 - NKTop ; Timer.kKind6 + dc.l TimerFire7 - NKTop ; Timer.kKind7 + dc.l TimerFire8 - NKTop ; Timer.kKind8 TimerDispatch ; OUTSIDE REFERER mflr r19 mfsprg r18, 0 - stw r19, -0x0258(r18) + stw r19, EWA.TimerDispatchLR(r18) TimerDispatch_0x30 ; OUTSIDE REFERER mfspr r8, pvr rlwinm. r8, r8, 0, 0, 14 - beq- TimerDispatch_0x54 + beq- @is_601 -TimerDispatch_0x3c +;not 601 +@gettime_loop_non_601 mftbu r8 mftb r9 mftbu r16 cmpw r8, r16 - bne- TimerDispatch_0x3c - b TimerDispatch_0x90 + bne- @gettime_loop_non_601 + b @common -TimerDispatch_0x54 +@is_601 +@gettime_loop_601 mfspr r8, rtcu mfspr r9, rtcl mfspr r16, rtcu cmpw r8, r16 - bne- TimerDispatch_0x54 - lis r16, 0x3b9a - ori r16, r16, 0xca00 - mfspr r17, mq - dc.l 0x7d1040d6 - mfspr r16, mq - mtspr mq, r17 + bne- @gettime_loop_601 + + dialect POWER + + liu r16, 1000000000 >> 16 + oril r16, r16, 1000000000 & 0xffff + + mfmq r17 + mul r8, r16, r8 + mfmq r16 + mtmq r17 + mfxer r17 - addc r9, r16, r9 - addze r8, r8 + a r9, r16, r9 + aze r8, r8 mtxer r17 -TimerDispatch_0x90 - lbz r19, -0x0309(r18) - 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 + dialect PowerPC +@common -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 stw r30, -0x0254(r18) stb r19, 0x0017(r30) - b major_0x132e8_0x10 + b TimerFire4_0x10 -TimerDispatch_0xcc +timer_earlier_than_sometime lwz r30, -0x0a7c(r1) lwz r16, 0x0038(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 lwz r19, 0x064c(r1) - lbz r20, 0x0014(r30) + lbz r20, Timer.Kind(r30) rlwimi r19, r20, 2, 23, 29 cmplwi r20, 0x09 llabel r20, TimerTable @@ -233,7 +237,7 @@ TimerDispatch_0x180: b TimerDispatch_0x30 TimerDispatch_0x188 - lwz r19, -0x0258(r18) + lwz r19, EWA.TimerDispatchLR(r18) mtlr r19 b AdjustDecForTMRQGivenCurTimeAndTripTime @@ -248,7 +252,7 @@ StartTimeslicing ; OUTSIDE REFERER mfsprg r19, 0 li r8, 1 - stb r8, -0x0309(r19) + stb r8, EWA.GlobalTimeIsValid(r19) li r8, 0 stw r8, -0x02e8(r19) @@ -278,7 +282,7 @@ AdjustDecForTMRQ AdjustDecForTMRQGivenCurTime ; 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 r17, Timer.Time+4(r18) @@ -300,20 +304,15 @@ AdjustDecForTMRQGivenCurTimeAndTripTime ; r16/r17 = soonest(last timer, global PSA time if available) - bne- @global_time_invalid + bne- global_time_invalid lwz r18, EWA.GlobalTime(r19) lwz r19, EWA.GlobalTime+4(r19) - cmpw r16, r18 - cmplw cr1, r17, r19 - blt- @last_timer_fires_sooner - bgt- @global_time_sooner - ble- cr1, @last_timer_fires_sooner -@global_time_sooner + _b_if_time_le r16, r18, last_timer_fires_sooner mr r17, r19 mr r16, r18 -@last_timer_fires_sooner -@global_time_invalid +last_timer_fires_sooner +global_time_invalid ; Subtract the current time (or what we were passed in r8/r9) from that time @@ -341,23 +340,23 @@ AdjustDecForTMRQGivenCurTimeAndTripTime -; major_0x130f0 +; TimerFire0 ; Xrefs: ; TimerDispatch -major_0x130f0 ; OUTSIDE REFERER +TimerFireUnknownKind _log 'TimerInformation.kind is zero??^n' -; major_0x13120 +; TimerFire1 ; Xrefs: ; TimerDispatch -; major_0x130f0 +; TimerFire0 -major_0x13120 ; OUTSIDE REFERER +TimerFire1 ; OUTSIDE REFERER bl Local_Panic lwz r18, 0x0018(r30) stw r16, 0x0080(r18) @@ -368,29 +367,29 @@ major_0x13120 ; OUTSIDE REFERER lwz r19, 0x0088(r8) cmpwi r17, 0x00 stw r16, 0x011c(r19) - bne- major_0x13120_0x64 + bne- TimerFire1_0x64 addi r16, r8, 0x08 RemoveFromList r16, scratch1=r17, scratch2=r19 li r17, 0x01 stb r17, 0x0019(r8) bl TaskReadyAsPrev bl CalculateTimeslice - bl major_0x14af8 + bl FlagSchEvaluationIfTaskRequires b TimerDispatch_0x144 -major_0x13120_0x64 +TimerFire1_0x64 lwz r16, 0x0064(r8) rlwinm. r16, r16, 0, 30, 30 -; major_0x1318c +; TimerFire2 ; Xrefs: ; TimerDispatch -; major_0x13120 +; TimerFire1 -major_0x1318c ; OUTSIDE REFERER +TimerFire2 ; OUTSIDE REFERER bne+ TimerDispatch_0x144 bl Local_Panic lwz r18, 0x0018(r30) @@ -401,7 +400,7 @@ major_0x1318c ; OUTSIDE REFERER lbz r17, 0x0018(r8) lwz r18, 0x0088(r8) cmpwi r17, 0x00 - bne- major_0x1324c_0x8 + bne- TimerFire3_0x8 stw r16, 0x011c(r18) lwz r8, 0x0008(r8) lwz r8, 0x0000(r8) @@ -411,35 +410,35 @@ major_0x1318c ; OUTSIDE REFERER cmpwi r9, Queue.kIDClass cmpwi cr1, r9, 0x05 - beq- major_0x1318c_0x8c - beq- cr1, major_0x1318c_0x7c + beq- TimerFire2_0x8c + beq- cr1, TimerFire2_0x7c cmpwi r9, 0x09 cmpwi cr1, r9, 0x06 - beq- major_0x1318c_0x6c + beq- TimerFire2_0x6c bne+ cr1, Local_Panic lwz r16, 0x0020(r8) addi r16, r16, -0x01 stw r16, 0x0020(r8) - b major_0x1318c_0x98 + b TimerFire2_0x98 -major_0x1318c_0x6c +TimerFire2_0x6c lwz r16, 0x001c(r8) addi r16, r16, -0x01 stw r16, 0x001c(r8) - b major_0x1318c_0x98 + b TimerFire2_0x98 -major_0x1318c_0x7c +TimerFire2_0x7c lwz r16, 0x001c(r8) addi r16, r16, -0x01 stw r16, 0x001c(r8) - b major_0x1318c_0x98 + b TimerFire2_0x98 -major_0x1318c_0x8c +TimerFire2_0x8c lwz r16, 0x002c(r8) addi r16, r16, -0x01 stw r16, 0x002c(r8) -major_0x1318c_0x98 +TimerFire2_0x98 lwz r8, 0x0018(r30) addi r16, r8, 0x08 RemoveFromList r16, scratch1=r17, scratch2=r18 @@ -447,17 +446,17 @@ major_0x1318c_0x98 -; major_0x1324c +; TimerFire3 ; Xrefs: ; TimerDispatch -; major_0x1318c +; TimerFire2 -major_0x1324c ; OUTSIDE REFERER - bl major_0x14af8 +TimerFire3 ; OUTSIDE REFERER + bl FlagSchEvaluationIfTaskRequires b TimerDispatch_0x144 -major_0x1324c_0x8 ; OUTSIDE REFERER +TimerFire3_0x8 ; OUTSIDE REFERER b Local_Panic @@ -498,7 +497,7 @@ major_0x13258_0x4c stw r16, 0x0010(r8) stw r17, 0x0014(r8) stw r18, 0x0018(r8) - bl major_0x0c8b4 + bl EnqueueMessage ; Message *r8, Queue *r31 major_0x13258_0x68 lwz r8, 0x0034(r30) @@ -509,7 +508,7 @@ major_0x13258_0x68 mr r31, r8 bne- major_0x13258_0x80 - bl major_0x0ccf4 + bl SignalSemaphore major_0x13258_0x80 lwz r8, 0x002c(r30) @@ -522,62 +521,62 @@ major_0x13258_0x80 -; major_0x132e8 +; TimerFire4 ; Xrefs: ; TimerDispatch ; major_0x13258 -major_0x132e8 ; OUTSIDE REFERER - bne- major_0x132e8_0xc +TimerFire4 ; OUTSIDE REFERER + bne- TimerFire4_0xc lwz r8, 0x0030(r30) - bl major_0x0d35c + bl SetEvent -major_0x132e8_0xc +TimerFire4_0xc b TimerDispatch_0x144 -major_0x132e8_0x10 ; OUTSIDE REFERER +TimerFire4_0x10 ; OUTSIDE REFERER mfsprg r28, 0 lwz r29, -0x0008(r28) mr r8, r29 - bl DequeueTask + bl TaskUnready lbz r17, 0x0019(r29) cmpwi r17, 0x02 - bge- major_0x132e8_0x64 + bge- TimerFire4_0x64 mr r8, r29 lwz r16, 0x0038(r30) lwz r17, 0x003c(r30) bl clear_cr0_lt - bge- major_0x132e8_0x50 + bge- TimerFire4_0x50 mr r8, r29 bl TaskReadyAsPrev bl CalculateTimeslice - b major_0x13350_0x8 + b TimerFire5_0x8 -major_0x132e8_0x50 +TimerFire4_0x50 li r18, 0x02 stb r18, 0x0019(r29) mr r8, r29 bl TaskReadyAsPrev - b major_0x13350_0x8 + b TimerFire5_0x8 -major_0x132e8_0x64 +TimerFire4_0x64 mr r8, r29 -; major_0x13350 +; TimerFire5 ; Xrefs: ; TimerDispatch -; major_0x132e8 +; TimerFire4 -major_0x13350 ; OUTSIDE REFERER +TimerFire5 ; OUTSIDE REFERER bl TaskReadyAsPrev bl major_0x149d4 -major_0x13350_0x8 ; OUTSIDE REFERER - bl major_0x14af8 +TimerFire5_0x8 ; OUTSIDE REFERER + bl FlagSchEvaluationIfTaskRequires mfsprg r18, 0 b TimerDispatch_0x30 @@ -605,7 +604,7 @@ major_0x13350_0x8 ; OUTSIDE REFERER mr r8, r16 bl printb _log 'scr-' - lwz r16, 0x0658(r1) + lwz r16, KDP.PA_ECB(r1) lwz r18, 0x0674(r1) lwz r16, 0x00dc(r16) and r16, r16, r18 @@ -621,7 +620,7 @@ major_0x13350_0x8 ; OUTSIDE REFERER mr r8, r16 bl printh _log 'eSR-' - lwz r16, 0x0658(r1) + lwz r16, KDP.PA_ECB(r1) lwz r16, 0x01cc(r16) andi. r16, r16, 0x07 mr r8, r16 @@ -636,13 +635,13 @@ major_0x13350_0x8 ; OUTSIDE REFERER -; major_0x134bc +; TimerFire7 ; Xrefs: ; TimerDispatch ; major_0x13364 -major_0x134bc ; OUTSIDE REFERER +TimerFire7 ; OUTSIDE REFERER addze r16, r16 stw r16, 0x0038(r30) stw r17, 0x003c(r30) @@ -660,7 +659,7 @@ major_0x134bc ; OUTSIDE REFERER lwz r18, -0x0438(r1) lwz r19, 0x0f88(r1) subf. r19, r18, r19 - ble- major_0x13524_0x1c + ble- TimerFire8_0x1c srwi r19, r19, 11 mfxer r20 @@ -681,13 +680,13 @@ major_0x134d8_0x18 -; major_0x13524 +; TimerFire8 ; Xrefs: ; TimerDispatch ; major_0x134d8 -major_0x13524 ; OUTSIDE REFERER +TimerFire8 ; OUTSIDE REFERER addc r17, r17, r18 addze r16, r16 stw r16, 0x0038(r30) @@ -696,7 +695,7 @@ major_0x13524 ; OUTSIDE REFERER mr r8, r30 bl EnqueueTimer -major_0x13524_0x1c ; OUTSIDE REFERER +TimerFire8_0x1c ; OUTSIDE REFERER b TimerDispatch_0x144 @@ -709,7 +708,7 @@ major_0x13524_0x1c ; OUTSIDE REFERER mfxer r20 cmpwi cr1, r19, 0x00 srawi r8, r19, 31 - beq- cr1, major_0x135b8_0x4 + beq- cr1, TimerFire6_0x4 major_0x13544_0x14 mftbu r16 @@ -743,16 +742,16 @@ major_0x13544_0x64 -; major_0x135b8 +; TimerFire6 ; Xrefs: ; TimerDispatch ; major_0x13544 -major_0x135b8 ; OUTSIDE REFERER +TimerFire6 ; OUTSIDE REFERER stw r17, 0x003c(r30) -major_0x135b8_0x4 ; OUTSIDE REFERER +TimerFire6_0x4 ; OUTSIDE REFERER mtxer r20 beq+ cr1, TimerDispatch_0x144 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 - - -; major_0x136c8 - -; 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) +DequeueTimer + lwz r16, Timer.QueueLLL + LLL.FreeForm(r8) + cmpwi r16, 0 + lwz r18, PSA.TimerQueue + TimerQueueStruct.LLL + LLL.Next(r1) beq+ Local_Panic + RemoveFromList r8, scratch1=r16, scratch2=r17 - li r16, 0x00 + + li r16, 0 cmpw r18, r8 - stb r16, 0x0017(r8) + stb r16, Timer.Byte3(r8) + beq+ AdjustDecForTMRQ + blr @@ -966,7 +951,7 @@ TimebaseTicksPerPeriod ; CreateTask ; InitTMRQs ; AdjustDecForTMRQ -; major_0x142dc +; RescheduleAndReturn ; major_0x14548 ; RET long r8 tbu, long r9 tbl diff --git a/NanoKernel/NKVMCalls.s b/NanoKernel/NKVMCalls.s index cdefee5..e07bbb0 100644 --- a/NanoKernel/NKVMCalls.s +++ b/NanoKernel/NKVMCalls.s @@ -189,7 +189,7 @@ VMReturn ; OUTSIDE REFERER lwz r7, -0x0010(r8) lwz r6, -0x0014(r8) _AssertAndRelease PSA.HTABLock, scratch=r8 - b skeleton_key + b IntReturn diff --git a/NanoKernel/NanoKernel.s b/NanoKernel/NanoKernel.s index 0c0b4e5..9044cb2 100644 --- a/NanoKernel/NanoKernel.s +++ b/NanoKernel/NanoKernel.s @@ -1,4 +1,5 @@ include 'MacErrors.a' + include 'Multiprocessing.a' include 'InfoRecords.a' include 'EmulatorPublic.a' @@ -29,7 +30,7 @@ NKTop align 5 include 'NKMPCalls.s' align 5 - include 'NKQueues.s' + include 'NKSync.s' align 5 include 'NKTasks.s' align 5