From 6c199998f0051862ba22814c6070cd93b05fc03f Mon Sep 17 00:00:00 2001 From: Elliot Nunn Date: Mon, 23 Apr 2018 23:22:55 +0800 Subject: [PATCH] Lots of work on Address Spaces --- Internal/EmulatorPublic.a | 14 +- Internal/NKOpaque.a | 19 +- Internal/NKPublic.a | 18 +- NanoKernel/InnerMakeFile | 2 +- NanoKernel/NKAdditions.s | 2 +- NanoKernel/NKAddressSpaceMPCalls.s | 4105 ------------------------ NanoKernel/NKAddressSpaces.s | 4801 ++++++++++++++++++++++++++++ NanoKernel/NKInit.s | 68 +- NanoKernel/NKInterrupts.s | 678 ++-- NanoKernel/NKMPCalls.s | 18 +- NanoKernel/NKPaging.s | 4 +- NanoKernel/NKScheduler.s | 12 +- NanoKernel/NKTasks.s | 18 +- NanoKernel/NKTranslation.s | 12 +- NanoKernel/NKVMCalls.s | 62 +- NanoKernel/NanoKernel.s | 2 +- 16 files changed, 5365 insertions(+), 4470 deletions(-) delete mode 100644 NanoKernel/NKAddressSpaceMPCalls.s create mode 100644 NanoKernel/NKAddressSpaces.s diff --git a/Internal/EmulatorPublic.a b/Internal/EmulatorPublic.a index c4ecc6b..57fe932 100644 --- a/Internal/EmulatorPublic.a +++ b/Internal/EmulatorPublic.a @@ -89,10 +89,22 @@ ContextBlock record 0,INCR Flags ds.l 1 ; 000 ; (SPAC) copied from kdp by CreateTask Enables ds.l 1 ; 004 - + + org 0x40 +SavedFlags ds.l 1 ; 040 ; from before exception + + org 0x44 +SavedEnables ds.l 1 ; 044 ; from before exception + + org 0x4c +ExceptionHandler ds.l 1 ; 04c + org 0x5c LA_EmulatorKernelTrapTable ds.l 1 + org 0x74 +SRR0 ds.l 1 ; 074 + org 0x84 LA_EmulatorEntry ds.l 1 ; 084 ; Entry pt of emulator; set by NK Init.s diff --git a/Internal/NKOpaque.a b/Internal/NKOpaque.a index 104548c..ce3affd 100644 --- a/Internal/NKOpaque.a +++ b/Internal/NKOpaque.a @@ -127,16 +127,16 @@ kFlag5 equ 5 kFlag6 equ 6 kFlag7 equ 7 kFlag8 equ 8 -kFlag9 equ 9 +kFlagTakesAllExceptions 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 +kFlagNotDebuggable equ 14 ; set for blue, idle1 kFlagBlue equ 15 kFlag16 equ 16 kFlag17 equ 17 -kFlag18 equ 18 +kFlagPageFaulted equ 18 kFlag19 equ 19 kFlag20 equ 20 kFlagPerfMon equ 21 ; set by MPMarkPMFTask, means perf monitor @@ -175,7 +175,7 @@ CodeFaultCtr ds.l 1 ; 0e0 ; these two only climb when VM is on DataFaultCtr ds.l 1 ; 0e4 PreemptCtr ds.l 1 ; 0e8 SomeLabelField ds.l 1 ; 0ec -YellowVecTblPtr ds.l 1 ; 0f0 +VecBase ds.l 1 ; 0f0 ExceptionHandlerID ds.l 1 ; 0f4 ; a queue ErrToReturnIfIDie ds.l 1 ; 0f8 ds.l 1 ; 0fc @@ -447,7 +447,8 @@ kSignature equ 'SPAC' ID ds.l 1 ; 00 Signature ds.l 1 ; 04 - ds.l 1 ; 08 +Flags ds.l 1 ; 08 +kFlag30 equ 30 TaskCount ds.l 1 ; 0c ; incremented by CreateTask RsrvList ds.l 4 ; 10:20 ; LLL AreaList ds.l 4 ; 20:30 ; LLL @@ -561,6 +562,9 @@ kIDClass equ 11 kFirstID equ 0x000b0001 kSignature equ 'AREA' +kPLEFlagIsInHTAB equ 20 ; bits 0-19 = HTAB offset if set, else physical page +kPLEFlagHasPhysPage equ 31 + ;_______________________ ; Fields ;_______________________ @@ -594,7 +598,7 @@ LLL ds.l 4 ; 54:64 ; member of address space ds.l 1 ; 64 PageSize ds.l 1 ; 68 ; always 4k, the size of a PPC page AddressSpacePtr ds.l 1 ; 6c -ContigPTETemplate ds.l 1 ; 70 ; in contig areas, acts as PTE template for every page +ContigPTETemplate ds.l 1 ; 70 ; in contig areas, acts as PTE template for every page (whole Area is same page) PagedPTETemplate ds.l 1 ; 74 ; when paged area is created this fills PageMapArray AlignmentMask ds.l 1 ; 78 ; bit mask that LogicalBase is aligned to DefaultAlignmentMask ds.l 1 ; 7c ; always 0xFFFFF000 (page alignment) @@ -607,6 +611,9 @@ FenceLLL ds.l 4 ; 90:a0 ; function unknown, id is 'fenc' Size equ * endr +; Page List Entry bits: + + diff --git a/Internal/NKPublic.a b/Internal/NKPublic.a index 2cc228f..7013eaa 100644 --- a/Internal/NKPublic.a +++ b/Internal/NKPublic.a @@ -159,11 +159,11 @@ Pending68kInt ds.w 1 ; -43c ; used when Sch interrupts blue task (-1 means "no _43a ds.w 1 ; -43a DecClockRateHzCopy ds.l 1 ; -438 ; copied by Init.s OtherTimerQueuePtr ds.l 1 ; -434 ; unsigned timer queue in the pool, set by InitTMRQs -FreePageCount ds.l 1 ; -430 ; zeroed by InitFreeList +FreePageCount ds.l 1 ; -430 ; zeroed by InitFreePageList UnheldFreePageCount ds.l 1 ; -42c ExternalHandlerID ds.l 1 ; -428 ; notification for PIH to bump SystemAddressSpaceID ds.l 1 ; -424 -_420 ds.l 1 ; -420 +AgerID ds.l 1 ; -420 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 @@ -173,7 +173,7 @@ _408 ds.l 1 ; -408 _404 ds.l 1 ; -404 _400 ds.l 1 ; -400 OtherSystemAddrSpcPtr ds.l 1 ; -3fc -OtherSystemAddrSpcPtr2 ds.l 1 ; -3f8 ; copied from the one above by InitFreeList +OtherSystemAddrSpcPtr2 ds.l 1 ; -3f8 ; copied from the one above by InitFreePageList ZeroedByInitFreeList3 ds.l 1 ; -3f4 _3f0 ds.l 1 ; -3f0 _3ec ds.l 1 ; -3ec @@ -580,9 +580,9 @@ NCBCacheLA3 ds.l 1 ; 358 NCBCachePA3 ds.l 1 ; 35c NCBPointerCacheEnd -YellowVecBase ds.l 48 ; 360:420 ; used to ignore illegal AltiVec insns by Init.s -OrangeVecBase ds.l 48 ; 420:4e0 -RedVecBase ds.l 48 ; 4e0:5a0 +VecBaseSystem ds.l 48 ; 360:420 ; when 68k emulator is running, *or* any MTask +VecBaseAlternate ds.l 48 ; 420:4e0 ; native PowerPC in blue task +VecBaseTranslation ds.l 48 ; 4e0:5a0 ; "FDP" instruction emulation OldKDP ds.l 1 ; 5a0 ; gotten from the old SPRG0 OtherFreeThing ds.l 1 ; 5a4 TopOfFreePages ds.l 1 ; 5a8 ; gotten from the old SPRG0 @@ -634,10 +634,10 @@ PageAttributeInit ds.l 1 ; 688 ; defaults for page table entries (see ConfigInf ds.l 1 ; 69c PTEGMask ds.l 1 ; 6a0 HTABORG ds.l 1 ; 6a4 -PrimaryAddrRangePages ds.l 1 ; 6a8 ; set at init and changed by VMInit +VMLogicalPages ds.l 1 ; 6a8 ; set at init and changed by VMInit TotalPhysicalPages ds.l 1 ; 6ac ; does not take into acct maximum MacOS memory -FlatPageListPtr ds.l 1 ; 6b0 -VMMaxVirtualPages ds.l 1 ; 6b4 ; size of main contiguous segment? +FlatPageListPtr ds.l 1 ; 6b0 ; VM puts this in system heap +VMMaxVirtualPages ds.l 1 ; 6b4 ; always 5fffe000, even with VM on CpuSpecificBytes CpuSpecificByte1 ds.b 1 ; 6b8 ; seems to contain flags (set from PVR & tbl by Init.s) CpuSpecificByte2 ds.b 1 ; 6b9 ; probably not flags (set in same way) diff --git a/NanoKernel/InnerMakeFile b/NanoKernel/InnerMakeFile index 1a7e92e..8d26ba0 100644 --- a/NanoKernel/InnerMakeFile +++ b/NanoKernel/InnerMakeFile @@ -17,7 +17,7 @@ NKFiles = {NKDir}NKMPCalls.s ¶ {NKDir}NKSync.s ¶ {NKDir}NKTasks.s ¶ - {NKDir}NKAddressSpaceMPCalls.s ¶ + {NKDir}NKAddressSpaces.s ¶ {NKDir}NKPoolAllocator.s ¶ {NKDir}NKTimers.s ¶ {NKDir}NKScheduler.s ¶ diff --git a/NanoKernel/NKAdditions.s b/NanoKernel/NKAdditions.s index e553798..e92ff99 100644 --- a/NanoKernel/NKAdditions.s +++ b/NanoKernel/NKAdditions.s @@ -16,7 +16,7 @@ NKDebug beq @already_physical li r9, 0 - bl V2P ; takes page EA in r8, r9=0, returns page PA in r17 + bl SpaceL2PUsingBATs ; LogicalPage *r8, MPAddressSpace *r9 // PhysicalPage *r17 beq @fail rlwimi r8, r17, 0, 0, 19 @already_physical diff --git a/NanoKernel/NKAddressSpaceMPCalls.s b/NanoKernel/NKAddressSpaceMPCalls.s deleted file mode 100644 index 8a9faa8..0000000 --- a/NanoKernel/NKAddressSpaceMPCalls.s +++ /dev/null @@ -1,4105 +0,0 @@ -Local_Panic set * - b panic - - - -InitFreeList - addi r9, r1, PSA.FreeList - - InitList r9, 'PHYS', scratch=r8 - - li r8, 0 - stw r8, PSA.FreePageCount(r1) - stw r8, PSA.UnheldFreePageCount(r1) - stw r8, PSA.ZeroedByInitFreeList3(r1) - - lwz r8, PSA.OtherSystemAddrSpcPtr(r1) - stw r8, PSA.OtherSystemAddrSpcPtr2(r1) - - blr - - - -; convert_pmdts_to_areas - -; Pretty obvious from log output. - -convert_pmdts_to_areas ; OUTSIDE REFERER - - ; The kind of crap we have to do without a stack - mflr r16 - mfcr r17 - stw r16, EWA.SpacesSavedLR(r1) - stw r17, EWA.SpacesSavedCR(r1) - - _log 'Converting PMDTs to areas^n' - - lwz r17, PSA.UnheldFreePageCount(r1) - lwz r16, KDP.TotalPhysicalPages(r1) - add r17, r17, r16 - stw r17, PSA.UnheldFreePageCount(r1) - - -;_______________________________________________________________________ -; Code to increment a loop that: -; iterates over segmap entries, and -; iterates over PMDTs, starting at the one -; ref'd by the segmap entry -;_______________________________________________________________________ - - addi r27, r1, KDP.SegMaps - 8 - lis r26, 0 - -@next_segment_entry - _wlog 'SEGMENT ', r26, '^n' - - lwzu r25, 8(r27) - - b @this_pmdt -@next_pmdt - addi r25, r25, PMDT.Size -@this_pmdt - - -;_______________________________________________________________________ -; Now we enter the loop body: -; r27 points to segmap entry -; r25 points to the PMDT -; r26 equals the base address of this segment -;_______________________________________________________________________ - - - ; Load the contents of the PMDT. - - lwz r17, PMDT.PBaseAndFlags(r25) - _wlog ' PMDT PBaseAndFlags ', r17, ' ' - - lhz r15, PMDT.LBase(r25) - _wlogh 'LBase ', r15, ' ' - - andi. r8, r17, $800 | $400 | $200 ; interested in 3 PBase flags - - lhz r16, PMDT.PageCount(r25) - _wlogh 'PageCount ', r16, '^n', scratch=r9 ; cannot clobber r8 here - - - ; Based on those flags, do one of two things - cmplwi r8, 0 - cmplwi cr1, r8, $800 | $400 - beq @pmdt_flags_are_zero - beq cr1, @pmdt_flags_are_c00 - - ; Else if not a full-segment PMDT, next PMDT - cmplwi cr2, r15, 0x0000 - cmplwi cr3, r16, 0xffff - bne cr2, @next_pmdt - bne cr3, @next_pmdt - - ; Else if there are segments remaining (16 total), next segment. - addis r26, r26, 0x1000 - cmplwi r26, 0 ; once it wraps to zero, we're done - bne @next_segment_entry - - ; Else create special one-page Areas to catch naughty pointer derefs, - ; then return. - - ; 61F168F1 (magic bus error incantation) - - li r8, Area.Size - bl PoolAllocClear - mr. r31, r8 - beq Local_Panic - - lwz r8, EWA.PA_CurAddressSpace(r1) - stw r8, Area.AddressSpacePtr(r31) - - lisori r15, 0x68f168f1 - stw r15, Area.LogicalBase(r31) - - li r16, 0x1000 - stw r16, Area.Length(r31) - - lisori r8, 0x00008000 - stw r8, Area.LogicalSeparation(r31) - - li r8, 0 - stw r8, 0x001c(r31) - - lisori r8, 0x0000e00c - stw r8, 0x0020(r31) - - mr r8, r31 - bl createarea - - cmpwi r9, noErr - beq @success_68f168f1 - mr r8, r31 - bl PoolFree -@success_68f168f1 - - - ; DEADBEEF (all over the place) - - li r8, Area.Size - bl PoolAllocClear - mr. r31, r8 - beq Local_Panic - - lwz r8, EWA.PA_CurAddressSpace(r1) - stw r8, Area.AddressSpacePtr(r31) - - lisori r15, 0xdeadbeef - stw r15, Area.LogicalBase(r31) - - li r16, 0x1000 - stw r16, Area.Length(r31) - - lisori r8, 0x00008000 - stw r8, Area.LogicalSeparation(r31) - - li r8, 0 - stw r8, 0x001c(r31) - - lisori r8, 0x0000e00c - stw r8, 0x0020(r31) - - mr r8, r31 - bl createarea - - cmpwi r9, noErr - beq @success_deadbeef - mr r8, r31 - bl PoolFree -@success_deadbeef - - - ; Done -- return. - lwz r16, EWA.SpacesSavedLR(r1) - lwz r17, EWA.SpacesSavedCR(r1) - mtlr r16 - mtcr r17 - blr - - - ; ONE OF THE "FLAGS" CASES: all tests bits unset - -@pmdt_flags_are_zero - _clog ' pmdt_flags_are_zero^n' - - ; Apparently other iterations leave this to find? - lwz r8, EWA.SpacesDeferredAreaPtr(r1) - cmpwi r8, 0 - beq @thing_is_zero - - bl createarea - cmpwi r9, noErr - bne Local_Panic - - li r8, 0 - stw r8, EWA.SpacesDeferredAreaPtr(r1) -@thing_is_zero - - - - li r8, Area.Size - bl PoolAllocClear - mr. r31, r8 - beq Local_Panic - - ; Reload PMDT details - lwz r17, PMDT.PBaseAndFlags(r25) - lhz r15, PMDT.LBase(r25) - lhz r16, PMDT.PageCount(r25) - - ; Why do we need to sign the area? Isn't it 'AREA'? - lisori r8, 'area' - stw r8, Area.Signature(r31) - - ; Set r15/r16 to true logical base/length - slwi r15, r15, 12 - addi r16, r16, 1 - add r15, r15, r26 ; add a page, I think - slwi r16, r16, 12 - - lwz r8, KDP.NanoKernelInfo + NKNanoKernelInfo.blueProcessID(r1) - stw r8, Area.ProcessID(r31) - - lwz r8, EWA.PA_CurAddressSpace(r1) - stw r8, Area.AddressSpacePtr(r31) - - stw r15, Area.LogicalBase(r31) - - stw r16, Area.Length(r31) - stw r16, Area.BytesMapped(r31) - - li r8, 0 - stw r8, Area.LogicalSeparation(r31) - - lwz r18, 0x007c(r31) - rlwinm r9, r17, 0, 0, 19 - stw r9, 0x0070(r31) - andi. r16, r17, 0x03 - bne @_20c - ori r17, r17, 0x02 -@_20c - - bl major_0x10d38_0x58 - stw r18, 0x001c(r31) - - -@_214 - - - - lisori r8, 0x0000e00c - stw r8, 0x0020(r31) - - - ; Try to create the Area. If we succeed then do the next PMDT. - mr r8, r31 - bl createarea - cmpwi r9, noErr - mr r31, r8 - beq @next_pmdt - - ; If CreateArea failed, assume that it was due to overlap with another Area. - - ; Find that AboveArea that we impinged on (=> r24). - lwz r9, Area.LogicalBase(r31) - lwz r8, Area.AddressSpacePtr(r31) - bl FindAreaAbove - mr r24, r8 - - ; Shorten our FailedArea to fit below AboveArea. - lwz r15, Area.LogicalBase(r31) - lwz r16, Area.LogicalBase(r24) - lwz r17, Area.LogicalEnd(r31) - subf. r16, r15, r16 ; r16 = offset of found area from this one - stw r17, EWA.SpacesSavedAreaBase(r1) ; ??? - stw r16, Area.Length(r31) ; we will try again, with no overlap - - beq @found_area_has_same_base - - ; If FoundArea < FailedArea, panic (impossible for FindAreaAbove to return this) - bltl Local_Panic ; below would be impossible - - ; If AboveArea > FailedArea, create NewArea (=> r30) - mr r8, r31 - bl createarea - - cmpwi r9, noErr ; strike three - mr r30, r8 - bnel Local_Panic - - ; If AboveArea.LogicalEnd >= FailedArea.LogicalEnd then continue to next PMDT. - lwz r15, Area.LogicalEnd(r24) - lwz r16, EWA.SpacesSavedAreaBase(r1) - subf. r16, r15, r16 - ble @next_pmdt - - ; Else replace FailedArea with an Area copied from NewArea - li r8, Area.Size - bl PoolAllocClear - mr. r31, r8 - beq Local_Panic - - li r8, Area.Size - 4 -@area_copy_loop - lwzx r9, r8, r30 - stwx r9, r8, r31 - cmpwi r8, 0 - subi r8, r8, 4 - bgt @area_copy_loop -@found_area_has_same_base - - ; Else (AboveArea == ThisArea), do nothing special (endif) - - - lwz r9, Area.LogicalBase(r31) - - lwz r15, 0x0028(r24) - lwz r16, EWA.SpacesSavedAreaBase(r1) ; this is FailedArea.LogicalEnd - subf. r16, r15, r16 - addi r15, r15, 1 - blel Local_Panic - - stw r16, Area.Length(r31) - stw r15, Area.LogicalBase(r31) - subf r9, r9, r15 - lwz r8, 0x0070(r31) - add r8, r8, r9 - stw r8, 0x0070(r31) - b @_214 - - - - -@pmdt_flags_are_c00 - _clog ' pmdt_flags_are_c00^n' - li r8, Area.Size - bl PoolAllocClear - mr. r31, r8 - beq Local_Panic - - lwz r17, 0x0004(r25) - lhz r15, 0x0000(r25) - lhz r16, 0x0002(r25) - lis r8, 0x6172 - ori r8, r8, 0x6561 - stw r8, Area.Signature(r31) - slwi r15, r15, 12 - addi r16, r16, 0x01 - add r15, r15, r26 - slwi r16, r16, 12 - lwz r8, 0x0ec0(r1) - stw r8, Area.ProcessID(r31) - lwz r8, EWA.PA_CurAddressSpace(r1) - stw r8, Area.AddressSpacePtr(r31) - stw r15, Area.LogicalBase(r31) - stw r16, Area.Length(r31) - stw r16, Area.BytesMapped(r31) - li r8, 0x00 - stw r8, Area.LogicalSeparation(r31) - li r8, 0x07 - stw r8, 0x001c(r31) - lis r8, 0x00 - ori r8, r8, 0x600c - stw r8, 0x0020(r31) - rlwinm r8, r17, 22, 0, 29 - stw r8, 0x0040(r31) - lwz r8, Area.Flags(r31) - ori r8, r8, 0x40 - lwz r9, PSA.FreePageCount(r1) - cmpwi r9, noErr - - bgt @_374 - ori r8, r8, 0x80 -@_374 - - stw r8, Area.Flags(r31) - cmpwi r15, 0x00 - - bne @_388 - stw r31, EWA.SpacesDeferredAreaPtr(r1) - b @next_pmdt -@_388 - - lwz r18, EWA.SpacesDeferredAreaPtr(r1) - cmpwi r18, 0x00 - beq @_3c8 - lwz r8, 0x0024(r18) - lwz r9, 0x002c(r18) - add r19, r8, r9 - cmplw r19, r15 - bne @_3c8 - add r9, r9, r16 - addi r19, r9, -0x01 - stw r9, 0x002c(r18) - stw r9, 0x0038(r18) - stw r19, 0x0028(r18) - mr r8, r31 - bl PoolFree - b @next_pmdt -@_3c8 - - lwz r8, Area.Flags(r31) - ori r8, r8, 0x80 - stw r8, Area.Flags(r31) - mr r8, r31 - bl createarea - cmpwi r9, noErr - bne Local_Panic - b @next_pmdt - - - - - -; KCGetPageSizeClasses - - -; > r1 = kdp - -; < r3 = pageClass - - DeclareMPCall 68, KCGetPageSizeClasses - -KCGetPageSizeClasses ; OUTSIDE REFERER - li r3, 0x01 - b CommonMPCallReturnPath - - - -; KCGetPageSize - - -; > r1 = kdp -; > r3 = pageClass - -; < r3 = byteCount - - DeclareMPCall 69, KCGetPageSize - -KCGetPageSize ; OUTSIDE REFERER - cmpwi r3, 0x01 - bne ReturnParamErrFromMPCall - lwz r3, 0x0f30(r1) - b CommonMPCallReturnPath - - - - DeclareMPCall 70, MPCall_70 - -MPCall_70 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mfsprg r16, 0 - lwz r17, -0x0008(r16) - mr r8, r3 - lwz r9, Area.AddressSpacePtr(r17) - lwz r16, 0x0008(r9) - rlwinm. r16, r16, 0, 30, 30 - bne ReleaseAndReturnMPCallOOM - bl NKCreateAddressSpaceSub - _AssertAndRelease PSA.SchLock, scratch=r16 - mr. r3, r8 - li r4, 0x00 - bne CommonMPCallReturnPath - lwz r4, 0x0000(r9) - b CommonMPCallReturnPath - - - -; ARG MPCoherenceID r8 owningcgrp ; 0 to use mobo cgrp -; Process *r9 owningPROC - -; RET osErr r8 -; AddressSpace *r9 - -NKCreateAddressSpaceSub - cmpwi r8, 0 - mr r27, r9 ; Save the process arg for later - mflr r30 - - ; Use the motherboard coherence group if none is provided in r8 - bne @cgrp_provided - mfsprg r15, 0 - lwz r28, EWA.CPUBase + CPU.LLL + LLL.Freeform(r15) - - b @got_cgrp - -@cgrp_provided - bl LookupID ; takes id in r8, returns ptr in r8 and kind in r9 - - cmpwi r9, CoherenceGroup.kIDClass - mr r28, r8 - bne @fail_notcgrp - lwz r28, CoherenceGroup.LLL + LLL.Next(r28) - -@got_cgrp - - - ; Read the SpecialPtr of this cgrp element in list of the owning CpuStruct - ; But why? cgrp.LLL.Freeform does not seem to be set for the mobo cgrp - lwz r29, LLL.Freeform(r28) - - - ; Boast (including the SpecialPtr) - _log 'NKCreateAddressSpaceSub - group at 0x' - - mr r8, r28 - bl printw - - mr r8, r29 - bl printw - - _log '^n' - - - ; Create the AddressSpace - li r8, AddressSpace.Size - bl PoolAllocClear - mr. r31, r8 - beq @fail_OOM - - - ; Give the addr spc a copy of the SpecialPtr of its parent cgrp - stw r29, AddressSpace.ParentCoherenceSpecialPtr(r31) - - - ; Give the addr spc an ID - li r9, AddressSpace.kIDClass - bl MakeID - - cmpwi r8, 0x00 - beq @fail_MakeID - - stw r8, AddressSpace.ID(r31) - - - ; Increment a counter in the cgrp (modulo a million, fail on overflow) - lwz r16, CoherenceGroup.Incrementer(r28) - addi r16, r16, 1 - clrlwi. r16, r16, 12 - beq @fail_toomanycalls - stw r16, CoherenceGroup.Incrementer(r28) - - - ; Fill segment register fields in the address space struct like so: - ; (8 bits = 0x20) || (4 bits = word idx) || (20 bits = prev call count) - - addi r16, r16, -1 - li r17, 0x40 - 4 - oris r16, r16, 0x2000 - addi r18, r31, AddressSpace.SRs - -@fill_loop - cmpwi r17, 0 - rlwimi r16, r17, 18, 8, 11 ; = index (15, 14, 13...) << 20 - stwx r16, r17, r18 - addi r17, r17, -4 - bne @fill_loop - - - ; Sign the addr spc struct - lisori r8, AddressSpace.kSignature - stw r8, AddressSpace.Signature(r31) - - - ; Create an empty linked list of 'rsrv's (what are they?) - addi r16, r31, AddressSpace.RsrvList - InitList r16, 'rsrv', scratch=r17 - - - ; Create a linked list with one Area - addi r16, r31, AddressSpace.AreaList - InitList r16, 'area', scratch=r17 - - ; Allocate the Area, check for errors - li r8, Area.Size - bl PoolAllocClear - mr. r29, r8 - beq @fail_OOM_again - - ; Sign the Area - lisori r8, Area.kSignature - stw r8, Area.Signature(r29) - - ; Pop some constants in - lisori r8, -1 - stw r8, Area.LogicalBase(r29) - stw r8, Area.LogicalEnd(r29) - li r8, 256 - stw r8, Area.Flags(r29) - - ; Give it a copy of the ID of its parent address space - lwz r8, AddressSpace.ID(r31) - stw r8, Area.AddressSpaceID(r29) - - ; Point the SpecialPtr to it and insert it in the list - addi r16, r31, AddressSpace.AreaList - addi r29, r29, Area.LLL - stw r16, LLL.Freeform(r29) - InsertAsPrev r29, r16, scratch=r17 - - - ; Point this struct by ID to its owning Process, - ; and increment a counter in that struct. - lwz r18, Process.ID(r27) - stw r18, AddressSpace.ProcessID(r31) - - lwz r17, Process.AddressSpaceCount(r27) - addi r17, r17, 1 - stw r17, Process.AddressSpaceCount(r27) - - - ; Done, with no errors - li r8, 0 ; kMPNoErr - mr r9, r31 ; ptr to new AddressSpace - b @return - -@fail_OOM_again - lwz r8,Area.ID(r31) - -@fail_toomanycalls - bl DeleteID - mr r8, r31 - bl PoolFree - li r8, kMPInsufficientResourcesErr - b @return - -@fail_MakeID - mr r8, r31 - bl PoolFree - -@fail_OOM - li r8, -29294 - b @return - -@fail_notcgrp - li r8, kMPInvalidIDErr - -@return - mtlr r30 - blr - - - - DeclareMPCall 71, MPCall_71 - -MPCall_71 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, AddressSpace.kIDClass - - bne ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - lwz r16, Area.ProcessID(r31) - cmpwi r16, 0x00 - bne ReleaseAndReturnMPCallOOM - addi r16, r31, 0x10 - lwz r17, 0x0018(r31) - cmpw r16, r17 - bne ReleaseAndReturnMPCallOOM - addi r16, r31, 0x20 - lwz r17, Area.LogicalEnd(r31) - cmpw r16, r17 - bne ReleaseAndReturnMPCallOOM - lwz r8, 0x0074(r31) - -; 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 - - lwz r17, 0x0018(r8) - addi r17, r17, -0x01 - stw r17, 0x0018(r8) - lwz r8, Area.ID(r31) - bl DeleteID - mr r8, r31 - bl PoolFree - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - -; KCCurrentAddressSpace - - - DeclareMPCall 117, KCCurrentAddressSpace - -KCCurrentAddressSpace ; OUTSIDE REFERER - mfsprg r16, 0 - lwz r17, EWA.PA_CurAddressSpace(r16) - lwz r3, AddressSpace.ID(r17) - b CommonMPCallReturnPath - - - -; KCHomeAddressSpace - - - DeclareMPCall 118, KCHomeAddressSpace - -KCHomeAddressSpace ; OUTSIDE REFERER - mfsprg r16, 0 - lwz r17, EWA.PA_CurTask(r16) - lwz r18, Task.OwningProcessPtr(r17) - lwz r19, Process.SystemAddressSpacePtr(r18) - lwz r3, AddressSpace.ID(r19) - b CommonMPCallReturnPath - - - -; KCSetTaskAddressSpace - - - DeclareMPCall 119, KCSetTaskAddressSpace - -KCSetTaskAddressSpace ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - bl LookupID - mr r31, r8 - cmpwi r9, Task.kIDClass - bne ReleaseAndReturnMPCallInvalidIDErr - - lwz r16, Task.Flags(r31) - mtcr r16 - - li r3, kMPTaskAbortedErr - beq cr7, ReleaseAndReturnMPCall - bne cr5, ReleaseAndReturnMPCallOOM - lbz r16, 0x0018(r31) - cmpwi r16, 0x00 - bne ReleaseAndReturnMPCallOOM - mr r8, r4 - -; 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 r30, r8 - lwz r16, 0x0060(r31) - cmpwi r9, 0x08 - lwz r17, 0x0074(r30) - bne ReleaseAndReturnMPCallInvalidIDErr - cmpw r16, r17 - bne ReleaseAndReturnMPCallOOM - lwz r17, 0x0070(r31) - lwz r16, 0x000c(r17) - addi r16, r16, -0x01 - stw r16, 0x000c(r17) - lwz r16, 0x000c(r30) - addi r16, r16, 0x01 - stw r16, 0x000c(r30) - stw r30, 0x0070(r31) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - -; This MP call does some of the heavy lifting for the MPLibrary function -; of the same name. No pages are mapped into the Area. - -; ARG AddressSpaceID r3 (optional) -; long r4 PTEConfig -; long r5 length -; long r6 LogicalSeparation -; long r7 flagsAndMinAlign -; char *r8 LogicalBase -; RET r3 OSErr -; char *r8 LogicalBase -; AreaID r9 - -; Hint: in the 9.2.2 System MPLibrary, MPCreateArea calls a syscall -; wrapper function at code offset 0x7fa8, with arguments pointing to save -; locations for r8 and r9. - - DeclareMPCall 72, MPCreateArea - -MPCreateArea - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - ; If !r3 then use the current address space - mr. r8, r3 - mfsprg r28, 0 - lwz r30, EWA.PA_CurAddressSpace(r28) - beq @use_current_space - - ; ... else use the one specified. - bl LookupID - cmpwi r9, AddressSpace.kIDClass - mr r30, r8 - bne ReleaseAndReturnMPCallInvalidIDErr -@use_current_space - - ; Allocate the new Area - li r8, Area.Size - bl PoolAllocClear - mr. r31, r8 - beq ReleaseAndScrambleMPCall - - ; Populate - stw r30, Area.AddressSpacePtr(r31) - - stw r4, Area.PTEConfig(r31) - - stw r5, Area.Length(r31) - - lwz r8, ContextBlock.r6(r6) - stw r8, Area.LogicalSeparation(r31) - - lwz r8, ContextBlock.r7(r6) - stw r8, Area.FlagsAndMinAlign(r31) - - lwz r8, ContextBlock.r8(r6) - stw r8, Area.LogicalBase(r31) - - ; "Create" the area - mr r8, r31 - bl createarea - - _AssertAndRelease PSA.SchLock, scratch=r16 - - mr. r3, r9 - bne @error - - ; CreateArea returned successfully - lwz r8, Area.LogicalBase(r31) - stw r8, ContextBlock.r8(r6) - - lwz r8, Area.ID(r31) - stw r8, ContextBlock.r9(r6) - - b CommonMPCallReturnPath - -@error - bl PoolFree - b CommonMPCallReturnPath - - - -; This function actually gets passed its own structure. -; What the frick? - -; Always returns via ReturnFromCreateArea - -; ARG Area *r8 -; RET ID r8, osErr r9 - -createarea ; OUTSIDE REFERER - - ; Always returns via ReturnFromCreateArea - mflr r16 - mfsprg r9, 0 - stw r16, EWA.CreateAreaSavedLR(r9) - stmw r25, EWA.CreateAreaSavedR25(r9) - - ; Keep the structure itself in r31 for the duration. - ; r8 must be used for other things - mr r31, r8 - - ; For if we need to return early - li r9, paramErr - - - lwz r16, Area.Flags(r31) - lwz r17, 0x0020(r31) - rlwinm. r16, r16, 0, 28, 28 - - lisori r16, 0xfffc13e0 ; if bit 28 = 0 - beq @use_other - lisori r16, 0xfff99be0 ; if bit 28 = 1 -@use_other - - and. r16, r16, r17 - bne ReturnFromCreateArea - - andi. r16, r17, 0x1f - cmpwi cr1, r16, 0x0c - beq createarea_0x50 - blt cr1, ReturnFromCreateArea - -createarea_0x50 - bne createarea_0x5c - ori r17, r17, 0x0c - stw r17, 0x0020(r31) - -createarea_0x5c - andi. r16, r17, 0x1f - li r18, -0x01 - slw r18, r18, r16 - stw r18, 0x0078(r31) - rlwinm. r16, r17, 27, 27, 31 - bne ReturnFromCreateArea - addi r16, r16, 0x0c - li r18, -0x01 - slw r18, r18, r16 - stw r18, 0x007c(r31) - neg r16, r18 - not r19, r18 - stw r16, 0x0068(r31) - lwz r16, Area.Length(r31) - add r16, r16, r19 - and. r16, r16, r18 - stw r16, Area.Length(r31) - beq ReturnFromCreateArea - lwz r18, 0x001c(r31) - lis r16, -0x01 - ori r16, r16, 0xff10 - and. r16, r16, r18 - bne ReturnFromCreateArea - lwz r16, 0x0070(r31) - li r17, 0x200 - rlwimi r17, r16, 0, 0, 19 - bl major_0x10cb8 - stw r16, 0x0070(r31) - stw r17, 0x0074(r31) - mr r8, r31 - - li r9, Area.kIDClass - bl MakeID - cmpwi r8, 0 - beq major_0x10320 - - stw r8, Area.ID(r31) - mfsprg r16, 0 - lwz r17, -0x0008(r16) - lwz r18, 0x0060(r17) - lwz r30, Area.AddressSpacePtr(r17) - stw r18, Area.ProcessID(r31) - lwz r16, Area.AddressSpacePtr(r31) - lwz r17, 0x0000(r16) - stw r17, Area.AddressSpaceID(r31) - lwz r16, 0x0008(r30) - rlwinm. r16, r16, 0, 30, 30 - bne major_0x10320_0x64 - lis r16, 0x4152 - ori r16, r16, 0x4541 - stw r16, Area.Signature(r31) - lwz r17, 0x0020(r31) - lwz r16, Area.LogicalSeparation(r31) - addi r16, r16, 0xfff - rlwinm r16, r16, 0, 0, 19 - stw r16, Area.LogicalSeparation(r31) - rlwinm r16, r17, 0, 17, 18 - cmplwi cr7, r16, 0x6000 - rlwinm. r16, r17, 0, 17, 17 - beq cr7, createarea_0x150 - bne createarea_0x150 - crset cr7_gt - crclr cr7_lt - -createarea_0x150 - rlwinm. r16, r17, 0, 17, 18 - lwz r18, Area.LogicalBase(r31) - lwz r19, Area.Length(r31) - blt cr7, createarea_0x16c - bne createarea_0x170 - li r18, 0x00 - b createarea_0x170 - -createarea_0x16c - subf r18, r19, r18 - -createarea_0x170 - lwz r16, 0x0078(r31) - and r18, r18, r16 - stw r18, Area.LogicalBase(r31) - add r16, r18, r19 - addi r16, r16, -0x01 - stw r16, Area.LogicalEnd(r31) - - - ; Major hint here... - - _log ' CreateArea [ ' - mr r8, r18 - bl Printw - mr r8, r16 - bl Printw - _log '] ID ' - - - lwz r8, Area.ID(r31) - mr r8, r8 - bl Printw - - - bgt cr7, createarea_0x1f4 - blt cr7, createarea_0x218 - _log 'placed' - b createarea_0x234 - -createarea_0x1f4 - _log 'placed at or above' - b createarea_0x234 - -createarea_0x218 - _log 'placed below' - -createarea_0x234 - lwz r8, Area.AddressSpacePtr(r31) - lwz r16, Area.LogicalEnd(r31) - lwz r9, Area.LogicalBase(r31) - cmplw r9, r16 - bge major_0x10320_0x64 - bl FindAreaAbove - mr r30, r8 - lwz r14, Area.LogicalBase(r31) - lwz r15, Area.LogicalEnd(r31) - lwz r16, Area.LogicalSeparation(r31) - lwz r17, 0x0024(r30) - lwz r18, 0x0028(r30) - lwz r19, 0x0030(r30) - lwz r21, Area.AddressSpacePtr(r31) - cmpwi r17, -0x01 - add r8, r15, r16 - add r9, r15, r19 - beq createarea_0x2b8 - cmplw r8, r17 - cmplw cr1, r9, r17 - bge createarea_0x28c - blt cr1, createarea_0x2b8 - -createarea_0x28c - beq cr7, major_0x10320_0x64 - _log ' ... bc search^n' - bgt cr7, createarea_0x34c - b createarea_0x31c - -createarea_0x2b8 - addi r21, r21, 0x20 - lwz r20, 0x0060(r30) - cmpw r20, r21 - beq createarea_0x39c - addi r20, r20, -0x54 - lwz r17, 0x0024(r20) - lwz r18, 0x0028(r20) - lwz r19, 0x0030(r20) - add r8, r18, r16 - add r9, r18, r19 - cmplw r8, r14 - cmplw cr1, r9, r14 - bge createarea_0x2f0 - blt cr1, createarea_0x374 - -createarea_0x2f0 - beq cr7, major_0x10320_0x64 - _log ' ... ab search^n' - bgt cr7, createarea_0x34c - b createarea_0x31c - -createarea_0x31c - subf r8, r19, r17 - subf r9, r16, r17 - cmplw r8, r9 - lwz r21, Area.Length(r31) - ble createarea_0x334 - mr r8, r9 - -createarea_0x334 - subf r8, r21, r8 - cmplw r8, r14 - addi r18, r8, 0x01 - lwz r19, Area.Length(r31) - bge major_0x10320_0x64 - b createarea_0x170 - -createarea_0x34c - add r8, r18, r19 - add r9, r18, r16 - lwz r20, 0x0078(r31) - cmplw r8, r9 - neg r21, r20 - bge createarea_0x368 - mr r8, r9 - -createarea_0x368 - add r18, r8, r21 - lwz r19, Area.Length(r31) - b createarea_0x170 - -createarea_0x374 - addi r19, r31, 0x54 - addi r20, r20, 0x54 - lwz r16, 0x0000(r20) - stw r16, 0x0000(r19) - lwz r16, 0x0008(r20) - stw r16, 0x0008(r19) - stw r20, 0x000c(r19) - stw r19, 0x000c(r16) - stw r19, 0x0008(r20) - b createarea_0x3b8 - -createarea_0x39c - addi r19, r31, 0x54 - stw r20, 0x0000(r19) - InsertAsNext r19, r20, scratch=r16 - -createarea_0x3b8 - addi r16, r31, 0x90 - InitList r16, 'fenc', scratch=r17 - lwz r16, 0x0020(r31) - lwz r17, Area.Flags(r31) - rlwinm. r8, r16, 0, 16, 16 - bne createarea_0x64c - rlwinm. r8, r17, 0, 25, 25 - bne createarea_0x41c - lwz r8, Area.Length(r31) - rlwinm r8, r8, 22, 10, 29 - mr r29, r8 - -; r1 = kdp -; r8 = size - bl PoolAllocClear -; r8 = ptr - - cmpwi r8, 0x00 - stw r8, 0x0040(r31) - beq createarea_0x460 - lwz r9, Area.Length(r31) - srwi r9, r9, 12 - bl major_0x10284 - lwz r17, Area.Flags(r31) - ori r17, r17, 0x10 - stw r17, Area.Flags(r31) - -createarea_0x41c - lwz r17, Area.Flags(r31) - andi. r8, r17, 0x88 - lwz r8, Area.Length(r31) - bne createarea_0x45c - rlwinm r8, r8, 21, 11, 30 - mr r29, r8 - -; r1 = kdp -; r8 = size - bl PoolAllocClear -; r8 = ptr - - cmpwi r8, 0x00 - stw r8, 0x003c(r31) - beq createarea_0x460 - lwz r9, Area.Length(r31) - srwi r9, r9, 12 - bl major_0x102a8 - lwz r16, Area.Flags(r31) - ori r16, r16, 0x01 - stw r16, Area.Flags(r31) - -createarea_0x45c - b createarea_0x64c - -createarea_0x460 - cmpwi r29, 0xfd8 - ble major_0x10320_0x20 - - _Lock PSA.PoolLock, scratch1=r16, scratch2=r17 - - lwz r17, Area.Flags(r31) - li r27, 0x00 - rlwinm. r8, r17, 0, 25, 25 - bne createarea_0x4b4 - lwz r27, Area.Length(r31) - srwi r27, r27, 12 - cmpwi r27, 0x400 - ble createarea_0x4ac - ori r17, r17, 0x20 - stw r17, Area.Flags(r31) - addi r27, r27, 0x400 - -createarea_0x4ac - addi r27, r27, 0x3ff - srwi r27, r27, 10 - -createarea_0x4b4 - lwz r8, Area.Flags(r31) - li r29, 0x00 - rlwinm. r9, r8, 0, 28, 28 - bne createarea_0x4e8 - lwz r29, Area.Length(r31) - srwi r29, r29, 12 - cmpwi r29, 0x800 - ble createarea_0x4e0 - ori r8, r8, 0x02 - stw r8, Area.Flags(r31) - addi r29, r29, 0x800 - -createarea_0x4e0 - addi r29, r29, 0x7ff - srwi r29, r29, 11 - -createarea_0x4e8 - lwz r18, PSA.FreePageCount(r1) - add. r8, r27, r29 - ble major_0x102c8 - cmpw r8, r18 - bgt major_0x102c8 - lwz r16, PSA.FreePageCount(r1) - lwz r17, PSA.UnheldFreePageCount(r1) - subf r16, r8, r16 - subf r17, r8, r17 - stw r16, PSA.FreePageCount(r1) - stw r17, PSA.UnheldFreePageCount(r1) - mr. r18, r27 - beq createarea_0x5a0 - lwz r16, PSA.FreeList + LLL.Next(r1) - RemoveFromList r16, scratch1=r17, scratch2=r19 - addi r18, r18, -0x01 - stw r16, 0x0040(r31) - cmpwi r18, 0x00 - lwz r17, PSA.FreeList + LLL.Next(r1) - mr r8, r16 - subi r16, r16, 4 - bgt createarea_0x564 - li r9, 0x400 - bl major_0x10284 - b createarea_0x5a0 - -createarea_0x564 - RemoveFromList r17, scratch1=r19, scratch2=r20 - addi r18, r18, -0x01 - stwu r17, 0x0004(r16) - mr r8, r17 - li r9, 0x400 - bl major_0x10284 - lwz r17, PSA.FreeList + LLL.Next(r1) - cmpwi r18, 0x00 - bgt createarea_0x564 - -createarea_0x5a0 - mr. r18, r29 - beq createarea_0x62c - lwz r16, PSA.FreeList + LLL.Next(r1) - RemoveFromList r16, scratch1=r17, scratch2=r19 - addi r18, r18, -0x01 - stw r16, 0x003c(r31) - cmpwi r18, 0x00 - lwz r17, PSA.FreeList + LLL.Next(r1) - mr r8, r16 - subi r16, r16, 4 - bgt createarea_0x5f0 - li r9, 0x800 - bl major_0x102a8 - b createarea_0x62c - -createarea_0x5f0 - RemoveFromList r17, scratch1=r19, scratch2=r20 - addi r18, r18, -0x01 - stwu r17, 0x0004(r16) - mr r8, r17 - li r9, 0x800 - bl major_0x102a8 - lwz r17, PSA.FreeList + LLL.Next(r1) - cmpwi r18, 0x00 - bgt createarea_0x5f0 - -createarea_0x62c - _AssertAndRelease PSA.PoolLock, scratch=r16 - -createarea_0x64c - lwz r16, Area.Flags(r31) - rlwinm. r8, r16, 0, 28, 28 - beq createarea_0x67c - lwz r16, 0x0044(r31) - addi r17, r31, 0x44 - stw r16, 0x0000(r17) - InsertAsPrev r17, r16, scratch=r18 - b major_0x10320_0x94 - -createarea_0x67c - addi r16, r31, 0x44 - InitList r16, 'AKA ', scratch=r17 - b major_0x10320_0x94 - - - -major_0x10284 ; OUTSIDE REFERER - subi r8, r8, 4 - addi r9, r9, -0x01 - lwz r20, 0x0074(r31) - ori r20, r20, 0x200 - -major_0x10284_0x10 - cmpwi r9, noErr - stwu r20, 0x0004(r8) - addi r9, r9, -0x01 - bgt major_0x10284_0x10 - blr - - - -major_0x102a8 ; OUTSIDE REFERER - addi r8, r8, -0x02 - addi r9, r9, -0x01 - li r20, 0x7fff - -major_0x102a8_0xc - cmpwi r9, noErr - sthu r20, 0x0002(r8) - addi r9, r9, -0x01 - bgt major_0x102a8_0xc - blr - - - -major_0x102c8 ; OUTSIDE REFERER - _AssertAndRelease PSA.PoolLock, scratch=r16 - addi r30, r8, 0x08 - lwz r8, PSA._420(r1) - -; r8 = id - bl LookupID - cmpwi r9, Notification.kIDClass - - mr r26, r8 - bne major_0x10320_0x20 - li r8, 0x02 - stw r8, 0x0010(r26) - stw r30, 0x0014(r26) - li r29, 0x00 - stw r29, 0x0018(r26) - mr r30, r26 - bl CauseNotification - b major_0x10320_0x20 - - - -major_0x10320 ; OUTSIDE REFERER - mr r8, r31 - li r9, -29294 - b ReturnFromCreateArea - - ; Dead code: - lwz r8, Area.ID(r31) - bl DeleteID - mr r8, r31 - li r9, kMPInvalidIDErr - b ReturnFromCreateArea - -major_0x10320_0x20 ; OUTSIDE REFERER - addi r19, r31, 0x54 - RemoveFromList r19, scratch1=r16, scratch2=r17 - lwz r16, Area.Flags(r31) - lwz r8, 0x0040(r31) - rlwinm. r16, r16, 0, 25, 25 - bne major_0x10320_0x58 - cmpwi r8, 0x00 - bnel PoolFree - -major_0x10320_0x58 - lwz r8, 0x003c(r31) - cmpwi r8, 0x00 - bnel PoolFree - -major_0x10320_0x64 ; OUTSIDE REFERER - _log ' ... skipped^n' - lwz r8, Area.ID(r31) - bl DeleteID - mr r8, r31 - li r9, kMPInsufficientResourcesErr - b ReturnFromCreateArea - -major_0x10320_0x94 ; OUTSIDE REFERER - _log ' ... created^n' - mr r8, r31 - li r9, 0x00 - - - -ReturnFromCreateArea - mfsprg r16, 0 - lwz r17, EWA.CreateAreaSavedLR(r16) - mtlr r17 - lmw r25, EWA.CreateAreaSavedR25(r16) - blr - - - -; ARG AddressSpace *r8, -; RET Area *r8 - -FindAreaAbove ; OUTSIDE REFERER - lwz r8, AddressSpace.AreaList + LLL.Next(r8) - -@loop - subi r8, r8, Area.LLL - - ; Return an area such that: - ; max(Area.LogicalBase, Area.LogicalEnd) >= r9 - lwz r16, Area.LogicalBase(r8) - lwz r17, Area.LogicalEnd(r8) - cmplw r16, r9 - cmplw cr1, r17, r9 - bgelr - bgelr cr1 - - ; Iterate over linked list - lwz r8, Area.LLL + LLL.Next(r8) - b @loop - - - -; This MP call does most of the work for the same-named MPLibrary -; function. An "alias" Area is created from a template. This code is very -; similar to regular MPCreateArea above, so differences are commented. - -; ARG AreaID r3 ; Alias-specific -; long r4 PTEConfig -; long r5 length -; long r6 LogicalSeparation -; long r7 flagsAndMinAlign -; char *r8 LogicalBase -; long r9 unknown ; Alias-specific -; RET r3 OSErr -; char *r8 LogicalBase -; AreaID r10 ; Alias-specific - -; Hint: in the 9.2.2 System MPLibrary, MPCreateAliasArea calls a syscall -; wrapper function at code offset 0x7fe8, with arguments pointing to save -; locations for r8 and r10. - - DeclareMPCall 73, MPCreateAliasArea - -MPCreateAliasArea - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - bl LookupID - cmpwi r9, Area.kIDClass - bne ReleaseAndReturnMPCallInvalidIDErr - - ; Confirm that the template Area is not itself an alias - mr r30, r8 - lwz r16, Area.Flags(r30) - rlwinm. r8, r16, 0, Area.kAliasFlag, Area.kAliasFlag - bne ReleaseAndReturnParamErrFromMPCall - - ; Allocate the new Area - li r8, Area.Size - bl PoolAllocClear - mr. r31, r8 - beq ReleaseAndScrambleMPCall - - ; Populate - mfsprg r28, 0 - lwz r8, EWA.PA_CurAddressSpace(r28) - stw r8, Area.AddressSpacePtr(r31) - - stw r3, Area.ParentAreaID(r31) ; Alias-specific - - stw r30, Area.AliasLLL + LLL.Freeform(r31) ; Alias-specific - - stw r4, Area.PTEConfig(r31) - - stw r5, Area.Length(r31) - - lwz r8, ContextBlock.r6(r6) - stw r8, Area.LogicalSeparation(r31) - - lwz r8, ContextBlock.r7(r6) - stw r8, Area.FlagsAndMinAlign(r31) - - lwz r8, ContextBlock.r8(r6) - stw r8, Area.LogicalBase(r31) - - lwz r8, ContextBlock.r9(r6) ; Alias-specific - stw r8, 0x0080(r31) - - li r8, 1 << (31 - Area.kAliasFlag) ; Alias-specific - stw r8, Area.Flags(r31) - - ; "Create" the area (everything after here is identical to MPCreateArea) - mr r8, r31 - bl createarea - - _AssertAndRelease PSA.SchLock, scratch=r16 - - mr. r3, r9 - bne @error - - ; CreateArea returned successfully - lwz r8, Area.LogicalBase(r31) - stw r8, ContextBlock.r8(r6) - - lwz r8, Area.ID(r31) - stw r8, ContextBlock.r10(r6) ; Alias-specific - - b CommonMPCallReturnPath - - ; ...or not -@error - bl PoolFree - b CommonMPCallReturnPath - - - -; Delete an Area: the eponymous MPLibrary function is a simple wrapper - -; 1. Only works on unprivileged Areas with no mapped pages. -; 2. Remove from parent address space. -; 3. Remove from template Area's alias list if applicable. -; 4. Delete the "PageMap" array if present. -; 5. Delete the "Fault Counter" array if present. -; 6. Delete the structure from the pool. - -; ARG AreaID r3 -; RET OSErr r3 - - DeclareMPCall 74, MPDeleteArea - -MPDeleteArea - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - ; Look up and validate - mr r8, r3 - bl LookupID - cmpwi r9, Area.kIDClass - bne ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - - ; If pages are still mapped in, fail with OOM - ; If area is privileged, fail with privileged - lwz r17, Area.BytesMapped(r31) - lwz r29, Area.Flags(r31) - cmpwi cr1, r17, 0 - rlwinm. r8, r29, 0, Area.kPrivilegedFlag, Area.kPrivilegedFlag - bne cr1, ReleaseAndReturnMPCallOOM - bne ReleaseAndReturnMPCallPrivilegedErr - - ; If is alias area and is not at back of queue (???), fail with OOM - rlwinm. r8, r29, 0, Area.kAliasFlag, Area.kAliasFlag - lwz r16, Area.AliasLLL + LLL.Next(r31) - bne @dont_check_for_nonempty_alias - addi r17, r31, Area.AliasLLL - cmpw r16, r17 - bne ReleaseAndReturnMPCallOOM -@dont_check_for_nonempty_alias - - ; HTAB lock wraps around all Address Space structures? - - _Lock PSA.HTABLock, scratch1=r18, scratch2=r9 - - ; Remove from parent address space - addi r16, r31, Area.LLL - RemoveFromList r16, scratch1=r17, scratch2=r18 - - ; Remove from template area's list of aliases, if necessary - rlwinm. r8, r29, 0, Area.kAliasFlag, Area.kAliasFlag - addi r16, r31, Area.AliasLLL - beq @not_alias_so_dont_remove_from_alias_list - RemoveFromList r16, scratch1=r17, scratch2=r18 -@not_alias_so_dont_remove_from_alias_list - - _AssertAndRelease PSA.HTABLock, scratch=r18 - - - ; DELETE PAGEMAP (array of [array of] per-page data) - ; There are a few cases here... - - lwz r8, Area.PageMapArrayPtr(r31) - rlwinm. r16, r29, 0, Area.kDontOwnPageMapArray, Area.kDontOwnPageMapArray - cmpwi cr1, r8, 0 - bne @no_pagemap - rlwinm. r16, r29, 0, Area.kPageMapArrayInPool, Area.kPageMapArrayInPool - beq cr1, @no_pagemap - bne @pagemap_in_pool - - - ; If PageMap occupies whole pages then return those pages - ; directly to the free list without bothering the pool - - ; (Pool lock still protects free list) - _Lock PSA.PoolLock, scratch1=r18, scratch2=r9 - - rlwinm. r16, r29, 0, Area.kPageMapArrayIs2D, Area.kPageMapArrayIs2D - beq @pagemap_is_1d - - - ; CASE: 2D array, all in whole pages - - ; r19 := size of ptr array in primary page - lwz r19, Area.Length(r31) - mr r20, r8 - srwi r19, r19, 12 - addi r19, r19, 0x3ff - srwi r19, r19, 10 - slwi r19, r19, 2 - - ; Free every second-level page - subi r19, r19, 4 -@2d_pagemap_delete_loop - lwzx r8, r19, r20 - bl free_list_add_page - cmpwi r19, 0 - subi r19, r19, 4 - bgt @2d_pagemap_delete_loop - - mr r8, r20 - - - ; COMMON CASE: single first-level page of 2D or 1D-in-whole-page case - -@pagemap_is_1d - bl free_list_add_page - - _AssertAndRelease PSA.PoolLock, scratch=r18 - - b @pagemap_deleted - - - ; CASE: 1D array in pool block (not whole page) - -@pagemap_in_pool - bl PoolFree - - -@pagemap_deleted -@no_pagemap - - - ; DELETE FAULT COUNTER ARRAY - ; Again, the code to manage the cases is tricky. - - lwz r8, Area.FaultCtrArrayPtr(r31) - rlwinm. r16, r29, 0, Area.kFaultCtrArrayInPool, Area.kFaultCtrArrayInPool - cmpwi cr1, r8, 0 - beq cr1, @no_faultctr - bne @faultctr_in_pool - - - ; Whole-page cases require us to get the Pool lock manually (for free list) - _Lock PSA.PoolLock, scratch1=r18, scratch2=r9 - - rlwinm. r16, r29, 0, Area.kFaultCtrArrayIs2D, Area.kFaultCtrArrayIs2D - beq @faultctr_is_1d - - - ; CASE: 2D array, all in whole pages - - ; Once again, r19 = the size of the primary array - lwz r19, Area.Length(r31) - mr r20, r8 - srwi r19, r19, 12 - addi r19, r19, 0x7ff - srwi r19, r19, 11 - slwi r19, r19, 2 - - ; Free every second-level page - subi r19, r19, 4 -@2d_faultctr_delete_loop - lwzx r8, r19, r20 - bl free_list_add_page - cmpwi r19, 0 - subi r19, r19, 4 - bgt @2d_faultctr_delete_loop - - mr r8, r20 - - - ; COMMON CASE: single first-level page of 2D or 1D-in-whole-page case - -@faultctr_is_1d - bl free_list_add_page - - _AssertAndRelease PSA.PoolLock, scratch=r18 - - b @faultctr_deleted - - - ; CASE: 1D array in pool block (not whole page) - -@faultctr_in_pool - bl PoolFree - - -@faultctr_deleted -@no_faultctr - - - ; Delete the struct from the pool - lwz r8, Area.ID(r31) - bl DeleteID - mr r8, r31 - bl PoolFree - - - ; Return noErr - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 75, MPCall_75 - -MPCall_75 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Area.kIDClass - - mr r31, r8 - bne ReleaseAndReturnMPCallInvalidIDErr - lwz r16, 0x0020(r31) - rlwinm. r8, r16, 0, 16, 16 - bne ReleaseAndReturnMPCallOOM - lwz r18, 0x007c(r31) - lwz r17, Area.Length(r31) - and. r5, r5, r18 - and r17, r17, r18 - ble ReleaseAndReturnParamErrFromMPCall - subf. r27, r17, r5 - -; r1 = kdp - beq ReleaseAndReturnZeroFromMPCall - bgt MPCall_75_0x1c8 - rlwinm. r8, r4, 0, 24, 24 - lwz r28, Area.LogicalBase(r31) - lwz r29, Area.LogicalEnd(r31) - bne MPCall_75_0x74 - add r28, r27, r29 - addi r28, r28, 0x01 - b MPCall_75_0x7c - -MPCall_75_0x74 - subf r29, r27, r28 - addi r29, r29, -0x01 - -MPCall_75_0x7c - - _Lock PSA.PoolLock, scratch1=r14, scratch2=r15 - - - _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 - - lwz r27, 0x0068(r31) - -MPCall_75_0xb0 - mr r8, r28 - bl MPCall_95_0x1e4 - beq Local_Panic - bl MPCall_95_0x2b0 - bns cr7, MPCall_75_0xe0 - bltl cr5, MPCall_95_0x2e0 - bltl cr5, MPCall_95_0x348 - lwz r17, 0x0000(r30) - rlwinm r17, r17, 0, 0, 30 - rlwinm r8, r17, 0, 0, 19 - stw r17, 0x0000(r30) - -; r1 = kdp -; r8 = maybe the page - bl free_list_add_page - -MPCall_75_0xe0 - add r28, r28, r27 - cmplw r28, r29 - ble MPCall_75_0xb0 - rlwinm. r8, r4, 0, 24, 24 - lwz r28, Area.LogicalBase(r31) - beq MPCall_75_0x138 - lwz r27, 0x0068(r31) - add r29, r29, r27 - -MPCall_75_0x100 - mr r8, r28 - bl MPCall_95_0x1e4 - beq Local_Panic - mr r26, r30 - mr r8, r29 - bl MPCall_95_0x1e4 - beq Local_Panic - lwz r17, 0x0000(r30) - stw r17, 0x0000(r26) - lwz r16, Area.LogicalEnd(r31) - add r28, r28, r27 - add r29, r29, r27 - cmplw r29, r16 - ble MPCall_75_0x100 - -MPCall_75_0x138 - _AssertAndRelease PSA.HTABLock, scratch=r8 - lwz r16, Area.Flags(r31) - rlwinm. r8, r16, 0, 25, 25 - bne MPCall_75_0x16c - rlwinm. r8, r16, 0, 27, 27 - bne MPCall_75_0x16c - -MPCall_75_0x16c - _AssertAndRelease PSA.PoolLock, scratch=r8 - b MPCall_75_0x190 - -MPCall_75_0x190 - rlwinm. r8, r4, 0, 24, 24 - lwz r16, Area.LogicalBase(r31) - bne MPCall_75_0x1b0 - add r17, r16, r5 - addi r17, r17, -0x01 - stw r5, Area.Length(r31) - stw r17, Area.LogicalEnd(r31) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_75_0x1b0 - lwz r17, Area.LogicalEnd(r31) - subf r16, r5, r17 - stw r5, Area.Length(r31) - addi r16, r16, 0x01 - stw r16, Area.LogicalBase(r31) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_75_0x1c8 - rlwinm. r8, r4, 0, 24, 24 - lwz r28, Area.LogicalBase(r31) - lwz r29, Area.LogicalEnd(r31) - bne ReleaseAndMPCallWasBad - add r28, r27, r29 - addi r28, r28, 0x01 - b MPCall_75_0x1ec - - ; Dead code: - subf r29, r27, r28 - subi r29, r29, 1 - -MPCall_75_0x1ec - b ReleaseAndMPCallWasBad - - - - DeclareMPCall 130, MPCall_130 - -MPCall_130 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Area.kIDClass - - bne ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - lis r16, -0x01 - ori r16, r16, 0xfff8 - lwz r17, 0x0020(r31) - and. r16, r16, r4 - bne ReleaseAndReturnParamErrFromMPCall - rlwinm. r8, r17, 0, 16, 16 - 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 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, ReleaseAndReturnParamErrFromMPCall - bgt cr2, ReleaseAndReturnParamErrFromMPCall - xor r8, r28, r29 - rlwinm. r8, r8, 0, 0, 19 - bne ReleaseAndReturnParamErrFromMPCall - - _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 - - mr r8, r29 - bl MPCall_95_0x1e4 - _AssertAndRelease PSA.HTABLock, scratch=r14 - beq Local_Panic - rlwinm r8, r16, 0, 29, 30 - lwz r16, 0x0000(r30) - cmpwi cr7, r8, 0x04 - beq cr7, ReleaseAndReturnParamErrFromMPCall - lwz r16, 0x0098(r31) - -MPCall_130_0xe8 - addi r17, r31, 0x90 - cmpw r16, r17 - addi r17, r16, 0x14 - beq MPCall_130_0x11c - lwz r8, 0x0010(r16) - cmplwi r8, 0x1f8 - add r9, r8, r17 - blt MPCall_130_0x110 - lwz r16, 0x0008(r16) - b MPCall_130_0xe8 - -MPCall_130_0x110 - addi r8, r8, 0x08 - addi r9, r9, 0x08 - b MPCall_130_0x15c - -MPCall_130_0x11c - li r8, 0x214 - -; r1 = kdp -; r8 = size - bl PoolAllocClear -; r8 = ptr - - mr. r16, r8 - beq ReleaseAndScrambleMPCall - addi r18, r31, 0x90 - lis r17, 0x4645 - ori r17, r17, 0x4e43 - stw r17, 0x0004(r16) - stw r18, 0x0000(r16) - InsertAsPrev r16, r18, scratch=r19 - li r8, 0x00 - addi r9, r16, 0x14 - -MPCall_130_0x15c - stw r8, 0x0010(r16) - stw r29, 0x0000(r9) - stw r28, 0x0004(r9) - - _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 - - mr r8, r29 - bl MPCall_95_0x1e4 - beq Local_Panic - bl MPCall_95_0x2b0 - bns cr7, MPCall_130_0x19c - bltl cr5, MPCall_95_0x2e0 - bltl cr5, MPCall_95_0x348 - -MPCall_130_0x19c - lwz r17, 0x0000(r30) - li r16, 0x06 - rlwimi r17, r16, 0, 29, 30 - stw r17, 0x0000(r30) - _AssertAndRelease PSA.HTABLock, scratch=r14 - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - -; MPSetAreaAccess - - - DeclareMPCall 76, MPSetAreaAccess - -MPSetAreaAccess ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Area.kIDClass - - bne ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - lis r16, -0x01 - ori r16, r16, 0xff10 - and. r16, r16, r4 - bne ReleaseAndReturnParamErrFromMPCall - lis r16, -0x01 - ori r16, r16, 0xff10 - and. r16, r16, r5 - bne ReleaseAndReturnParamErrFromMPCall - lwz r29, 0x0134(r6) - lwz r18, 0x013c(r6) - lwz r16, Area.LogicalBase(r31) - add r28, r18, r29 - lwz r17, 0x007c(r31) - addi r28, r28, -0x01 - lwz r18, 0x0020(r31) - lwz r19, Area.LogicalEnd(r31) - rlwinm. r8, r18, 0, 16, 16 - cmplw cr1, r29, r16 - cmplw cr2, r28, r19 - blt cr1, ReleaseAndReturnParamErrFromMPCall - bgt cr2, ReleaseAndReturnParamErrFromMPCall - bne MPSetAreaAccess_0x154 - - _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 - - -MPSetAreaAccess_0x9c - mr r8, r29 - bl MPCall_95_0x1e4 - beq Local_Panic - bl MPCall_95_0x2b0 - bns cr7, MPSetAreaAccess_0xb8 - bltl cr5, MPCall_95_0x2e0 - bltl cr5, MPCall_95_0x348 - -MPSetAreaAccess_0xb8 - lwz r17, 0x0000(r30) - bl major_0x10d38 - and r8, r4, r5 - orc r9, r4, r5 - or r18, r18, r8 - and r18, r18, r9 - lwz r17, 0x0000(r30) - rlwinm. r8, r18, 0, 26, 26 - bns cr7, MPSetAreaAccess_0x118 - bgt cr6, MPSetAreaAccess_0x118 - beq MPSetAreaAccess_0x118 - rlwinm r9, r17, 0, 0, 19 - lwz r8, 0x0068(r31) - -MPSetAreaAccess_0xec - addi r8, r8, -0x20 - dcbf r8, r9 - cmpwi r8, 0x00 - bgt MPSetAreaAccess_0xec - sync - lwz r8, 0x0068(r31) - -MPSetAreaAccess_0x104 - addi r8, r8, -0x20 - icbi r8, r9 - cmpwi r8, 0x00 - bgt MPSetAreaAccess_0x104 - isync - -MPSetAreaAccess_0x118 - bl major_0x10cb8 - lwz r19, 0x0068(r31) - stw r17, 0x0000(r30) - add r29, r29, r19 - subf. r8, r29, r28 - bge MPSetAreaAccess_0x9c - _AssertAndRelease PSA.HTABLock, scratch=r14 - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPSetAreaAccess_0x154 - bne cr1, ReleaseAndReturnParamErrFromMPCall - lwz r18, 0x001c(r31) - and r8, r4, r5 - orc r9, r4, r5 - or r18, r18, r8 - and r18, r18, r9 - stw r18, 0x001c(r31) - lwz r16, 0x0070(r31) - lwz r17, 0x0074(r31) - bl major_0x10cb8 - stw r16, 0x0070(r31) - stw r17, 0x0074(r31) - - _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 - - lwz r27, 0x0068(r31) - mr r28, r19 - -MPSetAreaAccess_0x1a4 - mr r8, r29 - lwz r9, Area.AddressSpacePtr(r31) - bl MPCall_95_0x45c - beq MPSetAreaAccess_0x1bc - bl MPCall_95_0x2e0 - bl MPCall_95_0x348 - -MPSetAreaAccess_0x1bc - add r29, r29, r27 - subf. r8, r29, r28 - bge MPSetAreaAccess_0x1a4 - _AssertAndRelease PSA.HTABLock, scratch=r14 - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - -; ARG PTE r16, PTE r17, control r18 -; RET PTE r16, PTE r17 -; CLOB CR - - -major_0x10cb8 - - rlwinm r16, r16, 0, 0xFFFFFF87 ; fill these in again... - rlwinm r17, r17, 0, 0xFFFFFF1F ; - rlwinm r16, r16, 0, 0xFFFFFFFC ; - rlwinm r17, r17, 0, 0xFFFFFFF9 ; - - - ; Load control argument into condition register - ; Note: this is a pretty expensive operation, not in hot path - - mtcr r18 - - - bge cr6, @80_not_set ; if(control & 0x80) { - ori r17, r17, 0x80 ; PTE2 |= 0x80; //set referenced bit - ori r16, r16, 0x08 ; PTE1 |= 0x08; //set guard bit -@80_not_set ; } - - - ble cr6, @40_not_set ; if(control & 0x40) { - ori r16, r16, 0x40 ; PTE1 |= 0x40; //set change bit - b @40_endif ; } else { -@40_not_set - ori r17, r17, 0x20 ; PTE2 |= 0x20; //set W bit -@40_endif ; } - - - bne cr6, @20_not_set ; if(control & 0x20) { - ori r17, r17, 0x40 ; PTE2 |= 0x40; //set change bit - ori r16, r16, 0x20 ; PTE1 |= 0x20; //set W bit -@20_not_set ; } - - - ble cr7, @04_not_set ; if(control & 0x04) { -@04_not_set ; } - - - bge cr7, @08_not_set ; if(control & 0x08) { - ori r17, r17, 0x06 ; PTE2 |= 0x06; //set leftmost protection bit and reserved bit - ori r16, r16, 0x01 ; PTE1 |= 0x01; //set rightmost protection bit - b @block_endif ; } -@08_not_set - bne cr7, @02_not_set ; else if(control & 0x02) { - ori r17, r17, 0x00 ; PTE2 |= 0x00; //useless instruction? - ori r16, r16, 0x02 ; PTE1 |= 0x02; //set second protection bit - b @block_endif ; } -@02_not_set - bns cr7, @01_not_set ; else if(control & 0x01) { - ori r17, r17, 0x04 ; PTE2 |= 0x04; //set reserved bit. - ori r16, r16, 0x03 ; PTE1 |= 0x03: //set both protection bits - b @block_endif ; } -@01_not_set ; else { - ori r17, r17, 0x02 ; PTE2 |= 0x02; //set second protection bit - ori r16, r16, 0x00 ; PTE1 |= 0x00; //useless instruction? -@block_endif ; } - - - ori r16, r16, 0x10 ; PTE1 |= 0x10; //set M bit - - - blr ; return (PTE1, PTE2); - - - -major_0x10d38 ; OUTSIDE REFERER - andi. r16, r17, 0x06 - li r18, 0x00 - cmpwi r16, 0x02 - cmpwi cr1, r16, 0x06 - beq major_0x10d38_0x28 - li r18, 0x04 - andi. r16, r17, 0x04 - ori r18, r18, 0x01 - bne major_0x10d38_0x28 - ori r18, r18, 0x02 - -major_0x10d38_0x28 - bne cr1, major_0x10d38_0x30 - ori r18, r18, 0x08 - -major_0x10d38_0x30 - andi. r16, r17, 0x20 - bne major_0x10d38_0x3c - ori r18, r18, 0x40 - -major_0x10d38_0x3c - andi. r16, r17, 0x40 - beq major_0x10d38_0x48 - ori r18, r18, 0x20 - -major_0x10d38_0x48 - andi. r16, r17, 0x80 - beq major_0x10d38_0x54 - ori r18, r18, 0x80 - -major_0x10d38_0x54 - blr - -major_0x10d38_0x58 ; OUTSIDE REFERER - andi. r16, r17, 0x03 - li r18, 0x04 - cmpwi cr1, r16, 0x01 - beq major_0x10d38_0x78 - andi. r16, r17, 0x01 - ori r18, r18, 0x01 - bne major_0x10d38_0x78 - ori r18, r18, 0x02 - -major_0x10d38_0x78 - bne cr1, major_0x10d38_0x80 - ori r18, r18, 0x08 - -major_0x10d38_0x80 - andi. r16, r17, 0x40 - beq major_0x10d38_0x8c - ori r18, r18, 0x40 - -major_0x10d38_0x8c - andi. r16, r17, 0x20 - beq major_0x10d38_0x98 - ori r18, r18, 0x20 - -major_0x10d38_0x98 - andi. r16, r17, 0x08 - beq major_0x10d38_0xa4 - ori r18, r18, 0x80 - -major_0x10d38_0xa4 - blr - - - - DeclareMPCall 123, MPCall_123 - -MPCall_123 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Area.kIDClass - - bne ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - lwz r16, Area.LogicalBase(r31) - lwz r17, Area.LogicalEnd(r31) - lwz r18, 0x0020(r31) - cmplw r4, r16 - cmplw cr1, r4, r17 - blt ReleaseAndReturnParamErrFromMPCall - bgt cr1, ReleaseAndReturnParamErrFromMPCall - rlwinm. r8, r18, 0, 16, 16 - lwz r5, 0x001c(r31) - -; r1 = kdp - bne ReleaseAndReturnZeroFromMPCall - - _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 - - mr r8, r4 - bl MPCall_95_0x1e4 - beq Local_Panic - bl MPCall_95_0x2b0 - bltl cr5, MPCall_95_0x2e0 - bltl cr5, MPCall_95_0x348 - lwz r17, 0x0000(r30) - _AssertAndRelease PSA.HTABLock, scratch=r14 - bl major_0x10d38 - mr r5, r18 - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - -; Does the blue task always get these notifications? - -; (MPLibrary function is a simple wrapper.) - -; ARG AreaID r3, NotificationID r4, long r5 -; RET OSErr r3 - - DeclareMPCall 77, MPSetAreaBackingProvider - -MPSetAreaBackingProvider - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - ; Expect Area ID in r3 - mr r8, r3 - bl LookupID - cmpwi r9, Area.kIDClass - bne ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - - ; r4 optionally contains... - mr. r8, r4 - beq @no_notification - - ; a Notification ID - bl LookupID - cmpwi r9, Notification.kIDClass - bne ReleaseAndReturnMPCallInvalidIDErr -@no_notification - - stw r4, Area.BackingProviderID(r31) - stw r5, Area.BackingProviderMisc(r31) - - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 78, MPCall_78 - -MPCall_78 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Area.kIDClass - - bne ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - cmpwi r4, 0x01 - bne ReleaseAndReturnParamErrFromMPCall - cmplwi r5, 0x00 - bne MPCall_78_0x68 - li r16, 0x01 - stw r16, 0x0134(r6) - lwz r16, Area.ProcessID(r31) - stw r16, 0x013c(r6) - lwz r16, Area.AddressSpaceID(r31) - stw r16, 0x0144(r6) - lwz r16, 0x0014(r31) - stw r16, 0x014c(r6) - li r16, 0x10 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_78_0x68 - cmplwi r5, 0x10 - bne MPCall_78_0x9c - lwz r16, 0x0018(r31) - stw r16, 0x0134(r6) - lwz r16, 0x001c(r31) - stw r16, 0x013c(r6) - lwz r16, 0x0020(r31) - stw r16, 0x0144(r6) - lwz r16, Area.LogicalBase(r31) - stw r16, 0x014c(r6) - li r16, 0x10 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_78_0x9c - cmplwi r5, 0x20 - bne MPCall_78_0xd0 - lwz r16, Area.Length(r31) - stw r16, 0x0134(r6) - lwz r16, Area.LogicalSeparation(r31) - stw r16, 0x013c(r6) - lwz r16, 0x0034(r31) - stw r16, 0x0144(r6) - lwz r16, Area.BytesMapped(r31) - stw r16, 0x014c(r6) - li r16, 0x10 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_78_0xd0 - cmplwi r5, 0x30 - bne MPCall_78_0xfc - lwz r16, 0x0068(r31) - stw r16, 0x0134(r6) - lwz r16, 0x0080(r31) - stw r16, 0x013c(r6) - lwz r16, 0x0084(r31) - stw r16, 0x0144(r6) - li r16, 0x0c - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_78_0xfc - cmpwi r5, 0x3c - bne ReleaseAndReturnParamErrFromMPCall - li r16, 0x00 - stw r16, 0x0154(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 79, MPCall_79 - -MPCall_79 ; OUTSIDE REFERER - mr. r8, r3 - mfsprg r28, 0 - lwz r31, EWA.PA_CurAddressSpace(r28) - beq MPCall_79_0x20 - -; r8 = id - bl LookupID - cmpwi r9, AddressSpace.kIDClass - - bne ReturnMPCallInvalidIDErr - mr r31, r8 - -MPCall_79_0x20 - lwz r3, Area.ID(r31) - -MPCall_79_0x24 - mr r8, r4 - li r9, 0x0b - bl GetNextIDOfClass - cmpwi r8, 0x00 - beq ReturnMPCallInvalidIDErr - mr r4, r8 - -; r8 = id - bl LookupID -; r8 = something not sure what -; r9 = 0:inval, 1:proc, 2:task, 3:timer, 4:q, 5:sema, 6:cr, 7:cpu, 8:addrspc, 9:evtg, 10:cgrp, 11:area, 12:not, 13:log - - lwz r16, 0x0010(r8) - cmpw r16, r3 - bne MPCall_79_0x24 - b ReturnZeroFromMPCall - - - - DeclareMPCall 80, MPCall_80 - -MPCall_80 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr. r8, r3 - mfsprg r9, 0 - bne MPCall_80_0x2c - lwz r8, EWA.PA_CurAddressSpace(r9) - b MPCall_80_0x38 - -MPCall_80_0x2c -; r8 = id - bl LookupID - cmpwi r9, AddressSpace.kIDClass - - bne ReleaseAndReturnMPCallInvalidIDErr - -MPCall_80_0x38 - mr r9, r4 - bl FindAreaAbove - lwz r16, 0x0024(r8) - li r5, 0x00 - cmplw r16, r4 - bgt ReleaseAndReturnParamErrFromMPCall - lwz r5, 0x0000(r8) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 125, MPCall_125 - -MPCall_125 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr. r8, r3 - mfsprg r9, 0 - bne MPCall_125_0x2c - lwz r8, EWA.PA_CurAddressSpace(r9) - b MPCall_125_0x38 - -MPCall_125_0x2c -; r8 = id - bl LookupID - cmpwi r9, AddressSpace.kIDClass - - bne ReleaseAndReturnMPCallInvalidIDErr - -MPCall_125_0x38 - mr r9, r4 - bl FindAreaAbove - lwz r16, 0x0024(r8) - li r5, 0x00 - cmplw r16, r4 - bgt MPCall_125_0x58 - lwz r8, 0x005c(r8) - addi r8, r8, -0x54 - -MPCall_125_0x58 - lwz r9, 0x002c(r8) - cmpwi r9, noErr - beq ReleaseAndReturnParamErrFromMPCall - lwz r5, 0x0000(r8) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 81, MPCall_81 - -MPCall_81 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Area.kIDClass - - mr r31, r8 - bne ReleaseAndReturnMPCallInvalidIDErr - lwz r16, Area.LogicalBase(r31) - lwz r17, Area.LogicalEnd(r31) - lwz r18, 0x0020(r31) - cmplw r4, r16 - cmplw cr1, r4, r17 - blt ReleaseAndReturnParamErrFromMPCall - bgt cr1, ReleaseAndReturnParamErrFromMPCall - rlwinm. r8, r18, 0, 16, 16 - lwz r19, 0x0070(r31) - beq MPCall_81_0x70 - lwz r17, Area.BytesMapped(r31) - rlwinm r19, r19, 0, 0, 19 - cmpwi r17, 0x00 - subf r18, r16, r4 - beq ReleaseAndReturnParamErrFromMPCall - add r5, r18, r19 - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_81_0x70 - li r3, 0x00 - - _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 - - mr r8, r4 - bl MPCall_95_0x1e4 - bl MPCall_95_0x2b0 - bns cr7, MPCall_81_0xc8 - mr r5, r17 - rlwimi r5, r4, 0, 20, 31 - -MPCall_81_0xa4 - _AssertAndRelease PSA.HTABLock, scratch=r8 - b ReleaseAndReturnMPCall - -MPCall_81_0xc8 - li r3, kMPInsufficientResourcesErr - b MPCall_81_0xa4 - - - - DeclareMPCall 98, MPCall_98 - -MPCall_98 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Area.kIDClass - - mr r31, r8 - bne ReleaseAndReturnMPCallInvalidIDErr - lwz r16, Area.LogicalBase(r31) - lwz r17, Area.LogicalEnd(r31) - mr r29, r5 - add r5, r5, r4 - lwz r18, 0x0020(r31) - addi r5, r5, -0x01 - cmplw r4, r16 - cmplw cr1, r5, r17 - 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, ReleaseAndReturnParamErrFromMPCall - lwz r19, 0x0070(r31) - subf r18, r16, r4 - rlwinm r19, r19, 0, 0, 19 - add r16, r18, r19 - stw r16, 0x0134(r6) - stw r29, 0x013c(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_98_0x84 - - _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 - - mr r8, r4 - mr r28, r4 - bl MPCall_95_0x1e4 - beq Local_Panic - bl MPCall_95_0x2b0 - crclr cr3_eq - li r3, 0x00 - bso cr7, MPCall_98_0xc4 - crset cr3_eq - li r3, kMPInsufficientResourcesErr - -MPCall_98_0xc4 - rlwimi r17, r4, 0, 20, 31 - rlwinm r29, r17, 0, 0, 19 - stw r17, 0x0134(r6) - -MPCall_98_0xd0 - lwz r16, 0x0068(r31) - add r28, r28, r16 - add r29, r29, r16 - cmplw cr2, r28, r5 - bgt cr2, MPCall_98_0x140 - mr r8, r28 - bl MPCall_95_0x1e4 - beq Local_Panic - bl MPCall_95_0x2b0 - rlwinm r17, r17, 0, 0, 19 - crxor 31, 31, 14 - bns cr7, MPCall_98_0x10c - beq cr3, MPCall_98_0xd0 - cmplw r29, r17 - beq MPCall_98_0xd0 - -MPCall_98_0x10c - lwz r16, 0x007c(r31) - and r28, r28, r16 - subf r16, r4, r28 - -MPCall_98_0x118 - stw r16, 0x013c(r6) - _AssertAndRelease PSA.HTABLock, scratch=r8 - b ReleaseAndReturnMPCall - -MPCall_98_0x140 - addi r5, r5, 0x01 - beq cr3, MPCall_98_0x170 - mr r8, r28 - bl MPCall_95_0x1e4 - beq Local_Panic - bl MPCall_95_0x2b0 - rlwinm r17, r17, 0, 0, 19 - bns cr7, MPCall_98_0x170 - cmplw r29, r17 - bne MPCall_98_0x170 - subf r16, r4, r5 - b MPCall_98_0x118 - -MPCall_98_0x170 - lwz r16, 0x007c(r31) - and r28, r28, r16 - cmplw r5, r28 - bge MPCall_98_0x184 - mr r28, r5 - -MPCall_98_0x184 - subf r16, r4, r28 - b MPCall_98_0x118 - - - - DeclareMPCall 82, MPCall_82 - -MPCall_82 ; OUTSIDE REFERER - lwz r8, PSA._420(r1) - cmpwi r8, 0x00 - bne ReturnMPCallOOM - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Notification.kIDClass - - bne ReleaseAndReturnMPCallInvalidIDErr - stw r3, PSA._420(r1) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 83, MPCall_83 - -MPCall_83 ; OUTSIDE REFERER - - _Lock PSA.PoolLock, scratch1=r16, scratch2=r17 - - bl MPCall_83_0x90 - _AssertAndRelease PSA.PoolLock, scratch=r16 - mr. r4, r8 - bne ReturnZeroFromMPCall - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - -MPCall_83_0x5c ; OUTSIDE REFERER - lwz r8, PSA._420(r1) - -; r8 = id - bl LookupID - cmpwi r9, Notification.kIDClass - - mr r31, r8 - bne ReleaseAndReturnMPCallOOM - lwz r8, 0x001c(r31) - -; r8 = id - bl LookupID - cmpwi r9, EventGroup.kIDClass - - mr r31, r8 - bne ReleaseAndReturnMPCallOOM - lwz r8, 0x0020(r31) - bl SetEvent - b ReleaseAndReturnMPCallOOM - -MPCall_83_0x90 ; OUTSIDE REFERER - addi r18, r1, PSA.FreeList - lwz r8, PSA.FreeList + LLL.Next(r1) - cmpw r8, r18 - beq MPCall_83_0xec - RemoveFromList r8, scratch1=r16, scratch2=r17 - lwz r16, PSA.FreePageCount(r1) - addi r16, r16, -0x01 - stw r16, PSA.FreePageCount(r1) - lwz r17, 0x0004(r8) - mfspr r16, dec - eqv. r17, r18, r17 - stw r16, 0x0000(r8) - bne Local_Panic - stw r16, 0x0004(r8) - stw r16, 0x0008(r8) - stw r16, 0x000c(r8) - blr - -MPCall_83_0xec - li r8, 0x00 - blr - - - - DeclareMPCall 84, MPCall_84 - -MPCall_84 ; OUTSIDE REFERER - - _Lock PSA.PoolLock, scratch1=r16, scratch2=r17 - - lwz r16, 0x0004(r3) - lwz r17, 0x0000(r3) - addi r18, r1, PSA.FreeList - eqv. r16, r16, r17 - cmpw cr1, r17, r18 - bne MPCall_84_0x3c - bne cr1, MPCall_84_0x3c - li r3, -0x32 - b MPCall_84_0x48 - -MPCall_84_0x3c - mr r8, r3 - -; r1 = kdp -; r8 = maybe the page - bl free_list_add_page - li r3, 0x00 - -MPCall_84_0x48 - _AssertAndRelease PSA.PoolLock, scratch=r16 - b CommonMPCallReturnPath - - - -; > r1 = kdp -; > r8 = maybe the page - -free_list_add_page ; OUTSIDE REFERER - - ; Must be an actual page-aligned address - clrlwi. r9, r8, 20 - addi r9, r1, PSA.FreeList - bne Local_Panic - - - ; This is probably an alternative to heavyweight locks around the free list - - stw r9, 0(r8) ; store &parent in Freeform field - - InsertAsPrev r8, r9, scratch=r16 - - not r9, r9 - stw r9, 4(r8) ; store ^&parent in Signature field - - - lwz r8, PSA.FreePageCount(r1) - addi r8, r8, 1 - stw r8, PSA.FreePageCount(r1) - - blr - - - -; KCGetFreePageCount - - - DeclareMPCall 100, KCGetFreePageCount - -KCGetFreePageCount ; OUTSIDE REFERER - lwz r3, PSA.FreePageCount(r1) - b CommonMPCallReturnPath - - - -; KCGetUnheldFreePageCount - - - DeclareMPCall 101, KCGetUnheldFreePageCount - -KCGetUnheldFreePageCount ; OUTSIDE REFERER - lwz r3, PSA.UnheldFreePageCount(r1) - b CommonMPCallReturnPath - - - -; KCMapPage - - - DeclareMPCall 85, KCMapPage - -KCMapPage ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Area.kIDClass - - bne ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - lwz r16, Area.Flags(r31) - rlwinm. r8, r16, 0, 28, 28 - bne ReleaseAndReturnParamErrFromMPCall - lwz r16, Area.LogicalBase(r31) - lwz r17, Area.LogicalEnd(r31) - lwz r19, 0x0020(r31) - cmplw r4, r16 - cmplw cr1, r4, r17 - 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, ReleaseAndReturnParamErrFromMPCall - cmpwi r20, 0x00 - lwz r8, 0x0070(r31) - bne ReleaseAndReturnMPCallOOM - rlwimi r8, r5, 0, 0, 19 - lwz r18, 0x007c(r31) - lwz r20, Area.Length(r31) - stw r8, 0x0070(r31) - stw r20, Area.BytesMapped(r31) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -KCMapPage_0x8c - - _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 - - mr r8, r4 - bl MPCall_95_0x1e4 - beq Local_Panic - lwz r29, 0x0000(r30) - _AssertAndRelease PSA.HTABLock, scratch=r14 - clrlwi. r8, r29, 0x1f - bne ReleaseAndReturnMPCallOOM - lwz r17, 0x0134(r6) - rlwinm. r8, r17, 0, 30, 30 - bne KCMapPage_0x12c - - _Lock PSA.PoolLock, scratch1=r16, scratch2=r17 - - bl MPCall_83_0x90 - _AssertAndRelease PSA.PoolLock, scratch=r16 - mr. r5, r8 - beq MPCall_83_0x5c - -KCMapPage_0x12c - lwz r17, 0x0134(r6) - rlwinm. r8, r17, 0, 29, 29 - beq KCMapPage_0x17c - rlwinm. r8, r29, 0, 25, 25 - lwz r18, 0x0068(r31) - -KCMapPage_0x140 - addi r18, r18, -0x20 - bne KCMapPage_0x174 - dcbst r18, r5 - -KCMapPage_0x14c - cmpwi cr1, r18, 0x00 - bgt cr1, KCMapPage_0x140 - sync - lwz r18, 0x0068(r31) - -KCMapPage_0x15c - addi r18, r18, -0x20 - icbi r18, r5 - cmpwi cr1, r18, 0x00 - bgt cr1, KCMapPage_0x15c - isync - b KCMapPage_0x17c - -KCMapPage_0x174 - dcbf r18, r5 - b KCMapPage_0x14c - -KCMapPage_0x17c - lwz r18, 0x0068(r31) - andi. r29, r29, 0x7e7 - ori r29, r29, 0x01 - rlwimi r29, r5, 0, 0, 19 - lwz r17, Area.BytesMapped(r31) - stw r29, 0x0000(r30) - add r17, r17, r18 - stw r17, Area.BytesMapped(r31) - lwz r17, 0x0134(r6) - clrlwi. r8, r17, 0x1f - -; r1 = kdp - beq ReleaseAndReturnZeroFromMPCall - lwz r5, 0x0068(r31) - b KCHoldPages_0x2c - - - -; KCUnmapPages - - - DeclareMPCall 86, KCUnmapPages - -KCUnmapPages ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Area.kIDClass - - bne ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - lwz r8, 0x0134(r6) - lwz r16, Area.Flags(r31) - rlwinm. r16, r16, 0, 28, 28 - bne ReleaseAndReturnParamErrFromMPCall - clrlwi. r8, r8, 0x1f - add r5, r5, r4 - lwz r16, Area.LogicalBase(r31) - lwz r17, Area.LogicalEnd(r31) - lwz r19, 0x0020(r31) - crmove 14, 2 - addi r5, r5, -0x01 - cmplw r4, r16 - cmplw cr1, r5, r17 - 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, ReleaseAndReturnParamErrFromMPCall - cmpwi r20, 0x00 - li r20, 0x00 - ble ReleaseAndReturnMPCallOOM - stw r20, Area.BytesMapped(r31) - - _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 - - li r30, 0x00 - -KCUnmapPages_0xac - mr r8, r4 - lwz r9, Area.AddressSpacePtr(r31) - bl MPCall_95_0x45c - beq KCUnmapPages_0xc4 - bl MPCall_95_0x2e0 - bl MPCall_95_0x348 - -KCUnmapPages_0xc4 - add r4, r4, r29 - subf. r8, r4, r5 - bge KCUnmapPages_0xac - crclr cr3_eq - b KCUnmapPages_0x158 - -KCUnmapPages_0xd8 - bne cr3, KCUnmapPages_0xf4 - - _Lock PSA.PoolLock, scratch1=r14, scratch2=r15 - - -KCUnmapPages_0xf4 - - _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 - - lwz r28, Area.BytesMapped(r31) - -KCUnmapPages_0x110 - mr r8, r4 - bl MPCall_95_0x1e4 - beq Local_Panic - bl MPCall_95_0x2b0 - bns cr7, KCUnmapPages_0x148 - bltl cr5, MPCall_95_0x2e0 - bltl cr5, MPCall_95_0x348 - lwz r18, 0x0000(r30) - subf r28, r29, r28 - rlwinm r18, r18, 0, 0, 30 - stw r18, 0x0000(r30) - bne cr3, KCUnmapPages_0x148 - rlwinm r8, r18, 0, 0, 19 - -; r1 = kdp -; r8 = maybe the page - bl free_list_add_page - -KCUnmapPages_0x148 - add r4, r4, r29 - subf. r8, r4, r5 - bge KCUnmapPages_0x110 - stw r28, Area.BytesMapped(r31) - -KCUnmapPages_0x158 - _AssertAndRelease PSA.HTABLock, scratch=r14 - -; r1 = kdp - bne cr3, ReleaseAndReturnZeroFromMPCall - _AssertAndRelease PSA.PoolLock, scratch=r14 - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - -; KCMakePhysicallyContiguous - - - DeclareMPCall 127, KCMakePhysicallyContiguous - -KCMakePhysicallyContiguous ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Area.kIDClass - - bne ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - mr r27, r5 - add r5, r5, r4 - lwz r16, Area.LogicalBase(r31) - lwz r17, Area.LogicalEnd(r31) - addi r5, r5, -0x01 - cmplw r4, r16 - cmplw cr1, r5, r17 - blt ReleaseAndReturnParamErrFromMPCall - bgt cr1, ReleaseAndReturnParamErrFromMPCall - lwz r19, 0x0020(r31) - lwz r29, 0x0068(r31) - rlwinm. r8, r19, 0, 16, 16 - bne ReleaseAndReturnParamErrFromMPCall - - _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 - - mr r27, r4 - li r28, -0x01 - -NKMakePhysicallyContiguous_0x80 - mr r8, r27 - bl MPCall_95_0x1e4 - beq Local_Panic - bl MPCall_95_0x2b0 - bns cr7, NKMakePhysicallyContiguous_0x150 - rlwinm r8, r17, 0, 0, 19 - cmpwi r28, -0x01 - cmpw cr1, r28, r8 - mr r28, r8 - beq NKMakePhysicallyContiguous_0xac - bne cr1, NKMakePhysicallyContiguous_0xe0 - -NKMakePhysicallyContiguous_0xac - add r27, r27, r29 - add r28, r28, r29 - subf. r8, r27, r5 - bge NKMakePhysicallyContiguous_0x80 - _AssertAndRelease PSA.HTABLock, scratch=r14 - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -NKMakePhysicallyContiguous_0xe0 - _AssertAndRelease PSA.HTABLock, scratch=r14 - - _Lock PSA.PoolLock, scratch1=r16, scratch2=r17 - - addi r18, r1, PSA.FreeList - lwz r8, PSA.FreeList + LLL.Next(r1) - cmpw r8, r18 - beq NKMakePhysicallyContiguous_0x174 - b NKMakePhysicallyContiguous_0x174 - - ; Dead code: - _AssertAndRelease PSA.PoolLock, scratch=r16 - b ReleaseAndReturnZeroFromMPCall - -NKMakePhysicallyContiguous_0x150 - _AssertAndRelease PSA.HTABLock, scratch=r16 - b ReleaseAndReturnMPCallOOM - -NKMakePhysicallyContiguous_0x174 - _AssertAndRelease PSA.PoolLock, scratch=r16 - b ReleaseAndReturnMPCallOOM - - - -; KCLockPages - - - DeclareMPCall 87, KCLockPages - -KCLockPages ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Area.kIDClass - - bne ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - mr r27, r5 - add r5, r5, r4 - lwz r16, Area.LogicalBase(r31) - lwz r17, Area.LogicalEnd(r31) - addi r5, r5, -0x01 - cmplw r4, r16 - cmplw cr1, r5, r17 - blt ReleaseAndReturnParamErrFromMPCall - bgt cr1, ReleaseAndReturnParamErrFromMPCall - lwz r19, 0x0020(r31) - lwz r29, 0x0068(r31) - rlwinm. r8, r19, 0, 16, 16 - bne ReleaseAndReturnParamErrFromMPCall - mr r27, r4 - li r28, 0x00 - -KCLockPages_0x68 - mr r8, r27 - bl MPCall_95_0x254 - beq ReleaseAndReturnParamErrFromMPCall - lhz r18, 0x0000(r30) - rlwinm r17, r18, 24, 25, 31 - rlwinm. r8, r18, 0, 16, 16 - cmpwi cr1, r17, 0x7f - addi r28, r28, 0x01 - beq KCLockPages_0x94 - addi r28, r28, -0x01 - bge cr1, major_0x0b0cc - -KCLockPages_0x94 - add r27, r27, r29 - subf. r8, r27, r5 - bge KCLockPages_0x68 - - _Lock PSA.PoolLock, scratch1=r16, scratch2=r17 - - lwz r16, PSA.UnheldFreePageCount(r1) - subf. r16, r28, r16 - ble KCLockPages_0xc8 - stw r16, PSA.UnheldFreePageCount(r1) - -KCLockPages_0xc8 - _AssertAndRelease PSA.PoolLock, scratch=r16 - ble ReleaseAndReturnMPCallOOM - mr r27, r4 - -KCLockPages_0xf0 - mr r8, r27 - bl MPCall_95_0x254 - beq Local_Panic - lhz r18, 0x0000(r30) - rlwinm. r17, r18, 0, 16, 16 - bne KCLockPages_0x10c - li r18, -0x8000 - -KCLockPages_0x10c - rlwinm r17, r18, 24, 25, 31 - addi r17, r17, 0x01 - rlwimi r18, r17, 8, 17, 23 - sth r18, 0x0000(r30) - add r27, r27, r29 - subf. r8, r27, r5 - bge KCLockPages_0xf0 - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - -; KCUnlockPages - - - DeclareMPCall 88, KCUnlockPages - -KCUnlockPages ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Area.kIDClass - - bne ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - add r5, r5, r4 - lwz r16, Area.LogicalBase(r31) - lwz r17, Area.LogicalEnd(r31) - addi r5, r5, -0x01 - cmplw r4, r16 - cmplw cr1, r5, r17 - blt ReleaseAndReturnParamErrFromMPCall - bgt cr1, ReleaseAndReturnParamErrFromMPCall - lwz r19, 0x0020(r31) - lwz r29, 0x0068(r31) - rlwinm. r8, r19, 0, 16, 16 - bne ReleaseAndReturnParamErrFromMPCall - mr r27, r4 - -KCUnlockPages_0x60 - mr r8, r27 - bl MPCall_95_0x254 - beq ReleaseAndReturnParamErrFromMPCall - lhz r18, 0x0000(r30) - rlwinm r17, r18, 24, 25, 31 - rlwinm. r8, r18, 0, 16, 16 - cmpwi cr1, r17, 0x00 - beq major_0x0b0cc - addi r28, r28, 0x01 - beq cr1, major_0x0b0cc - add r27, r27, r29 - subf. r8, r27, r5 - bge KCUnlockPages_0x60 - li r28, 0x00 - -KCUnlockPages_0x98 - mr r8, r4 - bl MPCall_95_0x254 - beq ReleaseAndReturnParamErrFromMPCall - lhz r18, 0x0000(r30) - rlwinm r17, r18, 24, 25, 31 - addi r17, r17, -0x01 - rlwimi r18, r17, 8, 17, 23 - clrlwi. r8, r18, 0x11 - bne KCUnlockPages_0xc4 - rlwinm r18, r18, 0, 17, 15 - addi r28, r28, 0x01 - -KCUnlockPages_0xc4 - sth r18, 0x0000(r30) - add r4, r4, r29 - subf. r8, r4, r5 - bge KCUnlockPages_0x98 - - _Lock PSA.PoolLock, scratch1=r16, scratch2=r17 - - lwz r16, PSA.UnheldFreePageCount(r1) - add r16, r16, r28 - stw r16, PSA.UnheldFreePageCount(r1) - _AssertAndRelease PSA.PoolLock, scratch=r16 - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - -; KCHoldPages - - - DeclareMPCall 89, KCHoldPages - -KCHoldPages ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Area.kIDClass - - bne ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - -KCHoldPages_0x2c ; OUTSIDE REFERER - add r5, r5, r4 - lwz r16, Area.LogicalBase(r31) - lwz r17, Area.LogicalEnd(r31) - addi r5, r5, -0x01 - cmplw r4, r16 - cmplw cr1, r5, r17 - blt ReleaseAndReturnParamErrFromMPCall - bgt cr1, ReleaseAndReturnParamErrFromMPCall - lwz r19, 0x0020(r31) - lwz r29, 0x0068(r31) - rlwinm. r8, r19, 0, 16, 16 - bne ReleaseAndReturnParamErrFromMPCall - mr r27, r4 - li r28, 0x00 - -KCHoldPages_0x64 - mr r8, r27 - bl MPCall_95_0x254 - beq ReleaseAndReturnParamErrFromMPCall - lhz r18, 0x0000(r30) - clrlwi r17, r18, 0x18 - rlwinm. r8, r18, 0, 16, 16 - cmpwi cr1, r17, 0xff - addi r28, r28, 0x01 - beq KCHoldPages_0x90 - addi r28, r28, -0x01 - bge cr1, major_0x0b0cc - -KCHoldPages_0x90 - add r27, r27, r29 - subf. r8, r27, r5 - bge KCHoldPages_0x64 - - _Lock PSA.PoolLock, scratch1=r16, scratch2=r17 - - lwz r16, PSA.UnheldFreePageCount(r1) - subf. r16, r28, r16 - ble KCHoldPages_0xc4 - stw r16, PSA.UnheldFreePageCount(r1) - -KCHoldPages_0xc4 - _AssertAndRelease PSA.PoolLock, scratch=r16 - ble ReleaseAndReturnMPCallOOM - mr r27, r4 - -KCHoldPages_0xec - mr r8, r27 - bl MPCall_95_0x254 - beq Local_Panic - lhz r18, 0x0000(r30) - rlwinm. r17, r18, 0, 16, 16 - bne KCHoldPages_0x108 - li r18, -0x8000 - -KCHoldPages_0x108 - clrlwi r17, r18, 0x18 - addi r17, r17, 0x01 - rlwimi r18, r17, 0, 24, 31 - sth r18, 0x0000(r30) - add r27, r27, r29 - subf. r8, r27, r5 - bge KCHoldPages_0xec - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - -; KCUnholdPages - - - DeclareMPCall 90, KCUnholdPages - -KCUnholdPages ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Area.kIDClass - - bne ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - add r5, r5, r4 - lwz r16, Area.LogicalBase(r31) - lwz r17, Area.LogicalEnd(r31) - addi r5, r5, -0x01 - cmplw r4, r16 - cmplw cr1, r5, r17 - blt ReleaseAndReturnParamErrFromMPCall - bgt cr1, ReleaseAndReturnParamErrFromMPCall - lwz r19, 0x0020(r31) - lwz r29, 0x0068(r31) - rlwinm. r8, r19, 0, 16, 16 - bne ReleaseAndReturnParamErrFromMPCall - mr r27, r4 - -KCUnholdPages_0x60 - mr r8, r27 - bl MPCall_95_0x254 - beq ReleaseAndReturnParamErrFromMPCall - lhz r18, 0x0000(r30) - clrlwi r17, r18, 0x18 - rlwinm. r8, r18, 0, 16, 16 - cmpwi cr1, r17, 0x00 - beq major_0x0b0cc - addi r28, r28, 0x01 - beq cr1, major_0x0b0cc - add r27, r27, r29 - subf. r8, r27, r5 - bge KCUnholdPages_0x60 - li r28, 0x00 - -KCUnholdPages_0x98 - mr r8, r4 - bl MPCall_95_0x254 - beq ReleaseAndReturnParamErrFromMPCall - lhz r18, 0x0000(r30) - clrlwi r17, r18, 0x18 - addi r17, r17, -0x01 - rlwimi r18, r17, 0, 24, 31 - clrlwi. r8, r18, 0x11 - bne KCUnholdPages_0xc4 - rlwinm r18, r18, 0, 17, 15 - addi r28, r28, 0x01 - -KCUnholdPages_0xc4 - sth r18, 0x0000(r30) - add r4, r4, r29 - subf. r8, r4, r5 - bge KCUnholdPages_0x98 - - _Lock PSA.PoolLock, scratch1=r16, scratch2=r17 - - lwz r16, PSA.UnheldFreePageCount(r1) - add r16, r16, r28 - stw r16, PSA.UnheldFreePageCount(r1) - _AssertAndRelease PSA.PoolLock, scratch=r16 - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 91, MPCall_91 - -MPCall_91 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Area.kIDClass - - bne ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - lwz r16, Area.LogicalBase(r31) - lwz r17, Area.LogicalEnd(r31) - cmplw r4, r16 - cmplw cr1, r4, r17 - blt ReleaseAndReturnParamErrFromMPCall - bgt cr1, ReleaseAndReturnParamErrFromMPCall - - _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 - - mr r8, r4 - bl MPCall_95_0x1e4 - beq MPCall_91_0xcc - bl MPCall_95_0x2b0 - bltl cr5, MPCall_95_0x2e0 - bltl cr5, MPCall_95_0x348 - lwz r29, 0x0000(r30) - _AssertAndRelease PSA.HTABLock, scratch=r14 - mr r8, r4 - bl MPCall_95_0x254 - li r19, 0x00 - beq MPCall_91_0xac - lhz r19, 0x0000(r30) - -MPCall_91_0xac - andi. r5, r29, 0x319 - rlwinm. r8, r19, 0, 16, 16 - rlwimi r5, r19, 0, 16, 16 - -; r1 = kdp - beq ReleaseAndReturnZeroFromMPCall - rlwinm. r8, r19, 0, 17, 23 - -; r1 = kdp - beq ReleaseAndReturnZeroFromMPCall - ori r5, r5, 0x4000 - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_91_0xcc - _AssertAndRelease PSA.HTABLock, scratch=r14 - b ReleaseAndReturnMPCallOOM - - - - DeclareMPCall 92, MPCall_92 - -MPCall_92 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Area.kIDClass - - bne ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - lwz r16, Area.Flags(r31) - rlwinm. r8, r16, 0, 28, 28 - bne ReleaseAndReturnParamErrFromMPCall - lwz r29, 0x0134(r6) - li r8, 0x318 - andc. r9, r5, r8 - bne ReleaseAndReturnParamErrFromMPCall - andc. r9, r29, r8 - bne ReleaseAndReturnParamErrFromMPCall - lwz r16, Area.LogicalBase(r31) - lwz r17, Area.LogicalEnd(r31) - cmplw r4, r16 - cmplw cr1, r4, r17 - blt ReleaseAndReturnParamErrFromMPCall - bgt cr1, ReleaseAndReturnParamErrFromMPCall - - _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 - - mr r8, r4 - bl MPCall_95_0x1e4 - beq MPCall_92_0xd8 - bl MPCall_95_0x2b0 - bns cr7, MPCall_92_0x9c - bltl cr5, MPCall_95_0x2e0 - bltl cr5, MPCall_95_0x348 - -MPCall_92_0x9c - lwz r16, 0x0000(r30) - and r8, r5, r29 - orc r9, r5, r29 - or r16, r16, r8 - and r16, r16, r9 - stw r16, 0x0000(r30) - _AssertAndRelease PSA.HTABLock, scratch=r14 - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_92_0xd8 - _AssertAndRelease PSA.HTABLock, scratch=r14 - b ReleaseAndReturnMPCallOOM - - - - DeclareMPCall 93, MPCall_93 - -MPCall_93 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Area.kIDClass - - bne ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - lwz r16, Area.LogicalBase(r31) - lwz r17, Area.LogicalEnd(r31) - cmplw r4, r16 - cmplw cr1, r4, r17 - blt ReleaseAndReturnParamErrFromMPCall - bgt cr1, ReleaseAndReturnParamErrFromMPCall - mr r8, r4 - bl MPCall_95_0x254 - beq ReleaseAndReturnParamErrFromMPCall - lhz r18, 0x0000(r30) - rlwinm. r8, r18, 0, 16, 16 - li r5, 0x00 - -; r1 = kdp - bne ReleaseAndReturnZeroFromMPCall - clrlwi r5, r18, 0x11 - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 94, MPCall_94 - -MPCall_94 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Area.kIDClass - - bne ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - lwz r16, Area.LogicalBase(r31) - lwz r17, Area.LogicalEnd(r31) - cmplw r4, r16 - cmplw cr1, r4, r17 - blt ReleaseAndReturnParamErrFromMPCall - bgt cr1, ReleaseAndReturnParamErrFromMPCall - mr r8, r4 - bl MPCall_95_0x254 - beq ReleaseAndReturnParamErrFromMPCall - cmplwi r5, 0x7fff - bgt ReleaseAndReturnParamErrFromMPCall - lhz r18, 0x0000(r30) - rlwinm. r8, r18, 0, 16, 16 - bne ReleaseAndReturnMPCallOOM - rlwimi r18, r5, 0, 17, 31 - sth r18, 0x0000(r30) - - _Lock PSA.HTABLock, scratch1=r16, scratch2=r17 - - mr r8, r4 - bl MPCall_95_0x1e4 - beq Local_Panic - bl MPCall_95_0x2b0 - bns cr7, MPCall_94_0xa0 - bltl cr5, MPCall_95_0x2e0 - bltl cr5, MPCall_95_0x348 - -MPCall_94_0xa0 - _AssertAndRelease PSA.HTABLock, scratch=r16 - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 129, MPCall_129 - -MPCall_129 ; OUTSIDE REFERER - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - mr r8, r3 - -; r8 = id - bl LookupID - cmpwi r9, Area.kIDClass - - bne ReleaseAndReturnMPCallInvalidIDErr - mr r31, r8 - lwz r16, Area.LogicalBase(r31) - lwz r17, Area.LogicalEnd(r31) - cmplw r4, r16 - cmplw cr1, r4, r17 - blt ReleaseAndReturnParamErrFromMPCall - bgt cr1, ReleaseAndReturnParamErrFromMPCall - mr r8, r4 - bl MPCall_95_0x254 - beq ReleaseAndReturnParamErrFromMPCall - lhz r18, 0x0000(r30) - li r5, 0x00 - rlwinm. r8, r18, 0, 16, 16 - li r16, 0x00 - beq MPCall_129_0x6c - rlwinm r16, r18, 24, 25, 31 - clrlwi r5, r18, 0x18 - -MPCall_129_0x6c - stw r16, 0x0134(r6) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - - - - DeclareMPCall 95, MPCall_95 - -MPCall_95 ; OUTSIDE REFERER - or. r8, r3, r4 - bne MPCall_95_0x44 - li r16, 0x00 - stw r16, 0x06b4(r1) - _log 'Areas capability probe detected^n' - b ReturnParamErrFromMPCall - -MPCall_95_0x44 - - _Lock PSA.SchLock, scratch1=r16, scratch2=r17 - - li r28, -0x01 - li r4, 0x00 - li r5, 0x00 - lwz r8, PSA.UnheldFreePageCount(r1) - cmpwi r8, 0x00 - ble ReleaseAndReturnMPCallOOM - lwz r27, PSA.DecClockRateHzCopy(r1) - srwi r27, r27, 15 - mfspr r8, dec - subf r27, r27, r8 - lwz r8, PSA.OtherSystemAddrSpcPtr2(r1) - lwz r9, PSA.ZeroedByInitFreeList3(r1) - mr r30, r9 - bl FindAreaAbove - mr r31, r8 - lwz r29, Area.LogicalBase(r31) - cmplw r29, r30 - bgt MPCall_95_0xa8 - mr r29, r30 - -MPCall_95_0xa8 - crset cr2_eq - -MPCall_95_0xac - mfspr r9, dec - subf. r9, r27, r9 - blt MPCall_95_0x1c8 - -MPCall_95_0xb8 - lwz r8, 0x0020(r31) - lwz r9, 0x0018(r31) - rlwinm. r8, r8, 0, 16, 16 - cmpwi cr1, r3, 0x00 - bne MPCall_95_0x19c - beq cr1, MPCall_95_0xe0 - cmpwi cr3, r9, 0x00 - beq cr3, MPCall_95_0xe0 - cmpw cr1, r9, r3 - bne cr1, MPCall_95_0x19c - -MPCall_95_0xe0 - lwz r9, Area.Flags(r31) - rlwinm. r8, r9, 0, 28, 28 - bne MPCall_95_0x19c - rlwinm. r8, r9, 0, 23, 23 - bne MPCall_95_0x19c - - _Lock PSA.HTABLock, scratch1=r16, scratch2=r17 - - mr r8, r29 - bl MPCall_95_0x1e4 - beq Local_Panic - _AssertAndRelease PSA.HTABLock, scratch=r16 - lwz r16, 0x0000(r30) - clrlwi. r8, r16, 0x1f - beq MPCall_95_0x180 - mr r8, r29 - bl MPCall_95_0x254 - beq MPCall_95_0x1c8 - lhz r17, 0x0000(r30) - rlwinm. r8, r17, 0, 16, 16 - clrlwi r17, r17, 0x11 - bne MPCall_95_0x180 - cmpw r17, r28 - crclr cr2_eq - ble MPCall_95_0x180 - mr r28, r17 - lwz r4, Area.ID(r31) - cmplwi r17, 0x7fff - mr r5, r29 - bge MPCall_95_0x1c8 - -MPCall_95_0x180 - lwz r8, 0x0068(r31) - lwz r9, Area.LogicalEnd(r31) - add r29, r29, r8 - subf. r9, r9, r29 - bge MPCall_95_0x19c - bne cr2, MPCall_95_0xac - b MPCall_95_0xb8 - -MPCall_95_0x19c - lwz r8, 0x0054(r31) - lwz r9, 0x005c(r31) - cmpw r8, r9 - addi r31, r9, -0x54 - lwz r29, Area.LogicalBase(r31) - bne MPCall_95_0x1c0 - lwz r9, 0x0008(r8) - addi r31, r9, -0x54 - lwz r29, Area.LogicalBase(r31) - -MPCall_95_0x1c0 - bne cr2, MPCall_95_0xac - b MPCall_95_0xb8 - -MPCall_95_0x1c8 - cmpwi r4, 0x00 - stw r29, PSA.ZeroedByInitFreeList3(r1) - beq ReleaseAndReturnMPCallOOM - lwz r8, 0x0068(r31) - add r8, r8, r5 - stw r8, PSA.ZeroedByInitFreeList3(r1) - -; r1 = kdp - b ReleaseAndReturnZeroFromMPCall - -MPCall_95_0x1e4 ; OUTSIDE REFERER - lwz r16, Area.LogicalBase(r31) - lwz r18, Area.Flags(r31) - lwz r30, 0x0040(r31) - subf r17, r16, r8 - -MPCall_95_0x1f4 - cmpwi r30, 0x00 - rlwinm r17, r17, 22, 10, 29 - beqlr - rlwinm. r16, r18, 0, 26, 26 - rlwinm r16, r17, 22, 20, 29 - beq MPCall_95_0x214 - rlwinm r17, r17, 0, 20, 29 - lwzx r30, r30, r16 - -MPCall_95_0x214 - add. r30, r30, r17 - blr - - ; Dead code: - lwz r16, Area.LogicalBase(r31) - lwz r18, Area.Flags(r31) - lwz r30, 0x0040(r31) - rlwinm. r17, r18, 0, 28, 28 - subf r17, r16, r8 - beq MPCall_95_0x1f4 - lwz r30, Area.AliasLLL(r31) - lwz r18, 0x80(r31) - subi r30, r30, Area.AliasLLL - subf r17, r16, r8 - add r17, r17, r18 - lwz r18, Area.Flags(r30) - lwz r30, Area.PageMapArrayPtr(r30) - b MPCall_95_0x1f4 - -MPCall_95_0x254 ; OUTSIDE REFERER - lwz r16, Area.LogicalBase(r31) - lwz r18, Area.Flags(r31) - lwz r30, 0x003c(r31) - rlwinm. r17, r18, 0, 28, 28 - subf r17, r16, r8 - beq MPCall_95_0x288 - lwz r30, 0x0044(r31) - lwz r18, 0x0080(r31) - addi r30, r30, -0x44 - subf r17, r16, r8 - add r17, r17, r18 - lwz r18, 0x0008(r30) - lwz r30, 0x003c(r30) - -MPCall_95_0x288 - cmpwi r30, 0x00 - rlwinm r17, r17, 21, 11, 30 - beqlr - rlwinm. r16, r18, 0, 30, 30 - rlwinm r16, r17, 22, 20, 29 - beq MPCall_95_0x2a8 - rlwinm r17, r17, 0, 20, 30 - lwzx r30, r30, r16 - -MPCall_95_0x2a8 - add. r30, r30, r17 - blr - -MPCall_95_0x2b0 ; OUTSIDE REFERER - lwz r19, 0x0000(r30) - lwz r18, 0x06a4(r1) - mtcrf 0x07, r19 - rlwinm r17, r19, 0, 0, 19 - rlwinm r16, r19, 23, 9, 28 - bnslr cr7 - bgelr cr5 - lwzux r16, r18, r16 - lwz r17, 0x0004(r18) - mtcrf 0x80, r16 - bge Local_Panic - blr - -MPCall_95_0x2e0 ; OUTSIDE REFERER - mfspr r14, pvr - clrlwi r16, r16, 0x01 - rlwinm. r14, r14, 0, 0, 14 - stw r16, 0x0000(r18) - sync - tlbie r8 - beq MPCall_95_0x304 - sync - tlbsync - -MPCall_95_0x304 - sync - isync - cmpwi r30, 0x00 - lwz r14, 0x0000(r30) - lwz r17, 0x0004(r18) - oris r16, r16, 0x8000 - beqlr - rlwimi r14, r17, 29, 27, 27 - rlwimi r14, r17, 27, 28, 28 - mtcrf 0x07, r14 - stw r14, 0x0000(r30) - blr - -MPCall_95_0x334 - stw r17, 0x0004(r18) - eieio - stw r16, 0x0000(r18) - sync - blr - -MPCall_95_0x348 ; OUTSIDE REFERER - lwz r14, 0x0000(r30) - - _InvalNCBPointerCache scratch=r16 - - lwz r16, 0x0e98(r1) - rlwinm r14, r14, 0, 21, 19 - addi r16, r16, 0x01 - stw r16, 0x0e98(r1) - rlwimi r14, r17, 0, 0, 19 - cmpwi r30, 0x00 - li r16, 0x00 - li r17, 0x00 - beq MPCall_95_0x334 - stw r14, 0x0000(r30) - b MPCall_95_0x334 - -V2P ; OUTSIDE REFERER - mr. r19, r9 - mfsprg r17, 0 - bne MPCall_95_0x39c - lwz r19, EWA.PA_CurAddressSpace(r17) - -MPCall_95_0x39c - addi r18, r19, 0x80 - lwz r16, 0x0000(r18) - li r19, -0x01 - rlwimi r19, r16, 15, 0, 14 - xor r17, r8, r16 - andc. r17, r17, r19 - beq MPCall_95_0x444 - lwzu r16, 0x0008(r18) - rlwimi r19, r16, 15, 0, 14 - xor r17, r8, r16 - andc. r17, r17, r19 - beq MPCall_95_0x444 - lwzu r16, 0x0008(r18) - rlwimi r19, r16, 15, 0, 14 - xor r17, r8, r16 - andc. r17, r17, r19 - beq MPCall_95_0x444 - lwzu r16, 0x0008(r18) - rlwimi r19, r16, 15, 0, 14 - xor r17, r8, r16 - andc. r17, r17, r19 - beq MPCall_95_0x444 - lwzu r16, 0x0008(r18) - rlwimi r19, r16, 15, 0, 14 - xor r17, r8, r16 - andc. r17, r17, r19 - beq MPCall_95_0x444 - lwzu r16, 0x0008(r18) - rlwimi r19, r16, 15, 0, 14 - xor r17, r8, r16 - andc. r17, r17, r19 - beq MPCall_95_0x444 - lwzu r16, 0x0008(r18) - rlwimi r19, r16, 15, 0, 14 - xor r17, r8, r16 - andc. r17, r17, r19 - beq MPCall_95_0x444 - lwzu r16, 0x0008(r18) - rlwimi r19, r16, 15, 0, 14 - xor r17, r8, r16 - andc. r17, r17, r19 - bne MPCall_95_0x45c - -MPCall_95_0x444 - andi. r17, r16, 0x01 - rlwinm r19, r19, 0, 8, 19 - lwzu r17, 0x0004(r18) - and r19, r8, r19 - or r17, r17, r19 - bnelr - -MPCall_95_0x45c ; OUTSIDE REFERER - cmpwi r9, noErr - addi r16, r9, 0x30 - beq MPCall_95_0x474 - rlwinm r17, r8, 6, 26, 29 - lwzx r17, r16, r17 - b MPCall_95_0x478 - -MPCall_95_0x474 - mfsrin r17, r8 - -MPCall_95_0x478 - rlwinm r16, r8, 10, 26, 31 - rlwimi r16, r17, 7, 1, 24 - rlwinm r9, r8, 26, 10, 25 - oris r16, r16, 0x8000 - rlwinm r17, r17, 6, 7, 25 - xor r9, r9, r17 - lwz r17, 0x06a0(r1) - lwz r18, 0x06a4(r1) - and r9, r9, r17 - or. r18, r18, r9 - -MPCall_95_0x4a0 - lwz r17, 0x0000(r18) - lwz r9, 0x0008(r18) - cmpw cr6, r16, r17 - lwz r17, 0x0010(r18) - cmpw cr7, r16, r9 - lwzu r9, 0x0018(r18) - bne cr6, MPCall_95_0x4c4 - -MPCall_95_0x4bc - lwzu r17, -0x0014(r18) - blr - -MPCall_95_0x4c4 - cmpw cr6, r16, r17 - lwzu r17, 0x0008(r18) - beq cr7, MPCall_95_0x4bc - cmpw cr7, r16, r9 - lwzu r9, 0x0008(r18) - beq cr6, MPCall_95_0x4bc - cmpw cr6, r16, r17 - lwzu r17, 0x0008(r18) - beq cr7, MPCall_95_0x4bc - cmpw cr7, r16, r9 - lwzu r9, 0x0008(r18) - beq cr6, MPCall_95_0x4bc - cmpw cr6, r16, r17 - lwzu r17, -0x000c(r18) - beqlr cr7 - cmpw cr7, r16, r9 - lwzu r17, 0x0008(r18) - beqlr cr6 - lwzu r17, 0x0008(r18) - beqlr cr7 - lwz r17, 0x06a0(r1) - xori r16, r16, 0x40 - andi. r9, r16, 0x40 - addi r18, r18, -0x3c - xor r18, r18, r17 - bne MPCall_95_0x4a0 - blr diff --git a/NanoKernel/NKAddressSpaces.s b/NanoKernel/NKAddressSpaces.s new file mode 100644 index 0000000..07e1684 --- /dev/null +++ b/NanoKernel/NKAddressSpaces.s @@ -0,0 +1,4801 @@ + ##### ###### ### +# # ##### ## #### ###### # # ## # # # #### # #### # ## # # ##### +# # # # # # # # # # # # ## # # # # # # # # # ## # # # + ##### # # # # # ##### ###### # # # # # # # # #### # # # # # # # # + # ##### ###### # # # ###### # # # # # # # # ###### # # # # # +# # # # # # # # # # # # ## # # # # # # # # # # ## # # + ##### # # # #### ###### # # # # # # #### ### #### ###### # # # # ##### + +SpacePanicIsland + b panic + + + +### ####### ###### # + # # # # ##### # ##### ###### ###### # # ## #### ###### # # #### ##### + # ## # # # # # # # # # # # # # # # # # # # + # # # # # # ##### # # ##### ##### ###### # # # ##### # # #### # + # # # # # # # ##### # # # ###### # ### # # # # # + # # ## # # # # # # # # # # # # # # # # # # +### # # # # # # # ###### ###### # # # #### ###### ####### # #### # + +InitFreePageList + addi r9, r1, PSA.FreeList + + InitList r9, 'PHYS', scratch=r8 + + li r8, 0 + stw r8, PSA.FreePageCount(r1) + stw r8, PSA.UnheldFreePageCount(r1) + stw r8, PSA.ZeroedByInitFreeList3(r1) + + lwz r8, PSA.OtherSystemAddrSpcPtr(r1) + stw r8, PSA.OtherSystemAddrSpcPtr2(r1) + + blr + + + + ##### # ####### ###### # # +# # ##### ###### ## ##### ###### # # ##### ###### ## #### # ##### #### # # # # ## #### ###### ## ## ## ##### +# # # # # # # # # # # # # # # # # # # # # ## ## # # # # # # # # # # # # # # # +# # # ##### # # # ##### # # # # ##### # # #### ##### # # # # # ## # ###### # # # ##### # # # # # # # +# ##### # ###### # # ####### ##### # ###### # # ##### # # # # # ###### # ### # # # ###### ##### +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + ##### # # ###### # # # ###### # # # # ###### # # #### # # # #### # # # # # #### ###### # # # # # + +; Pretty obvious from log output. + +CreateAreasFromPageMap + + ; The kind of crap we have to do without a stack + mflr r16 + mfcr r17 + stw r16, EWA.SpacesSavedLR(r1) + stw r17, EWA.SpacesSavedCR(r1) + + _log 'Converting PMDTs to areas^n' + + lwz r17, PSA.UnheldFreePageCount(r1) + lwz r16, KDP.TotalPhysicalPages(r1) + add r17, r17, r16 + stw r17, PSA.UnheldFreePageCount(r1) + + +;_______________________________________________________________________ +; Code to increment a loop that: +; iterates over segmap entries, and +; iterates over PMDTs, starting at the one +; ref'd by the segmap entry +;_______________________________________________________________________ + + addi r27, r1, KDP.SegMaps - 8 + lis r26, 0 + +@next_segment_entry + _wlog 'SEGMENT ', r26, '^n' + + lwzu r25, 8(r27) + + b @this_pmdt +@next_pmdt + addi r25, r25, PMDT.Size +@this_pmdt + + +;_______________________________________________________________________ +; Now we enter the loop body: +; r27 points to segmap entry +; r25 points to the PMDT +; r26 equals the base address of this segment +;_______________________________________________________________________ + + + ; Load the contents of the PMDT. + + lwz r17, PMDT.PBaseAndFlags(r25) + _wlog ' PMDT PBaseAndFlags ', r17, ' ' + + lhz r15, PMDT.LBase(r25) + _wlogh 'LBase ', r15, ' ' + + andi. r8, r17, $800 | $400 | $200 ; interested in 3 PBase flags + + lhz r16, PMDT.PageCount(r25) + _wlogh 'PageCount ', r16, '^n', scratch=r9 ; cannot clobber r8 here + + + ; Based on those flags, do one of two things + cmplwi r8, 0 + cmplwi cr1, r8, $800 | $400 + beq @pmdt_flags_are_zero + beq cr1, @pmdt_flags_are_c00 + + ; Else if not a full-segment PMDT, next PMDT + cmplwi cr2, r15, 0x0000 + cmplwi cr3, r16, 0xffff + bne cr2, @next_pmdt + bne cr3, @next_pmdt + + ; Else if there are segments remaining (16 total), next segment. + addis r26, r26, 0x1000 + cmplwi r26, 0 ; once it wraps to zero, we're done + bne @next_segment_entry + + ; Else create special one-page Areas to catch naughty pointer derefs, + ; then return. + + ; 61F168F1 (magic bus error incantation) + + li r8, Area.Size + bl PoolAllocClear + mr. r31, r8 + beq SpacePanicIsland + + lwz r8, EWA.PA_CurAddressSpace(r1) + stw r8, Area.AddressSpacePtr(r31) + + lisori r15, 0x68f168f1 + stw r15, Area.LogicalBase(r31) + + li r16, 0x1000 + stw r16, Area.Length(r31) + + lisori r8, 0x00008000 + stw r8, Area.LogicalSeparation(r31) + + li r8, 0 + stw r8, 0x001c(r31) + + lisori r8, 0x0000e00c + stw r8, 0x0020(r31) + + mr r8, r31 + bl CreateArea + + cmpwi r9, noErr + beq @success_68f168f1 + mr r8, r31 + bl PoolFree +@success_68f168f1 + + + ; DEADBEEF (all over the place) + + li r8, Area.Size + bl PoolAllocClear + mr. r31, r8 + beq SpacePanicIsland + + lwz r8, EWA.PA_CurAddressSpace(r1) + stw r8, Area.AddressSpacePtr(r31) + + lisori r15, 0xdeadbeef + stw r15, Area.LogicalBase(r31) + + li r16, 0x1000 + stw r16, Area.Length(r31) + + lisori r8, 0x00008000 + stw r8, Area.LogicalSeparation(r31) + + li r8, 0 + stw r8, 0x001c(r31) + + lisori r8, 0x0000e00c + stw r8, 0x0020(r31) + + mr r8, r31 + bl CreateArea + + cmpwi r9, noErr + beq @success_deadbeef + mr r8, r31 + bl PoolFree +@success_deadbeef + + + ; Done -- return. + lwz r16, EWA.SpacesSavedLR(r1) + lwz r17, EWA.SpacesSavedCR(r1) + mtlr r16 + mtcr r17 + blr + + + ; ONE OF THE "FLAGS" CASES: all tests bits unset + +@pmdt_flags_are_zero + _clog ' pmdt_flags_are_zero^n' + + ; Apparently other iterations leave this to find? + lwz r8, EWA.SpacesDeferredAreaPtr(r1) + cmpwi r8, 0 + beq @thing_is_zero + + bl CreateArea + cmpwi r9, noErr + bne SpacePanicIsland + + li r8, 0 + stw r8, EWA.SpacesDeferredAreaPtr(r1) +@thing_is_zero + + + + li r8, Area.Size + bl PoolAllocClear + mr. r31, r8 + beq SpacePanicIsland + + ; Reload PMDT details + lwz r17, PMDT.PBaseAndFlags(r25) + lhz r15, PMDT.LBase(r25) + lhz r16, PMDT.PageCount(r25) + + ; Why do we need to sign the area? Isn't it 'AREA'? + lisori r8, 'area' + stw r8, Area.Signature(r31) + + ; Set r15/r16 to true logical base/length + slwi r15, r15, 12 + addi r16, r16, 1 + add r15, r15, r26 ; add a page, I think + slwi r16, r16, 12 + + lwz r8, KDP.NanoKernelInfo + NKNanoKernelInfo.blueProcessID(r1) + stw r8, Area.ProcessID(r31) + + lwz r8, EWA.PA_CurAddressSpace(r1) + stw r8, Area.AddressSpacePtr(r31) + + stw r15, Area.LogicalBase(r31) + + stw r16, Area.Length(r31) + stw r16, Area.BytesMapped(r31) + + li r8, 0 + stw r8, Area.LogicalSeparation(r31) + + lwz r18, 0x007c(r31) + rlwinm r9, r17, 0, 0, 19 + stw r9, 0x0070(r31) + andi. r16, r17, 0x03 + bne @_20c + ori r17, r17, 0x02 +@_20c + + bl major_0x10d38_0x58 + stw r18, 0x001c(r31) + + +@_214 + + + + lisori r8, 0x0000e00c + stw r8, 0x0020(r31) + + + ; Try to create the Area. If we succeed then do the next PMDT. + mr r8, r31 + bl CreateArea + cmpwi r9, noErr + mr r31, r8 + beq @next_pmdt + + ; If CreateArea failed, assume that it was due to overlap with another Area. + + ; Find that AboveArea that we impinged on (=> r24). + lwz r9, Area.LogicalBase(r31) + lwz r8, Area.AddressSpacePtr(r31) + bl FindAreaAbove + mr r24, r8 + + ; Shorten our FailedArea to fit below AboveArea. + lwz r15, Area.LogicalBase(r31) + lwz r16, Area.LogicalBase(r24) + lwz r17, Area.LogicalEnd(r31) + subf. r16, r15, r16 ; r16 = offset of found area from this one + stw r17, EWA.SpacesSavedAreaBase(r1) ; ??? + stw r16, Area.Length(r31) ; we will try again, with no overlap + + beq @found_area_has_same_base + + ; If FoundArea < FailedArea, panic (impossible for FindAreaAbove to return this) + bltl SpacePanicIsland ; below would be impossible + + ; If AboveArea > FailedArea, create NewArea (=> r30) + mr r8, r31 + bl CreateArea + + cmpwi r9, noErr ; strike three + mr r30, r8 + bnel SpacePanicIsland + + ; If AboveArea.LogicalEnd >= FailedArea.LogicalEnd then continue to next PMDT. + lwz r15, Area.LogicalEnd(r24) + lwz r16, EWA.SpacesSavedAreaBase(r1) + subf. r16, r15, r16 + ble @next_pmdt + + ; Else replace FailedArea with an Area copied from NewArea + li r8, Area.Size + bl PoolAllocClear + mr. r31, r8 + beq SpacePanicIsland + + li r8, Area.Size - 4 +@area_copy_loop + lwzx r9, r8, r30 + stwx r9, r8, r31 + cmpwi r8, 0 + subi r8, r8, 4 + bgt @area_copy_loop +@found_area_has_same_base + + ; Else (AboveArea == ThisArea), do nothing special (endif) + + + lwz r9, Area.LogicalBase(r31) + + lwz r15, 0x0028(r24) + lwz r16, EWA.SpacesSavedAreaBase(r1) ; this is FailedArea.LogicalEnd + subf. r16, r15, r16 + addi r15, r15, 1 + blel SpacePanicIsland + + stw r16, Area.Length(r31) + stw r15, Area.LogicalBase(r31) + subf r9, r9, r15 + lwz r8, 0x0070(r31) + add r8, r8, r9 + stw r8, 0x0070(r31) + b @_214 + + + + +@pmdt_flags_are_c00 + _clog ' pmdt_flags_are_c00^n' + li r8, Area.Size + bl PoolAllocClear + mr. r31, r8 + beq SpacePanicIsland + + lwz r17, 0x0004(r25) + lhz r15, 0x0000(r25) + lhz r16, 0x0002(r25) + lis r8, 0x6172 + ori r8, r8, 0x6561 + stw r8, Area.Signature(r31) + slwi r15, r15, 12 + addi r16, r16, 0x01 + add r15, r15, r26 + slwi r16, r16, 12 + lwz r8, 0x0ec0(r1) + stw r8, Area.ProcessID(r31) + lwz r8, EWA.PA_CurAddressSpace(r1) + stw r8, Area.AddressSpacePtr(r31) + stw r15, Area.LogicalBase(r31) + stw r16, Area.Length(r31) + stw r16, Area.BytesMapped(r31) + li r8, 0x00 + stw r8, Area.LogicalSeparation(r31) + li r8, 0x07 + stw r8, 0x001c(r31) + lis r8, 0x00 + ori r8, r8, 0x600c + stw r8, 0x0020(r31) + rlwinm r8, r17, 22, 0, 29 + stw r8, 0x0040(r31) + lwz r8, Area.Flags(r31) + ori r8, r8, 0x40 + lwz r9, PSA.FreePageCount(r1) + cmpwi r9, noErr + + bgt @_374 + ori r8, r8, 0x80 +@_374 + + stw r8, Area.Flags(r31) + cmpwi r15, 0x00 + + bne @_388 + stw r31, EWA.SpacesDeferredAreaPtr(r1) + b @next_pmdt +@_388 + + lwz r18, EWA.SpacesDeferredAreaPtr(r1) + cmpwi r18, 0x00 + beq @_3c8 + lwz r8, 0x0024(r18) + lwz r9, 0x002c(r18) + add r19, r8, r9 + cmplw r19, r15 + bne @_3c8 + add r9, r9, r16 + addi r19, r9, -0x01 + stw r9, 0x002c(r18) + stw r9, 0x0038(r18) + stw r19, 0x0028(r18) + mr r8, r31 + bl PoolFree + b @next_pmdt +@_3c8 + + lwz r8, Area.Flags(r31) + ori r8, r8, 0x80 + stw r8, Area.Flags(r31) + mr r8, r31 + bl CreateArea + cmpwi r9, noErr + bne SpacePanicIsland + b @next_pmdt + + + +# # ###### ##### ###### ##### ##### +## ## # # # # ###### ##### # # ## #### ###### # # # ###### ###### # # # ## #### #### ###### #### +# # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # ###### # #### ##### # ###### # # # ##### ##### # # ##### # # # # #### #### ##### #### +# # # # # # # # ###### # ### # # # # # # # ###### # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # ##### ###### # # # # #### ###### ##### # ###### ###### ##### ###### # # #### #### ###### #### + +; The number of page size classes, 1 to n. + +; MPPageSizeClass MPGetPageSizeClasses(void ) + +; Straight MPLibrary wrapper: yes +; In Universal Interfaces: yes + + DeclareMPCall 68, MPGetPageSizeClasses + +MPGetPageSizeClasses + + li r3, 1 + b CommonMPCallReturnPath + + + +# # ###### ##### ###### ##### +## ## # # # # ###### ##### # # ## #### ###### # # # ###### ###### +# # # # # # # # # # # # # # # # # # # # +# # # ###### # #### ##### # ###### # # # ##### ##### # # ##### +# # # # # # # # ###### # ### # # # # # +# # # # # # # # # # # # # # # # # # +# # # ##### ###### # # # # #### ###### ##### # ###### ###### + +; The page size in bytes. + +; ByteCount MPGetPageSize(MPPageSizeClass pageClass) + +; Straight MPLibrary wrapper: yes +; In Universal Interfaces: yes + + DeclareMPCall 69, MPGetPageSize + +MPGetPageSize + + cmpwi r3, 1 + bne ReturnParamErrFromMPCall + + lwz r3, KDP.ProcessorInfo + NKProcessorInfo.PageSize(r1) + b CommonMPCallReturnPath + + + +# # ###### ##### # ##### +## ## # # # # ##### ###### ## ##### ###### # # ##### ##### ##### ###### #### #### # # ##### ## #### ###### +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # ###### # # # ##### # # # ##### # # # # # # # # ##### #### #### ##### # # # # # ##### +# # # # ##### # ###### # # ####### # # # # ##### # # # # ##### ###### # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # ##### # # ###### # # # ###### # # ##### ##### # # ###### #### #### ##### # # # #### ###### + +; ARG MPCoherenceID r3 +; RET OSStatus r3, MPAddressSpaceID r4 + +; Straight MPLibrary wrapper: no +; In Universal Interfaces: no + + DeclareMPCall 70, MPCreateAddressSpace + +MPCreateAddressSpace + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mfsprg r16, 0 + lwz r17, EWA.PA_CurTask(r16) + + mr r8, r3 + + lwz r9, Area.AddressSpacePtr(r17) + lwz r16, AddressSpace.Flags(r9) + rlwinm. r16, r16, 0, AddressSpace.kFlag30, AddressSpace.kFlag30 + bne ReleaseAndReturnMPCallOOM + + bl NKCreateAddressSpaceSub + + _AssertAndRelease PSA.SchLock, scratch=r16 + + mr. r3, r8 + li r4, 0 + bne CommonMPCallReturnPath ; failure + + lwz r4, AddressSpace.ID(r9) + b CommonMPCallReturnPath ; success + + + +# # # # ##### # ##### ##### +## # # # # # ##### ###### ## ##### ###### # # ##### ##### ##### ###### #### #### # # ##### ## #### ###### # # # # ##### +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # ### # # # ##### # # # ##### # # # # # # # # ##### #### #### ##### # # # # # ##### ##### # # ##### +# # # # # # ##### # ###### # # ####### # # # # ##### # # # # ##### ###### # # # # # # # +# ## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # ##### # # ###### # # # ###### # # ##### ##### # # ###### #### #### ##### # # # #### ###### ##### #### ##### + +; ARG MPCoherenceID r8 owningcgrp ; 0 to use mobo cgrp +; Process *r9 owningPROC + +; RET osErr r8 +; AddressSpace *r9 + +NKCreateAddressSpaceSub + cmpwi r8, 0 + mr r27, r9 ; Save the process arg for later + mflr r30 + + ; Use the motherboard coherence group if none is provided in r8 + bne @cgrp_provided + mfsprg r15, 0 + lwz r28, EWA.CPUBase + CPU.LLL + LLL.Freeform(r15) + + b @got_cgrp + +@cgrp_provided + bl LookupID ; takes id in r8, returns ptr in r8 and kind in r9 + + cmpwi r9, CoherenceGroup.kIDClass + mr r28, r8 + bne @fail_notcgrp + lwz r28, CoherenceGroup.LLL + LLL.Next(r28) + +@got_cgrp + + + ; Read the SpecialPtr of this cgrp element in list of the owning CpuStruct + ; But why? cgrp.LLL.Freeform does not seem to be set for the mobo cgrp + lwz r29, LLL.Freeform(r28) + + + ; Boast (including the SpecialPtr) + _log 'NKCreateAddressSpaceSub - group at 0x' + + mr r8, r28 + bl printw + + mr r8, r29 + bl printw + + _log '^n' + + + ; Create the AddressSpace + li r8, AddressSpace.Size + bl PoolAllocClear + mr. r31, r8 + beq @fail_OOM + + + ; Give the addr spc a copy of the SpecialPtr of its parent cgrp + stw r29, AddressSpace.ParentCoherenceSpecialPtr(r31) + + + ; Give the addr spc an ID + li r9, AddressSpace.kIDClass + bl MakeID + + cmpwi r8, 0x00 + beq @fail_MakeID + + stw r8, AddressSpace.ID(r31) + + + ; Increment a counter in the cgrp (modulo a million, fail on overflow) + lwz r16, CoherenceGroup.Incrementer(r28) + addi r16, r16, 1 + clrlwi. r16, r16, 12 + beq @fail_toomanycalls + stw r16, CoherenceGroup.Incrementer(r28) + + + ; Fill segment register fields in the address space struct like so: + ; (8 bits = 0x20) || (4 bits = word idx) || (20 bits = prev call count) + + addi r16, r16, -1 + li r17, 0x40 - 4 + oris r16, r16, 0x2000 + addi r18, r31, AddressSpace.SRs + +@fill_loop + cmpwi r17, 0 + rlwimi r16, r17, 18, 8, 11 ; = index (15, 14, 13...) << 20 + stwx r16, r17, r18 + addi r17, r17, -4 + bne @fill_loop + + + ; Sign the addr spc struct + lisori r8, AddressSpace.kSignature + stw r8, AddressSpace.Signature(r31) + + + ; Create an empty linked list of 'rsrv's (what are they?) + addi r16, r31, AddressSpace.RsrvList + InitList r16, 'rsrv', scratch=r17 + + + ; Create a linked list with one Area + addi r16, r31, AddressSpace.AreaList + InitList r16, 'area', scratch=r17 + + ; Allocate the Area, check for errors + li r8, Area.Size + bl PoolAllocClear + mr. r29, r8 + beq @fail_OOM_again + + ; Sign the Area + lisori r8, Area.kSignature + stw r8, Area.Signature(r29) + + ; Pop some constants in + lisori r8, -1 + stw r8, Area.LogicalBase(r29) + stw r8, Area.LogicalEnd(r29) + li r8, 256 + stw r8, Area.Flags(r29) + + ; Give it a copy of the ID of its parent address space + lwz r8, AddressSpace.ID(r31) + stw r8, Area.AddressSpaceID(r29) + + ; Point the SpecialPtr to it and insert it in the list + addi r16, r31, AddressSpace.AreaList + addi r29, r29, Area.LLL + stw r16, LLL.Freeform(r29) + InsertAsPrev r29, r16, scratch=r17 + + + ; Point this struct by ID to its owning Process, + ; and increment a counter in that struct. + lwz r18, Process.ID(r27) + stw r18, AddressSpace.ProcessID(r31) + + lwz r17, Process.AddressSpaceCount(r27) + addi r17, r17, 1 + stw r17, Process.AddressSpaceCount(r27) + + + ; Done, with no errors + li r8, 0 ; kMPNoErr + mr r9, r31 ; ptr to new AddressSpace + b @return + +@fail_OOM_again + lwz r8,Area.ID(r31) + +@fail_toomanycalls + bl DeleteID + mr r8, r31 + bl PoolFree + li r8, kMPInsufficientResourcesErr + b @return + +@fail_MakeID + mr r8, r31 + bl PoolFree + +@fail_OOM + li r8, -29294 + b @return + +@fail_notcgrp + li r8, kMPInvalidIDErr + +@return + mtlr r30 + blr + + + +# # ###### ###### # ##### +## ## # # # # ###### # ###### ##### ###### # # ##### ##### ##### ###### #### #### # # ##### ## #### ###### +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # ###### # # ##### # ##### # ##### # # # # # # # # ##### #### #### ##### # # # # # ##### +# # # # # # # # # # ####### # # # # ##### # # # # ##### ###### # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # ###### ###### ###### ###### # ###### # # ##### ##### # # ###### #### #### ##### # # # #### ###### + +; ARG MPAddressSpaceID r3 +; RET OSStatus r3 + +; Straight MPLibrary wrapper: yes +; In Universal Interfaces: no + + DeclareMPCall 71, MPDeleteAddressSpace + +MPDeleteAddressSpace + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, AddressSpace.kIDClass + bne ReleaseAndReturnMPCallInvalidIDErr + + mr r31, r8 + + ; Die if a Task is using this Space + lwz r16, AddressSpace.TaskCount(r31) + cmpwi r16, 0 + bne ReleaseAndReturnMPCallOOM + + ; Die if the Space has a non-empty RsrvList + addi r16, r31, AddressSpace.RsrvList + lwz r17, AddressSpace.RsrvList + LLL.Next(r31) + cmpw r16, r17 + bne ReleaseAndReturnMPCallOOM + + ; Die if the Space has a non-empty AreaList + addi r16, r31, AddressSpace.AreaList + lwz r17, AddressSpace.AreaList + LLL.Next(r31) + cmpw r16, r17 + bne ReleaseAndReturnMPCallOOM + + lwz r8, AddressSpace.ProcessID(r31) + bl LookupID + lwz r17, Process.AddressSpaceCount(r8) + subi r17, r17, 1 + stw r17, Process.AddressSpaceCount(r8) + + ; Kill + lwz r8, AddressSpace.ID(r31) + bl DeleteID + mr r8, r31 + bl PoolFree + + b ReleaseAndReturnZeroFromMPCall + + + +# # ###### ##### # ##### +## ## # # # # # # ##### ##### ###### # # ##### # # ##### ##### ##### ###### #### #### # # ##### ## #### ###### +# # # # # # # # # # # # # # ## # # # # # # # # # # # # # # # # # # # # # +# # # ###### # # # # # # # ##### # # # # # # # # # # # # ##### #### #### ##### # # # # # ##### +# # # # # # ##### ##### # # # # # ####### # # # # ##### # # # # ##### ###### # # +# # # # # # # # # # # # # ## # # # # # # # # # # # # # # # # # # # # # # +# # # ##### #### # # # # ###### # # # # # ##### ##### # # ###### #### #### ##### # # # #### ###### + +; RET MPAddressSpaceID r3 + +; Straight MPLibrary wrapper: yes +; In Universal Interfaces: no + + DeclareMPCall 117, MPCurrentAddressSpace + +MPCurrentAddressSpace + + mfsprg r16, 0 + lwz r17, EWA.PA_CurAddressSpace(r16) + lwz r3, AddressSpace.ID(r17) + b CommonMPCallReturnPath + + + +# # ###### # # # ##### +## ## # # # # #### # # ###### # # ##### ##### ##### ###### #### #### # # ##### ## #### ###### +# # # # # # # # # # ## ## # # # # # # # # # # # # # # # # # # # # +# # # ###### ####### # # # ## # ##### # # # # # # # # ##### #### #### ##### # # # # # ##### +# # # # # # # # # # ####### # # # # ##### # # # # ##### ###### # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # #### # # ###### # # ##### ##### # # ###### #### #### ##### # # # #### ###### + +; RET MPAddressSpaceID r3 + +; Straight MPLibrary wrapper: yes +; In Universal Interfaces: no + + DeclareMPCall 118, MPHomeAddressSpace + +MPHomeAddressSpace + + mfsprg r16, 0 + lwz r17, EWA.PA_CurTask(r16) + lwz r18, Task.OwningProcessPtr(r17) + lwz r19, Process.SystemAddressSpacePtr(r18) + lwz r3, AddressSpace.ID(r19) + b CommonMPCallReturnPath + + + +# # ###### ##### ####### # ##### +## ## # # # # ###### ##### # ## #### # # # # ##### ##### ##### ###### #### #### # # ##### ## #### ###### +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # ###### ##### ##### # # # # #### #### # # # # # # # # ##### #### #### ##### # # # # # ##### +# # # # # # # ###### # # # ####### # # # # ##### # # # # ##### ###### # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # ##### ###### # # # # #### # # # # ##### ##### # # ###### #### #### ##### # # # #### ###### + +; ARG MPTaskID r3, MPAddressSpaceID r4 +; RET OSStatus r3 + +; Straight MPLibrary wrapper: yes +; In Universal Interfaces: no + + DeclareMPCall 119, MPSetTaskAddressSpace + +MPSetTaskAddressSpace + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + + ; Get Task and do some checks + + mr r8, r3 + bl LookupID + mr r31, r8 + cmpwi r9, Task.kIDClass + bne ReleaseAndReturnMPCallInvalidIDErr + + lwz r16, Task.Flags(r31) + mtcr r16 + + li r3, kMPTaskAbortedErr + bc BO_IF, Task.kFlagAborted, ReleaseAndReturnMPCall + + bc BO_IF_NOT, Task.kFlagStopped, ReleaseAndReturnMPCallOOM + + lbz r16, Task.State(r31) + cmpwi r16, 0 + bne ReleaseAndReturnMPCallOOM + + + ; Get Address Space and do some checks + + mr r8, r4 + bl LookupID + mr r30, r8 + + lwz r16, Task.ProcessID(r31) + cmpwi r9, AddressSpace.kIDClass + lwz r17, AddressSpace.ProcessID(r30) + bne ReleaseAndReturnMPCallInvalidIDErr + + ; The Task and Address Space must already share a process ID + cmpw r16, r17 + bne ReleaseAndReturnMPCallOOM + + lwz r17, Task.AddressSpacePtr(r31) + + ; Decrement old Address Space + lwz r16, AddressSpace.TaskCount(r17) + subi r16, r16, 1 + stw r16, AddressSpace.TaskCount(r17) + + ; Increment old Address Space + lwz r16, AddressSpace.TaskCount(r30) + addi r16, r16, 1 + stw r16, AddressSpace.TaskCount(r30) + + stw r30, Task.AddressSpacePtr(r31) + + + b ReleaseAndReturnZeroFromMPCall + + + +# # ###### ##### # +## ## # # # # ##### ###### ## ##### ###### # # ##### ###### ## +# # # # # # # # # # # # # # # # # # # # # +# # # ###### # # # ##### # # # ##### # # # # ##### # # +# # # # ##### # ###### # # ####### ##### # ###### +# # # # # # # # # # # # # # # # # # # +# # # ##### # # ###### # # # ###### # # # # ###### # # + +; This MP call does some of the heavy lifting for the MPLibrary function +; of the same name. No pages are mapped into the Area. + +; ARG AddressSpaceID r3 (optional) +; long r4 PTEConfig +; long r5 length +; long r6 LogicalSeparation +; long r7 flagsAndMinAlign +; char *r8 LogicalBase +; RET r3 OSErr +; char *r8 LogicalBase +; AreaID r9 + +; Hint: in the 9.2.2 System MPLibrary, MPCreateArea calls a syscall +; wrapper function at code offset 0x7fa8, with arguments pointing to save +; locations for r8 and r9. + + DeclareMPCall 72, MPCreateArea + +MPCreateArea + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + ; If !r3 then use the current address space + mr. r8, r3 + mfsprg r28, 0 + lwz r30, EWA.PA_CurAddressSpace(r28) + beq @use_current_space + + ; ... else use the one specified. + bl LookupID + cmpwi r9, AddressSpace.kIDClass + mr r30, r8 + bne ReleaseAndReturnMPCallInvalidIDErr +@use_current_space + + ; Allocate the new Area + li r8, Area.Size + bl PoolAllocClear + mr. r31, r8 + beq ReleaseAndScrambleMPCall + + ; Populate + stw r30, Area.AddressSpacePtr(r31) + + stw r4, Area.PTEConfig(r31) + + stw r5, Area.Length(r31) + + lwz r8, ContextBlock.r6(r6) + stw r8, Area.LogicalSeparation(r31) + + lwz r8, ContextBlock.r7(r6) + stw r8, Area.FlagsAndMinAlign(r31) + + lwz r8, ContextBlock.r8(r6) + stw r8, Area.LogicalBase(r31) + + ; "Create" the area + mr r8, r31 + bl CreateArea + + _AssertAndRelease PSA.SchLock, scratch=r16 + + mr. r3, r9 + bne @error + + ; CreateArea returned successfully + lwz r8, Area.LogicalBase(r31) + stw r8, ContextBlock.r8(r6) + + lwz r8, Area.ID(r31) + stw r8, ContextBlock.r9(r6) + + b CommonMPCallReturnPath + +@error + bl PoolFree + b CommonMPCallReturnPath + + + + ##### # +# # ##### ###### ## ##### ###### # # ##### ###### ## +# # # # # # # # # # # # # # # +# # # ##### # # # ##### # # # # ##### # # +# ##### # ###### # # ####### ##### # ###### +# # # # # # # # # # # # # # # # + ##### # # ###### # # # ###### # # # # ###### # # + +; This function actually gets passed its own structure. +; What the frick? + +; Always returns via ReturnFromCreateArea + +; ARG Area *r8 +; RET ID r8, osErr r9 + +CreateArea ; OUTSIDE REFERER + + ; Always returns via ReturnFromCreateArea + mflr r16 + mfsprg r9, 0 + stw r16, EWA.CreateAreaSavedLR(r9) + stmw r25, EWA.CreateAreaSavedR25(r9) + + ; Keep the structure itself in r31 for the duration. + ; r8 must be used for other things + mr r31, r8 + + ; For if we need to return early + li r9, paramErr + + + lwz r16, Area.Flags(r31) + lwz r17, 0x0020(r31) + rlwinm. r16, r16, 0, 28, 28 + + lisori r16, 0xfffc13e0 ; if bit 28 = 0 + beq @use_other + lisori r16, 0xfff99be0 ; if bit 28 = 1 +@use_other + + and. r16, r16, r17 + bne ReturnFromCreateArea + + andi. r16, r17, 0x1f + cmpwi cr1, r16, 0x0c + beq CreateArea_0x50 + blt cr1, ReturnFromCreateArea + +CreateArea_0x50 + bne CreateArea_0x5c + ori r17, r17, 0x0c + stw r17, 0x0020(r31) + +CreateArea_0x5c + andi. r16, r17, 0x1f + li r18, -0x01 + slw r18, r18, r16 + stw r18, 0x0078(r31) + rlwinm. r16, r17, 27, 27, 31 + bne ReturnFromCreateArea + addi r16, r16, 0x0c + li r18, -0x01 + slw r18, r18, r16 + stw r18, 0x007c(r31) + neg r16, r18 + not r19, r18 + stw r16, 0x0068(r31) + lwz r16, Area.Length(r31) + add r16, r16, r19 + and. r16, r16, r18 + stw r16, Area.Length(r31) + beq ReturnFromCreateArea + lwz r18, 0x001c(r31) + lis r16, -0x01 + ori r16, r16, 0xff10 + and. r16, r16, r18 + bne ReturnFromCreateArea + lwz r16, 0x0070(r31) + li r17, 0x200 + rlwimi r17, r16, 0, 0, 19 + bl major_0x10cb8 ; PTE r16/r17, control r18 // PTE r16/r17 + stw r16, 0x0070(r31) + stw r17, 0x0074(r31) + mr r8, r31 + + li r9, Area.kIDClass + bl MakeID + cmpwi r8, 0 + beq major_0x10320 + + stw r8, Area.ID(r31) + mfsprg r16, 0 + lwz r17, -0x0008(r16) + lwz r18, 0x0060(r17) + lwz r30, Area.AddressSpacePtr(r17) + stw r18, Area.ProcessID(r31) + lwz r16, Area.AddressSpacePtr(r31) + lwz r17, 0x0000(r16) + stw r17, Area.AddressSpaceID(r31) + lwz r16, 0x0008(r30) + rlwinm. r16, r16, 0, 30, 30 + bne major_0x10320_0x64 + lis r16, 0x4152 + ori r16, r16, 0x4541 + stw r16, Area.Signature(r31) + lwz r17, 0x0020(r31) + lwz r16, Area.LogicalSeparation(r31) + addi r16, r16, 0xfff + rlwinm r16, r16, 0, 0, 19 + stw r16, Area.LogicalSeparation(r31) + rlwinm r16, r17, 0, 17, 18 + cmplwi cr7, r16, 0x6000 + rlwinm. r16, r17, 0, 17, 17 + beq cr7, CreateArea_0x150 + bne CreateArea_0x150 + crset cr7_gt + crclr cr7_lt + +CreateArea_0x150 + rlwinm. r16, r17, 0, 17, 18 + lwz r18, Area.LogicalBase(r31) + lwz r19, Area.Length(r31) + blt cr7, CreateArea_0x16c + bne CreateArea_0x170 + li r18, 0x00 + b CreateArea_0x170 + +CreateArea_0x16c + subf r18, r19, r18 + +CreateArea_0x170 + lwz r16, 0x0078(r31) + and r18, r18, r16 + stw r18, Area.LogicalBase(r31) + add r16, r18, r19 + addi r16, r16, -0x01 + stw r16, Area.LogicalEnd(r31) + + + ; Major hint here... + + _log ' CreateArea [ ' + mr r8, r18 + bl Printw + mr r8, r16 + bl Printw + _log '] ID ' + + + lwz r8, Area.ID(r31) + mr r8, r8 + bl Printw + + + bgt cr7, CreateArea_0x1f4 + blt cr7, CreateArea_0x218 + _log 'placed' + b CreateArea_0x234 + +CreateArea_0x1f4 + _log 'placed at or above' + b CreateArea_0x234 + +CreateArea_0x218 + _log 'placed below' + +CreateArea_0x234 + lwz r8, Area.AddressSpacePtr(r31) + lwz r16, Area.LogicalEnd(r31) + lwz r9, Area.LogicalBase(r31) + cmplw r9, r16 + bge major_0x10320_0x64 + bl FindAreaAbove + mr r30, r8 + lwz r14, Area.LogicalBase(r31) + lwz r15, Area.LogicalEnd(r31) + lwz r16, Area.LogicalSeparation(r31) + lwz r17, 0x0024(r30) + lwz r18, 0x0028(r30) + lwz r19, 0x0030(r30) + lwz r21, Area.AddressSpacePtr(r31) + cmpwi r17, -0x01 + add r8, r15, r16 + add r9, r15, r19 + beq CreateArea_0x2b8 + cmplw r8, r17 + cmplw cr1, r9, r17 + bge CreateArea_0x28c + blt cr1, CreateArea_0x2b8 + +CreateArea_0x28c + beq cr7, major_0x10320_0x64 + _log ' ... bc search^n' + bgt cr7, CreateArea_0x34c + b CreateArea_0x31c + +CreateArea_0x2b8 + addi r21, r21, 0x20 + lwz r20, 0x0060(r30) + cmpw r20, r21 + beq CreateArea_0x39c + addi r20, r20, -0x54 + lwz r17, 0x0024(r20) + lwz r18, 0x0028(r20) + lwz r19, 0x0030(r20) + add r8, r18, r16 + add r9, r18, r19 + cmplw r8, r14 + cmplw cr1, r9, r14 + bge CreateArea_0x2f0 + blt cr1, CreateArea_0x374 + +CreateArea_0x2f0 + beq cr7, major_0x10320_0x64 + _log ' ... ab search^n' + bgt cr7, CreateArea_0x34c + b CreateArea_0x31c + +CreateArea_0x31c + subf r8, r19, r17 + subf r9, r16, r17 + cmplw r8, r9 + lwz r21, Area.Length(r31) + ble CreateArea_0x334 + mr r8, r9 + +CreateArea_0x334 + subf r8, r21, r8 + cmplw r8, r14 + addi r18, r8, 0x01 + lwz r19, Area.Length(r31) + bge major_0x10320_0x64 + b CreateArea_0x170 + +CreateArea_0x34c + add r8, r18, r19 + add r9, r18, r16 + lwz r20, 0x0078(r31) + cmplw r8, r9 + neg r21, r20 + bge CreateArea_0x368 + mr r8, r9 + +CreateArea_0x368 + add r18, r8, r21 + lwz r19, Area.Length(r31) + b CreateArea_0x170 + +CreateArea_0x374 + addi r19, r31, 0x54 + addi r20, r20, 0x54 + lwz r16, 0x0000(r20) + stw r16, 0x0000(r19) + lwz r16, 0x0008(r20) + stw r16, 0x0008(r19) + stw r20, 0x000c(r19) + stw r19, 0x000c(r16) + stw r19, 0x0008(r20) + b CreateArea_0x3b8 + +CreateArea_0x39c + addi r19, r31, 0x54 + stw r20, 0x0000(r19) + InsertAsNext r19, r20, scratch=r16 + +CreateArea_0x3b8 + addi r16, r31, 0x90 + InitList r16, 'fenc', scratch=r17 + lwz r16, 0x0020(r31) + lwz r17, Area.Flags(r31) + rlwinm. r8, r16, 0, 16, 16 + bne CreateArea_0x64c + rlwinm. r8, r17, 0, 25, 25 + bne CreateArea_0x41c + lwz r8, Area.Length(r31) + rlwinm r8, r8, 22, 10, 29 + mr r29, r8 + +; r1 = kdp +; r8 = size + bl PoolAllocClear +; r8 = ptr + + cmpwi r8, 0x00 + stw r8, 0x0040(r31) + beq CreateArea_0x460 + lwz r9, Area.Length(r31) + srwi r9, r9, 12 + bl major_0x10284 + lwz r17, Area.Flags(r31) + ori r17, r17, 0x10 + stw r17, Area.Flags(r31) + +CreateArea_0x41c + lwz r17, Area.Flags(r31) + andi. r8, r17, 0x88 + lwz r8, Area.Length(r31) + bne CreateArea_0x45c + rlwinm r8, r8, 21, 11, 30 + mr r29, r8 + +; r1 = kdp +; r8 = size + bl PoolAllocClear +; r8 = ptr + + cmpwi r8, 0x00 + stw r8, 0x003c(r31) + beq CreateArea_0x460 + lwz r9, Area.Length(r31) + srwi r9, r9, 12 + bl major_0x102a8 + lwz r16, Area.Flags(r31) + ori r16, r16, 0x01 + stw r16, Area.Flags(r31) + +CreateArea_0x45c + b CreateArea_0x64c + +CreateArea_0x460 + cmpwi r29, 0xfd8 + ble major_0x10320_0x20 + + _Lock PSA.PoolLock, scratch1=r16, scratch2=r17 + + lwz r17, Area.Flags(r31) + li r27, 0x00 + rlwinm. r8, r17, 0, 25, 25 + bne CreateArea_0x4b4 + lwz r27, Area.Length(r31) + srwi r27, r27, 12 + cmpwi r27, 0x400 + ble CreateArea_0x4ac + ori r17, r17, 0x20 + stw r17, Area.Flags(r31) + addi r27, r27, 0x400 + +CreateArea_0x4ac + addi r27, r27, 0x3ff + srwi r27, r27, 10 + +CreateArea_0x4b4 + lwz r8, Area.Flags(r31) + li r29, 0x00 + rlwinm. r9, r8, 0, 28, 28 + bne CreateArea_0x4e8 + lwz r29, Area.Length(r31) + srwi r29, r29, 12 + cmpwi r29, 0x800 + ble CreateArea_0x4e0 + ori r8, r8, 0x02 + stw r8, Area.Flags(r31) + addi r29, r29, 0x800 + +CreateArea_0x4e0 + addi r29, r29, 0x7ff + srwi r29, r29, 11 + +CreateArea_0x4e8 + lwz r18, PSA.FreePageCount(r1) + add. r8, r27, r29 + ble major_0x102c8 + cmpw r8, r18 + bgt major_0x102c8 + lwz r16, PSA.FreePageCount(r1) + lwz r17, PSA.UnheldFreePageCount(r1) + subf r16, r8, r16 + subf r17, r8, r17 + stw r16, PSA.FreePageCount(r1) + stw r17, PSA.UnheldFreePageCount(r1) + mr. r18, r27 + beq CreateArea_0x5a0 + lwz r16, PSA.FreeList + LLL.Next(r1) + RemoveFromList r16, scratch1=r17, scratch2=r19 + addi r18, r18, -0x01 + stw r16, 0x0040(r31) + cmpwi r18, 0x00 + lwz r17, PSA.FreeList + LLL.Next(r1) + mr r8, r16 + subi r16, r16, 4 + bgt CreateArea_0x564 + li r9, 0x400 + bl major_0x10284 + b CreateArea_0x5a0 + +CreateArea_0x564 + RemoveFromList r17, scratch1=r19, scratch2=r20 + addi r18, r18, -0x01 + stwu r17, 0x0004(r16) + mr r8, r17 + li r9, 0x400 + bl major_0x10284 + lwz r17, PSA.FreeList + LLL.Next(r1) + cmpwi r18, 0x00 + bgt CreateArea_0x564 + +CreateArea_0x5a0 + mr. r18, r29 + beq CreateArea_0x62c + lwz r16, PSA.FreeList + LLL.Next(r1) + RemoveFromList r16, scratch1=r17, scratch2=r19 + addi r18, r18, -0x01 + stw r16, 0x003c(r31) + cmpwi r18, 0x00 + lwz r17, PSA.FreeList + LLL.Next(r1) + mr r8, r16 + subi r16, r16, 4 + bgt CreateArea_0x5f0 + li r9, 0x800 + bl major_0x102a8 + b CreateArea_0x62c + +CreateArea_0x5f0 + RemoveFromList r17, scratch1=r19, scratch2=r20 + addi r18, r18, -0x01 + stwu r17, 0x0004(r16) + mr r8, r17 + li r9, 0x800 + bl major_0x102a8 + lwz r17, PSA.FreeList + LLL.Next(r1) + cmpwi r18, 0x00 + bgt CreateArea_0x5f0 + +CreateArea_0x62c + _AssertAndRelease PSA.PoolLock, scratch=r16 + +CreateArea_0x64c + lwz r16, Area.Flags(r31) + rlwinm. r8, r16, 0, 28, 28 + beq CreateArea_0x67c + lwz r16, 0x0044(r31) + addi r17, r31, 0x44 + stw r16, 0x0000(r17) + InsertAsPrev r17, r16, scratch=r18 + b major_0x10320_0x94 + +CreateArea_0x67c + addi r16, r31, 0x44 + InitList r16, 'AKA ', scratch=r17 + b major_0x10320_0x94 + + + +major_0x10284 ; OUTSIDE REFERER + subi r8, r8, 4 + addi r9, r9, -0x01 + lwz r20, 0x0074(r31) + ori r20, r20, 0x200 + +major_0x10284_0x10 + cmpwi r9, noErr + stwu r20, 0x0004(r8) + addi r9, r9, -0x01 + bgt major_0x10284_0x10 + blr + + + +major_0x102a8 ; OUTSIDE REFERER + addi r8, r8, -0x02 + addi r9, r9, -0x01 + li r20, 0x7fff + +major_0x102a8_0xc + cmpwi r9, noErr + sthu r20, 0x0002(r8) + addi r9, r9, -0x01 + bgt major_0x102a8_0xc + blr + + + +major_0x102c8 ; OUTSIDE REFERER + _AssertAndRelease PSA.PoolLock, scratch=r16 + addi r30, r8, 0x08 + lwz r8, PSA.AgerID(r1) + bl LookupID + cmpwi r9, Notification.kIDClass + + mr r26, r8 + bne major_0x10320_0x20 + li r8, 0x02 + stw r8, 0x0010(r26) + stw r30, 0x0014(r26) + li r29, 0x00 + stw r29, 0x0018(r26) + mr r30, r26 + bl CauseNotification + b major_0x10320_0x20 + + + +major_0x10320 ; OUTSIDE REFERER + mr r8, r31 + li r9, -29294 + b ReturnFromCreateArea + + ; Dead code: + lwz r8, Area.ID(r31) + bl DeleteID + mr r8, r31 + li r9, kMPInvalidIDErr + b ReturnFromCreateArea + +major_0x10320_0x20 ; OUTSIDE REFERER + addi r19, r31, 0x54 + RemoveFromList r19, scratch1=r16, scratch2=r17 + lwz r16, Area.Flags(r31) + lwz r8, 0x0040(r31) + rlwinm. r16, r16, 0, 25, 25 + bne major_0x10320_0x58 + cmpwi r8, 0x00 + bnel PoolFree + +major_0x10320_0x58 + lwz r8, 0x003c(r31) + cmpwi r8, 0x00 + bnel PoolFree + +major_0x10320_0x64 ; OUTSIDE REFERER + _log ' ... skipped^n' + lwz r8, Area.ID(r31) + bl DeleteID + mr r8, r31 + li r9, kMPInsufficientResourcesErr + b ReturnFromCreateArea + +major_0x10320_0x94 ; OUTSIDE REFERER + _log ' ... created^n' + mr r8, r31 + li r9, 0x00 + + + +ReturnFromCreateArea + mfsprg r16, 0 + lwz r17, EWA.CreateAreaSavedLR(r16) + mtlr r17 + lmw r25, EWA.CreateAreaSavedR25(r16) + blr + + + +; ARG AddressSpace *r8, +; RET Area *r8 + +FindAreaAbove ; OUTSIDE REFERER + lwz r8, AddressSpace.AreaList + LLL.Next(r8) + +@loop + subi r8, r8, Area.LLL + + ; Return an area such that: + ; max(Area.LogicalBase, Area.LogicalEnd) >= r9 + lwz r16, Area.LogicalBase(r8) + lwz r17, Area.LogicalEnd(r8) + cmplw r16, r9 + cmplw cr1, r17, r9 + bgelr + bgelr cr1 + + ; Iterate over linked list + lwz r8, Area.LLL + LLL.Next(r8) + b @loop + + + +# # ###### ##### # # +## ## # # # # ##### ###### ## ##### ###### # # # # ## #### # # ##### ###### ## +# # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # ###### # # # ##### # # # ##### # # # # # # #### # # # # ##### # # +# # # # ##### # ###### # # ####### # # ###### # ####### ##### # ###### +# # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # ##### # # ###### # # # ###### # # ###### # # # #### # # # # ###### # # + +; This MP call does most of the work for the same-named MPLibrary +; function. An "alias" Area is created from a template. This code is very +; similar to regular MPCreateArea above, so differences are commented. + +; ARG AreaID r3 ; Alias-specific +; long r4 PTEConfig +; long r5 length +; long r6 LogicalSeparation +; long r7 flagsAndMinAlign +; char *r8 LogicalBase +; long r9 unknown ; Alias-specific +; RET r3 OSErr +; char *r8 LogicalBase +; AreaID r10 ; Alias-specific + + DeclareMPCall 73, MPCreateAliasArea + +MPCreateAliasArea + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Area.kIDClass + bne ReleaseAndReturnMPCallInvalidIDErr + + ; Confirm that the template Area is not itself an alias + mr r30, r8 + lwz r16, Area.Flags(r30) + rlwinm. r8, r16, 0, Area.kAliasFlag, Area.kAliasFlag + bne ReleaseAndReturnParamErrFromMPCall + + ; Allocate the new Area + li r8, Area.Size + bl PoolAllocClear + mr. r31, r8 + beq ReleaseAndScrambleMPCall + + ; Populate + mfsprg r28, 0 + lwz r8, EWA.PA_CurAddressSpace(r28) + stw r8, Area.AddressSpacePtr(r31) + + stw r3, Area.ParentAreaID(r31) ; Alias-specific + + stw r30, Area.AliasLLL + LLL.Freeform(r31) ; Alias-specific + + stw r4, Area.PTEConfig(r31) + + stw r5, Area.Length(r31) + + lwz r8, ContextBlock.r6(r6) + stw r8, Area.LogicalSeparation(r31) + + lwz r8, ContextBlock.r7(r6) + stw r8, Area.FlagsAndMinAlign(r31) + + lwz r8, ContextBlock.r8(r6) + stw r8, Area.LogicalBase(r31) + + lwz r8, ContextBlock.r9(r6) ; Alias-specific + stw r8, 0x0080(r31) + + li r8, 1 << (31 - Area.kAliasFlag) ; Alias-specific + stw r8, Area.Flags(r31) + + ; "Create" the area (everything after here is identical to MPCreateArea) + mr r8, r31 + bl CreateArea + + _AssertAndRelease PSA.SchLock, scratch=r16 + + mr. r3, r9 + bne @error + + ; CreateArea returned successfully + lwz r8, Area.LogicalBase(r31) + stw r8, ContextBlock.r8(r6) + + lwz r8, Area.ID(r31) + stw r8, ContextBlock.r10(r6) ; Alias-specific + + b CommonMPCallReturnPath + + ; ...or not +@error + bl PoolFree + b CommonMPCallReturnPath + + + +# # ###### ###### # +## ## # # # # ###### # ###### ##### ###### # # ##### ###### ## +# # # # # # # # # # # # # # # # # # # # +# # # ###### # # ##### # ##### # ##### # # # # ##### # # +# # # # # # # # # # ####### ##### # ###### +# # # # # # # # # # # # # # # # # +# # # ###### ###### ###### ###### # ###### # # # # ###### # # + +; Delete an Area: the eponymous MPLibrary function is a simple wrapper + +; 1. Only works on unprivileged Areas with no mapped pages. +; 2. Remove from parent address space. +; 3. Remove from template Area's alias list if applicable. +; 4. Delete the "PageMap" array if present. +; 5. Delete the "Fault Counter" array if present. +; 6. Delete the structure from the pool. + +; ARG AreaID r3 +; RET OSErr r3 + + DeclareMPCall 74, MPDeleteArea + +MPDeleteArea + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + ; Look up and validate + mr r8, r3 + bl LookupID + cmpwi r9, Area.kIDClass + bne ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + + ; If pages are still mapped in, fail with OOM + ; If area is privileged, fail with privileged + lwz r17, Area.BytesMapped(r31) + lwz r29, Area.Flags(r31) + cmpwi cr1, r17, 0 + rlwinm. r8, r29, 0, Area.kPrivilegedFlag, Area.kPrivilegedFlag + bne cr1, ReleaseAndReturnMPCallOOM + bne ReleaseAndReturnMPCallPrivilegedErr + + ; If is alias area and is not at back of queue (???), fail with OOM + rlwinm. r8, r29, 0, Area.kAliasFlag, Area.kAliasFlag + lwz r16, Area.AliasLLL + LLL.Next(r31) + bne @dont_check_for_nonempty_alias + addi r17, r31, Area.AliasLLL + cmpw r16, r17 + bne ReleaseAndReturnMPCallOOM +@dont_check_for_nonempty_alias + + ; HTAB lock wraps around all Address Space structures? + + _Lock PSA.HTABLock, scratch1=r18, scratch2=r9 + + ; Remove from parent address space + addi r16, r31, Area.LLL + RemoveFromList r16, scratch1=r17, scratch2=r18 + + ; Remove from template area's list of aliases, if necessary + rlwinm. r8, r29, 0, Area.kAliasFlag, Area.kAliasFlag + addi r16, r31, Area.AliasLLL + beq @not_alias_so_dont_remove_from_alias_list + RemoveFromList r16, scratch1=r17, scratch2=r18 +@not_alias_so_dont_remove_from_alias_list + + _AssertAndRelease PSA.HTABLock, scratch=r18 + + + ; DELETE PAGEMAP (array of [array of] per-page data) + ; There are a few cases here... + + lwz r8, Area.PageMapArrayPtr(r31) + rlwinm. r16, r29, 0, Area.kDontOwnPageMapArray, Area.kDontOwnPageMapArray + cmpwi cr1, r8, 0 + bne @no_pagemap + rlwinm. r16, r29, 0, Area.kPageMapArrayInPool, Area.kPageMapArrayInPool + beq cr1, @no_pagemap + bne @pagemap_in_pool + + + ; If PageMap occupies whole pages then return those pages + ; directly to the free list without bothering the pool + + ; (Pool lock still protects free list) + _Lock PSA.PoolLock, scratch1=r18, scratch2=r9 + + rlwinm. r16, r29, 0, Area.kPageMapArrayIs2D, Area.kPageMapArrayIs2D + beq @pagemap_is_1d + + + ; CASE: 2D array, all in whole pages + + ; r19 := size of ptr array in primary page + lwz r19, Area.Length(r31) + mr r20, r8 + srwi r19, r19, 12 + addi r19, r19, 0x3ff + srwi r19, r19, 10 + slwi r19, r19, 2 + + ; Free every second-level page + subi r19, r19, 4 +@2d_pagemap_delete_loop + lwzx r8, r19, r20 + bl FreePageListPush ; PhysicalPage *r8 + cmpwi r19, 0 + subi r19, r19, 4 + bgt @2d_pagemap_delete_loop + + mr r8, r20 + + + ; COMMON CASE: single first-level page of 2D or 1D-in-whole-page case + +@pagemap_is_1d + bl FreePageListPush ; PhysicalPage *r8 + + _AssertAndRelease PSA.PoolLock, scratch=r18 + + b @pagemap_deleted + + + ; CASE: 1D array in pool block (not whole page) + +@pagemap_in_pool + bl PoolFree + + +@pagemap_deleted +@no_pagemap + + + ; DELETE FAULT COUNTER ARRAY + ; Again, the code to manage the cases is tricky. + + lwz r8, Area.FaultCtrArrayPtr(r31) + rlwinm. r16, r29, 0, Area.kFaultCtrArrayInPool, Area.kFaultCtrArrayInPool + cmpwi cr1, r8, 0 + beq cr1, @no_faultctr + bne @faultctr_in_pool + + + ; Whole-page cases require us to get the Pool lock manually (for free list) + _Lock PSA.PoolLock, scratch1=r18, scratch2=r9 + + rlwinm. r16, r29, 0, Area.kFaultCtrArrayIs2D, Area.kFaultCtrArrayIs2D + beq @faultctr_is_1d + + + ; CASE: 2D array, all in whole pages + + ; Once again, r19 = the size of the primary array + lwz r19, Area.Length(r31) + mr r20, r8 + srwi r19, r19, 12 + addi r19, r19, 0x7ff + srwi r19, r19, 11 + slwi r19, r19, 2 + + ; Free every second-level page + subi r19, r19, 4 +@2d_faultctr_delete_loop + lwzx r8, r19, r20 + bl FreePageListPush ; PhysicalPage *r8 + cmpwi r19, 0 + subi r19, r19, 4 + bgt @2d_faultctr_delete_loop + + mr r8, r20 + + + ; COMMON CASE: single first-level page of 2D or 1D-in-whole-page case + +@faultctr_is_1d + bl FreePageListPush ; PhysicalPage *r8 + + _AssertAndRelease PSA.PoolLock, scratch=r18 + + b @faultctr_deleted + + + ; CASE: 1D array in pool block (not whole page) + +@faultctr_in_pool + bl PoolFree + + +@faultctr_deleted +@no_faultctr + + + ; Delete the struct from the pool + lwz r8, Area.ID(r31) + bl DeleteID + mr r8, r31 + bl PoolFree + + + ; Return noErr + b ReleaseAndReturnZeroFromMPCall + + + +# # ###### ##### # ##### +## ## # # # # ###### ##### # # ##### ###### ## # # # ###### ###### +# # # # # # # # # # # # # # # # # # # # +# # # ###### ##### ##### # # # # # ##### # # ##### # # ##### +# # # # # # ####### ##### # ###### # # # # +# # # # # # # # # # # # # # # # # # # +# # # ##### ###### # # # # # ###### # # ##### # ###### ###### + +; ARG MPAreaID r3, flag_24_means_change_left_side r4 + +; Straight MPLibrary wrapper: no +; In Universal Interfaces: no + + DeclareMPCall 75, MPSetAreaSize + +MPSetAreaSize + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Area.kIDClass + mr r31, r8 + bne ReleaseAndReturnMPCallInvalidIDErr + + ; Chase Daniel about this field! + lwz r16, Area.FlagsAndMinAlign(r31) + rlwinm. r8, r16, 0, 16, 16 + bne ReleaseAndReturnMPCallOOM + + lwz r18, Area.DefaultAlignmentMask(r31) + lwz r17, Area.Length(r31) + and. r5, r5, r18 + and r17, r17, r18 + ble ReleaseAndReturnParamErrFromMPCall + + + ; DECIDE: MAKE BIGGER OR MAKE SMALLER? + + subf. r27, r17, r5 ; r27 = how much space to add + beq ReleaseAndReturnZeroFromMPCall ; area is already this size (ignoring change) + bgt @SHRINK_AREA ; not actually allowed + + +;EXPAND AREA + + rlwinm. r8, r4, 0, 24, 24 + lwz r28, Area.LogicalBase(r31) + lwz r29, Area.LogicalEnd(r31) + bne @expand_downwards + +;expand upwards ; (replace LogicalBase with new LogicalEnd) + add r28, r27, r29 + addi r28, r28, 1 + b @endif + +@expand_downwards ; (replace LogicalEnd with new LogicalBase) + subf r29, r27, r28 + subi r29, r29, 1 +@endif + + + _Lock PSA.PoolLock, scratch1=r14, scratch2=r15 + _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 + + + ; Free pages from LogicalBase to LogicalEnd, flushing PTEs that might conflict (a million iterations???) + + lwz r27, Area.PageSize(r31) + +@freelist_loop + mr r8, r28 + bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq + beq SpacePanicIsland + + bl GetPTEFromPLE ; PLE *r30 // PTE r16/r17, PTE *r18, PTEflags cr0, PLEflags cr5-7 + + bc BO_IF_NOT, Area.kPLEFlagHasPhysPage, @there_is_no_page_to_free + + bcl BO_IF, Area.kPLEFlagIsInHTAB, InvalPTE ; page *r8, PTE r16/r17, PTE *r18, PLE *r30 // PLEflags cr5-7 + bcl BO_IF, Area.kPLEFlagIsInHTAB, DeletePTE ; PTE *r18, PLE *r30 + + ; Unset PLE bit kPLEFlagHasPhysPage and free the physical page + lwz r17, 0(r30) + _bclr r17, r17, Area.kPLEFlagHasPhysPage + rlwinm r8, r17, 0, 0xfffff000 + stw r17, 0(r30) + bl FreePageListPush ; PhysicalPage *r8 + +@there_is_no_page_to_free + + add r28, r28, r27 + cmplw r28, r29 + ble @freelist_loop + + + + rlwinm. r8, r4, 0, 24, 24 + lwz r28, Area.LogicalBase(r31) + beq @_138 + + lwz r27, 0x0068(r31) + add r29, r29, r27 + +@_100 + mr r8, r28 + bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq + beq SpacePanicIsland + mr r26, r30 + mr r8, r29 + bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq + beq SpacePanicIsland + lwz r17, 0x0000(r30) + stw r17, 0x0000(r26) + lwz r16, Area.LogicalEnd(r31) + add r28, r28, r27 + add r29, r29, r27 + cmplw r29, r16 + ble @_100 + +@_138 + + _AssertAndRelease PSA.HTABLock, scratch=r8 + + + lwz r16, Area.Flags(r31) + rlwinm. r8, r16, 0, 25, 25 + bne @_16c + + rlwinm. r8, r16, 0, 27, 27 + bne @_16c + + +@_16c + _AssertAndRelease PSA.PoolLock, scratch=r8 + b @_190 + +@_190 + rlwinm. r8, r4, 0, 24, 24 + lwz r16, Area.LogicalBase(r31) + bne @_1b0 + add r17, r16, r5 + addi r17, r17, -0x01 + stw r5, Area.Length(r31) + stw r17, Area.LogicalEnd(r31) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +@_1b0 + lwz r17, Area.LogicalEnd(r31) + subf r16, r5, r17 + stw r5, Area.Length(r31) + addi r16, r16, 0x01 + stw r16, Area.LogicalBase(r31) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + +@SHRINK_AREA + + rlwinm. r8, r4, 0, 24, 24 + lwz r28, Area.LogicalBase(r31) + lwz r29, Area.LogicalEnd(r31) + bne ReleaseAndMPCallWasBad + + add r28, r27, r29 + addi r28, r28, 0x01 + + b @_1ec + ; Dead code: + subf r29, r27, r28 + subi r29, r29, 1 +@_1ec + + b ReleaseAndMPCallWasBad + + + +# # ###### ##### ##### ###### # +## ## # # # # ###### ##### # # # # ##### # # ## #### ###### # # #### #### ###### #### #### +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # ###### ##### ##### # ##### # # ##### ###### # # # ##### # # # # ##### #### #### +# # # # # # # # # # # # ###### # ### # ####### # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # ##### ###### # ##### #### ##### # # # #### ###### # # #### #### ###### #### #### + +; Straight MPLibrary wrapper: almost +; In Universal Interfaces: no + + DeclareMPCall 130, MPSetSubPageAccess + +MPSetSubPageAccess + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Area.kIDClass + + bne ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + lis r16, -0x01 + ori r16, r16, 0xfff8 + lwz r17, 0x0020(r31) + and. r16, r16, r4 + bne ReleaseAndReturnParamErrFromMPCall + rlwinm. r8, r17, 0, 16, 16 + 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 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, ReleaseAndReturnParamErrFromMPCall + bgt cr2, ReleaseAndReturnParamErrFromMPCall + xor r8, r28, r29 + rlwinm. r8, r8, 0, 0, 19 + bne ReleaseAndReturnParamErrFromMPCall + + _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 + + mr r8, r29 + bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq + _AssertAndRelease PSA.HTABLock, scratch=r14 + beq SpacePanicIsland + rlwinm r8, r16, 0, 29, 30 + lwz r16, 0x0000(r30) + cmpwi cr7, r8, 0x04 + beq cr7, ReleaseAndReturnParamErrFromMPCall + lwz r16, 0x0098(r31) + +MPCall_130_0xe8 + addi r17, r31, 0x90 + cmpw r16, r17 + addi r17, r16, 0x14 + beq MPCall_130_0x11c + lwz r8, 0x0010(r16) + cmplwi r8, 0x1f8 + add r9, r8, r17 + blt MPCall_130_0x110 + lwz r16, 0x0008(r16) + b MPCall_130_0xe8 + +MPCall_130_0x110 + addi r8, r8, 0x08 + addi r9, r9, 0x08 + b MPCall_130_0x15c + +MPCall_130_0x11c + li r8, 0x214 + +; r1 = kdp +; r8 = size + bl PoolAllocClear +; r8 = ptr + + mr. r16, r8 + beq ReleaseAndScrambleMPCall + addi r18, r31, 0x90 + lis r17, 0x4645 + ori r17, r17, 0x4e43 + stw r17, 0x0004(r16) + stw r18, 0x0000(r16) + InsertAsPrev r16, r18, scratch=r19 + li r8, 0x00 + addi r9, r16, 0x14 + +MPCall_130_0x15c + stw r8, 0x0010(r16) + stw r29, 0x0000(r9) + stw r28, 0x0004(r9) + + _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 + + mr r8, r29 + bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq + beq SpacePanicIsland + + bl GetPTEFromPLE ; PLE *r30 // PTE r16/r17, PTE *r18, PTEflags cr0, PLEflags cr5-7 + + bc BO_IF_NOT, Area.kPLEFlagHasPhysPage, MPCall_130_0x19c + + bcl BO_IF, Area.kPLEFlagIsInHTAB, InvalPTE ; page *r8, PTE r16/r17, PTE *r18, PLE *r30 // PLEflags cr5-7 + bcl BO_IF, Area.kPLEFlagIsInHTAB, DeletePTE ; PTE *r18, PLE *r30 + +MPCall_130_0x19c + lwz r17, 0x0000(r30) + li r16, 0x06 + rlwimi r17, r16, 0, 29, 30 + stw r17, 0x0000(r30) + _AssertAndRelease PSA.HTABLock, scratch=r14 + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + +# # ###### ##### # # +## ## # # # # ###### ##### # # ##### ###### ## # # #### #### ###### #### #### +# # # # # # # # # # # # # # # # # # # # # # # # # +# # # ###### ##### ##### # # # # # ##### # # # # # # ##### #### #### +# # # # # # ####### ##### # ###### ####### # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # +# # # ##### ###### # # # # # ###### # # # # #### #### ###### #### #### + +; ARG MPAreaID r3, bits_to_set r4, bits_to_unset r5, start r6, len r7 +; RET OSStatus r3 + +; Straight MPLibrary wrapper: yes +; In Universal Interfaces: no + + DeclareMPCall 76, MPSetAreaAccess + +MPSetAreaAccess + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Area.kIDClass + bne ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + + ; Fail if any bits other than these are set in r4 + lisori r16, ~%11101111 + and. r16, r16, r4 + bne ReleaseAndReturnParamErrFromMPCall + + ; Or in r5 + lisori r16, ~%11101111 + and. r16, r16, r5 + bne ReleaseAndReturnParamErrFromMPCall + + ; Get more args + lwz r29, ContextBlock.r6(r6) + lwz r18, ContextBlock.r7(r6) + + ; Figure out whether the Area covers the specified range + lwz r16, Area.LogicalBase(r31) + add r28, r18, r29 + lwz r17, Area.DefaultAlignmentMask(r31) ; unused? + subi r28, r28, 1 + lwz r18, Area.FlagsAndMinAlign(r31) + lwz r19, Area.LogicalEnd(r31) + + ; Check that range lies within Area (cr1/2). + ; Also, two cases depending on FlagsAndMinAlign bit 16 + rlwinm. r8, r18, 0, 16, 16 + cmplw cr1, r29, r16 + cmplw cr2, r28, r19 + blt cr1, ReleaseAndReturnParamErrFromMPCall + bgt cr2, ReleaseAndReturnParamErrFromMPCall + bne @BIT_16_SET + + +;BIT 16 CLEAR + + _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 + +@pageloop + mr r8, r29 + bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq + beq SpacePanicIsland + + bl GetPTEFromPLE ; PLE *r30 // PTE r16/r17, PTE *r18, PTEflags cr0, PLEflags cr5-7 + + bc BO_IF_NOT, Area.kPLEFlagHasPhysPage, @no_physical_page + bcl BO_IF, Area.kPLEFlagIsInHTAB, InvalPTE ; page *r8, PTE r16/r17, PTE *r18, PLE *r30 // PLEflags cr5-7 + bcl BO_IF, Area.kPLEFlagIsInHTAB, DeletePTE ; PTE *r18, PLE *r30 +@no_physical_page + + lwz r17, 0(r30) + bl major_0x10d38 + + and r8, r4, r5 + orc r9, r4, r5 + or r18, r18, r8 + and r18, r18, r9 + + lwz r17, 0(r30) + + rlwinm. r8, r18, 0, 26, 26 + bc BO_IF_NOT, 31, @118 + bgt cr6, @118 + beq @118 + + ; Remove the page in question from the data cache + rlwinm r9, r17, 0, 0xFFFFF000 + lwz r8, Area.PageSize(r31) +@dcache_flush_loop + subi r8, r8, 32 + dcbf r8, r9 + cmpwi r8, 0 + bgt @dcache_flush_loop + sync + + ; Also from the inst cache + lwz r8, Area.PageSize(r31) +@icache_flush_loop + subi r8, r8, 32 + icbi r8, r9 + cmpwi r8, 0 + bgt @icache_flush_loop + isync + +@118 + bl major_0x10cb8 ; PTE r16/r17, control r18 // PTE r16/r17 + + lwz r19, Area.PageSize(r31) + stw r17, 0(r30) + add r29, r29, r19 + subf. r8, r29, r28 + bge @pageloop + _AssertAndRelease PSA.HTABLock, scratch=r14 + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +@BIT_16_SET + + bne cr1, ReleaseAndReturnParamErrFromMPCall + lwz r18, 0x001c(r31) + and r8, r4, r5 + orc r9, r4, r5 + or r18, r18, r8 + and r18, r18, r9 + stw r18, 0x001c(r31) + lwz r16, 0x0070(r31) + lwz r17, 0x0074(r31) + bl major_0x10cb8 ; PTE r16/r17, control r18 // PTE r16/r17 + stw r16, 0x0070(r31) + stw r17, 0x0074(r31) + + _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 + + lwz r27, 0x0068(r31) + mr r28, r19 + +@1a4 + mr r8, r29 + lwz r9, Area.AddressSpacePtr(r31) + bl SpaceL2PIgnoringBATs ; LogicalPage *r8, MPAddressSpace *r9 // PhysicalPage *r17 + beq @1bc + bl InvalPTE ; page *r8, PTE r16/r17, PTE *r18, PLE *r30 // PLEflags cr5-7 + bl DeletePTE ; PTE *r18, PLE *r30 + +@1bc + add r29, r29, r27 + subf. r8, r29, r28 + bge @1a4 + _AssertAndRelease PSA.HTABLock, scratch=r14 + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + +; ARG PTE r16, PTE r17, control r18 +; RET PTE r16, PTE r17 +; CLOB CR + + +major_0x10cb8 ; PTE r16/r17, control r18 // PTE r16/r17 + + rlwinm r16, r16, 0, 0xFFFFFF87 ; fill these in again... + rlwinm r17, r17, 0, 0xFFFFFF1F ; + rlwinm r16, r16, 0, 0xFFFFFFFC ; clear + rlwinm r17, r17, 0, 0xFFFFFFF9 ; + + + ; Load control argument into condition register + ; Note: this is a pretty expensive operation, not in hot path + + mtcr r18 + + + bge cr6, @80_not_set ; if(control & 0x80) { + ori r17, r17, 0x80 ; PTE2 |= 0x80; //set referenced bit + ori r16, r16, 0x08 ; PTE1 |= 0x08; //set guard bit +@80_not_set ; } + + + ble cr6, @40_not_set ; if(control & 0x40) { + ori r16, r16, 0x40 ; PTE1 |= 0x40; //set change bit + b @40_endif ; } else { +@40_not_set + ori r17, r17, 0x20 ; PTE2 |= 0x20; //set W bit +@40_endif ; } + + + bne cr6, @20_not_set ; if(control & 0x20) { + ori r17, r17, 0x40 ; PTE2 |= 0x40; //set change bit + ori r16, r16, 0x20 ; PTE1 |= 0x20; //set W bit +@20_not_set ; } + + + ble cr7, @04_not_set ; if(control & 0x04) { +@04_not_set ; } + + + bge cr7, @08_not_set ; if(control & 0x08) { + ori r17, r17, 0x06 ; PTE2 |= 0x06; //set leftmost protection bit and reserved bit + ori r16, r16, 0x01 ; PTE1 |= 0x01; //set rightmost protection bit + b @block_endif ; } +@08_not_set + bne cr7, @02_not_set ; else if(control & 0x02) { + ori r17, r17, 0x00 ; PTE2 |= 0x00; //useless instruction? + ori r16, r16, 0x02 ; PTE1 |= 0x02; //set second protection bit + b @block_endif ; } +@02_not_set + bc BO_IF_NOT, 31, @01_not_set ; else if(control & 0x01) { + ori r17, r17, 0x04 ; PTE2 |= 0x04; //set reserved bit. + ori r16, r16, 0x03 ; PTE1 |= 0x03: //set both protection bits + b @block_endif ; } +@01_not_set ; else { + ori r17, r17, 0x02 ; PTE2 |= 0x02; //set second protection bit + ori r16, r16, 0x00 ; PTE1 |= 0x00; //useless instruction? +@block_endif ; } + + + ori r16, r16, 0x10 ; PTE1 |= 0x10; //set M bit + + + blr ; return (PTE1, PTE2); + + + +major_0x10d38 ; PLE r17 + + andi. r16, r17, %110 + + li r18, 0 + + cmpwi cr0, r16, %010 + cmpwi cr1, r16, %110 + beq cr0, @disconcordant + + li r18, %100 + andi. r16, r17, %100 + ori r18, r18, %001 ; may as well have set both P bits in r8? + bne @disconcordant + ori r18, r18, %010 +@disconcordant + + bne cr1, major_0x10d38_0x30 + ori r18, r18, 0x8 + +major_0x10d38_0x30 + andi. r16, r17, 0x20 + bne major_0x10d38_0x3c + ori r18, r18, 0x40 + +major_0x10d38_0x3c + andi. r16, r17, 0x40 + beq major_0x10d38_0x48 + ori r18, r18, 0x20 + +major_0x10d38_0x48 + andi. r16, r17, 0x80 + beq major_0x10d38_0x54 + ori r18, r18, 0x80 + +major_0x10d38_0x54 + blr + + + +major_0x10d38_0x58 ; OUTSIDE REFERER + andi. r16, r17, 0x03 + li r18, 0x04 + cmpwi cr1, r16, 0x01 + beq major_0x10d38_0x78 + andi. r16, r17, 0x01 + ori r18, r18, 0x01 + bne major_0x10d38_0x78 + ori r18, r18, 0x02 + +major_0x10d38_0x78 + bne cr1, major_0x10d38_0x80 + ori r18, r18, 0x08 + +major_0x10d38_0x80 + andi. r16, r17, 0x40 + beq major_0x10d38_0x8c + ori r18, r18, 0x40 + +major_0x10d38_0x8c + andi. r16, r17, 0x20 + beq major_0x10d38_0x98 + ori r18, r18, 0x20 + +major_0x10d38_0x98 + andi. r16, r17, 0x08 + beq major_0x10d38_0xa4 + ori r18, r18, 0x80 + +major_0x10d38_0xa4 + blr + + + +# # ###### ##### # # +## ## # # # # ###### ##### # # ##### ###### ## # # #### #### ###### #### #### +# # # # # # # # # # # # # # # # # # # # # # # # # +# # # ###### # #### ##### # # # # # ##### # # # # # # ##### #### #### +# # # # # # # ####### ##### # ###### ####### # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # +# # # ##### ###### # # # # # ###### # # # # #### #### ###### #### #### + +; Straight MPLibrary wrapper: returns value via passed ptr +; In Universal Interfaces: no + + DeclareMPCall 123, MPGetAreaAccess + +MPGetAreaAccess + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Area.kIDClass + + bne ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + lwz r16, Area.LogicalBase(r31) + lwz r17, Area.LogicalEnd(r31) + lwz r18, 0x0020(r31) + cmplw r4, r16 + cmplw cr1, r4, r17 + blt ReleaseAndReturnParamErrFromMPCall + bgt cr1, ReleaseAndReturnParamErrFromMPCall + rlwinm. r8, r18, 0, 16, 16 + lwz r5, 0x001c(r31) + +; r1 = kdp + bne ReleaseAndReturnZeroFromMPCall + + _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 + + mr r8, r4 + bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq + beq SpacePanicIsland + bl GetPTEFromPLE ; PLE *r30 // PTE r16/r17, PTE *r18, PTEflags cr0, PLEflags cr5-7 + bcl BO_IF, Area.kPLEFlagIsInHTAB, InvalPTE ; page *r8, PTE r16/r17, PTE *r18, PLE *r30 // PLEflags cr5-7 + bcl BO_IF, Area.kPLEFlagIsInHTAB, DeletePTE ; PTE *r18, PLE *r30 + lwz r17, 0x0000(r30) + _AssertAndRelease PSA.HTABLock, scratch=r14 + bl major_0x10d38 + mr r5, r18 + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + +# # ###### ##### # ###### ###### +## ## # # # # ###### ##### # # ##### ###### ## # # ## #### # # # # # #### # # ##### #### # # # ##### ###### ##### +# # # # # # # # # # # # # # # # # # # # # # # # # ## # # # # # # # # # # # # # # # # # +# # # ###### ##### ##### # # # # # ##### # # ###### # # # #### # # # # # ###### # # # # # # # # # ##### # # +# # # # # # ####### ##### # ###### # # ###### # # # # # # # # ### # ##### # # # # # # # # ##### +# # # # # # # # # # # # # # # # # # # # # # # # ## # # # # # # # # # # # # # # # +# # # ##### ###### # # # # # ###### # # ###### # # #### # # # # # #### # # # #### ## # ##### ###### # # + +; Does the blue task always get these notifications? + +; Straight MPLibrary wrapper: yes +; In Universal Interfaces: no + +; ARG AreaID r3, NotificationID r4, long r5 +; RET OSErr r3 + + DeclareMPCall 77, MPSetAreaBackingProvider + +MPSetAreaBackingProvider + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + ; Expect Area ID in r3 + mr r8, r3 + bl LookupID + cmpwi r9, Area.kIDClass + bne ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + + ; r4 optionally contains... + mr. r8, r4 + beq @no_notification + + ; a Notification ID + bl LookupID + cmpwi r9, Notification.kIDClass + bne ReleaseAndReturnMPCallInvalidIDErr +@no_notification + + stw r4, Area.BackingProviderID(r31) + stw r5, Area.BackingProviderMisc(r31) + + b ReleaseAndReturnZeroFromMPCall + + + +# # ###### ##### ####### ##### +## ## # # # # ## # # # # # # +# # # # # # # # # # # # # # +# # # ###### # # # # # # ##### +# # # # ###### # # # # # +# # # # # # # # # # # # +# # # ##### # # ###### ###### ###### # ##### + +; Dump Area info to userspace + + DeclareMPCall 78, MPCall_78 + +MPCall_78 ; OUTSIDE REFERER + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Area.kIDClass + + bne ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + cmpwi r4, 0x01 + bne ReleaseAndReturnParamErrFromMPCall + cmplwi r5, 0x00 + bne MPCall_78_0x68 + li r16, 0x01 + stw r16, 0x0134(r6) + lwz r16, Area.ProcessID(r31) + stw r16, 0x013c(r6) + lwz r16, Area.AddressSpaceID(r31) + stw r16, 0x0144(r6) + lwz r16, 0x0014(r31) + stw r16, 0x014c(r6) + li r16, 0x10 + stw r16, 0x0154(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +MPCall_78_0x68 + cmplwi r5, 0x10 + bne MPCall_78_0x9c + lwz r16, 0x0018(r31) + stw r16, 0x0134(r6) + lwz r16, 0x001c(r31) + stw r16, 0x013c(r6) + lwz r16, 0x0020(r31) + stw r16, 0x0144(r6) + lwz r16, Area.LogicalBase(r31) + stw r16, 0x014c(r6) + li r16, 0x10 + stw r16, 0x0154(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +MPCall_78_0x9c + cmplwi r5, 0x20 + bne MPCall_78_0xd0 + lwz r16, Area.Length(r31) + stw r16, 0x0134(r6) + lwz r16, Area.LogicalSeparation(r31) + stw r16, 0x013c(r6) + lwz r16, 0x0034(r31) + stw r16, 0x0144(r6) + lwz r16, Area.BytesMapped(r31) + stw r16, 0x014c(r6) + li r16, 0x10 + stw r16, 0x0154(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +MPCall_78_0xd0 + cmplwi r5, 0x30 + bne MPCall_78_0xfc + lwz r16, 0x0068(r31) + stw r16, 0x0134(r6) + lwz r16, 0x0080(r31) + stw r16, 0x013c(r6) + lwz r16, 0x0084(r31) + stw r16, 0x0144(r6) + li r16, 0x0c + stw r16, 0x0154(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +MPCall_78_0xfc + cmpwi r5, 0x3c + bne ReleaseAndReturnParamErrFromMPCall + li r16, 0x00 + stw r16, 0x0154(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + +# # ###### ##### # # # ### ###### +## ## # # # # ###### ##### ## # ###### # # ##### # # ##### ###### ## # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # +# # # ###### # #### ##### # # # # ##### ## # # # # # ##### # # # # # +# # # # # # # # # # # ## # ####### ##### # ###### # # # +# # # # # # # # ## # # # # # # # # # # # # # # +# # # ##### ###### # # # ###### # # # # # # # ###### # # ### ###### + +; OSStatus MPGetNextAreaID(MPAddressSpaceID owningSpaceID, MPAreaID *areaID) + +; Straight MPLibrary wrapper: returns value via passed ptr +; In Universal Interfaces: yes + + DeclareMPCall 79, MPGetNextAreaID + +MPGetNextAreaID + + mr. r8, r3 + mfsprg r28, 0 + lwz r31, EWA.PA_CurAddressSpace(r28) + beq MPCall_79_0x20 + bl LookupID + cmpwi r9, AddressSpace.kIDClass + + bne ReturnMPCallInvalidIDErr + mr r31, r8 + +MPCall_79_0x20 + lwz r3, Area.ID(r31) + +MPCall_79_0x24 + mr r8, r4 + li r9, 0x0b + bl GetNextIDOfClass + cmpwi r8, 0x00 + beq ReturnMPCallInvalidIDErr + mr r4, r8 + 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 + + lwz r16, 0x0010(r8) + cmpw r16, r3 + bne MPCall_79_0x24 + b ReturnZeroFromMPCall + + + +# # ###### ##### # ####### # +## ## # # # # ###### ##### # # ##### ###### ## # ##### #### # # # # ##### ##### ##### ###### #### #### +# # # # # # # # # # # # # # # # # # # # # ## ## # # # # # # # # # # # +# # # ###### # #### ##### # # # # # ##### # # ##### # # # # # ## # # # # # # # # # ##### #### #### +# # # # # # # ####### ##### # ###### # ##### # # # # ####### # # # # ##### # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # ##### ###### # # # # # ###### # # # # # #### # # # # ##### ##### # # ###### #### #### + +; Straight MPLibrary wrapper: returns value via passed ptr +; In Universal Interfaces: yes + + DeclareMPCall 80, MPGetAreaFromAddress + +MPGetAreaFromAddress + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr. r8, r3 + mfsprg r9, 0 + bne MPCall_80_0x2c + lwz r8, EWA.PA_CurAddressSpace(r9) + b MPCall_80_0x38 + +MPCall_80_0x2c bl LookupID + cmpwi r9, AddressSpace.kIDClass + + bne ReleaseAndReturnMPCallInvalidIDErr + +MPCall_80_0x38 + mr r9, r4 + bl FindAreaAbove + lwz r16, 0x0024(r8) + li r5, 0x00 + cmplw r16, r4 + bgt ReleaseAndReturnParamErrFromMPCall + lwz r5, 0x0000(r8) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + +# # ###### ##### # # # ####### # +## ## # # # # ###### ##### ## # ###### # # ##### # # ##### ###### ## # ##### #### # # # # ##### ##### ##### ###### #### #### +# # # # # # # # # # # # # # # # # # # # # # # # # # # # ## ## # # # # # # # # # # # +# # # ###### # #### ##### # # # # ##### ## # # # # # ##### # # ##### # # # # # ## # # # # # # # # # ##### #### #### +# # # # # # # # # # # ## # ####### ##### # ###### # ##### # # # # ####### # # # # ##### # # # +# # # # # # # # ## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # ##### ###### # # # ###### # # # # # # # ###### # # # # # #### # # # # ##### ##### # # ###### #### #### + +; Straight MPLibrary wrapper: returns value via passed ptr +; In Universal Interfaces: yes + + DeclareMPCall 125, MPGetNextAreaFromAddress + +MPGetNextAreaFromAddress + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr. r8, r3 + mfsprg r9, 0 + bne MPCall_125_0x2c + lwz r8, EWA.PA_CurAddressSpace(r9) + b MPCall_125_0x38 + +MPCall_125_0x2c bl LookupID + cmpwi r9, AddressSpace.kIDClass + + bne ReleaseAndReturnMPCallInvalidIDErr + +MPCall_125_0x38 + mr r9, r4 + bl FindAreaAbove + lwz r16, 0x0024(r8) + li r5, 0x00 + cmplw r16, r4 + bgt MPCall_125_0x58 + lwz r8, 0x005c(r8) + addi r8, r8, -0x54 + +MPCall_125_0x58 + lwz r9, 0x002c(r8) + cmpwi r9, noErr + beq ReleaseAndReturnParamErrFromMPCall + lwz r5, 0x0000(r8) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + +# # ###### ##### ###### # +## ## # # # # ###### ##### # # # # # # #### # #### ## # # # ##### ##### ##### ###### #### #### +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # ###### # #### ##### # ###### ###### # #### # # # # # # # # # # # # # ##### #### #### +# # # # # # # # # # # # # # ###### # ####### # # # # ##### # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # ##### ###### # # # # # #### # #### # # ###### # # ##### ##### # # ###### #### #### + +; Straight MPLibrary wrapper: no +; In Universal Interfaces: no + + DeclareMPCall 81, MPGetPhysicalAddress + +MPGetPhysicalAddress + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Area.kIDClass + + mr r31, r8 + bne ReleaseAndReturnMPCallInvalidIDErr + lwz r16, Area.LogicalBase(r31) + lwz r17, Area.LogicalEnd(r31) + lwz r18, 0x0020(r31) + cmplw r4, r16 + cmplw cr1, r4, r17 + blt ReleaseAndReturnParamErrFromMPCall + bgt cr1, ReleaseAndReturnParamErrFromMPCall + rlwinm. r8, r18, 0, 16, 16 + lwz r19, 0x0070(r31) + beq MPCall_81_0x70 + lwz r17, Area.BytesMapped(r31) + rlwinm r19, r19, 0, 0, 19 + cmpwi r17, 0x00 + subf r18, r16, r4 + beq ReleaseAndReturnParamErrFromMPCall + add r5, r18, r19 + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +MPCall_81_0x70 + li r3, 0x00 + + _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 + + mr r8, r4 + bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq + bl GetPTEFromPLE ; PLE *r30 // PTE r16/r17, PTE *r18, PTEflags cr0, PLEflags cr5-7 + bc BO_IF_NOT, Area.kPLEFlagHasPhysPage, MPCall_81_0xc8 + mr r5, r17 + rlwimi r5, r4, 0, 20, 31 + +MPCall_81_0xa4 + _AssertAndRelease PSA.HTABLock, scratch=r8 + b ReleaseAndReturnMPCall + +MPCall_81_0xc8 + li r3, kMPInsufficientResourcesErr + b MPCall_81_0xa4 + + + +# # ###### ##### ###### ####### +## ## # # # # ###### ##### # # # # # # #### # #### ## # # # # ##### ###### # # ##### +# # # # # # # # # # # # # # # # # # # # # # # # # # # ## # # +# # # ###### # #### ##### # ###### ###### # #### # # # # # ##### ## # ##### # # # # +# # # # # # # # # # # # # # ###### # # ## # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # ## # +# # # ##### ###### # # # # # #### # #### # # ###### ####### # # # ###### # # # + +; Straight MPLibrary wrapper: no +; In Universal Interfaces: no + + DeclareMPCall 98, MPGetPhysicalExtent + +MPGetPhysicalExtent + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Area.kIDClass + + mr r31, r8 + bne ReleaseAndReturnMPCallInvalidIDErr + lwz r16, Area.LogicalBase(r31) + lwz r17, Area.LogicalEnd(r31) + mr r29, r5 + add r5, r5, r4 + lwz r18, 0x0020(r31) + addi r5, r5, -0x01 + cmplw r4, r16 + cmplw cr1, r5, r17 + 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, ReleaseAndReturnParamErrFromMPCall + lwz r19, 0x0070(r31) + subf r18, r16, r4 + rlwinm r19, r19, 0, 0, 19 + add r16, r18, r19 + stw r16, 0x0134(r6) + stw r29, 0x013c(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +MPCall_98_0x84 + + _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 + + mr r8, r4 + mr r28, r4 + bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq + beq SpacePanicIsland + bl GetPTEFromPLE ; PLE *r30 // PTE r16/r17, PTE *r18, PTEflags cr0, PLEflags cr5-7 + crclr cr3_eq + li r3, 0x00 + bso cr7, MPCall_98_0xc4 + crset cr3_eq + li r3, kMPInsufficientResourcesErr + +MPCall_98_0xc4 + rlwimi r17, r4, 0, 20, 31 + rlwinm r29, r17, 0, 0, 19 + stw r17, 0x0134(r6) + +MPCall_98_0xd0 + lwz r16, 0x0068(r31) + add r28, r28, r16 + add r29, r29, r16 + cmplw cr2, r28, r5 + bgt cr2, MPCall_98_0x140 + mr r8, r28 + bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq + beq SpacePanicIsland + bl GetPTEFromPLE ; PLE *r30 // PTE r16/r17, PTE *r18, PTEflags cr0, PLEflags cr5-7 + rlwinm r17, r17, 0, 0, 19 + crxor 31, 31, 14 + bc BO_IF_NOT, Area.kPLEFlagHasPhysPage, MPCall_98_0x10c + beq cr3, MPCall_98_0xd0 + cmplw r29, r17 + beq MPCall_98_0xd0 + +MPCall_98_0x10c + lwz r16, 0x007c(r31) + and r28, r28, r16 + subf r16, r4, r28 + +MPCall_98_0x118 + stw r16, 0x013c(r6) + _AssertAndRelease PSA.HTABLock, scratch=r8 + b ReleaseAndReturnMPCall + +MPCall_98_0x140 + addi r5, r5, 0x01 + beq cr3, MPCall_98_0x170 + mr r8, r28 + bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq + beq SpacePanicIsland + bl GetPTEFromPLE ; PLE *r30 // PTE r16/r17, PTE *r18, PTEflags cr0, PLEflags cr5-7 + rlwinm r17, r17, 0, 0, 19 + bc BO_IF_NOT, Area.kPLEFlagHasPhysPage, MPCall_98_0x170 + cmplw r29, r17 + bne MPCall_98_0x170 + subf r16, r4, r5 + b MPCall_98_0x118 + +MPCall_98_0x170 + lwz r16, 0x007c(r31) + and r28, r28, r16 + cmplw r5, r28 + bge MPCall_98_0x184 + mr r28, r5 + +MPCall_98_0x184 + subf r16, r4, r28 + b MPCall_98_0x118 + + + +# # ###### ###### # +## ## # # # # ###### #### # #### ##### ###### ##### # # #### ###### ##### +# # # # # # # # # # # # # # # # # # # # # # # # +# # # ###### ###### ##### # # #### # ##### # # # # # ##### # # +# # # # # # # ### # # # # ##### ####### # ### # ##### +# # # # # # # # # # # # # # # # # # # # # # +# # # # # ###### #### # #### # ###### # # # # #### ###### # # + +; ARG MPNotificationID r3 +; RET OSStatus r3 + +; Straight MPLibrary wrapper: yes +; In Universal Interfaces: no + + DeclareMPCall 82, MPRegisterAger + +MPRegisterAger + + ; May only register the ager once + lwz r8, PSA.AgerID(r1) + cmpwi r8, 0 + bne ReturnMPCallOOM + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Notification.kIDClass + bne ReleaseAndReturnMPCallInvalidIDErr + + stw r3, PSA.AgerID(r1) + + b ReleaseAndReturnZeroFromMPCall + + + +# # ###### ##### ####### ###### +## ## # # # # ###### ##### # ##### ###### ###### # # ## #### ###### +# # # # # # # # # # # # # # # # # # # # # +# # # ###### # #### ##### # ##### # # ##### ##### ###### # # # ##### +# # # # # # # # ##### # # # ###### # ### # +# # # # # # # # # # # # # # # # # # +# # # ##### ###### # # # # ###### ###### # # # #### ###### + +; Pop page from system free list + +; RET OSStatus r3, PhysicalPage *r4 + +; Straight MPLibrary wrapper: returns value via passed ptr +; In Universal Interfaces: no + + DeclareMPCall 83, MPGetFreePage + +MPGetFreePage + + _Lock PSA.PoolLock, scratch1=r16, scratch2=r17 + bl FreePageListPop ; // PhysicalPage *r8 + _AssertAndRelease PSA.PoolLock, scratch=r16 + + ; Success + mr. r4, r8 + bne ReturnZeroFromMPCall + + ; Failure. Fall through to something horrible! + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + + +# # # # # # +## ## # # #### # # # # ##### #### # # # # ##### # # # # ##### # # # # #### ###### ##### +# # # # # # # # # # # # # # # # # # ## # # # # # # # # # # # # # # # # # +# # # # # # #### # # # # # # # # # # # # # # # # # # ###### # # # ##### # # +# # # # # # # ####### ##### # # # # # # # # # # # # # # # # ####### # ### # ##### +# # # # # # # # # # # # # # # # # ## # # # # # # # # # # # # # # # # +# # #### #### # # # # # # #### #### # # ##### ## ## # # # # # # #### ###### # # + +FailMPCallAndNotifyAgerWeNeedPages + + lwz r8, PSA.AgerID(r1) + bl LookupID + cmpwi r9, Notification.kIDClass + mr r31, r8 + bne ReleaseAndReturnMPCallOOM + + lwz r8, Notification.EventGroupID(r31) + bl LookupID + cmpwi r9, EventGroup.kIDClass + mr r31, r8 + bne ReleaseAndReturnMPCallOOM + + ; Huh? Event Groups are 32 bytes. Bug? + lwz r8, 0x20(r31) + bl SetEvent + + b ReleaseAndReturnMPCallOOM + + + +####### ###### # ###### +# ##### ###### ###### # # ## #### ###### # # #### ##### # # #### ##### +# # # # # # # # # # # # # # # # # # # # # # +##### # # ##### ##### ###### # # # ##### # # #### # ###### # # # # +# ##### # # # ###### # ### # # # # # # # # ##### +# # # # # # # # # # # # # # # # # # # # +# # # ###### ###### # # # #### ###### ####### # #### # # #### # + +; Requires PoolLock to be acquired! + +FreePageListPop ; // PhysicalPage *r8 + + addi r18, r1, PSA.FreeList + lwz r8, PSA.FreeList + LLL.Next(r1) + cmpw r8, r18 + beq @fail + + RemoveFromList r8, scratch1=r16, scratch2=r17 + + lwz r16, PSA.FreePageCount(r1) + subi r16, r16, 1 + stw r16, PSA.FreePageCount(r1) + + ; Daniel found the bug here! + lwz r17, LLL.Signature(r8) + mfspr r16, dec + eqv. r17, r18, r17 + + stw r16, 0(r8) + bne SpacePanicIsland + stw r16, 4(r8) + stw r16, 8(r8) + stw r16, 12(r8) + + blr + +@fail + li r8, 0 + blr + + + +# # ###### ###### ####### ###### +## ## # # # # # # ##### # ##### ###### ###### # # ## #### ###### +# # # # # # # # # # # # # # # # # # # # # # # +# # # ###### ###### # # # ##### # # ##### ##### ###### # # # ##### +# # # # # # # # ##### # # # ###### # ### # +# # # # # # # # # # # # # # # # # # +# # # # #### # # # # ###### ###### # # # #### ###### + +; Checks some junk in the page first (consider removing this) + +; ARG PhysicalPage *r3 +; RET OSStatus r3 + +; Straight MPLibrary wrapper: yes +; In Universal Interfaces: no + + DeclareMPCall 84, MPPutFreePage + +MPPutFreePage + + _Lock PSA.PoolLock, scratch1=r16, scratch2=r17 + + lwz r16, 4(r3) + lwz r17, 0(r3) + + addi r18, r1, PSA.FreeList + eqv. r16, r16, r17 + cmpw cr1, r17, r18 + bne @succeed + bne cr1, @succeed + + li r3, paramErr + b @return + +@succeed + mr r8, r3 + bl FreePageListPush ; PhysicalPage *r8 + li r3, 0 + +@return + _AssertAndRelease PSA.PoolLock, scratch=r16 + + b CommonMPCallReturnPath + + + +####### ###### # ###### +# ##### ###### ###### # # ## #### ###### # # #### ##### # # # # #### # # +# # # # # # # # # # # # # # # # # # # # # # # +##### # # ##### ##### ###### # # # ##### # # #### # ###### # # #### ###### +# ##### # # # ###### # ### # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # +# # # ###### ###### # # # #### ###### ####### # #### # # #### #### # # + +FreePageListPush ; PhysicalPage *r8 + + ; Must be an actual page-aligned address + clrlwi. r9, r8, 20 + addi r9, r1, PSA.FreeList + bne SpacePanicIsland + + + ; This is probably an alternative to heavyweight locks around the free list + + stw r9, 0(r8) ; store &parent in Freeform field + + InsertAsPrev r8, r9, scratch=r16 + + not r9, r9 + stw r9, 4(r8) ; store ^&parent in Signature field + + + lwz r8, PSA.FreePageCount(r1) + addi r8, r8, 1 + stw r8, PSA.FreePageCount(r1) + + blr + + + +# # ###### ##### ####### ###### ##### +## ## # # # # ###### ##### # ##### ###### ###### # # ## #### ###### # # #### # # # # ##### +# # # # # # # # # # # # # # # # # # # # # # # # # # ## # # +# # # ###### # #### ##### # ##### # # ##### ##### ###### # # # ##### # # # # # # # # # +# # # # # # # # ##### # # # ###### # ### # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # ## # +# # # ##### ###### # # # # ###### ###### # # # #### ###### ##### #### #### # # # + +; RET r3 + +; Straight MPLibrary wrapper: yes +; In Universal Interfaces: no + + DeclareMPCall 100, MPGetFreePageCount + +MPGetFreePageCount + + lwz r3, PSA.FreePageCount(r1) + b CommonMPCallReturnPath + + + +# # ###### ##### # # ###### ##### +## ## # # # # ###### ##### # # # # # # ###### # ##### # # ## #### ###### # # #### # # # # ##### +# # # # # # # # # # # ## # # # # # # # # # # # # # # # # # # # ## # # +# # # ###### # #### ##### # # # # # # ###### ##### # # # ###### # # # ##### # # # # # # # # # +# # # # # # # # # # # # # # # # # # # ###### # ### # # # # # # # # # # +# # # # # # # # # # ## # # # # # # # # # # # # # # # # # # # ## # +# # # ##### ###### # ##### # # # # ###### ###### ##### # # # #### ###### ##### #### #### # # # + +; RET r3 + +; Straight MPLibrary wrapper: yes +; In Universal Interfaces: no + + DeclareMPCall 101, MPGetUnheldPageCount + +MPGetUnheldPageCount + + lwz r3, PSA.UnheldFreePageCount(r1) + b CommonMPCallReturnPath + + + +# # ###### # # ###### +## ## # # ## ## ## ##### # # ## #### ###### +# # # # # # # # # # # # # # # # # # # # # +# # # ###### # # # # # # # ###### # # # ##### +# # # # # ###### ##### # ###### # ### # +# # # # # # # # # # # # # # +# # # # # # # # # # # #### ###### + +; ARG MPAreaID r3 + +; Straight MPLibrary wrapper: yes +; In Universal Interfaces: no + + DeclareMPCall 85, MPMapPage + +MPMapPage + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Area.kIDClass + bne ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + + lwz r16, Area.Flags(r31) + rlwinm. r8, r16, 0, Area.kAliasFlag, Area.kAliasFlag + bne ReleaseAndReturnParamErrFromMPCall + + lwz r16, Area.LogicalBase(r31) + lwz r17, Area.LogicalEnd(r31) + lwz r19, Area.FlagsAndMinAlign(r31) + cmplw r4, r16 + cmplw cr1, r4, r17 + blt ReleaseAndReturnParamErrFromMPCall + bgt cr1, ReleaseAndReturnParamErrFromMPCall + + rlwinm. r8, r19, 0, 16, 16 ; test Contig bit of FlagsAndMinAlign + cmplw cr1, r4, r16 + lwz r20, Area.BytesMapped(r31) + beq @not_contig_area + bne cr1, ReleaseAndReturnParamErrFromMPCall + +;is contig area + + cmpwi r20, 0 + lwz r8, Area.ContigPTETemplate(r31) + bne ReleaseAndReturnMPCallOOM + rlwimi r8, r5, 0, 0xFFFFF000 + lwz r18, Area.DefaultAlignmentMask(r31) + lwz r20, Area.Length(r31) + stw r8, Area.ContigPTETemplate(r31) + stw r20, Area.BytesMapped(r31) + + b ReleaseAndReturnZeroFromMPCall + +@not_contig_area + + _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 + + mr r8, r4 + bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq + beq SpacePanicIsland + + lwz r29, 0(r30) + _AssertAndRelease PSA.HTABLock, scratch=r14 + + rlwinm. r8, r29, 0, 31, 31 + bne ReleaseAndReturnMPCallOOM + + lwz r17, ContextBlock.r6(r6) + rlwinm. r8, r17, 0, 30, 30 + bne KCMapPage_0x12c + + _Lock PSA.PoolLock, scratch1=r16, scratch2=r17 + bl FreePageListPop ; // PhysicalPage *r8 + _AssertAndRelease PSA.PoolLock, scratch=r16 + + mr. r5, r8 + beq FailMPCallAndNotifyAgerWeNeedPages + +KCMapPage_0x12c + lwz r17, 0x0134(r6) + rlwinm. r8, r17, 0, 29, 29 + beq KCMapPage_0x17c + rlwinm. r8, r29, 0, 25, 25 + lwz r18, 0x0068(r31) + +KCMapPage_0x140 + addi r18, r18, -0x20 + bne KCMapPage_0x174 + dcbst r18, r5 + +KCMapPage_0x14c + cmpwi cr1, r18, 0x00 + bgt cr1, KCMapPage_0x140 + sync + lwz r18, 0x0068(r31) + +KCMapPage_0x15c + addi r18, r18, -0x20 + icbi r18, r5 + cmpwi cr1, r18, 0x00 + bgt cr1, KCMapPage_0x15c + isync + b KCMapPage_0x17c + +KCMapPage_0x174 + dcbf r18, r5 + b KCMapPage_0x14c + +KCMapPage_0x17c + lwz r18, 0x0068(r31) + andi. r29, r29, 0x7e7 + ori r29, r29, 0x01 + rlwimi r29, r5, 0, 0, 19 + lwz r17, Area.BytesMapped(r31) + stw r29, 0x0000(r30) + add r17, r17, r18 + stw r17, Area.BytesMapped(r31) + lwz r17, 0x0134(r6) + clrlwi. r8, r17, 0x1f + +; r1 = kdp + beq ReleaseAndReturnZeroFromMPCall + lwz r5, 0x0068(r31) + b HoldPages + + + +# # ###### # # ###### +## ## # # # # # # # # ## ##### # # ## #### ###### #### +# # # # # # # # ## # ## ## # # # # # # # # # # # # +# # # ###### # # # # # # ## # # # # # ###### # # # ##### #### +# # # # # # # # # # ###### ##### # ###### # ### # # +# # # # # # ## # # # # # # # # # # # # # +# # # ##### # # # # # # # # # # #### ###### #### + +; Straight MPLibrary wrapper: yes +; In Universal Interfaces: no + + DeclareMPCall 86, MPUnmapPages + +MPUnmapPages + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Area.kIDClass + + bne ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + lwz r8, 0x0134(r6) + lwz r16, Area.Flags(r31) + rlwinm. r16, r16, 0, 28, 28 + bne ReleaseAndReturnParamErrFromMPCall + clrlwi. r8, r8, 0x1f + add r5, r5, r4 + lwz r16, Area.LogicalBase(r31) + lwz r17, Area.LogicalEnd(r31) + lwz r19, 0x0020(r31) + crmove 14, 2 + addi r5, r5, -0x01 + cmplw r4, r16 + cmplw cr1, r5, r17 + 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, ReleaseAndReturnParamErrFromMPCall + cmpwi r20, 0x00 + li r20, 0x00 + ble ReleaseAndReturnMPCallOOM + stw r20, Area.BytesMapped(r31) + + _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 + + li r30, 0x00 + +KCUnmapPages_0xac + mr r8, r4 + lwz r9, Area.AddressSpacePtr(r31) + bl SpaceL2PIgnoringBATs ; LogicalPage *r8, MPAddressSpace *r9 // PhysicalPage *r17 + beq KCUnmapPages_0xc4 + bl InvalPTE ; page *r8, PTE r16/r17, PTE *r18, PLE *r30 // PLEflags cr5-7 + bl DeletePTE ; PTE *r18, PLE *r30 + +KCUnmapPages_0xc4 + add r4, r4, r29 + subf. r8, r4, r5 + bge KCUnmapPages_0xac + crclr cr3_eq + b KCUnmapPages_0x158 + +KCUnmapPages_0xd8 + bne cr3, KCUnmapPages_0xf4 + + _Lock PSA.PoolLock, scratch1=r14, scratch2=r15 + + +KCUnmapPages_0xf4 + + _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 + + lwz r28, Area.BytesMapped(r31) + +KCUnmapPages_0x110 + mr r8, r4 + bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq + beq SpacePanicIsland + bl GetPTEFromPLE ; PLE *r30 // PTE r16/r17, PTE *r18, PTEflags cr0, PLEflags cr5-7 + bc BO_IF_NOT, Area.kPLEFlagHasPhysPage, KCUnmapPages_0x148 + bcl BO_IF, Area.kPLEFlagIsInHTAB, InvalPTE ; page *r8, PTE r16/r17, PTE *r18, PLE *r30 // PLEflags cr5-7 + bcl BO_IF, Area.kPLEFlagIsInHTAB, DeletePTE ; PTE *r18, PLE *r30 + lwz r18, 0x0000(r30) + subf r28, r29, r28 + rlwinm r18, r18, 0, 0, 30 + stw r18, 0x0000(r30) + bne cr3, KCUnmapPages_0x148 + rlwinm r8, r18, 0, 0, 19 + +; r1 = kdp +; r8 = maybe the page + bl FreePageListPush ; PhysicalPage *r8 + +KCUnmapPages_0x148 + add r4, r4, r29 + subf. r8, r4, r5 + bge KCUnmapPages_0x110 + stw r28, Area.BytesMapped(r31) + +KCUnmapPages_0x158 + _AssertAndRelease PSA.HTABLock, scratch=r14 + +; r1 = kdp + bne cr3, ReleaseAndReturnZeroFromMPCall + _AssertAndRelease PSA.PoolLock, scratch=r14 + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + +# # ###### # # ###### ##### +## ## # # ## ## ## # # ###### # # # # # # #### # #### ## # # # # # # #### # # ##### # #### # # #### # # #### +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ## # # # # # # # # # # # # +# # # ###### # # # # # #### ##### ###### ###### # #### # # # # # # # # # # # # # # # # # # # # # # #### +# # # # # ###### # # # # # # # # # # ###### # # # # # # # # # # # # ### # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # ## # # # # # # # # # # # # +# # # # # # # # # ###### # # # # #### # #### # # ###### ###### # ##### #### # # # # #### #### #### #### #### + +; Straight MPLibrary wrapper: yes +; In Universal Interfaces: no + + DeclareMPCall 127, MPMakePhysicallyContiguous + +MPMakePhysicallyContiguous + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Area.kIDClass + + bne ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + mr r27, r5 + add r5, r5, r4 + lwz r16, Area.LogicalBase(r31) + lwz r17, Area.LogicalEnd(r31) + addi r5, r5, -0x01 + cmplw r4, r16 + cmplw cr1, r5, r17 + blt ReleaseAndReturnParamErrFromMPCall + bgt cr1, ReleaseAndReturnParamErrFromMPCall + lwz r19, 0x0020(r31) + lwz r29, 0x0068(r31) + rlwinm. r8, r19, 0, 16, 16 + bne ReleaseAndReturnParamErrFromMPCall + + _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 + + mr r27, r4 + li r28, -0x01 + +NKMakePhysicallyContiguous_0x80 + mr r8, r27 + bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq + beq SpacePanicIsland + bl GetPTEFromPLE ; PLE *r30 // PTE r16/r17, PTE *r18, PTEflags cr0, PLEflags cr5-7 + bc BO_IF_NOT, Area.kPLEFlagHasPhysPage, NKMakePhysicallyContiguous_0x150 + rlwinm r8, r17, 0, 0, 19 + cmpwi r28, -0x01 + cmpw cr1, r28, r8 + mr r28, r8 + beq NKMakePhysicallyContiguous_0xac + bne cr1, NKMakePhysicallyContiguous_0xe0 + +NKMakePhysicallyContiguous_0xac + add r27, r27, r29 + add r28, r28, r29 + subf. r8, r27, r5 + bge NKMakePhysicallyContiguous_0x80 + _AssertAndRelease PSA.HTABLock, scratch=r14 + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +NKMakePhysicallyContiguous_0xe0 + _AssertAndRelease PSA.HTABLock, scratch=r14 + + _Lock PSA.PoolLock, scratch1=r16, scratch2=r17 + + addi r18, r1, PSA.FreeList + lwz r8, PSA.FreeList + LLL.Next(r1) + cmpw r8, r18 + beq NKMakePhysicallyContiguous_0x174 + b NKMakePhysicallyContiguous_0x174 + + ; Dead code: + _AssertAndRelease PSA.PoolLock, scratch=r16 + b ReleaseAndReturnZeroFromMPCall + +NKMakePhysicallyContiguous_0x150 + _AssertAndRelease PSA.HTABLock, scratch=r16 + b ReleaseAndReturnMPCallOOM + +NKMakePhysicallyContiguous_0x174 + _AssertAndRelease PSA.PoolLock, scratch=r16 + b ReleaseAndReturnMPCallOOM + + + +# # ###### # ###### +## ## # # # #### #### # # # # ## #### ###### #### +# # # # # # # # # # # # # # # # # # # # # +# # # ###### # # # # #### ###### # # # ##### #### +# # # # # # # # # # ###### # ### # # +# # # # # # # # # # # # # # # # # # +# # # ####### #### #### # # # # # #### ###### #### + +; Straight MPLibrary wrapper: yes +; In Universal Interfaces: no + + DeclareMPCall 87, MPLockPages + +MPLockPages + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Area.kIDClass + + bne ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + mr r27, r5 + add r5, r5, r4 + lwz r16, Area.LogicalBase(r31) + lwz r17, Area.LogicalEnd(r31) + addi r5, r5, -0x01 + cmplw r4, r16 + cmplw cr1, r5, r17 + blt ReleaseAndReturnParamErrFromMPCall + bgt cr1, ReleaseAndReturnParamErrFromMPCall + lwz r19, 0x0020(r31) + lwz r29, 0x0068(r31) + rlwinm. r8, r19, 0, 16, 16 + bne ReleaseAndReturnParamErrFromMPCall + mr r27, r4 + li r28, 0x00 + +KCLockPages_0x68 + mr r8, r27 + bl MPCall_95_0x254 + beq ReleaseAndReturnParamErrFromMPCall + lhz r18, 0x0000(r30) + rlwinm r17, r18, 24, 25, 31 + rlwinm. r8, r18, 0, 16, 16 + cmpwi cr1, r17, 0x7f + addi r28, r28, 0x01 + beq KCLockPages_0x94 + addi r28, r28, -0x01 + bge cr1, major_0x0b0cc + +KCLockPages_0x94 + add r27, r27, r29 + subf. r8, r27, r5 + bge KCLockPages_0x68 + + _Lock PSA.PoolLock, scratch1=r16, scratch2=r17 + + lwz r16, PSA.UnheldFreePageCount(r1) + subf. r16, r28, r16 + ble KCLockPages_0xc8 + stw r16, PSA.UnheldFreePageCount(r1) + +KCLockPages_0xc8 + _AssertAndRelease PSA.PoolLock, scratch=r16 + ble ReleaseAndReturnMPCallOOM + mr r27, r4 + +KCLockPages_0xf0 + mr r8, r27 + bl MPCall_95_0x254 + beq SpacePanicIsland + lhz r18, 0x0000(r30) + rlwinm. r17, r18, 0, 16, 16 + bne KCLockPages_0x10c + li r18, -0x8000 + +KCLockPages_0x10c + rlwinm r17, r18, 24, 25, 31 + addi r17, r17, 0x01 + rlwimi r18, r17, 8, 17, 23 + sth r18, 0x0000(r30) + add r27, r27, r29 + subf. r8, r27, r5 + bge KCLockPages_0xf0 + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + +# # ###### # # ###### +## ## # # # # # # # #### #### # # # # ## #### ###### #### +# # # # # # # # ## # # # # # # # # # # # # # # # # +# # # ###### # # # # # # # # # #### ###### # # # ##### #### +# # # # # # # # # # # # # # # ###### # ### # # +# # # # # # ## # # # # # # # # # # # # # # # +# # # ##### # # ###### #### #### # # # # # #### ###### #### + +; Straight MPLibrary wrapper: yes +; In Universal Interfaces: no + + DeclareMPCall 88, MPUnlockPages + +MPUnlockPages + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Area.kIDClass + + bne ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + add r5, r5, r4 + lwz r16, Area.LogicalBase(r31) + lwz r17, Area.LogicalEnd(r31) + addi r5, r5, -0x01 + cmplw r4, r16 + cmplw cr1, r5, r17 + blt ReleaseAndReturnParamErrFromMPCall + bgt cr1, ReleaseAndReturnParamErrFromMPCall + lwz r19, 0x0020(r31) + lwz r29, 0x0068(r31) + rlwinm. r8, r19, 0, 16, 16 + bne ReleaseAndReturnParamErrFromMPCall + mr r27, r4 + +KCUnlockPages_0x60 + mr r8, r27 + bl MPCall_95_0x254 + beq ReleaseAndReturnParamErrFromMPCall + lhz r18, 0x0000(r30) + rlwinm r17, r18, 24, 25, 31 + rlwinm. r8, r18, 0, 16, 16 + cmpwi cr1, r17, 0x00 + beq major_0x0b0cc + addi r28, r28, 0x01 + beq cr1, major_0x0b0cc + add r27, r27, r29 + subf. r8, r27, r5 + bge KCUnlockPages_0x60 + li r28, 0x00 + +KCUnlockPages_0x98 + mr r8, r4 + bl MPCall_95_0x254 + beq ReleaseAndReturnParamErrFromMPCall + lhz r18, 0x0000(r30) + rlwinm r17, r18, 24, 25, 31 + addi r17, r17, -0x01 + rlwimi r18, r17, 8, 17, 23 + clrlwi. r8, r18, 0x11 + bne KCUnlockPages_0xc4 + rlwinm r18, r18, 0, 17, 15 + addi r28, r28, 0x01 + +KCUnlockPages_0xc4 + sth r18, 0x0000(r30) + add r4, r4, r29 + subf. r8, r4, r5 + bge KCUnlockPages_0x98 + + _Lock PSA.PoolLock, scratch1=r16, scratch2=r17 + + lwz r16, PSA.UnheldFreePageCount(r1) + add r16, r16, r28 + stw r16, PSA.UnheldFreePageCount(r1) + _AssertAndRelease PSA.PoolLock, scratch=r16 + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + +# # ###### # # ###### +## ## # # # # #### # ##### # # ## #### ###### #### +# # # # # # # # # # # # # # # # # # # # # +# # # ###### ####### # # # # # ###### # # # ##### #### +# # # # # # # # # # # ###### # ### # # +# # # # # # # # # # # # # # # # # # +# # # # # #### ###### ##### # # # #### ###### #### + +; Straight MPLibrary wrapper: yes +; In Universal Interfaces: no + + DeclareMPCall 89, MPHoldPages + +MPHoldPages + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Area.kIDClass + bne ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + + + +# # ###### +# # #### # ##### # # ## #### ###### #### +# # # # # # # # # # # # # # # +####### # # # # # ###### # # # ##### #### +# # # # # # # # ###### # ### # # +# # # # # # # # # # # # # # # +# # #### ###### ##### # # # #### ###### #### + +HoldPages + + add r5, r5, r4 + lwz r16, Area.LogicalBase(r31) + lwz r17, Area.LogicalEnd(r31) + addi r5, r5, -0x01 + cmplw r4, r16 + cmplw cr1, r5, r17 + blt ReleaseAndReturnParamErrFromMPCall + bgt cr1, ReleaseAndReturnParamErrFromMPCall + lwz r19, 0x0020(r31) + lwz r29, 0x0068(r31) + rlwinm. r8, r19, 0, 16, 16 + bne ReleaseAndReturnParamErrFromMPCall + mr r27, r4 + li r28, 0x00 + +KCHoldPages_0x64 + mr r8, r27 + bl MPCall_95_0x254 + beq ReleaseAndReturnParamErrFromMPCall + lhz r18, 0x0000(r30) + clrlwi r17, r18, 0x18 + rlwinm. r8, r18, 0, 16, 16 + cmpwi cr1, r17, 0xff + addi r28, r28, 0x01 + beq KCHoldPages_0x90 + addi r28, r28, -0x01 + bge cr1, major_0x0b0cc + +KCHoldPages_0x90 + add r27, r27, r29 + subf. r8, r27, r5 + bge KCHoldPages_0x64 + + _Lock PSA.PoolLock, scratch1=r16, scratch2=r17 + + lwz r16, PSA.UnheldFreePageCount(r1) + subf. r16, r28, r16 + ble KCHoldPages_0xc4 + stw r16, PSA.UnheldFreePageCount(r1) + +KCHoldPages_0xc4 + _AssertAndRelease PSA.PoolLock, scratch=r16 + ble ReleaseAndReturnMPCallOOM + mr r27, r4 + +KCHoldPages_0xec + mr r8, r27 + bl MPCall_95_0x254 + beq SpacePanicIsland + lhz r18, 0x0000(r30) + rlwinm. r17, r18, 0, 16, 16 + bne KCHoldPages_0x108 + li r18, -0x8000 + +KCHoldPages_0x108 + clrlwi r17, r18, 0x18 + addi r17, r17, 0x01 + rlwimi r18, r17, 0, 24, 31 + sth r18, 0x0000(r30) + add r27, r27, r29 + subf. r8, r27, r5 + bge KCHoldPages_0xec + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + +# # ###### # # ###### +## ## # # # # # # # # #### # ##### # # ## #### ###### #### +# # # # # # # # ## # # # # # # # # # # # # # # # # +# # # ###### # # # # # ###### # # # # # ###### # # # ##### #### +# # # # # # # # # # # # # # # # ###### # ### # # +# # # # # # ## # # # # # # # # # # # # # # # +# # # ##### # # # # #### ###### ##### # # # #### ###### #### + +; Straight MPLibrary wrapper: yes +; In Universal Interfaces: no + + DeclareMPCall 90, MPUnholdPages + +MPUnholdPages + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Area.kIDClass + + bne ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + add r5, r5, r4 + lwz r16, Area.LogicalBase(r31) + lwz r17, Area.LogicalEnd(r31) + addi r5, r5, -0x01 + cmplw r4, r16 + cmplw cr1, r5, r17 + blt ReleaseAndReturnParamErrFromMPCall + bgt cr1, ReleaseAndReturnParamErrFromMPCall + lwz r19, 0x0020(r31) + lwz r29, 0x0068(r31) + rlwinm. r8, r19, 0, 16, 16 + bne ReleaseAndReturnParamErrFromMPCall + mr r27, r4 + +KCUnholdPages_0x60 + mr r8, r27 + bl MPCall_95_0x254 + beq ReleaseAndReturnParamErrFromMPCall + lhz r18, 0x0000(r30) + clrlwi r17, r18, 0x18 + rlwinm. r8, r18, 0, 16, 16 + cmpwi cr1, r17, 0x00 + beq major_0x0b0cc + addi r28, r28, 0x01 + beq cr1, major_0x0b0cc + add r27, r27, r29 + subf. r8, r27, r5 + bge KCUnholdPages_0x60 + li r28, 0x00 + +KCUnholdPages_0x98 + mr r8, r4 + bl MPCall_95_0x254 + beq ReleaseAndReturnParamErrFromMPCall + lhz r18, 0x0000(r30) + clrlwi r17, r18, 0x18 + addi r17, r17, -0x01 + rlwimi r18, r17, 0, 24, 31 + clrlwi. r8, r18, 0x11 + bne KCUnholdPages_0xc4 + rlwinm r18, r18, 0, 17, 15 + addi r28, r28, 0x01 + +KCUnholdPages_0xc4 + sth r18, 0x0000(r30) + add r4, r4, r29 + subf. r8, r4, r5 + bge KCUnholdPages_0x98 + + _Lock PSA.PoolLock, scratch1=r16, scratch2=r17 + + lwz r16, PSA.UnheldFreePageCount(r1) + add r16, r16, r28 + stw r16, PSA.UnheldFreePageCount(r1) + _AssertAndRelease PSA.PoolLock, scratch=r16 + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + +# # ###### ##### ###### # +## ## # # # # ###### ##### # # ## #### ###### # # ##### ##### ##### # ##### # # ##### ###### #### +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # ###### # #### ##### # ###### # # # ##### # # # # # # # ##### # # # ##### #### +# # # # # # # # ###### # ### # ####### # # ##### # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # ##### ###### # # # # #### ###### # # # # # # # ##### #### # ###### #### + +; ARG MPAreaID r3, LogicalPage *r4 +; RET OSStatus r3, PageAttrs r5 + + DeclareMPCall 91, MPGetPageAttributes + +MPGetPageAttributes + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Area.kIDClass + bne ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + + ; Check that the passed address lies within the area + lwz r16, Area.LogicalBase(r31) + lwz r17, Area.LogicalEnd(r31) + cmplw r4, r16 + cmplw cr1, r4, r17 + blt ReleaseAndReturnParamErrFromMPCall + bgt cr1, ReleaseAndReturnParamErrFromMPCall + + _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 + + ; Find the Page List Entry + mr r8, r4 + bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq + beq @release_lock_return_oom + + ; Clear the PTE from the HTAB + bl GetPTEFromPLE ; PLE *r30 // PTE r16/r17, PTE *r18, PTEflags cr0, PLEflags cr5-7 + bcl BO_IF, Area.kPLEFlagIsInHTAB, InvalPTE ; page *r8, PTE r16/r17, PTE *r18, PLE *r30 // PLEflags cr5-7 + bcl BO_IF, Area.kPLEFlagIsInHTAB, DeletePTE ; PTE *r18, PLE *r30 + + ; Get the PLE, and then we're clear of the HTAB lock + lwz r29, 0(r30) + _AssertAndRelease PSA.HTABLock, scratch=r14 + + mr r8, r4 + bl MPCall_95_0x254 + + li r19, 0 + beq @_ac + lhz r19, 0(r30) +@_ac + + andi. r5, r29, 0x319 + rlwinm. r8, r19, 0, 16, 16 + rlwimi r5, r19, 0, 16, 16 + beq ReleaseAndReturnZeroFromMPCall + + rlwinm. r8, r19, 0, 17, 23 + beq ReleaseAndReturnZeroFromMPCall + + ori r5, r5, 0x4000 + b ReleaseAndReturnZeroFromMPCall + +@release_lock_return_oom + _AssertAndRelease PSA.HTABLock, scratch=r14 + b ReleaseAndReturnMPCallOOM + + + +# # ###### ##### ###### # +## ## # # # # ###### ##### # # ## #### ###### # # ##### ##### ##### # ##### # # ##### ###### #### +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # ###### ##### ##### # ###### # # # ##### # # # # # # # ##### # # # ##### #### +# # # # # # # ###### # ### # ####### # # ##### # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # ##### ###### # # # # #### ###### # # # # # # # ##### #### # ###### #### + +; Straight MPLibrary wrapper: yes +; In Universal Interfaces: no + + DeclareMPCall 92, MPSetPageAttributes + +MPSetPageAttributes + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Area.kIDClass + + bne ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + lwz r16, Area.Flags(r31) + rlwinm. r8, r16, 0, 28, 28 + bne ReleaseAndReturnParamErrFromMPCall + lwz r29, 0x0134(r6) + li r8, 0x318 + andc. r9, r5, r8 + bne ReleaseAndReturnParamErrFromMPCall + andc. r9, r29, r8 + bne ReleaseAndReturnParamErrFromMPCall + lwz r16, Area.LogicalBase(r31) + lwz r17, Area.LogicalEnd(r31) + cmplw r4, r16 + cmplw cr1, r4, r17 + blt ReleaseAndReturnParamErrFromMPCall + bgt cr1, ReleaseAndReturnParamErrFromMPCall + + _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 + + mr r8, r4 + bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq + beq MPCall_92_0xd8 + bl GetPTEFromPLE ; PLE *r30 // PTE r16/r17, PTE *r18, PTEflags cr0, PLEflags cr5-7 + bc BO_IF_NOT, Area.kPLEFlagHasPhysPage, MPCall_92_0x9c + bcl BO_IF, Area.kPLEFlagIsInHTAB, InvalPTE ; page *r8, PTE r16/r17, PTE *r18, PLE *r30 // PLEflags cr5-7 + bcl BO_IF, Area.kPLEFlagIsInHTAB, DeletePTE ; PTE *r18, PLE *r30 + +MPCall_92_0x9c + lwz r16, 0x0000(r30) + and r8, r5, r29 + orc r9, r5, r29 + or r16, r16, r8 + and r16, r16, r9 + stw r16, 0x0000(r30) + _AssertAndRelease PSA.HTABLock, scratch=r14 + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + +MPCall_92_0xd8 + _AssertAndRelease PSA.HTABLock, scratch=r14 + b ReleaseAndReturnMPCallOOM + + + +# # ###### ##### ###### # +## ## # # # # ###### ##### # # ## #### ###### # # #### ###### +# # # # # # # # # # # # # # # # # # # # # +# # # ###### # #### ##### # ###### # # # ##### # # # ##### +# # # # # # # # ###### # ### # ####### # ### # +# # # # # # # # # # # # # # # # # # +# # # ##### ###### # # # # #### ###### # # #### ###### + +; Straight MPLibrary wrapper: returns value via passed ptr +; In Universal Interfaces: no + + DeclareMPCall 93, MPGetPageAge + +MPGetPageAge + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Area.kIDClass + + bne ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + lwz r16, Area.LogicalBase(r31) + lwz r17, Area.LogicalEnd(r31) + cmplw r4, r16 + cmplw cr1, r4, r17 + blt ReleaseAndReturnParamErrFromMPCall + bgt cr1, ReleaseAndReturnParamErrFromMPCall + mr r8, r4 + bl MPCall_95_0x254 + beq ReleaseAndReturnParamErrFromMPCall + lhz r18, 0x0000(r30) + rlwinm. r8, r18, 0, 16, 16 + li r5, 0x00 + +; r1 = kdp + bne ReleaseAndReturnZeroFromMPCall + clrlwi r5, r18, 0x11 + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + +# # ###### ##### ###### # +## ## # # # # ###### ##### # # ## #### ###### # # #### ###### +# # # # # # # # # # # # # # # # # # # # # +# # # ###### ##### ##### # ###### # # # ##### # # # ##### +# # # # # # # ###### # ### # ####### # ### # +# # # # # # # # # # # # # # # # # # +# # # ##### ###### # # # # #### ###### # # #### ###### + +; Straight MPLibrary wrapper: yes +; In Universal Interfaces: no + + DeclareMPCall 94, MPSetPageAge + +MPSetPageAge + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Area.kIDClass + + bne ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + lwz r16, Area.LogicalBase(r31) + lwz r17, Area.LogicalEnd(r31) + cmplw r4, r16 + cmplw cr1, r4, r17 + blt ReleaseAndReturnParamErrFromMPCall + bgt cr1, ReleaseAndReturnParamErrFromMPCall + mr r8, r4 + bl MPCall_95_0x254 + beq ReleaseAndReturnParamErrFromMPCall + cmplwi r5, 0x7fff + bgt ReleaseAndReturnParamErrFromMPCall + lhz r18, 0x0000(r30) + rlwinm. r8, r18, 0, 16, 16 + bne ReleaseAndReturnMPCallOOM + rlwimi r18, r5, 0, 17, 31 + sth r18, 0x0000(r30) + + _Lock PSA.HTABLock, scratch1=r16, scratch2=r17 + + mr r8, r4 + bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq + beq SpacePanicIsland + bl GetPTEFromPLE ; PLE *r30 // PTE r16/r17, PTE *r18, PTEflags cr0, PLEflags cr5-7 + bc BO_IF_NOT, Area.kPLEFlagHasPhysPage, MPCall_94_0xa0 + bcl BO_IF, Area.kPLEFlagIsInHTAB, InvalPTE ; page *r8, PTE r16/r17, PTE *r18, PLE *r30 // PLEflags cr5-7 + bcl BO_IF, Area.kPLEFlagIsInHTAB, DeletePTE ; PTE *r18, PLE *r30 + +MPCall_94_0xa0 + _AssertAndRelease PSA.HTABLock, scratch=r16 + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + +# # ###### ##### ###### # # # ##### +## ## # # # # ###### ##### # # ## #### ###### # # #### # ##### # #### #### # # # # #### # # # # ##### #### +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ## # # # +# # # ###### # #### ##### # ###### # # # ##### ####### # # # # # # # # # #### # # # # # # # # # #### +# # # # # # # # ###### # ### # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ## # # # +# # # ##### ###### # # # # #### ###### # # #### ###### ##### ####### #### #### # # ##### #### #### # # # #### + +; Straight MPLibrary wrapper: returns value via passed ptr +; In Universal Interfaces: no + + DeclareMPCall 129, MPGetPageHoldLockCounts + +MPGetPageHoldLockCounts + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + mr r8, r3 + bl LookupID + cmpwi r9, Area.kIDClass + + bne ReleaseAndReturnMPCallInvalidIDErr + mr r31, r8 + lwz r16, Area.LogicalBase(r31) + lwz r17, Area.LogicalEnd(r31) + cmplw r4, r16 + cmplw cr1, r4, r17 + blt ReleaseAndReturnParamErrFromMPCall + bgt cr1, ReleaseAndReturnParamErrFromMPCall + mr r8, r4 + bl MPCall_95_0x254 + beq ReleaseAndReturnParamErrFromMPCall + lhz r18, 0x0000(r30) + li r5, 0x00 + rlwinm. r8, r18, 0, 16, 16 + li r16, 0x00 + beq MPCall_129_0x6c + rlwinm r16, r18, 24, 25, 31 + clrlwi r5, r18, 0x18 + +MPCall_129_0x6c + stw r16, 0x0134(r6) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + +# # ###### ####### # # ###### +## ## # # # # # # ##### # # # #### ##### # # # # # ## #### ###### +# # # # # # # # ## # # # # # # # # # # ## ## # # # # # # # +# # # ###### ##### # # # # # # # # # # # # # ## # ###### # # # ##### +# # # # # # # # # # # # # # # # # # # ###### # ### # +# # # # # # ## # # # # # # # # # # # # # # # # # +# # # # # # # ##### # # #### # # # # # # # #### ###### + +; Straight MPLibrary wrapper: returns value via passed ptr +; In Universal Interfaces: no + + DeclareMPCall 95, MPFindVictimPage + +MPFindVictimPage + + or. r8, r3, r4 + + bne @not_naughty + li r16, 0 + stw r16, KDP.VMMaxVirtualPages(r1) + _log 'Areas capability probe detected^n' + b ReturnParamErrFromMPCall +@not_naughty + + _Lock PSA.SchLock, scratch1=r16, scratch2=r17 + + li r28, -0x01 + li r4, 0x00 + li r5, 0x00 + lwz r8, PSA.UnheldFreePageCount(r1) + cmpwi r8, 0x00 + ble ReleaseAndReturnMPCallOOM + lwz r27, PSA.DecClockRateHzCopy(r1) + srwi r27, r27, 15 + mfspr r8, dec + subf r27, r27, r8 + lwz r8, PSA.OtherSystemAddrSpcPtr2(r1) + lwz r9, PSA.ZeroedByInitFreeList3(r1) + mr r30, r9 + bl FindAreaAbove + mr r31, r8 + lwz r29, Area.LogicalBase(r31) + cmplw r29, r30 + bgt MPCall_95_0xa8 + mr r29, r30 + +MPCall_95_0xa8 + crset cr2_eq + +MPCall_95_0xac + mfspr r9, dec + subf. r9, r27, r9 + blt MPCall_95_0x1c8 + +MPCall_95_0xb8 + lwz r8, 0x0020(r31) + lwz r9, 0x0018(r31) + rlwinm. r8, r8, 0, 16, 16 + cmpwi cr1, r3, 0x00 + bne MPCall_95_0x19c + beq cr1, MPCall_95_0xe0 + cmpwi cr3, r9, 0x00 + beq cr3, MPCall_95_0xe0 + cmpw cr1, r9, r3 + bne cr1, MPCall_95_0x19c + +MPCall_95_0xe0 + lwz r9, Area.Flags(r31) + rlwinm. r8, r9, 0, 28, 28 + bne MPCall_95_0x19c + rlwinm. r8, r9, 0, 23, 23 + bne MPCall_95_0x19c + + _Lock PSA.HTABLock, scratch1=r16, scratch2=r17 + + mr r8, r29 + bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq + beq SpacePanicIsland + _AssertAndRelease PSA.HTABLock, scratch=r16 + lwz r16, 0x0000(r30) + clrlwi. r8, r16, 0x1f + beq MPCall_95_0x180 + mr r8, r29 + bl MPCall_95_0x254 + beq MPCall_95_0x1c8 + lhz r17, 0x0000(r30) + rlwinm. r8, r17, 0, 16, 16 + clrlwi r17, r17, 0x11 + bne MPCall_95_0x180 + cmpw r17, r28 + crclr cr2_eq + ble MPCall_95_0x180 + mr r28, r17 + lwz r4, Area.ID(r31) + cmplwi r17, 0x7fff + mr r5, r29 + bge MPCall_95_0x1c8 + +MPCall_95_0x180 + lwz r8, 0x0068(r31) + lwz r9, Area.LogicalEnd(r31) + add r29, r29, r8 + subf. r9, r9, r29 + bge MPCall_95_0x19c + bne cr2, MPCall_95_0xac + b MPCall_95_0xb8 + +MPCall_95_0x19c + lwz r8, 0x0054(r31) + lwz r9, 0x005c(r31) + cmpw r8, r9 + addi r31, r9, -0x54 + lwz r29, Area.LogicalBase(r31) + bne MPCall_95_0x1c0 + lwz r9, 0x0008(r8) + addi r31, r9, -0x54 + lwz r29, Area.LogicalBase(r31) + +MPCall_95_0x1c0 + bne cr2, MPCall_95_0xac + b MPCall_95_0xb8 + +MPCall_95_0x1c8 + cmpwi r4, 0x00 + stw r29, PSA.ZeroedByInitFreeList3(r1) + beq ReleaseAndReturnMPCallOOM + lwz r8, 0x0068(r31) + add r8, r8, r5 + stw r8, PSA.ZeroedByInitFreeList3(r1) + +; r1 = kdp + b ReleaseAndReturnZeroFromMPCall + + + + ##### ##### ###### ###### # ####### +# # ##### ## #### ###### # # ###### ##### # # ## #### ###### # # # # +# # # # # # # # # # # # # # # # # # # # # # + ##### # # # # # ##### # #### ##### # ###### # # # ##### ###### # ##### + # ##### ###### # # # # # # # ###### # ### # # # # +# # # # # # # # # # # # # # # # # # # # # + ##### # # # #### ###### ##### ###### # # # # #### ###### # ####### ####### + +SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq + + lwz r16, Area.LogicalBase(r31) + lwz r18, Area.Flags(r31) + lwz r30, Area.PageMapArrayPtr(r31) + + ; r17 = offset of ptr into area + subf r17, r16, r8 + +@loop_that_would_totally_happen_but_not + + ; Fail if Area has no page map array. + ; r17 = offset of page's entry in page map (entries are 4b) + cmpwi r30, 0 + rlwinm r17, r17, (32-10), 10, 29 + beqlr + + ; Do another level of lookups if the array is 2D + ; (i.e. the Area contains more than 1k pages) + rlwinm. r16, r18, 0, Area.kPageMapArrayIs2D, Area.kPageMapArrayIs2D + rlwinm r16, r17, (32-10), 20, 29 ; offset of secondary ptr in page map + beq @not_2d + rlwinm r17, r17, 0, 20, 29 + lwzx r30, r30, r16 +@not_2d + + ; Return r30, a pointer to the list entry + ; cr0.eq if we failed + add. r30, r30, r17 + blr + + ; Dead code: + lwz r16, Area.LogicalBase(r31) + lwz r18, Area.Flags(r31) + lwz r30, 0x0040(r31) + + rlwinm. r17, r18, 0, Area.kAliasFlag, Area.kAliasFlag + subf r17, r16, r8 + beq @loop_that_would_totally_happen_but_not + + lwz r30, Area.AliasLLL(r31) + lwz r18, 0x80(r31) + subi r30, r30, Area.AliasLLL + subf r17, r16, r8 + add r17, r17, r18 + lwz r18, Area.Flags(r30) + lwz r30, Area.PageMapArrayPtr(r30) + b @loop_that_would_totally_happen_but_not + + + +MPCall_95_0x254 ; OUTSIDE REFERER + lwz r16, Area.LogicalBase(r31) + lwz r18, Area.Flags(r31) + lwz r30, 0x003c(r31) + rlwinm. r17, r18, 0, Area.kAliasFlag, Area.kAliasFlag + subf r17, r16, r8 + beq MPCall_95_0x288 + + lwz r30, 0x0044(r31) + lwz r18, 0x0080(r31) + addi r30, r30, -0x44 + subf r17, r16, r8 + add r17, r17, r18 + lwz r18, 0x0008(r30) + lwz r30, 0x003c(r30) + +MPCall_95_0x288 + cmpwi r30, 0x00 + rlwinm r17, r17, 21, 11, 30 + beqlr + rlwinm. r16, r18, 0, 30, 30 + rlwinm r16, r17, 22, 20, 29 + beq MPCall_95_0x2a8 + rlwinm r17, r17, 0, 20, 30 + lwzx r30, r30, r16 + +MPCall_95_0x2a8 + add. r30, r30, r17 + blr + + + + ##### ###### ####### ####### ####### ###### # ####### +# # ###### ##### # # # # # ##### #### # # # # # # +# # # # # # # # # # # # ## ## # # # # +# #### ##### # ###### # ##### ##### # # # # # ## # ###### # ##### +# # # # # # # # ##### # # # # # # # +# # # # # # # # # # # # # # # # # + ##### ###### # # # ####### # # # #### # # # ####### ####### + +; If a logical page (of an Area of an AddressSpace) is featured in the HTAB, +; its NanoKernel Page List Entry (PLE) should point at that PowerPC Page Table +; Entry (PTE, of a PTEG in the HTAB). If there is a physical page mapped to +; that logical page, but it is not yet in the HTAB, then the PLE will point +; directly to the page. + +GetPTEFromPLE ; PLE *r30 // PTE r16/r17, PTE *r18, PTEflags cr0, PLEflags cr5-7 + + lwz r19, 0(r30) ; r19 = contents of page list entry + lwz r18, KDP.HTABORG(r1) ; r18 = HTAB base, in case like me you were confused + + mtcrf %00000111, r19 ; cr5-7 = flags from PLE + + ; Returning early because we are not in HTAB? Cook up a fake PTE. + rlwinm r17, r19, 0, 0, 19 ; lower has RPN + rlwinm r16, r19, (32-9), 0+9, 19+9 ; will actually use this as PTE offset within HTAB! + + bclr BO_IF_NOT, Area.kPLEFlagHasPhysPage + bclr BO_IF_NOT, Area.kPLEFlagIsInHTAB + + ; r16/r17 = PTE + ; r18 = &PTE + lwzux r16, r18, r16 + lwz r17, 4(r18) + + ; Die if V bit is not set (entry is invalid). + ; Return flags. + mtcrf %10000000, r16 + bc BO_IF_NOT, 0, SpacePanicIsland + + blr + + + +### ###### ####### ####### + # # # # # ## # # # # # + # ## # # # # # # # # # # + # # # # # # # # # ###### # ##### + # # # # # # ###### # # # # + # # ## # # # # # # # # +### # # ## # # ###### # # ####### + +InvalPTE ; page *r8, PTE r16/r17, PTE *r18, PLE *r30 // PLEflags cr5-7 + + ; Special-case 601. + ; Clear V bit of PTE. + mfspr r14, pvr + _bclr r16, r16, 0 + rlwinm. r14, r14, 0, 0xFFFE0000 + stw r16, 0(r18) + + ; Now that HTAB is touched, bump our page from the TLB + sync + tlbie r8 + beq @is_601 + sync + tlbsync +@is_601 + sync + isync + + ; Prepare to re-set V bit, but return if there is no PLE + cmpwi r30, 0 + + ; Be needlessly sure that these registers don't get clobbered + lwz r14, 0(r30) ; r14 = PLE + lwz r17, 4(r18) ; r17 = lower PTE + _bset r16, r16, 0 ; r16 = upper PTE + + beqlr + + ; Continue if there is a PLE involved... INTERESTING PART + rlwimi r14, r17, (32-3), 27, 27 ; lowest two bits of VSID into 27/28 of PLE + rlwimi r14, r17, (32-5), 28, 28 + + ; Slightly update the cond reg with the new PLE + ; (flags 27 and 28, others should be unchanged) + mtcrf %00000111, r14 ; set CR (is return value) + stw r14, 0(r30) ; save that PLE + + blr + + + + ##### ###### ####### ####### +# # ###### ##### # # # # +# # # # # # # + ##### ##### # ###### # ##### + # # # # # # +# # # # # # # + ##### ###### # # # ####### + +SetPTE ; PTE r16/r17, PTE *r18 + + stw r17, 4(r18) + eieio + stw r16, 0(r18) + sync + blr + + + +###### ###### ####### ####### +# # ###### # ###### ##### ###### # # # # +# # # # # # # # # # # +# # ##### # ##### # ##### ###### # ##### +# # # # # # # # # # +# # # # # # # # # # +###### ###### ###### ###### # ###### # # ####### + +DeletePTE ; PTE *r18, PLE *r30 + + lwz r14, 0(r30) + + _InvalNCBPointerCache scratch=r16 + +foo set KDP.NanoKernelInfo + NKNanoKernelInfo.HashTableDeleteCount + lwz r16, foo(r1) + _bclr r14, r14, Area.kPLEFlagIsInHTAB + addi r16, r16, 1 + stw r16, foo(r1) + + ; Change "PLE>PTE>page" to "PLE>page" + rlwimi r14, r17, 0, 0xfffff000 + + ; Fully zero the PTE. + ; But only zero the PLE if the ptr is non-null. + cmpwi r30, 0 + li r16, 0 + li r17, 0 + beq SetPTE ; PTE r16/r17, PTE *r18 + stw r14, 0(r30) + b SetPTE ; PTE r16/r17, PTE *r18 + + + + ##### # ##### ###### # # ###### # ####### +# # ##### ## #### ###### # # # # # # # #### # # # #### # # # # # #### +# # # # # # # # # # # # # # # # ## # # # # # # # # # + ##### # # # # # ##### # ##### ###### # # #### # # # # # ###### # # # #### + # ##### ###### # # # # # # # # # # # # # ### # # ####### # # +# # # # # # # # # # # # # # # # # ## # # # # # # # # # + ##### # # # #### ###### ####### ####### # ##### #### # # # #### ###### # # # #### + +SpaceL2PUsingBATs ; LogicalPage *r8, MPAddressSpace *r9 // PhysicalPage *r17 + + MACRO + _v2pguts ; cr0.eq = match + rlwimi r19, r16, 15, 0, 14 ; r19 = 0000 (4b) || BEPI (11b) || 11111111111111111 (17b) = bits that needn't match + xor r17, r8, r16 ; xor the two things we are comparing + andc. r17, r17, r19 ; mask away the bits that needn't match + ENDM + + + ; Use current Address Space if none specified + + mr. r19, r9 + mfsprg r17, 0 + bne @addrspc_provided + lwz r19, EWA.PA_CurAddressSpace(r17) +@addrspc_provided + + + ; Search all 8 UBAT registers for one that contains our effective address + + addi r18, r19, AddressSpace.BATs + + lwz r16, 0(r18) + li r19, -1 + _v2pguts + beq @bat_yes + + lwzu r16, 8(r18) + _v2pguts + beq @bat_yes + + lwzu r16, 8(r18) + _v2pguts + beq @bat_yes + + lwzu r16, 8(r18) + _v2pguts + beq @bat_yes + + lwzu r16, 8(r18) + _v2pguts + beq @bat_yes + + lwzu r16, 8(r18) + _v2pguts + beq @bat_yes + + lwzu r16, 8(r18) + _v2pguts + beq @bat_yes + + lwzu r16, 8(r18) + _v2pguts + bne @bat_no + +@bat_yes + andi. r17, r16, 1 ; cr0.eq = !UBAT[Vp] + rlwinm r19, r19, 0, 8, 19 + lwzu r17, 4(r18) ; r17 = LBAT + and r19, r8, r19 + or r17, r17, r19 + bnelr ; succeed if UBAT[Vp] is set + +@bat_no + + + + ##### # ##### ###### ### ###### # ####### +# # ##### ## #### ###### # # # # # # #### # # #### ##### # # # #### # # # # # #### +# # # # # # # # # # # # # # # ## # # # # # # ## # # # # # # # # # + ##### # # # # # ##### # ##### ###### # # # # # # # # # # # # # # ###### # # # #### + # ##### ###### # # # # # # # ### # # # # # ##### # # # # # ### # # ####### # # +# # # # # # # # # # # # # # # ## # # # # # # ## # # # # # # # # # + ##### # # # #### ###### ####### ####### # ### #### # # #### # # # # # #### ###### # # # #### + +SpaceL2PIgnoringBATs ; LogicalPage *r8, MPAddressSpace *r9 // PhysicalPage *r17 + + ; r17 = segment descriptor (from addrspc or actual register) + + cmpwi r9, 0 + addi r16, r9, AddressSpace.SRs + beq @no_addrspc_provided + +;addrspc provided + rlwinm r17, r8, (32-26), 26, 29 + lwzx r17, r16, r17 + b @endif_addrspc + +@no_addrspc_provided + mfsrin r17, r8 + +@endif_addrspc + + + ; Do the "(VSID || page index) -> PTEG address" hashing function + ; Remember, PTEG = 8 x 8b PTEs + + ; r18 = physical address of 64b PTEG to search + ; r16 = upper PTE to check for (V, VSID and API fields) + + rlwinm r16, r8, 10, 26, 31 ; set API field of r16 + rlwimi r16, r17, 7, 1, 24 ; set VSID field of r16 + rlwinm r9, r8, 32-6, 10, 25 ; r9 = page index in bits 0x003FFFC0 + _bset r16, r16, 0 ; set V(alid) bit of r16 to 1 + rlwinm r17, r17, 6, 7, 25 + xor r9, r9, r17 ; r9 ^= (VSID & 0x7FFFF) in bits 0x01FFFFC0 + + lwz r17, KDP.PTEGMask(r1) + lwz r18, KDP.HTABORG(r1) + + and r9, r9, r17 ; r9 %= HTAB size + or. r18, r18, r9 ; r18 = &HTAB + r9 = &PTEG + + + ; This is tightly coded, but is obviously searching the PTEG for a match with r16 + +@try_other_four_PTEs + lwz r17, 0*8(r18) ; load this upper PTE + lwz r9, 1*8(r18) ; and the next upper PTE + cmpw cr6, r16, r17 + lwz r17, 2*8(r18) ; and the next upper PTE + cmpw cr7, r16, r9 + lwzu r9, 3*8(r18) ; and the next upper PTE, and update + + bne cr6, @nope + +@yes_this_one + lwzu r17, -20(r18) + blr + +@nope + cmpw cr6, r16, r17 + lwzu r17, 8(r18) + beq cr7, @yes_this_one + + cmpw cr7, r16, r9 + lwzu r9, 8(r18) + beq cr6, @yes_this_one + + cmpw cr6, r16, r17 + lwzu r17, 8(r18) + beq cr7, @yes_this_one + + cmpw cr7, r16, r9 + lwzu r9, 8(r18) + beq cr6, @yes_this_one + + cmpw cr6, r16, r17 + lwzu r17, -12(r18) + beqlr cr7 + + cmpw cr7, r16, r9 + lwzu r17, 8(r18) + beqlr cr6 + + lwzu r17, 8(r18) + beqlr cr7 + + lwz r17, KDP.PTEGMask(r1) + + xori r16, r16, 0x40 ; try the other four PTEs in this PTEG + andi. r9, r16, 0x40 ; but if that bit went back to 0 from 1 then we're out of PTEs! + + addi r18, r18, -0x3c + xor r18, r18, r17 + + bne @try_other_four_PTEs + + blr ; fail diff --git a/NanoKernel/NKInit.s b/NanoKernel/NKInit.s index db6c2df..025d593 100644 --- a/NanoKernel/NKInit.s +++ b/NanoKernel/NKInit.s @@ -198,13 +198,13 @@ FinishInitBuiltin llabel r8, IgnoreSoftwareInt add r8, r8, r9 - stw r8, KDP.YellowVecBase + VecTable.ProgramIntVector(r1) + stw r8, KDP.VecBaseSystem + VecTable.ProgramIntVector(r1) llabel r8, HandlePerfMonitorInt add r8, r8, r9 - stw r8, KDP.YellowVecBase + VecTable.PerfMonitorVector(r1) + stw r8, KDP.VecBaseSystem + VecTable.PerfMonitorVector(r1) - addi r8, r1, KDP.YellowVecBase + addi r8, r1, KDP.VecBaseSystem mtsprg 3, r8 @@ -366,21 +366,21 @@ InitHighLevel -; Fill with Panics: Yellow, Orange, Red (KDP) -; Violet, Blue (PSA) +; Fill the old-style KDP vector tables, and also two new PSA ones, +; with panics llabel r23, panic add r23, r23, r25 - addi r8, r1, KDP.YellowVecBase + addi r8, r1, KDP.VecBaseSystem li r22, VecTable.Size bl wordfill - addi r8, r1, KDP.OrangeVecBase + addi r8, r1, KDP.VecBaseAlternate li r22, VecTable.Size bl wordfill - addi r8, r1, KDP.RedVecBase + addi r8, r1, KDP.VecBaseTranslation li r22, VecTable.Size bl wordfill @@ -405,12 +405,13 @@ InitHighLevel -; Activate Yellow and fill Yellow and Orange (KDP) +; Populate System and Alternate Context vector tables. +; Activate System Context vector table (will enter 68k emu soon). - addi r9, r1, KDP.YellowVecBase + addi r9, r1, KDP.VecBaseSystem mtsprg 3, r9 - addi r8, r1, KDP.OrangeVecBase + addi r8, r1, KDP.VecBaseAlternate llabel r23, panic add r23, r23, r25 @@ -432,14 +433,15 @@ InitHighLevel stw r23, VecTable.ISIVector(r9) stw r23, VecTable.ISIVector(r8) - ; Difference: Yellow seems more likely to reach PIH - llabel r23, IntExternalYellow + ; Here is the difference between the System and Alternate + ; vector tables + llabel r23, IntExternalSystem add r23, r23, r25 - stw r23, VecTable.ExternalIntVector(r9) ; yellow + stw r23, VecTable.ExternalIntVector(r9) - llabel r23, IntExternalOrange + llabel r23, IntExternalAlternate add r23, r23, r25 - stw r23, VecTable.ExternalIntVector(r8) ; orange + stw r23, VecTable.ExternalIntVector(r8) llabel r23, IntAlignment add r23, r23, r25 @@ -490,9 +492,9 @@ InitHighLevel -; Fill Red (KDP), used while were emulating some instructions +; Fill the Translation vector table - addi r8, r1, KDP.RedVecBase + addi r8, r1, KDP.VecBaseTranslation llabel r23, panic add r23, r23, r25 @@ -502,7 +504,7 @@ InitHighLevel add r23, r23, r25 stw r23, VecTable.MachineCheckVector(r8) - llabel r23, IntDSIOtherOther + llabel r23, IntDSITranslation add r23, r23, r25 stw r23, VecTable.DSIVector(r8) @@ -1026,7 +1028,7 @@ SetProcessorFlags ; Initialize the kernel queues. They are called: ; -; - PHYS (free list, in KDP, by InitFreeList) +; - PHYS (free list, in KDP, by InitFreePageList) ; - DLYQ (in KDP, by me) ; - DBUG (in KDP, by me) ; - PAGQ (in KDP, has ID, by me) @@ -1037,7 +1039,7 @@ SetProcessorFlags ; Free list in hardcoded KDP location ; ARG KernelData *r1 ; CLOB r8, r9 - bl InitFreeList + bl InitFreePageList ; Delay queue in hardcoded KDP location @@ -1132,7 +1134,7 @@ SetProcessorFlags li r8, 2 stb r8, Task.State(r31) - lisori r8, 0x30028 ; (Z>>Task.kFlag14) | (Z>>Task.kFlagBlue) | (Z>>Task.kFlag26) | (Z>>Task.kFlag28) + lisori r8, 0x30028 ; (Z>>Task.kFlagNotDebuggable) | (Z>>Task.kFlagBlue) | (Z>>Task.kFlag26) | (Z>>Task.kFlag28) stw r8, Task.Flags(r31) li r8, 200 @@ -1226,7 +1228,7 @@ SetProcessorFlags stw r8, Task.Name(r31) - lisori r8, 0xA0040 ; (Z>>Task.kFlag12) | (Z>>Task.kFlag14) | (Z>>Task.kFlag25) + lisori r8, 0xA0040 ; (Z>>Task.kFlag12) | (Z>>Task.kFlagNotDebuggable) | (Z>>Task.kFlag25) stw r8, Task.Flags(r31) ; For the scheduler @@ -1626,7 +1628,7 @@ PrimeFreeListFromBanks @loop lwz r8, 0(r29) rlwinm r8, r8, 0, 0, 19 ; physical base of page - bl free_list_add_page + bl FreePageListPush ; PhysicalPage *r8 subi r17, r17, 1 subi r29, r29, 4 @@ -1661,7 +1663,7 @@ PrimeFreeListFromSystemHeap @stupidloop rlwinm r8, r18, 0, 0, 19 - bl free_list_add_page + bl FreePageListPush ; PhysicalPage *r8 addi r17, r17, -0x01 addi r18, r18, 0x1000 cmpwi r17, 0x00 @@ -1685,7 +1687,7 @@ DonePrimingFreeList _log 'VMLogicalPages: ' - lwz r8, 0x06a8(r1) ; kdp.phys_pages + lwz r8, KDP.VMLogicalPages(r1) mr r8, r8 bl Printw @@ -1764,7 +1766,7 @@ ReconcileMemory ; The above, divided by 4096 srwi r19, r19, 12 - stw r19, KDP.PrimaryAddrRangePages(r1) + stw r19, KDP.VMLogicalPages(r1) addi r29, r1, KDP.FlatPageListSegPtrs - 4 addi r19, r1, KDP.SegMaps - 8 @@ -1794,7 +1796,7 @@ ReconcileMemory ; Number of pages in that last segment sth r22, 0x0002(r8) - lwz r17, KDP.PrimaryAddrRangePages(r1) + lwz r17, KDP.VMLogicalPages(r1) lwz r18, KDP.TotalPhysicalPages(r1) stw r17, KDP.TotalPhysicalPages(r1) @@ -1815,7 +1817,7 @@ ReconcileMemory @loop mr r8, r31 - bl free_list_add_page + bl FreePageListPush ; PhysicalPage *r8 addi r31, r31, 4096 subi r18, r18, 1 cmpwi r18, 0 @@ -1827,7 +1829,7 @@ ReconcileMemory ; Create Areas (an abstract NKv2 structure) from the Trampoline's PageMap - bl convert_pmdts_to_areas + bl CreateAreasFromPageMap @@ -1870,7 +1872,7 @@ finish_old_world addi r29, r1, 0x5e8 bl PagingFunc2 bl PagingFlushTLB - bl convert_pmdts_to_areas + bl CreateAreasFromPageMap bl ProbePerfMonitor lwz r27, 0x0630(r1) lwz r27, 0x0094(r27) @@ -1931,7 +1933,7 @@ setup_0x11f0 _log 'Nanokernel replaced. Returning to boot process^n' - addi r9, r1, KDP.OrangeVecBase + addi r9, r1, KDP.VecBaseAlternate mtsprg 3, r9 ; r1 = kdp @@ -1954,7 +1956,7 @@ CancelReplacement lwz r8, KDP.OldKDP(r1) mtsprg 0, r8 - addi r9, r8, KDP.OrangeVecBase + addi r9, r8, KDP.VecBaseAlternate mtsprg 3, r9 diff --git a/NanoKernel/NKInterrupts.s b/NanoKernel/NKInterrupts.s index c42ead2..d7e3ebf 100644 --- a/NanoKernel/NKInterrupts.s +++ b/NanoKernel/NKInterrupts.s @@ -1,52 +1,65 @@ -ecNoException equ 0 -ecSystemCall equ 1 -ecTrapInstr equ 2 -ecFloatException equ 3 -ecInvalidInstr equ 4 -ecPrivilegedInstr equ 5 -ecMachineCheck equ 7 -ecInstTrace equ 8 -ecInstInvalidAddress equ 10 -ecInstHardwareFault equ 11 -ecInstPageFault equ 12 -ecInstSupAccessViolation equ 14 -ecDataInvalidAddress equ 18 -ecDataHardwareFault equ 19 -ecDataPageFault equ 20 -ecDataWriteViolation equ 21 -ecDataSupAccessViolation equ 22 -ecDataSupWriteViolation equ 23 -ecUnknown24 equ 24 +; System = FFFFFFFF, Alt = 7DF2F700 (ecInstPageFault and ecDataPageFault disabled), same +/- VM +ecNoException equ 0 ; CodeLikeException +ecSystemCall equ 1 ; ? +ecTrapInstr equ 2 ; CodeLikeException +ecFloatException equ 3 ; CodeLikeException +ecInvalidInstr equ 4 ; CodeLikeException +ecPrivilegedInstr equ 5 ; ? +ecMachineCheck equ 7 ; CodeLikeException +ecInstTrace equ 8 ; CodeLikeException +ecInstInvalidAddress equ 10 ; CodeLikeException +ecInstHardwareFault equ 11 ; CodeLikeException +ecInstPageFault equ 12 ; CodeLikeException +ecInstSupAccessViolation equ 14 ; CodeLikeException + +; Usually from IntDSITranslation (also IntAlignment and IntMachineCheck) +ecDataInvalidAddress equ 18 ; DataLikeException +ecDataHardwareFault equ 19 ; DataLikeException +ecDataPageFault equ 20 ; DataLikeException +ecDataWriteViolation equ 21 ; DataLikeException +ecDataSupAccessViolation equ 22 ; DataLikeException +ecDataSupWriteViolation equ 23 ; ? +ecUnknown24 equ 24 ; DataLikeException -Local_Panic set * - b panic +IntPanicIsland + b panic - - -IntLocalBlockMPCall ; OUTSIDE REFERER +IntLocalBlockMPCall b BlockMPCall +; ARG EC r8, nuFlags r16, ? r17, ? r19, ? r23, vecTable *r24 + align 5 -major_0x02980 ; OUTSIDE REFERER +DataLikeException + mfsprg r1, 0 mtsprg 3, r24 + lwz r9, EWA.Enables(r1) - rlwinm r23, r17, 31, 27, 31 - rlwnm. r9, r9, r8, 0x00, 0x00 - bcl BO_IF, 15, major_0x02980_0x100 - lwz r6, -0x0014(r1) - ori r7, r16, 0x10 + rlwinm r23, r17, (32-1), 27, 31 + rlwnm. r9, r9, r8, 0, 0 ; cr0.lt = (exception enabled?) + + bcl BO_IF, EWA.kFlag15, major_0x02980_0x100 + + lwz r6, EWA.PA_ContextBlock(r1) + + _bset r7, r16, 27 + neg r23, r23 mtcrf 0x3f, r7 add r19, r19, r23 - rlwimi r7, r8, 24, 0, 7 - lwz r1, -0x0004(r1) + ; Exception code in high byte of flags + rlwimi r7, r8, 24, 0xFF000000 + + + ; Increment counter, easy enough + lwz r1, EWA.PA_KDP(r1) slwi r8, r8, 2 add r8, r8, r1 lwz r9, KDP.NanoKernelInfo + NKNanoKernelInfo.ExceptionCauseCounts(r8) @@ -54,6 +67,8 @@ major_0x02980 ; OUTSIDE REFERER stw r9, KDP.NanoKernelInfo + NKNanoKernelInfo.ExceptionCauseCounts(r8) srwi r9, r7, 24 + + ; Move regs from EWA to ContextBlock mfsprg r1, 0 lwz r8, 0x0000(r1) stw r8, 0x0104(r6) @@ -71,41 +86,54 @@ major_0x02980 ; OUTSIDE REFERER stw r8, 0x0164(r6) lwz r8, 0x0034(r1) stw r8, 0x016c(r6) - cmpwi cr1, r9, 0x14 - bc BO_IF, EWA.kFlagSIGP, _IntReturnFromSIGP - bc BO_IF_NOT, EWA.kFlagBlue, _RecoverableDataFault - blt ExceptionIsInEnables - bne cr1, _IntReturnToSystemContext - b _RecoverableDataFault + + + ; Order of preference: + ; SIGP-return exceptions obviously separate + ; MTasks (non-blue) -> UnhandledDataFault (ends up going to system page queue) + ; Exception enabled for blue task (i.e. in system context) -> field exception to task + ; Not actually a data fault -> system context (68k interrupt) + ; Data fault that blue does not wish to handle + + cmpwi cr1, r9, ecDataPageFault + + bc BO_IF, EWA.kFlagSIGP, IntReturnFromSIGP + bc BO_IF_NOT, EWA.kFlagBlue, UnhandledDataFault + blt LetBlueHandleOwnException + bne cr1, IntReturnToSystemContext + b UnhandledDataFault -ExceptionIsInEnables +LetBlueHandleOwnException + ; How does the ContextBlock contain exception handling information? mfsprg r1, 0 stw r10, 0x0084(r6) stw r12, 0x008c(r6) stw r3, 0x0094(r6) stw r4, 0x009c(r6) lwz r8, EWA.Enables(r1) - stw r7, 0x0040(r6) - stw r8, 0x0044(r6) - li r8, 0x00 - lwz r10, 0x004c(r6) - stw r8, EWA.Enables(r1) + stw r7, ContextBlock.SavedFlags(r6) + stw r8, ContextBlock.SavedEnables(r6) + li r8, 0 + lwz r10, ContextBlock.ExceptionHandler(r6) + stw r8, EWA.Enables(r1) ; disallow double-exceptions lwz r1, EWA.PA_KDP(r1) lwz r4, 0x0054(r6) + ; Which context will we pass to the task exception handler? lwz r3, KDP.LA_ECB(r1) - bc BO_IF, 8, @is_system_context + bc BO_IF, 8, @pass_system_context lwz r3, KDP.LA_NCB(r1) _bclr r11, r11, MSR_EEbit -@is_system_context +@pass_system_context ; exception handler will return via trap in emulator code lwz r12, KDP.LA_EmulatorKernelTrapTable + NanoKernelCallTable.ReturnFromException(r1) bcl BO_IF, EWA.kFlagLowSaves, PreferRegistersFromEWASavingContextBlock + rlwinm r7, r7, 0, 29, 16 ; unset 17-28 rlwimi r11, r7, 0, 20, 23 ; threfore unset MSR[FE0/SE/BE/FE1] @@ -125,24 +153,29 @@ PreferRegistersFromEWASavingContextBlock ; OUTSIDE REFERER stw r17, 0x0064(r6) stw r20, 0x0068(r6) stw r21, 0x006c(r6) - stw r19, 0x0074(r6) + stw r19, ContextBlock.SRR0(r6) stw r18, 0x007c(r6) lmw r14, EWA.r14(r8) blr +; This is the only path to UnhandledCodeFault +CodeLikeException - -major_0x02980_0x134 ; OUTSIDE REFERER mfsprg r1, 0 mtcrf 0x3f, r7 + lwz r9, EWA.Enables(r1) lwz r1, EWA.PA_KDP(r1) - rlwnm. r9, r9, r8, 0, 0 - rlwimi r7, r8, 24, 0, 7 + rlwnm. r9, r9, r8, 0, 0 ; cr0.lt = (exception enabled?) + + ; Exception code in high byte of flags + rlwimi r7, r8, 24, 0xFF000000 + + ; Increment counter, easy enough slwi r8, r8, 2 add r8, r8, r1 lwz r9, KDP.NanoKernelInfo + NKNanoKernelInfo.ExceptionCauseCounts(r8) @@ -151,22 +184,32 @@ major_0x02980_0x134 ; OUTSIDE REFERER srwi r9, r7, 24 - bc BO_IF, EWA.kFlagSIGP, _IntReturnFromSIGP - bc BO_IF_NOT, EWA.kFlagBlue, _RecoverableCodeFault + ; Order of preference: + ; SIGP-return exceptions obviously separate + ; MTasks (non-blue) -> UnhandledCodeFault (ends up going to backing store) + ; Exception enabled for blue task (i.e. in system context) -> field exception to task + ; Not actually a code fault -> system context (68k interrupt) + ; Data fault that blue does not wish to handle + + bc BO_IF, EWA.kFlagSIGP, IntReturnFromSIGP + bc BO_IF_NOT, EWA.kFlagBlue, UnhandledCodeFault cmpwi cr1, r9, ecInstPageFault - blt ExceptionIsInEnables ; when Enables[cause] is set! - beq cr1, _RecoverableCodeFault + + blt LetBlueHandleOwnException + beq cr1, UnhandledCodeFault +; b IntReturnToSystemContext -; fall through if blue, exception not "enabled" -_IntReturnToSystemContext +; THESE TWO RETURN PATHS ARE ONLY CALLED IF BLUE IS RUNNING! + +IntReturnToSystemContext lwz r1, EWA.PA_KDP(r1) lwz r9, KDP.PA_ECB(r1) - addi r8, r1, KDP.YellowVecBase + addi r8, r1, KDP.VecBaseSystem mtsprg 3, r8 ; Exception came from emulator! Can't handle that with a 68k interrupt, can we? @@ -178,7 +221,7 @@ _IntReturnToSystemContext ; ARG old_context r6, new_context r9 -_IntReturnToOppositeContext +IntReturnToOtherBlueContext mfsprg r1, 0 @@ -353,7 +396,7 @@ major_0x02ccc ; OUTSIDE REFERER stw r7, EWA.Flags(r1) li r8, ecInstTrace - b major_0x02980_0x134 + b CodeLikeException @return blr @@ -403,7 +446,7 @@ major_0x02ccc_0x30 rlwimi r25, r17, 4, 23, 27 mtcrf 0x10, r26 ; so the second nybble of the entry is copied to cr3 lha r22, 0x0c00(r25) - addi r23, r8, 0x4e0 + addi r23, r8, KDP.VecBaseTranslation add r22, r22, r25 mfsprg r24, 3 mtlr r22 @@ -485,7 +528,7 @@ SuspendBlueTask bl Printw _log '^n' mtlr r16 - b Local_Panic + b IntPanicIsland @@ -497,21 +540,24 @@ SuspendBlueTask ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ###### ######## ## ## ## ####### ######## ## ###### -_RecoverableCodeFault +; Blue can easily get to both of these! - bcl BO_IF, EWA.kFlagLowSaves, Local_Panic +UnhandledCodeFault + + bcl BO_IF, EWA.kFlagLowSaves, IntPanicIsland bl SchSaveStartingAtR14 mr r30, r10 lwz r29, EWA.r6(r8) lwz r31, EWA.PA_CurTask(r8) stw r29, ContextBlock.r6(r6) - stw r30, 0x0074(r6) ; ContextBlock.srr0? + stw r30, ContextBlock.SRR0(r6) ; ContextBlock.srr0? stw r7, 0x0040(r6) ; ContextBlock.savedFlags? lwz r1, EWA.PA_KDP(r1) ; get task in r31, globals in r1 + ; Will be released via BlockMPCall _Lock PSA.SchLock, scratch1=r28, scratch2=r29 mr r8, r31 @@ -519,11 +565,14 @@ _RecoverableCodeFault lwz r16, Task.Flags(r31) srwi r8, r7, 24 - rlwinm. r16, r16, 0, Task.kFlag9, Task.kFlag9 + + + ; To debugger if not actually a code fault, or Task takes all exceptions + rlwinm. r16, r16, 0, Task.kFlagTakesAllExceptions, Task.kFlagTakesAllExceptions cmpwi cr1, r8, ecInstPageFault - bne _fault_throw_to_debugger - bne cr1, _fault_throw_to_debugger - ; what is special about the upper 8 Flags? Are they Task-related? + bne _PageFaultToDebugger + bne cr1, _PageFaultToDebugger + lwz r8, Task.CodeFaultCtr(r31) addi r8, r8, 1 @@ -533,9 +582,9 @@ _RecoverableCodeFault -_RecoverableDataFault +UnhandledDataFault - bcl BO_IF_NOT, EWA.kFlagLowSaves, Local_Panic + bcl BO_IF_NOT, EWA.kFlagLowSaves, IntPanicIsland bl PreferRegistersFromEWASavingContextBlock @@ -546,7 +595,7 @@ _RecoverableDataFault bl SchSaveStartingAtR14 - lwz r30, 0x0074(r6) + lwz r30, ContextBlock.SRR0(r6) lwz r29, 0x0018(r8) lwz r31, -0x0008(r8) stw r29, 0x0134(r6) @@ -554,17 +603,24 @@ _RecoverableDataFault lwz r1, -0x0004(r1) + ; Will be released via BlockMPCall _Lock PSA.SchLock, scratch1=r28, scratch2=r29 + mr r8, r31 bl SchTaskUnrdy + lwz r16, Task.Flags(r31) srwi r8, r7, 24 - rlwinm. r16, r16, 0, Task.kFlag9, Task.kFlag9 - cmpwi cr1, r8, 0x14 - bne _fault_throw_to_debugger - bne cr1, _fault_throw_to_debugger + + + ; To debugger if not actually a data fault, or Task takes all exceptions + rlwinm. r16, r16, 0, Task.kFlagTakesAllExceptions, Task.kFlagTakesAllExceptions + cmpwi cr1, r8, ecDataPageFault + bne _PageFaultToDebugger + bne cr1, _PageFaultToDebugger + lwz r8, Task.DataFaultCtr(r31) addi r8, r8, 1 @@ -579,79 +635,102 @@ _CommonFaultPath _bclr r7, r7, EWA.kFlag26 _bclr r7, r7, EWA.kFlag31 - ; Panic if EWA.SpecialAreaPtr is invalid + ; Panic if EWA.SpecialAreaPtr is invalid (presumably means CurrentlyFaultingArea?) lwz r29, EWA.SpecialAreaPtr(r14) lisori r17, Area.kSignature lwz r16, Area.Signature(r29) cmplw r16, r17 - bnel Local_Panic + bnel IntPanicIsland lwz r17, Area.Counter(r29) addi r17, r17, 1 stw r17, Area.Counter(r29) - lwz r8, Area.BackingProviderID(r29) ; this is a notification? ugh... + ; Get BackingProvider ptr in r26 (`mr` a few instructions down) + lwz r8, Area.BackingProviderID(r29) bl LookupID + + ; Three escape hatches: + + ; PAGE FAULT TASK VMMaxVirtualPages CODE PATH + ; -------------------------------------------------------------- + ; code blue 0 1 + ; code blue nonzero 3 + ; code non-blue 0 1 + ; code non-blue nonzero 1 + ; data blue 0 3 + ; data blue nonzero 3 + ; data non-blue 0 2 + ; data non-blue nonzero 2 + lwz r16, KDP.VMMaxVirtualPages(r1) cmpwi cr0, r9, ecInstPageFault cmpwi cr1, r16, 0 mr r26, r8 - bne cr0, @can_use_page_queue - beq cr1, @cannot_use_page_queue ; never seems to be taken (VMMaxVirtualPages never zero) - bc BO_IF, EWA.kFlagBlue, @can_use_page_queue + bne cr0, @ESCAPE_HATCH_2_OR_3 + beq cr1, @force_escape_hatch_1 + bc BO_IF, EWA.kFlagBlue, @ESCAPE_HATCH_2_OR_3 +@force_escape_hatch_1 -@cannot_use_page_queue ; no, I'm wrong about this -- this code gets executed normally! +; ESCAPE HATCH 1: CODE FAULT OUTSIDE BLUE TASK -> AREA BACKING PROVIDER + +; (also handles blue code faults IFF the never-before-seen VM regime is active) lwz r16, Task.Flags(r31) + + ; Enqueue Task on its internal Semaphore (only to be released when Provider says) addi r17, r31, Task.QueueMember addi r18, r31, Task.PageFaultSema - stw r18, LLL.Freeform(r17) InsertAsPrev r17, r18, scratch=r19 li r17, 1 - _bset r16, r16, Task.kFlag18 + _bset r16, r16, Task.kFlagPageFaulted stw r17, Task.PageFaultSema + Semaphore.Value(r31) stw r16, Task.Flags(r31) - rlwinm r30, r30, 0, 0, 19 + ; SRR0 points to faulting instruction. Extract the faulting page. + rlwinm r30, r30, 0, 0xFFFFF000 - lwz r27, 0x0000(r29) - lwz r28, 0x0000(r31) - stw r30, 0x0010(r26) - stw r27, 0x0014(r26) - stw r28, 0x0018(r26) + ; Message = page address || Area ID || Task ID + lwz r27, Area.ID(r29) + lwz r28, Task.ID(r31) + stw r30, Message.Word1(r26) + stw r27, Message.Word2(r26) + stw r28, Message.Word3(r26) + ; Bang mr r30, r26 bl CauseNotification + ; Success? If not, fall through to using the global blue-serviced page queue cmpwi r8, 0 - beq IntLocalBlockMPCall ; jump if no error? + beq IntLocalBlockMPCall - ; Block the task on its internal semaphore (the page fault semaphore) +@ESCAPE_HATCH_2_OR_3 -@can_use_page_queue + mfcr r28 ; only for hatch 3 + li r8, Message.Size ; only for hatch 2 - mfcr r28 - li r8, Message.Size - bc BO_IF, EWA.kFlagBlue, @was_blues_fault + bc BO_IF, EWA.kFlagBlue, @ESCAPE_HATCH_3 - ; FAULT IN NON-BLUE TASK: send message to the page queue + +; ESCAPE HATCH 2: DATA FAULT OUTSIDE BLUE TASK -> INTO SYSTEM PAGQ FOR BLUE TO SERVICE + + ; Instead of banging a notification, we send a (new) message to the global Page Queue bl PoolAlloc mr. r26, r8 - beq @oom + beq @oom_for_pagq_message - ; Block the faulting NON-BLUE TASK on its own PageFaultSema, - ; put raise the semaphore, thus preparing it to unblock once - ; the latency-protected-priority blue task has served the fault + ; Block the task in the usual way, but do *not* set Task.kFlagPageFaulted addi r17, r31, Task.QueueMember addi r18, r31, Task.PageFaultSema @@ -689,22 +768,30 @@ _CommonFaultPath - ; FAULT IN BLUE TASK: switch it over to the system context +; ESCAPE HATCH 3: PAGE FAULT IN BLUE TASK -> 68K INTERRUPT -@was_blues_fault +; All faults that occur in the blue task, except inst faults when the ?? VM regime is enabled +@ESCAPE_HATCH_3 + + ; Let the blue task keep running! mr r8, r31 bl SchRdyTaskNow - _AssertAndRelease PSA.SchLock, scratch=r31 - mtcr r28 + ; The other pathways release the Sch lock in BlockMPCall + _AssertAndRelease PSA.SchLock, scratch=r31 + + ; Restore CR (got clobbered by SchRdyTaskNow?) + + ; Do the LowSaves help the Emulator do an interrupt? + mtcr r28 bc BO_IF_NOT, EWA.kFlagLowSaves, @nolo lwz r8, 0x0064(r6) lwz r9, 0x0068(r6) stw r8, 0x0024(r6) stw r9, 0x0028(r6) lwz r8, 0x006c(r6) - lwz r9, 0x0074(r6) + lwz r9, ContextBlock.SRR0(r6) stw r8, 0x002c(r6) stw r9, 0x0034(r6) lwz r8, 0x007c(r6) @@ -712,15 +799,16 @@ _CommonFaultPath crclr EWA.kFlagLowSaves @nolo -; r6 = ewa bl SchRestoreStartingAtR14 - b _IntReturnToSystemContext + + ; Central to the Mac OS architecture: a 68k interrupt! + b IntReturnToSystemContext -; We failed to service a page fault in a non-blue task, so just let it run -; Is this terrible? A don't-care? -@oom +; This seems like an awfully calm way to handle a page fault. + +@oom_for_pagq_message li r16, Task.kNominalPriority stb r16, Task.Priority(r31) @@ -731,27 +819,27 @@ _CommonFaultPath -_fault_throw_to_debugger +; For tasks that were created with kMPCreateTaskTakesAllExceptionsMask + +_PageFaultToDebugger + b ThrowTaskToDebugger +#### ## ## ######## ## ## ### ## ## ######## ## ######## ######## ###### + ## ### ## ## ## ## ## ## ### ## ## ## ## ## ## ## ## ## + ## #### ## ## ## ## ## ## #### ## ## ## ## ## ## ## ## + ## ## ## ## ## ######### ## ## ## ## ## ## ## ## ###### ######## ###### + ## ## #### ## ## ## ######### ## #### ## ## ## ## ## ## ## + ## ## ### ## ## ## ## ## ## ### ## ## ## ## ## ## ## ## +#### ## ## ## ## ## ## ## ## ## ######## ######## ######## ## ## ###### + align kIntAlign IntDecrementer ; OUTSIDE REFERER -; r6 = saved at *(ewa + 0x18) -; sprg1 = saved at *(ewa + 4) -; rN (0,7,8,9,10,11,12,13, not r1) = saved at *(*(ewa - 0x14) + 0x104 + 8*N) - bl int_prepare -; r0 = 0 -; r1 = *(ewa - 4) -; r6 = kdp -; r7 = *(ewa - 0x10) # flags? -; r8 = ewa -; r10 = srr0 -; r11 = srr1 -; r12 = sprg2 -; r13 = cr + + bl LoadInterruptRegisters lwz r8, KDP.OldKDP(r1) rlwinm. r9, r11, 0, 16, 16 @@ -799,33 +887,58 @@ IntDecrementer_0x54 +### ###### ##### ### + # # # ##### # # # # # + # ## # # # # # # + # # # # # # # ##### # + # # # # # # # # # + # # ## # # # # # # +### # # # ###### ##### ### + +; Kick it to the FDP-associated IntDSITranslation + align kIntAlign -IntDSI ; OUTSIDE REFERER +IntDSI + mfsprg r1, 0 - stmw r2, 0x0008(r1) + stmw r2, EWA.r2(r1) mfsprg r11, 1 - stw r0, 0x0000(r1) - stw r11, 0x0004(r1) - li r0, 0x00 + + stw r0, EWA.r0(r1) + stw r11, EWA.r1(r1) ; Why? + + li r0, 0 + mfspr r10, srr0 mfspr r11, srr1 mfsprg r12, 2 mfcr r13 mfsprg r24, 3 + lwz r16, EWA.Flags(r1) - lwz r1, -0x0004(r1) + lwz r1, EWA.PA_KDP(r1) + mfspr r26, dsisr - addi r23, r1, 0x4e0 - andis. r28, r26, 0x400 + + ; Activate the Translation vecTable, and test DSISR bit 5 + ; ("Set if the access is due to a lwarx, ldarx, stwcx., or stdcx. + ; instruction that addresses memory that is Write Through + ; Required or Caching Inhibited; otherwise cleared") + addi r23, r1, KDP.VecBaseTranslation + andis. r28, r26, 0x400 ; test bit 5 (see cmt above) mtsprg 3, r23 + mfmsr r14 - bne major_0x03324_0x9c - ori r15, r14, 0x10 + bne HandleDSIDueToIllegalSyncPrimitive + + _bset r15, r14, 27 ; temp set MSR[DR] mtmsr r15 isync - lwz r27, 0x0000(r10) - mtmsr r14 + + lwz r27, 0(r10) ; get instruction (should be fine!) + + mtmsr r14 ; restore MSR isync @@ -875,7 +988,10 @@ major_0x03324_0x58 add r18, r18, r23 blr -major_0x03324_0x9c ; OUTSIDE REFERER + + +HandleDSIDueToIllegalSyncPrimitive ; OUTSIDE REFERER + ori r15, r14, 0x10 mr r28, r16 mfspr r18, dar @@ -890,7 +1006,7 @@ major_0x03324_0x9c ; OUTSIDE REFERER mr r31, r19 mr r8, r18 li r9, 0x00 - bl V2P + bl SpaceL2PUsingBATs ; LogicalPage *r8, MPAddressSpace *r9 // PhysicalPage *r17 mr r16, r28 crset cr3_so mfsprg r1, 0 @@ -950,9 +1066,9 @@ IntAlignment ; OUTSIDE REFERER mfspr r27, dsisr mfspr r18, dar - rlwinm. r21, r21, 0, Task.kFlag9, Task.kFlag9 + rlwinm. r21, r21, 0, Task.kFlagTakesAllExceptions, Task.kFlagTakesAllExceptions - addi r23, r1, KDP.RedVecBase + addi r23, r1, KDP.VecBaseTranslation bne major_0x03548_0x20 @@ -1012,7 +1128,7 @@ FDP_TableBase equ 0xa00 bclr BO_IF_NOT, 12 ; jump now if bit 12 is off ; if bit 12 was on, turn on paging and fetch the offending insn - ; and also activate the Red vector table + ; and also activate the Translation vector table mtmsr r15 isync lwz r27, 0x0000(r10) @@ -1041,13 +1157,14 @@ major_0x03548_0x20 ; OUTSIDE REFERER rlwimi r17, r27, 7, 31, 31 xori r17, r17, 0x01 li r8, ecUnknown24 - b major_0x02980 + b DataLikeException align kIntAlign -IntDSIOtherOther ; OUTSIDE REFERER +IntDSITranslation ; OUTSIDE REFERER + mfsprg r1, 0 mfspr r31, dsisr mfspr r27, dar @@ -1077,7 +1194,7 @@ IntDSIOtherOther ; OUTSIDE REFERER bgt cr7, IntDSIOtherOther_0xe0 mr r31, r8 mr r8, r27 - bl MPCall_95_0x1e4 + bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq beq IntDSIOtherOther_0xe0 lwz r8, 0x0000(r30) lwz r16, 0x0098(r31) @@ -1130,7 +1247,7 @@ IntDSIOtherOther_0x100 li r28, 0x43 and r28, r31, r28 cmpwi cr7, r28, 0x43 - beql Local_Panic + beql IntPanicIsland mfsprg r28, 2 mtlr r28 bne cr7, IntDSIOtherOther_0x144 @@ -1145,9 +1262,9 @@ IntDSIOtherOther_0x100 IntDSIOtherOther_0x144 andi. r28, r31, 0x03 li r8, ecDataSupAccessViolation - beq major_0x02980 + beq DataLikeException li r8, ecDataWriteViolation - b major_0x02980 + b DataLikeException IntDSIOtherOther_0x158 mfsprg r30, 0 @@ -1187,9 +1304,9 @@ IntDSIOtherOther_0x1c8 mtlr r28 beq IntDSIOtherOther_0x19c li r8, ecDataInvalidAddress - bge major_0x02980 + bge DataLikeException li r8, ecDataPageFault - b major_0x02980 + b DataLikeException @@ -1252,31 +1369,20 @@ IntMachineCheckMemRetry_0x124 IntMachineCheckMemRetry_0x14c ; OUTSIDE REFERER cmplw r10, r19 li r8, ecDataHardwareFault - bne major_0x02980 + bne DataLikeException mfsprg r1, 0 mtsprg 3, r24 lmw r14, 0x0038(r1) li r8, ecInstHardwareFault - b major_0x02980_0x134 + b CodeLikeException align kIntAlign IntISI ; OUTSIDE REFERER -; r6 = saved at *(ewa + 0x18) -; sprg1 = saved at *(ewa + 4) -; rN (0,7,8,9,10,11,12,13, not r1) = saved at *(*(ewa - 0x14) + 0x104 + 8*N) - bl int_prepare -; r0 = 0 -; r1 = *(ewa - 4) -; r6 = kdp -; r7 = *(ewa - 0x10) # flags? -; r8 = ewa -; r10 = srr0 -; r11 = srr1 -; r12 = sprg2 -; r13 = cr + + bl LoadInterruptRegisters andis. r8, r11, 0x4020 beq major_0x039dc_0x14 @@ -1293,7 +1399,7 @@ IntISI ; OUTSIDE REFERER mfsprg r24, 3 mfmsr r14 ori r15, r14, 0x10 - addi r23, r1, 0x4e0 + addi r23, r1, KDP.VecBaseTranslation mtsprg 3, r23 mr r19, r10 mtmsr r15 @@ -1312,33 +1418,22 @@ IntISI ; OUTSIDE REFERER major_0x039dc ; OUTSIDE REFERER lmw r14, 0x0038(r8) li r8, ecInstPageFault - blt major_0x02980_0x134 + blt CodeLikeException li r8, ecInstInvalidAddress - b major_0x02980_0x134 + b CodeLikeException major_0x039dc_0x14 ; OUTSIDE REFERER andis. r8, r11, 0x800 li r8, ecInstSupAccessViolation - bne major_0x02980_0x134 + bne CodeLikeException li r8, ecInstHardwareFault - b major_0x02980_0x134 + b CodeLikeException IntMachineCheck ; OUTSIDE REFERER -; r6 = saved at *(ewa + 0x18) -; sprg1 = saved at *(ewa + 4) -; rN (0,7,8,9,10,11,12,13, not r1) = saved at *(*(ewa - 0x14) + 0x104 + 8*N) - bl int_prepare -; r0 = 0 -; r1 = *(ewa - 4) -; r6 = kdp -; r7 = *(ewa - 0x10) # flags? -; r8 = ewa -; r10 = srr0 -; r11 = srr1 -; r12 = sprg2 -; r13 = cr + + bl LoadInterruptRegisters lwz r9, EWA.CPUBase + CPU.ID(r8) _log 'CPU ' @@ -1366,7 +1461,7 @@ IntMachineCheck ; OUTSIDE REFERER @not_L1_data_cache_error li r8, ecMachineCheck - b major_0x02980_0x134 + b CodeLikeException @@ -1380,7 +1475,7 @@ MaskedInterruptTaken ; OUTSIDE REFERER lis r10, -0x4523 ori r10, r10, 0xcb00 li r8, ecMachineCheck - b major_0x02980_0x134 + b CodeLikeException @@ -1412,6 +1507,14 @@ IntDSIOther ; OUTSIDE REFERER + ###### ####### ####### +# # #### # # ###### ##### # # ##### # # # ##### #### # # # # # #### ###### ##### ##### # #### # # +# # # # # # # # # # # # ## # # # # # # ## ## # # # # # # # # # # # # ## # +#### # ###### ##### # # # # # # # # ##### # # # # # ## # ##### ## # ##### # # # # # # # # # +# # # # # # # # # ##### # # # # ##### # # # # # ## # # ##### # # # # # # # +# # # # # # # # # # # # # ## # # # # # # # # # # # # # # # # # # # ## +# # #### # # ###### # #### # # # # # # # #### # # ####### # # #### ###### # # # #### # # + align kIntAlign ; dead code? @@ -1429,7 +1532,7 @@ kcReturnFromException ; OUTSIDE REFERER mtcrf 0x3f, r7 cmplwi cr1, r3, 0x01 - bc BO_IF, EWA.kFlagSIGP, _IntReturnFromSIGP + bc BO_IF, EWA.kFlagSIGP, IntReturnFromSIGP blt cr1, major_0x03be0_0x58 beq cr1, major_0x03be0_0x90 @@ -1444,7 +1547,7 @@ kcReturnFromException ; OUTSIDE REFERER rlwimi r7, r3, 24, 0, 7 blt major_0x03be0_0xe8 li r8, ecTrapInstr - b major_0x02980_0x134 + b CodeLikeException major_0x03be0_0x58 mfsprg r1, 0 @@ -1483,15 +1586,15 @@ major_0x03be0_0x90 lwz r17, 0x0064(r6) lwz r20, 0x0068(r6) lwz r21, 0x006c(r6) - lwz r19, 0x0074(r6) + lwz r19, ContextBlock.SRR0(r6) lwz r18, 0x007c(r6) major_0x03be0_0xe8 - beq cr2, _IntReturnToSystemContext + beq cr2, IntReturnToSystemContext crclr cr6_so mfspr r10, srr0 li r8, ecTrapInstr - b major_0x02980_0x134 + b CodeLikeException @@ -1525,6 +1628,14 @@ save_all_registers ; OUTSIDE REFERER +# ### ###### +# #### ## ##### # # # ##### ###### ##### ##### # # ##### ##### # # ###### #### # #### ##### ###### ##### #### +# # # # # # # # ## # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # ##### # # # # # # # # # ###### ##### # # #### # ##### # # #### +# # # ###### # # # # # # # # ##### ##### # # ##### # # # # # ### # # # # ##### # +# # # # # # # # # ## # # # # # # # # # # # # # # # # # # # # # # # # +####### #### # # ##### ### # # # ###### # # # # #### # # # # ###### #### # #### # ###### # # #### + ; How we arrive here: ; ; PowerPC exception vector saved r1/LR in SPRG1/2 and @@ -1563,7 +1674,7 @@ save_all_registers ; OUTSIDE REFERER align 5 -int_prepare +LoadInterruptRegisters ; Get EWA pointer in r1 (phew) mfsprg r1, 0 @@ -1608,6 +1719,14 @@ int_prepare +### ####### ###### # # + # # # ##### # # # # # # # ## # # ## # # + # ## # # # # # # # ## # # # # # # # # # + # # # # # ##### ###### # # # # # # # # # # # # # + # # # # # # # # # # # # ###### # # ###### # # + # # ## # # # # # # ## # # # # # # # # +### # # # # # ##### # # # # ## # # # ###### + align kIntAlign IntFPUnavail ; OUTSIDE REFERER @@ -1809,25 +1928,22 @@ major_0x04180_0x9c lwz r11, -0x0288(r1) lwz r13, -0x0284(r1) -; r6 = saved at *(ewa + 0x18) -; sprg1 = saved at *(ewa + 4) -; rN (0,7,8,9,10,11,12,13, not r1) = saved at *(*(ewa - 0x14) + 0x104 + 8*N) - bl int_prepare -; r0 = 0 -; r1 = *(ewa - 4) -; r6 = kdp -; r7 = *(ewa - 0x10) # flags? -; r8 = ewa -; r10 = srr0 -; r11 = srr1 -; r12 = sprg2 -; r13 = cr + + bl LoadInterruptRegisters li r8, ecInvalidInstr - b major_0x02980_0x134 + b CodeLikeException +### ###### # # + # # # ##### # # ###### ##### ###### ## ## #### # # # ##### #### ##### + # ## # # # # # # # # # # # # # # ## # # # # # # # + # # # # # ###### ##### # # ##### # # # # # # # # # # # # # # + # # # # # # # ##### # # # # # # # # # # # # ##### + # # ## # # # # # # # # # # # ## # # # # # # +### # # # # ###### # # # # # #### # # # # #### # # + align kIntAlign IntPerfMonitor ; OUTSIDE REFERER @@ -1905,6 +2021,14 @@ IntThermalEvent ; OUTSIDE REFERER + ###### # ##### +# # #### # # # # # # # # # ##### ###### ##### # # ## ##### ###### # # #### # # ##### ###### # # ##### +# # # # # # # # ## # # # # # # # # ## # # # # # # # # ## # # # # # # +#### # ###### # # # # # # # # # ##### # # # # # # # # ##### # # # # # # # ##### ## # +# # # # # # # # # # ####### # # # ##### # # # ###### # # # # # # # # # # ## # +# # # # # # # # # ## # # # # # # # # ## # # # # # # # # # ## # # # # # +# # #### # # #### # # # # ###### # ###### # # # # # # # ###### ##### #### # # # ###### # # # + ; We can assume that this is being called from the emulator ; We accept a logical NCB ptr but the kernel needs a physical one. @@ -1932,7 +2056,7 @@ kcRunAlternateContext @found_physical_in_cache ; can come here from below after a more thorough search - addi r8, r1, KDP.OrangeVecBase + addi r8, r1, KDP.VecBaseAlternate ; the only use of this vector table? mtsprg 3, r8 lwz r8, KDP.LA_EmulatorKernelTrapTable(r1) @@ -1943,7 +2067,7 @@ kcRunAlternateContext stw r9, EWA.PA_ContextBlock(r1) - b _IntReturnToOppositeContext + b IntReturnToOtherBlueContext @search_cache @@ -2062,7 +2186,7 @@ kcRunAlternateContext lmw r14, EWA.r14(r1) lwz r1, EWA.PA_KDP(r1) li r8, ecTrapInstr - b major_0x02980_0x134 + b CodeLikeException @@ -2078,6 +2202,14 @@ wordfill ; OUTSIDE REFERER + ###### ##### +# # #### # # ###### #### ###### ##### # # # # #### ##### ###### # # +# # # # # # # # # # # # # # # # ## ## +#### # ###### ##### #### ##### # ##### # #### # ##### # ## # +# # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # +# # #### # # ###### #### ###### # ##### # #### # ###### # # + ; Handle a 68k reset trap. ; If A0(r3)/A1(r4) == 'Gary'/$05051955, load the register list in A3? Or is this now disabled? @@ -2153,7 +2285,7 @@ NonGaryReset lwz r8, KDP.OldKDP(r1) mfsprg r1, 0 - addi r9, r8, KDP.YellowVecBase + addi r9, r8, KDP.VecBaseSystem mtsprg 0, r8 ; old NK has only one EWA! mtsprg 3, r9 @@ -2186,6 +2318,14 @@ NonGaryReset + ###### ### +# # #### # # ##### # #### ##### # ##### # ###### ###### # # # ##### ###### ##### ##### # # ##### ##### #### +# # # # # # # # # # # # # # # # # # # ## # # # # # # # # # # # # # +#### # ###### # # # # # # # # # # # ##### # # # # # ##### # # # # # # # # # #### +# # # # ##### # # # ##### # # # # # # # # # # # ##### ##### # # ##### # # +# # # # # # # # # # # # # # # # # # # ## # # # # # # # # # # # # +# # #### # # # # #### # # # # # ###### ###### ### # # # ###### # # # # #### # # #### + ; > r1 = kdp kcPrioritizeInterrupts ; OUTSIDE REFERER @@ -2226,49 +2366,54 @@ kcThud stmw r14, EWA.r14(r1) - bl Local_Panic + bl IntPanicIsland major_0x046d0 ; OUTSIDE REFERER -; r6 = saved at *(ewa + 0x18) -; sprg1 = saved at *(ewa + 4) -; rN (0,7,8,9,10,11,12,13, not r1) = saved at *(*(ewa - 0x14) + 0x104 + 8*N) - bl int_prepare -; r0 = 0 -; r1 = *(ewa - 4) -; r6 = kdp -; r7 = *(ewa - 0x10) # flags? -; r8 = ewa -; r10 = srr0 -; r11 = srr1 -; r12 = sprg2 -; r13 = cr + + bl LoadInterruptRegisters li r8, ecTrapInstr - b major_0x02980_0x134 + b CodeLikeException +### ####### # + # # # ##### # # # ##### ###### ##### # # ## # # # # ##### ###### ##### # # ## ##### ###### + # ## # # # # # # # # # ## # # # # # # # # # # # ## # # # # # + # # # # # ##### ## # ##### # # # # # # # # # # # # ##### # # # # # # # # ##### + # # # # # # ## # # ##### # # # ###### # ####### # # # ##### # # # ###### # # + # # ## # # # # # # # # # ## # # # # # # # # # # # ## # # # # +### # # # ####### # # # ###### # # # # # # ###### # # ###### # ###### # # # # # # # ###### + ; For when the alternate context is running? align kIntAlign -IntExternalOrange +IntExternalAlternate - bl int_prepare + bl LoadInterruptRegisters mtcrf 0x3f, r7 - bcl BO_IF_NOT, EWA.kFlagBlue, Local_Panic + bcl BO_IF_NOT, EWA.kFlagBlue, IntPanicIsland li r8, ecNoException - b major_0x02980_0x134 + b CodeLikeException +### ###### + # # # ##### # # ##### #### #### ##### ## # # + # ## # # # # # # # # # # # # # # ## ## + # # # # # ###### # # # # # # # # # # ## # + # # # # # # ##### # # # ### ##### ###### # # + # # ## # # # # # # # # # # # # # # +### # # # # # # #### #### # # # # # # + align kIntAlign IntProgram - bl int_prepare + bl LoadInterruptRegisters lwz r8, KDP.LA_EmulatorKernelTrapTable(r1) mtcr r11 ; UNUSUAL to have SRR1 in condition register @@ -2411,23 +2556,23 @@ IntProgram rlwinm r8, r11, 17, 28, 29 ; whoa addi r8, r8, 0x4b3 rlwnm r8, r8, r8, 28, 31 - b major_0x02980_0x134 + b CodeLikeException @floating_point_exception li r8, ecFloatException - bc BO_IF, 15, major_0x02980_0x134 ; if SRR0 points to subsequent instr + bc BO_IF, 15, CodeLikeException ; if SRR0 points to subsequent instr addi r10, r10, 4 ; if SRR0 points to offending instr rlwimi r7, r7, 27, 26, 26 ; copy EWA.kFlagBE into EWA.kFlag26 - b major_0x02980_0x134 + b CodeLikeException align kIntAlign -IntExternalYellow +IntExternalSystem - bl int_prepare + bl LoadInterruptRegisters ; Sanity check @@ -2475,6 +2620,14 @@ IntExternalYellow + ##### ### ##### ###### +# # # # # # # +# # # # # + ##### # # #### ###### + # # # # # +# # # # # # + ##### ### ##### # + ; "SIGnal Plugin": Call the CPU plugin PEF bundle synchronously. ; (blue address space but in supervisor mode without interrupts) @@ -2504,7 +2657,7 @@ SIGP lwz r16, EWA.PA_CurAddressSpace(r23) slwi r20, r3, 2 stw r16, EWA.SIGPSpacOnResume(r23) - bc BO_IF, EWA.kFlagSIGP, _IntReturnFromSIGP ; not sure about this + bc BO_IF, EWA.kFlagSIGP, IntReturnFromSIGP ; not sure about this cmpwi cr2, r8, 0 lwz r18, EWA.SIGPSelector(r23) beq cr2, @args_in_registers @@ -2628,7 +2781,7 @@ major_0x04a20 ; OUTSIDE REFERER -_IntReturnFromSIGP +IntReturnFromSIGP mfsprg r23, 0 lwz r7, EWA.SIGPSavedR7(r23) @@ -2673,6 +2826,14 @@ _IntReturnFromSIGP +### ##### + # # # ##### # # # # #### #### ## # # + # ## # # # # # # # # # # # # + # # # # # ##### # #### # # # # # + # # # # # # # # # ###### # # + # # ## # # # # # # # # # # # # +### # # # ##### # #### #### # # ###### ###### + ; IntSyscall ; Not fully sure about this one @@ -2734,7 +2895,7 @@ IntSyscall ; OUTSIDE REFERER ; Positive numbered syscalls are a fast path to MPDispatch (twi 31, r31, 8) - bl int_prepare ; Save the usual suspects and get comfy + bl LoadInterruptRegisters ; Save the usual suspects and get comfy lwz r9, KDP.NanoKernelInfo + NKNanoKernelInfo.NanoKernelCallCounts + 32(r1) addi r9, r9, 1 @@ -2748,28 +2909,33 @@ IntSyscall ; OUTSIDE REFERER +### ####### + # # # ##### # ##### ## #### ###### + # ## # # # # # # # # # # + # # # # # # # # # # # ##### + # # # # # # ##### ###### # # + # # ## # # # # # # # # # +### # # # # # # # # #### ###### + align kIntAlign IntTrace ; OUTSIDE REFERER -; r6 = saved at *(ewa + 0x18) -; sprg1 = saved at *(ewa + 4) -; rN (0,7,8,9,10,11,12,13, not r1) = saved at *(*(ewa - 0x14) + 0x104 + 8*N) - bl int_prepare -; r0 = 0 -; r1 = *(ewa - 4) -; r6 = kdp -; r7 = *(ewa - 0x10) # flags? -; r8 = ewa -; r10 = srr0 -; r11 = srr1 -; r12 = sprg2 -; r13 = cr + + bl LoadInterruptRegisters li r8, ecInstTrace - b major_0x02980_0x134 + b CodeLikeException +### ##### ### + # #### # # #### ##### ###### # # #### ###### ##### # # ## ##### ###### # # # ##### + # # # ## # # # # # # # # # # # # # # # # # # # ## # # + # # # # # # # # # ##### ##### # # ##### # # # # # # # ##### # # # # # + # # ### # # # # # ##### # # # # # # # ## # ###### ##### # # # # # # + # # # # ## # # # # # # # # # # # ## ## # # # # # # # ## # +### #### # # #### # # ###### ##### #### # # # # # # # # ###### ### # # # + align kIntAlign IgnoreSoftwareInt ; OUTSIDE REFERER @@ -2785,6 +2951,14 @@ IgnoreSoftwareInt ; OUTSIDE REFERER +# # ###### # # ### +# # ## # # ##### # ###### # # ###### ##### ###### ## ## #### # # # ##### #### ##### # # # ##### +# # # # ## # # # # # # # # # # # # # # # # # ## # # # # # # # # ## # # +####### # # # # # # # # ##### ###### ##### # # ##### # # # # # # # # # # # # # # # # # # # +# # ###### # # # # # # # # # ##### # # # # # # # # # # # # ##### # # # # # +# # # # # ## # # # # # # # # # # # # # # ## # # # # # # # # ## # +# # # # # # ##### ###### ###### # ###### # # # # # #### # # # # #### # # ### # # # + align kIntAlign HandlePerfMonitorInt ; OUTSIDE REFERER diff --git a/NanoKernel/NKMPCalls.s b/NanoKernel/NKMPCalls.s index ed0cf59..3d23770 100644 --- a/NanoKernel/NKMPCalls.s +++ b/NanoKernel/NKMPCalls.s @@ -299,7 +299,7 @@ MPCall_0 ; OUTSIDE REFERER ; Fail if this page is outside of the PAR rlwinm. r4, r3, 20, 12, 31 - lwz r9, KDP.PrimaryAddrRangePages(r1) + lwz r9, KDP.VMLogicalPages(r1) beq ReturnMPCallOOM cmplw r4, r9 bge ReturnMPCallOOM @@ -1408,9 +1408,11 @@ KCStopScheduling ; OUTSIDE REFERER lbz r17, 0x0019(r31) cmpwi r17, 0x00 beq KCStopScheduling_0x94 - lwz r17, 0x0064(r31) - oris r17, r17, 0x80 - stw r17, 0x0064(r31) + + lwz r17, Task.Flags(r31) + _bset r17, r17, Task.kFlag8 + stw r17, Task.Flags(r31) + mr r8, r31 bl SchTaskUnrdy li r17, 0x00 @@ -1494,7 +1496,7 @@ NKxprintf ; OUTSIDE REFERER mr r8, r3 beq NKxprintf_0x1c li r9, 0x00 - bl V2P + bl SpaceL2PUsingBATs ; LogicalPage *r8, MPAddressSpace *r9 // PhysicalPage *r17 beq NKxprintf_0x24 rlwimi r8, r17, 0, 0, 19 @@ -1969,13 +1971,13 @@ MPCall_115_0x94 crmove 30, 2 beq MPCall_115_0xd0 li r9, 0x00 - bl MPCall_95_0x45c + bl SpaceL2PIgnoringBATs ; LogicalPage *r8, MPAddressSpace *r9 // PhysicalPage *r17 beq ReleaseAndReturnMPCallOOM add r8, r4, r5 li r9, 0x00 addi r8, r8, -0x01 mr r30, r8 - bl MPCall_95_0x45c + bl SpaceL2PIgnoringBATs ; LogicalPage *r8, MPAddressSpace *r9 // PhysicalPage *r17 beq ReleaseAndReturnMPCallOOM MPCall_115_0xd0 @@ -1997,7 +1999,7 @@ MPCall_115_0xe0 beq MPCall_115_0x11c mr r27, r16 li r9, 0x00 - bl MPCall_95_0x45c + bl SpaceL2PIgnoringBATs ; LogicalPage *r8, MPAddressSpace *r9 // PhysicalPage *r17 beq ReleaseAndReturnMPCallOOM mr r26, r17 diff --git a/NanoKernel/NKPaging.s b/NanoKernel/NKPaging.s index 620bdfd..ef97d70 100644 --- a/NanoKernel/NKPaging.s +++ b/NanoKernel/NKPaging.s @@ -76,7 +76,7 @@ PagingFunc1 ; OUTSIDE REFERER @_fc mr r8, r27 - bl MPCall_95_0x1e4 + bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq lwz r28, 0x0000(r30) mr r26, r30 mr r8, r27 @@ -380,7 +380,7 @@ PagingFunc1 ; OUTSIDE REFERER mr r8, r28 bgt @_600 bgt Local_Panic - bl MPCall_95_0x1e4 + bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq mr r26, r30 beql @_88 diff --git a/NanoKernel/NKScheduler.s b/NanoKernel/NKScheduler.s index 2d7407e..8ede3d2 100644 --- a/NanoKernel/NKScheduler.s +++ b/NanoKernel/NKScheduler.s @@ -1272,7 +1272,7 @@ major_0x142dc_0x184 rlwimi r11, r27, 24, 29, 29 beq+ major_0x142dc_0x1bc lwz r10, 0x00fc(r6) - rlwinm r27, r27, 0, 9, 7 + _bclr r27, r27, Task.kFlag8 stw r27, 0x0064(r31) major_0x142dc_0x1bc @@ -1332,7 +1332,7 @@ _SchPreempt stw r6, Task.ContextBlockPtr(r31) mfsprg r8, 3 stw r16, Task.Flags(r31) - stw r8, Task.YellowVecTblPtr(r31) + stw r8, Task.VecBase(r31) ; Spam its context block @@ -1432,7 +1432,7 @@ _SchPreempt lwz r11, 0x00a4(r6) lwz r8, 0x00f0(r30) rlwimi r11, r27, 24, 29, 29 - rlwinm r27, r27, 0, 9, 7 + _bclr r27, r27, Task.kFlag8 mtsprg 3, r8 stw r27, Task.Flags(r30) @@ -1478,9 +1478,9 @@ _SchPreempt lwz r6, KDP.PA_ECB(r1) - addi r26, r1, KDP.YellowVecBase + addi r26, r1, KDP.VecBaseSystem mtsprg 3, r26 - stw r26, Task.YellowVecTblPtr(r30) + stw r26, Task.VecBase(r30) stw r6, EWA.PA_ContextBlock(r19) stw r6, Task.ContextBlockPtr(r30) @@ -2042,7 +2042,7 @@ NewCpuEntryPoint stw r7, EWA.Flags(r14) stw r28, EWA.Enables(r14) - lwz r8, Task.YellowVecTblPtr(r31) + lwz r8, Task.VecBase(r31) mtsprg 3, r8 lwz r10, ContextBlock.CodePtr(r6) diff --git a/NanoKernel/NKTasks.s b/NanoKernel/NKTasks.s index 13309c8..fe69acc 100644 --- a/NanoKernel/NKTasks.s +++ b/NanoKernel/NKTasks.s @@ -11,10 +11,12 @@ Local_Panic set * ; ARG ProcessID r3 ; RET OSStatus r3, TaskID r10 +; kMPCreateTaskSuspendedMask is ignored? + DeclareMPCall 7, MPCall_7 MPCall_7 ; OUTSIDE REFERER - rlwinm. r8, r5, 0, 31, 28 + rlwinm. r8, r5, 0, ~0x00000006 ; kMPCreateTaskValidOptionsMask minus kMPCreateTaskSuspendedMask bne ReturnMPCallOOM _Lock PSA.SchLock, scratch1=r16, scratch2=r17 @@ -65,14 +67,14 @@ MPCall_7 ; OUTSIDE REFERER lwz r16, Task.Flags(r28) - rlwinm. r8, r5, 0, 30, 30 + rlwinm. r8, r5, 0, kMPCreateTaskTakesAllExceptionsMask beq @noflag - oris r16, r16, 0x40 ; Task.kFlag9 + _bset r16, r16, Task.kFlagTakesAllExceptions @noflag - rlwinm. r8, r5, 0, 29, 29 + rlwinm. r8, r5, 0, kMPCreateTaskNotDebuggableMask beq @noflag2 - oris r16, r16, 0x02 ; Task.kFlag14 + _bset r16, r16, Task.kFlagNotDebuggable @noflag2 stw r16, Task.Flags(r28) @@ -226,8 +228,8 @@ CreateTask lwz r16, PSA.UserModeMSR(r1) stw r16, Task.ContextBlock + ContextBlock.MSR(r28) - addi r16, r1, KDP.YellowVecBase - stw r16, Task.YellowVecTblPtr(r28) + addi r16, r1, KDP.VecBaseSystem + stw r16, Task.VecBase(r28) li r16, 0 lwz r17, Task.NotificationPtr(r28) @@ -790,7 +792,7 @@ ThrowTaskToDebugger ; OUTSIDE REFERER MPCall_58_0x114 mtcr r29 mr r28, r8 - bc BO_IF, Task.kFlag14, MPCall_58_0x13c + bc BO_IF, Task.kFlagNotDebuggable, MPCall_58_0x13c bc BO_IF, Task.kFlag20, MPCall_58_0x13c lwz r8, PSA._8e8(r1) diff --git a/NanoKernel/NKTranslation.s b/NanoKernel/NKTranslation.s index af7cd00..c3d362b 100644 --- a/NanoKernel/NKTranslation.s +++ b/NanoKernel/NKTranslation.s @@ -285,7 +285,7 @@ FDP_023c FDP_024c li r8, 18 - b major_0x02980 + b DataLikeException FDP_0254 ; stswi @@ -2122,10 +2122,10 @@ ProbePerfMonitor ; OUTSIDE REFERER ; Temporarily disable program interrupts (leave old handler in r20) lwz r21, KDP.PA_NanoKernelCode(r1) - lwz r20, KDP.YellowVecBase + VecTable.ProgramIntVector(r1) + lwz r20, KDP.VecBaseSystem + VecTable.ProgramIntVector(r1) llabel r18, IgnoreSoftwareInt add r21, r18, r21 - stw r21, KDP.YellowVecBase + VecTable.ProgramIntVector(r1) + stw r21, KDP.VecBaseSystem + VecTable.ProgramIntVector(r1) @@ -2189,7 +2189,7 @@ ProbePerfMonitor ; OUTSIDE REFERER ; Restore program interrupts - stw r20, KDP.YellowVecBase + VecTable.ProgramIntVector(r1) + stw r20, KDP.VecBaseSystem + VecTable.ProgramIntVector(r1) ; Test r23 and save @@ -2351,7 +2351,7 @@ FDP_1354 stw r9, 0x0ea0(r6) lwz r6, -0x0014(r1) lwz r7, -0x0010(r1) - b major_0x02980_0x134 + b CodeLikeException @@ -3142,7 +3142,7 @@ FDP_1c40 ; OUTSIDE REFERER ; r6 = saved at *(ewa + 0x18) ; sprg1 = saved at *(ewa + 4) ; rN (0,7,8,9,10,11,12,13, not r1) = saved at *(*(ewa - 0x14) + 0x104 + 8*N) - bl int_prepare + bl LoadInterruptRegisters ; r0 = 0 ; r1 = *(ewa - 4) ; r6 = kdp diff --git a/NanoKernel/NKVMCalls.s b/NanoKernel/NKVMCalls.s index 3341063..4bff6f1 100644 --- a/NanoKernel/NKVMCalls.s +++ b/NanoKernel/NKVMCalls.s @@ -93,7 +93,7 @@ VMDispatchTableEnd @noalt lwzx r8, r8, r7 - lwz r9, KDP.PrimaryAddrRangePages(r1) + lwz r9, KDP.VMLogicalPages(r1) add r8, r8, r7 mtlr r8 bltlr @@ -203,7 +203,7 @@ VMFinalInit ; OUTSIDE REFERER @loop srwi r4, r31, 12 - lwz r9, KDP.PrimaryAddrRangePages(r1) + lwz r9, KDP.VMLogicalPages(r1) bl GetPARPageInfo bge cr4, @skip bltl cr5, RemovePageFromTLB @@ -239,7 +239,7 @@ VMInit ; OUTSIDE REFERER cmpw r7, r8 bne VMReturn1 - stw r4, KDP.PrimaryAddrRangePages(r1) ; resize PAR + stw r4, KDP.VMLogicalPages(r1) ; resize PAR stw r5, KDP.FlatPageListPtr(r1) ; where did NK find this??? @@ -311,7 +311,7 @@ VMInit_0x110 cmpw r4, r7 bnel Local_Panic lwz r5, KDP.FlatPageListPtr(r1) - lwz r4, KDP.PrimaryAddrRangePages(r1) + lwz r4, KDP.VMLogicalPages(r1) andi. r7, r5, 0xfff li r3, 0x02 @@ -354,7 +354,7 @@ VMInit_0x110 li r3, 0x06 bne VMInit_Fail - stw r4, KDP.PrimaryAddrRangePages(r1) + stw r4, KDP.VMLogicalPages(r1) lwz r8, -0x0020(r1) slwi r7, r4, 12 stw r7, 0x0dc8(r8) @@ -380,7 +380,7 @@ VMInit_0x1ec lwz r15, KDP.FlatPageListPtr(r1) srwi r7, r5, 10 add r15, r15, r7 - lwz r5, KDP.PrimaryAddrRangePages(r1) + lwz r5, KDP.VMLogicalPages(r1) VMInit_0x218 lwz r16, 0x0000(r15) @@ -411,7 +411,7 @@ VMInit_0x250 sth r9, 0x0002(r3) sth r9, 0x000a(r3) lwz r6, 0x05e8(r1) - lwz r9, KDP.PrimaryAddrRangePages(r1) + lwz r9, KDP.VMLogicalPages(r1) lwz r15, KDP.FlatPageListPtr(r1) VMInit_0x288 @@ -451,7 +451,7 @@ VMInit_0x29c lwz r16, KDP.FlatPageListPtr(r1) stw r16, Area.PageMapArrayPtr(r8) - lwz r16, KDP.PrimaryAddrRangePages(r1) + lwz r16, KDP.VMLogicalPages(r1) slwi r16, r16, 12 stw r16, Area.Length(r8) subi r16, r16, 1 @@ -475,7 +475,7 @@ VMInit_0x29c VMInit_Fail lwz r7, KDP.TotalPhysicalPages(r1) lwz r8, KDP.FlatPageListSegPtrs + 0(r1) - stw r7, KDP.PrimaryAddrRangePages(r1) + stw r7, KDP.VMLogicalPages(r1) stw r8, KDP.FlatPageListPtr(r1) b VMReturn @@ -498,7 +498,7 @@ VMExchangePages ; OUTSIDE REFERER mr r6, r15 mr r4, r5 mr r5, r16 - lwz r9, KDP.PrimaryAddrRangePages(r1) + lwz r9, KDP.VMLogicalPages(r1) bl GetPARPageInfo bge cr4, VMReturnMinus1 bgt cr5, VMReturnMinus1 @@ -548,7 +548,7 @@ VMGetPhysicalPage ; OUTSIDE REFERER VMGetPhysicalPage_0x28 ; r6 = ewa bl SchRestoreStartingAtR14 - lwz r9, KDP.PrimaryAddrRangePages(r1) + lwz r9, KDP.VMLogicalPages(r1) VMGetPhysicalPage_0x30 bl GetPARPageInfo @@ -578,8 +578,8 @@ getPTEntryGivenPage ; OUTSIDE REFERER beq getPTEntryGivenPage_0x3c bns cr7, getPTEntryGivenPage_0x3c bge cr5, getPTEntryGivenPage_0x3c - bl MPCall_95_0x2e0 - bl MPCall_95_0x334 + bl InvalPTE ; page *r8, PTE r16/r17, PTE *r18, PLE *r30 // PLEflags cr5-7 + bl SetPTE ; PTE r16/r17, PTE *r18 lwz r3, 0x0000(r30) rlwimi r3, r17, 0, 0, 19 @@ -591,7 +591,7 @@ getPTEntryGivenPage_0x3c getPTEntryGivenPage_0x48 ; r6 = ewa bl SchRestoreStartingAtR14 - lwz r9, KDP.PrimaryAddrRangePages(r1) + lwz r9, KDP.VMLogicalPages(r1) getPTEntryGivenPage_0x50 bl GetPARPageInfo @@ -654,8 +654,8 @@ major_0x08d88_0x74 major_0x08d88_0x8c mr r8, r29 - bl MPCall_95_0x1e4 - bl MPCall_95_0x2b0 + bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq + bl GetPTEFromPLE ; PLE *r30 // PTE r16/r17, PTE *r18, PTEflags cr0, PLEflags cr5-7 mtlr r27 crclr cr0_lt crclr cr0_eq @@ -708,7 +708,7 @@ VMIsResident ; OUTSIDE REFERER VMIsResident_0x28 ; r6 = ewa bl SchRestoreStartingAtR14 - lwz r9, KDP.PrimaryAddrRangePages(r1) + lwz r9, KDP.VMLogicalPages(r1) VMIsResident_0x30 bl GetPARPageInfo @@ -1136,8 +1136,8 @@ VMMarkBacking ; OUTSIDE REFERER beq major_0x08d88_0xa8 bns cr7, VMMarkBacking_0x30 bge cr5, VMMarkBacking_0x30 - bl MPCall_95_0x2e0 - bl MPCall_95_0x348 + bl InvalPTE ; page *r8, PTE r16/r17, PTE *r18, PLE *r30 // PLEflags cr5-7 + bl DeletePTE ; PTE *r18, PLE *r30 VMMarkBacking_0x30 lwz r18, 0x0000(r30) @@ -1152,7 +1152,7 @@ VMMarkBacking_0x30 VMMarkBacking_0x50 ; r6 = ewa bl SchRestoreStartingAtR14 - lwz r9, KDP.PrimaryAddrRangePages(r1) + lwz r9, KDP.VMLogicalPages(r1) VMMarkBacking_0x58 bl GetPARPageInfo @@ -1255,7 +1255,7 @@ VMMarkResident ; OUTSIDE REFERER VMMarkResident_0x50 ; r6 = ewa bl SchRestoreStartingAtR14 - lwz r9, KDP.PrimaryAddrRangePages(r1) + lwz r9, KDP.VMLogicalPages(r1) VMMarkResident_0x58 bl GetPARPageInfo @@ -1313,8 +1313,8 @@ setPTEntryGivenPage ; OUTSIDE REFERER beq major_0x08d88_0xa8 bns cr7, setPTEntryGivenPage_0x34 bge cr5, setPTEntryGivenPage_0x34 - bl MPCall_95_0x2e0 - bl MPCall_95_0x348 + bl InvalPTE ; page *r8, PTE r16/r17, PTE *r18, PLE *r30 // PLEflags cr5-7 + bl DeletePTE ; PTE *r18, PLE *r30 setPTEntryGivenPage_0x34 lwz r18, 0x0000(r30) @@ -1331,7 +1331,7 @@ setPTEntryGivenPage_0x34 setPTEntryGivenPage_0x5c ; r6 = ewa bl SchRestoreStartingAtR14 - lwz r9, KDP.PrimaryAddrRangePages(r1) + lwz r9, KDP.VMLogicalPages(r1) setPTEntryGivenPage_0x64 mr r6, r4 @@ -1401,7 +1401,7 @@ VMAllocateMemory ; OUTSIDE REFERER or r7, r4, r6 rlwinm. r7, r7, 0, 0, 11 ble cr6, VMReturnMinus1 - lwz r9, KDP.PrimaryAddrRangePages(r1) + lwz r9, KDP.VMLogicalPages(r1) bne cr7, VMReturnMinus1 mr r7, r4 bne VMReturnMinus1 @@ -1423,7 +1423,7 @@ VMAllocateMemory ; OUTSIDE REFERER b VMAllocateMemory_0xc0 VMAllocateMemory_0x6c - lwz r9, KDP.PrimaryAddrRangePages(r1) + lwz r9, KDP.VMLogicalPages(r1) addi r5, r5, -0x01 VMAllocateMemory_0x74 @@ -1431,7 +1431,7 @@ VMAllocateMemory_0x74 bl GetPARPageInfo bltl cr5, RemovePageFromTLB bltl cr5, RemovePTEFromHTAB - lwz r9, KDP.PrimaryAddrRangePages(r1) + lwz r9, KDP.VMLogicalPages(r1) subf r8, r4, r9 cmplw cr7, r5, r8 and. r8, r16, r6 @@ -1498,7 +1498,7 @@ VMAllocateMemory_0x164 lwz r7, KDP.TotalPhysicalPages(r1) subf r7, r5, r7 stw r7, KDP.TotalPhysicalPages(r1) - stw r7, KDP.PrimaryAddrRangePages(r1) + stw r7, KDP.VMLogicalPages(r1) lwz r5, -0x0020(r1) slwi r8, r7, 12 stw r8, 0x0dc4(r5) @@ -1564,7 +1564,7 @@ VMAllocateMemory_0x1a4 ori r8, r8, 0xc0 stw r8, 0x0008(r31) mr r8, r31 - bl createarea + bl CreateArea cmpwi r9, 0x00 bne Local_Panic mr r31, r8 @@ -1575,7 +1575,7 @@ VMAllocateMemory_0x1a4 lwz r16, 0x0024(r8) cmpwi r16, 0x00 bne Local_Panic - lwz r16, KDP.PrimaryAddrRangePages(r1) + lwz r16, KDP.VMLogicalPages(r1) lwz r17, 0x002c(r8) slwi r16, r16, 12 cmpw r17, r16 @@ -1876,7 +1876,7 @@ VMLastExportedFunc_0xd7 mr r31, r5 mr r28, r16 mr r26, r14 - lwz r9, KDP.PrimaryAddrRangePages(r1) + lwz r9, KDP.VMLogicalPages(r1) bl GetPARPageInfo mtlr r6 b RemovePageFromTLB diff --git a/NanoKernel/NanoKernel.s b/NanoKernel/NanoKernel.s index f9afeb8..0786996 100644 --- a/NanoKernel/NanoKernel.s +++ b/NanoKernel/NanoKernel.s @@ -34,7 +34,7 @@ NKTop align 5 include 'NKTasks.s' align 5 - include 'NKAddressSpaceMPCalls.s' + include 'NKAddressSpaces.s' align 5 include 'NKPoolAllocator.s'