From 7fdc813d8fe20736918eccdc451d9e150c706c02 Mon Sep 17 00:00:00 2001 From: Elliot Nunn Date: Sun, 18 Feb 2018 00:57:01 +0800 Subject: [PATCH] Reverse userspace sync primitives Namely queues, semaphores, critical regions, event groups and "notifications". The MP calls implementing these services have been named after their MPLibrary wrapper functions. This convention will be followed in the future (no more NKCreateEvent). --- Internal/EmulatorPublic.a | 3 +- Internal/InfoRecords.a | 2 +- Internal/NKOpaque.a | 178 +- Internal/NKPublic.a | 20 +- NanoKernel/NKAddressSpaceMPCalls.s | 177 +- NanoKernel/NKCacheCalls.s | 2 +- NanoKernel/NKEquates.s | 6 +- NanoKernel/NKInit.s | 35 +- NanoKernel/NKInterrupts.s | 249 ++- NanoKernel/NKMPCalls.s | 173 +- NanoKernel/NKMacros.s | 35 +- NanoKernel/NKPoolAllocator.s | 2 +- NanoKernel/NKPowerCalls.s | 12 +- NanoKernel/NKPrimaryIntHandlers.s | 39 +- NanoKernel/NKQueues.s | 2477 ----------------------- NanoKernel/NKRTASCalls.s | 10 +- NanoKernel/NKReplacementInit.s | 6 +- NanoKernel/NKScheduler.s | 524 ++--- NanoKernel/NKSleep.s | 10 +- NanoKernel/NKSync.s | 3031 ++++++++++++++++++++++++++++ NanoKernel/NKTasks.s | 266 +-- NanoKernel/NKThud.s | 10 +- NanoKernel/NKTimers.s | 287 ++- NanoKernel/NKVMCalls.s | 2 +- NanoKernel/NanoKernel.s | 3 +- 25 files changed, 4155 insertions(+), 3404 deletions(-) delete mode 100644 NanoKernel/NKQueues.s create mode 100644 NanoKernel/NKSync.s 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