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. ; Xrefs: ; setup 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 PoolAlloc 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.Zero(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 PoolAlloc 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.Zero(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 PoolAlloc 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.Length2(r31) li r8, 0 stw r8, Area.Zero(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.LogicalBase2(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.LogicalBase2 >= FailedArea.LogicalBase2 then continue to next PMDT. lwz r15, Area.LogicalBase2(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 PoolAlloc 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.LogicalBase2 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 PoolAlloc 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.Length2(r31) li r8, 0x00 stw r8, Area.Zero(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.TwoFiftySix(r31) ori r8, r8, 0x40 lwz r9, -0x0430(r1) cmpwi r9, noErr bgt- @_374 ori r8, r8, 0x80 @_374 stw r8, Area.TwoFiftySix(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.TwoFiftySix(r31) ori r8, r8, 0x80 stw r8, Area.TwoFiftySix(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 sync lwz r16, PSA.SchLock + Lock.Count(r1) cmpwi cr1, r16, 0x00 li r16, 0x00 bne+ cr1, MPCall_70_0x54 mflr r16 bl panic MPCall_70_0x54 stw r16, PSA.SchLock + Lock.Count(r1) 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.CgrpList + 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.GRPSList + 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 PoolAlloc 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 PoolAlloc 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.LogicalBase2(r29) li r8, 256 stw r8, Area.TwoFiftySix(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, -0x726e 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.LogicalBase2(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 ; r8 = id bl LookupID ; r8 = something not sure what ; r9 = 0:inval, 1:proc, 2:task, 3:timer, 4:q, 5:sema, 6:cr, 7:cpu, 8:addrspc, 9:evtg, 10:cgrp, 11:area, 12:not, 13:log mr r31, r8 cmpwi r9, 0x02 bne+ ReleaseAndReturnMPCallInvalidIDErr lwz r16, 0x0064(r31) mtcr r16 li r3, -0x7271 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 DeclareMPCall 72, MPCall_72 MPCall_72 ; OUTSIDE REFERER _Lock PSA.SchLock, scratch1=r16, scratch2=r17 mr. r8, r3 mfsprg r28, 0 lwz r30, EWA.PA_CurAddressSpace(r28) beq- MPCall_72_0x38 ; r8 = id bl LookupID cmpwi r9, AddressSpace.kIDClass mr r30, r8 bne+ ReleaseAndReturnMPCallInvalidIDErr MPCall_72_0x38 li r8, 160 ; r1 = kdp ; r8 = size bl PoolAlloc ; r8 = ptr mr. r31, r8 beq+ major_0x0af60 stw r30, Area.AddressSpacePtr(r31) stw r4, 0x001c(r31) stw r5, Area.Length(r31) lwz r8, 0x0134(r6) stw r8, Area.Zero(r31) lwz r8, 0x013c(r6) stw r8, 0x0020(r31) lwz r8, 0x0144(r6) stw r8, Area.LogicalBase(r31) mr r8, r31 bl createarea sync lwz r16, PSA.SchLock + Lock.Count(r1) cmpwi cr1, r16, 0x00 li r16, 0x00 bne+ cr1, MPCall_72_0x90 mflr r16 bl panic MPCall_72_0x90 stw r16, PSA.SchLock + Lock.Count(r1) mr. r3, r9 bne- MPCall_72_0xb0 lwz r8, Area.LogicalBase(r31) stw r8, 0x0144(r6) lwz r8, Area.ID(r31) stw r8, 0x014c(r6) b CommonMPCallReturnPath MPCall_72_0xb0 bl PoolFree b CommonMPCallReturnPath ; createarea ; Xrefs: ; convert_pmdts_to_areas ; MPCall_72 ; MPCall_73 ; 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.TwoFiftySix(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.Zero(r31) addi r16, r16, 0xfff rlwinm r16, r16, 0, 0, 19 stw r16, Area.Zero(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.LogicalBase2(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.LogicalBase2(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.LogicalBase2(r31) lwz r16, Area.Zero(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) stw r20, 0x000c(r19) lwz r16, 0x0008(r20) stw r16, 0x0008(r19) stw r19, 0x000c(r16) stw r19, 0x0008(r20) createarea_0x3b8 addi r16, r31, 0x90 lis r17, 0x6665 stw r16, 0x0008(r16) ori r17, r17, 0x6e63 stw r16, 0x000c(r16) stw r17, 0x0004(r16) lwz r16, 0x0020(r31) lwz r17, Area.TwoFiftySix(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 PoolAlloc ; 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.TwoFiftySix(r31) ori r17, r17, 0x10 stw r17, Area.TwoFiftySix(r31) createarea_0x41c lwz r17, Area.TwoFiftySix(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 PoolAlloc ; 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.TwoFiftySix(r31) ori r16, r16, 0x01 stw r16, Area.TwoFiftySix(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.TwoFiftySix(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.TwoFiftySix(r31) addi r27, r27, 0x400 createarea_0x4ac addi r27, r27, 0x3ff srwi r27, r27, 10 createarea_0x4b4 lwz r8, Area.TwoFiftySix(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.TwoFiftySix(r31) addi r29, r29, 0x800 createarea_0x4e0 addi r29, r29, 0x7ff srwi r29, r29, 11 createarea_0x4e8 lwz r18, -0x0430(r1) add. r8, r27, r29 ble- major_0x102c8 cmpw r8, r18 bgt- major_0x102c8 lwz r16, -0x0430(r1) lwz r17, PSA.UnheldFreePageCount(r1) subf r16, r8, r16 subf r17, r8, r17 stw r16, -0x0430(r1) stw r17, PSA.UnheldFreePageCount(r1) mr. r18, r27 beq- createarea_0x5a0 lwz r16, -0x0448(r1) lwz r17, 0x0008(r16) lwz r19, 0x000c(r16) stw r17, 0x0008(r19) stw r19, 0x000c(r17) li r17, 0x00 stw r17, 0x0008(r16) stw r17, 0x000c(r16) addi r18, r18, -0x01 stw r16, 0x0040(r31) cmpwi r18, 0x00 lwz r17, -0x0448(r1) mr r8, r16 subi r16, r16, 4 bgt- createarea_0x564 li r9, 0x400 bl major_0x10284 b createarea_0x5a0 createarea_0x564 lwz r19, 0x0008(r17) lwz r20, 0x000c(r17) stw r19, 0x0008(r20) stw r20, 0x000c(r19) li r19, 0x00 stw r19, 0x0008(r17) stw r19, 0x000c(r17) addi r18, r18, -0x01 stwu r17, 0x0004(r16) mr r8, r17 li r9, 0x400 bl major_0x10284 lwz r17, -0x0448(r1) cmpwi r18, 0x00 bgt+ createarea_0x564 createarea_0x5a0 mr. r18, r29 beq- createarea_0x62c lwz r16, -0x0448(r1) lwz r17, 0x0008(r16) lwz r19, 0x000c(r16) stw r17, 0x0008(r19) stw r19, 0x000c(r17) li r17, 0x00 stw r17, 0x0008(r16) stw r17, 0x000c(r16) addi r18, r18, -0x01 stw r16, 0x003c(r31) cmpwi r18, 0x00 lwz r17, -0x0448(r1) mr r8, r16 subi r16, r16, 4 bgt- createarea_0x5f0 li r9, 0x800 bl major_0x102a8 b createarea_0x62c createarea_0x5f0 lwz r19, 0x0008(r17) lwz r20, 0x000c(r17) stw r19, 0x0008(r20) stw r20, 0x000c(r19) li r19, 0x00 stw r19, 0x0008(r17) stw r19, 0x000c(r17) addi r18, r18, -0x01 stwu r17, 0x0004(r16) mr r8, r17 li r9, 0x800 bl major_0x102a8 lwz r17, -0x0448(r1) cmpwi r18, 0x00 bgt+ createarea_0x5f0 createarea_0x62c sync lwz r16, -0x0ad0(r1) cmpwi cr1, r16, 0x00 li r16, 0x00 bne+ cr1, createarea_0x648 mflr r16 bl panic createarea_0x648 stw r16, -0x0ad0(r1) createarea_0x64c lwz r16, Area.TwoFiftySix(r31) rlwinm. r8, r16, 0, 28, 28 beq- createarea_0x67c lwz r16, 0x0044(r31) addi r17, r31, 0x44 stw r16, 0x0000(r17) stw r16, 0x0008(r17) lwz r18, 0x000c(r16) stw r18, 0x000c(r17) stw r17, 0x0008(r18) stw r17, 0x000c(r16) b major_0x10320_0x94 createarea_0x67c addi r16, r31, 0x44 lis r17, 0x414b stw r16, 0x0008(r16) ori r17, r17, 0x4120 stw r16, 0x000c(r16) stw r17, 0x0004(r16) b major_0x10320_0x94 ; major_0x10284 ; Xrefs: ; createarea 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 ; Xrefs: ; createarea 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 ; Xrefs: ; createarea major_0x102c8 ; OUTSIDE REFERER sync lwz r16, -0x0ad0(r1) cmpwi cr1, r16, 0x00 li r16, 0x00 bne+ cr1, major_0x102c8_0x1c mflr r16 bl panic major_0x102c8_0x1c stw r16, -0x0ad0(r1) addi r30, r8, 0x08 lwz r8, -0x0420(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 major_0x0db04 b major_0x10320_0x20 ; major_0x10320 ; Xrefs: ; IntDSIOtherOther ; PagingFunc1 ; MPCall_60 ; convert_pmdts_to_areas ; createarea ; major_0x102c8 ; MPCall_80 ; MPCall_125 ; MPCall_95 major_0x10320 ; OUTSIDE REFERER mr r8, r31 li r9, -0x726e b ReturnFromCreateArea dc.l 0x811f0000 dc.l 0x48004fd1 dc.l 0x7fe8fb78 dc.l 0x39208d8d dc.l 0x4800009c major_0x10320_0x20 ; OUTSIDE REFERER addi r19, r31, 0x54 lwz r16, 0x0008(r19) lwz r17, 0x000c(r19) stw r16, 0x0008(r17) stw r17, 0x000c(r16) li r16, 0x00 stw r16, 0x0008(r19) stw r16, 0x000c(r19) lwz r16, Area.TwoFiftySix(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, -0x7272 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.LogicalBase2) >= r9 lwz r16, Area.LogicalBase(r8) lwz r17, Area.LogicalBase2(r8) cmplw r16, r9 cmplw cr1, r17, r9 bgelr- bgelr- cr1 ; Iterate over linked list lwz r8, Area.LLL + LLL.Next(r8) b @loop DeclareMPCall 73, MPCall_73 MPCall_73 ; OUTSIDE REFERER _Lock PSA.SchLock, scratch1=r16, scratch2=r17 mr r8, r3 bl LookupID cmpwi r9, Area.kIDClass bne+ ReleaseAndReturnMPCallInvalidIDErr mr r30, r8 lwz r16, 0x0008(r30) rlwinm. r8, r16, 0, 28, 28 bne+ major_0x0b054 li r8, Area.Size bl PoolAlloc mr. r31, r8 beq+ major_0x0af60 mfsprg r28, 0 lwz r8, EWA.PA_CurAddressSpace(r28) stw r8, Area.AddressSpacePtr(r31) stw r3, 0x0014(r31) stw r30, 0x0044(r31) stw r4, 0x001c(r31) stw r5, Area.Length(r31) lwz r8, 0x0134(r6) stw r8, Area.Zero(r31) lwz r8, 0x013c(r6) stw r8, 0x0020(r31) lwz r8, 0x0144(r6) stw r8, Area.LogicalBase(r31) lwz r8, 0x014c(r6) stw r8, 0x0080(r31) li r8, 0x08 stw r8, Area.TwoFiftySix(r31) mr r8, r31 bl createarea sync lwz r16, PSA.SchLock + Lock.Count(r1) cmpwi cr1, r16, 0x00 li r16, 0x00 bne+ cr1, MPCall_73_0xb0 mflr r16 bl panic MPCall_73_0xb0 stw r16, PSA.SchLock + Lock.Count(r1) mr. r3, r9 bne- MPCall_73_0xd0 lwz r8, Area.LogicalBase(r31) stw r8, 0x0144(r6) lwz r8, Area.ID(r31) stw r8, 0x0154(r6) b CommonMPCallReturnPath MPCall_73_0xd0 bl PoolFree b CommonMPCallReturnPath DeclareMPCall 74, MPCall_74 MPCall_74 ; 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 r17, Area.Length2(r31) lwz r29, Area.TwoFiftySix(r31) cmpwi cr1, r17, 0x00 rlwinm. r8, r29, 0, 29, 29 bne+ cr1, ReleaseAndReturnMPCallOOM bne+ ReleaseAndReturnMPCallPrivilegedErr rlwinm. r8, r29, 0, 28, 28 lwz r16, 0x004c(r31) bne- MPCall_74_0x5c addi r17, r31, 0x44 cmpw r16, r17 bne+ ReleaseAndReturnMPCallOOM MPCall_74_0x5c _Lock PSA.HTABLock, scratch1=r18, scratch2=r9 addi r16, r31, 0x54 lwz r17, 0x0008(r16) lwz r18, 0x000c(r16) stw r17, 0x0008(r18) stw r18, 0x000c(r17) li r17, 0x00 stw r17, 0x0008(r16) stw r17, 0x000c(r16) rlwinm. r8, r29, 0, 28, 28 addi r16, r31, 0x44 beq- MPCall_74_0xbc lwz r17, 0x0008(r16) lwz r18, 0x000c(r16) stw r17, 0x0008(r18) stw r18, 0x000c(r17) li r17, 0x00 stw r17, 0x0008(r16) stw r17, 0x000c(r16) MPCall_74_0xbc sync lwz r18, -0x0b90(r1) cmpwi cr1, r18, 0x00 li r18, 0x00 bne+ cr1, MPCall_74_0xd8 mflr r18 bl panic MPCall_74_0xd8 stw r18, -0x0b90(r1) lwz r8, 0x0040(r31) rlwinm. r16, r29, 0, 25, 25 cmpwi cr1, r8, 0x00 bne- MPCall_74_0x178 rlwinm. r16, r29, 0, 27, 27 beq- cr1, MPCall_74_0x178 bne- MPCall_74_0x174 _Lock PSA.PoolLock, scratch1=r18, scratch2=r9 rlwinm. r16, r29, 0, 26, 26 beq- MPCall_74_0x14c lwz r19, Area.Length(r31) mr r20, r8 srwi r19, r19, 12 addi r19, r19, 0x3ff srwi r19, r19, 10 slwi r19, r19, 2 subi r19, r19, 4 MPCall_74_0x134 lwzx r8, r19, r20 ; r1 = kdp ; r8 = maybe the page bl free_list_add_page cmpwi r19, 0x00 subi r19, r19, 4 bgt+ MPCall_74_0x134 mr r8, r20 MPCall_74_0x14c ; r1 = kdp ; r8 = maybe the page bl free_list_add_page sync lwz r18, -0x0ad0(r1) cmpwi cr1, r18, 0x00 li r18, 0x00 bne+ cr1, MPCall_74_0x16c mflr r18 bl panic MPCall_74_0x16c stw r18, -0x0ad0(r1) b MPCall_74_0x178 MPCall_74_0x174 bl PoolFree MPCall_74_0x178 lwz r8, 0x003c(r31) clrlwi. r16, r29, 0x1f cmpwi cr1, r8, 0x00 beq- cr1, MPCall_74_0x20c bne- MPCall_74_0x208 _Lock PSA.PoolLock, scratch1=r18, scratch2=r9 rlwinm. r16, r29, 0, 30, 30 beq- MPCall_74_0x1e0 lwz r19, Area.Length(r31) mr r20, r8 srwi r19, r19, 12 addi r19, r19, 0x7ff srwi r19, r19, 11 slwi r19, r19, 2 subi r19, r19, 4 MPCall_74_0x1c8 lwzx r8, r19, r20 ; r1 = kdp ; r8 = maybe the page bl free_list_add_page cmpwi r19, 0x00 subi r19, r19, 4 bgt+ MPCall_74_0x1c8 mr r8, r20 MPCall_74_0x1e0 ; r1 = kdp ; r8 = maybe the page bl free_list_add_page sync lwz r18, -0x0ad0(r1) cmpwi cr1, r18, 0x00 li r18, 0x00 bne+ cr1, MPCall_74_0x200 mflr r18 bl panic MPCall_74_0x200 stw r18, -0x0ad0(r1) b MPCall_74_0x20c MPCall_74_0x208 bl PoolFree MPCall_74_0x20c lwz r8, Area.ID(r31) bl DeleteID mr r8, r31 bl PoolFree ; r1 = kdp 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+ major_0x0b054 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.LogicalBase2(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.LogicalBase2(r31) add r28, r28, r27 add r29, r29, r27 cmplw r29, r16 ble+ MPCall_75_0x100 MPCall_75_0x138 sync lwz r8, -0x0b90(r1) cmpwi cr1, r8, 0x00 li r8, 0x00 bne+ cr1, MPCall_75_0x154 mflr r8 bl panic MPCall_75_0x154 stw r8, -0x0b90(r1) lwz r16, Area.TwoFiftySix(r31) rlwinm. r8, r16, 0, 25, 25 bne- MPCall_75_0x16c rlwinm. r8, r16, 0, 27, 27 bne- MPCall_75_0x16c MPCall_75_0x16c sync lwz r8, -0x0ad0(r1) cmpwi cr1, r8, 0x00 li r8, 0x00 bne+ cr1, MPCall_75_0x188 mflr r8 bl panic MPCall_75_0x188 stw r8, -0x0ad0(r1) 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.LogicalBase2(r31) ; r1 = kdp b ReleaseAndReturnZeroFromMPCall MPCall_75_0x1b0 lwz r17, Area.LogicalBase2(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.LogicalBase2(r31) bne+ ReleaseAndMPCallWasBad add r28, r27, r29 addi r28, r28, 0x01 b MPCall_75_0x1ec dc.l 0x7fbbe050 dc.l 0x3bbdffff 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+ major_0x0b054 rlwinm. r8, r17, 0, 16, 16 bne+ major_0x0b054 mr r29, r5 lwz r18, 0x0134(r6) lwz r19, 0x0068(r31) lwz r16, Area.LogicalBase(r31) cmplw r18, r19 add r28, r18, r29 bge+ major_0x0b054 lwz r17, 0x007c(r31) addi r28, r28, -0x01 lwz r18, 0x0020(r31) lwz r19, Area.LogicalBase2(r31) cmplw cr1, r29, r16 cmplw cr2, r28, r19 blt+ cr1, major_0x0b054 bgt+ cr2, major_0x0b054 xor r8, r28, r29 rlwinm. r8, r8, 0, 0, 19 bne+ major_0x0b054 _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 mr r8, r29 bl MPCall_95_0x1e4 sync lwz r14, -0x0b90(r1) cmpwi cr1, r14, 0x00 li r14, 0x00 bne+ cr1, MPCall_130_0xcc mflr r14 bl panic MPCall_130_0xcc stw r14, -0x0b90(r1) beq+ Local_Panic rlwinm r8, r16, 0, 29, 30 lwz r16, 0x0000(r30) cmpwi cr7, r8, 0x04 beq+ cr7, major_0x0b054 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 PoolAlloc ; r8 = ptr mr. r16, r8 beq+ major_0x0af60 addi r18, r31, 0x90 lis r17, 0x4645 ori r17, r17, 0x4e43 stw r17, 0x0004(r16) stw r18, 0x0000(r16) stw r18, 0x0008(r16) lwz r19, 0x000c(r18) stw r19, 0x000c(r16) stw r16, 0x0008(r19) stw r16, 0x000c(r18) 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) sync lwz r14, -0x0b90(r1) cmpwi cr1, r14, 0x00 li r14, 0x00 bne+ cr1, MPCall_130_0x1c8 mflr r14 bl panic MPCall_130_0x1c8 stw r14, -0x0b90(r1) ; r1 = kdp b ReleaseAndReturnZeroFromMPCall ; KCSetAreaAccess DeclareMPCall 76, KCSetAreaAccess KCSetAreaAccess ; 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+ major_0x0b054 lis r16, -0x01 ori r16, r16, 0xff10 and. r16, r16, r5 bne+ major_0x0b054 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.LogicalBase2(r31) rlwinm. r8, r18, 0, 16, 16 cmplw cr1, r29, r16 cmplw cr2, r28, r19 blt+ cr1, major_0x0b054 bgt+ cr2, major_0x0b054 bne- KCSetAreaAccess_0x154 _Lock PSA.HTABLock, scratch1=r14, scratch2=r15 KCSetAreaAccess_0x9c mr r8, r29 bl MPCall_95_0x1e4 beq+ Local_Panic bl MPCall_95_0x2b0 bns- cr7, KCSetAreaAccess_0xb8 bltl- cr5, MPCall_95_0x2e0 bltl- cr5, MPCall_95_0x348 KCSetAreaAccess_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, KCSetAreaAccess_0x118 bgt- cr6, KCSetAreaAccess_0x118 beq- KCSetAreaAccess_0x118 rlwinm r9, r17, 0, 0, 19 lwz r8, 0x0068(r31) KCSetAreaAccess_0xec addi r8, r8, -0x20 dcbf r8, r9 cmpwi r8, 0x00 bgt+ KCSetAreaAccess_0xec sync lwz r8, 0x0068(r31) KCSetAreaAccess_0x104 addi r8, r8, -0x20 icbi r8, r9 cmpwi r8, 0x00 bgt+ KCSetAreaAccess_0x104 isync KCSetAreaAccess_0x118 bl major_0x10cb8 lwz r19, 0x0068(r31) stw r17, 0x0000(r30) add r29, r29, r19 subf. r8, r29, r28 bge+ KCSetAreaAccess_0x9c sync lwz r14, -0x0b90(r1) cmpwi cr1, r14, 0x00 li r14, 0x00 bne+ cr1, KCSetAreaAccess_0x14c mflr r14 bl panic KCSetAreaAccess_0x14c stw r14, -0x0b90(r1) ; r1 = kdp b ReleaseAndReturnZeroFromMPCall KCSetAreaAccess_0x154 bne+ cr1, major_0x0b054 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 KCSetAreaAccess_0x1a4 mr r8, r29 lwz r9, Area.AddressSpacePtr(r31) bl MPCall_95_0x45c beq- KCSetAreaAccess_0x1bc bl MPCall_95_0x2e0 bl MPCall_95_0x348 KCSetAreaAccess_0x1bc add r29, r29, r27 subf. r8, r29, r28 bge+ KCSetAreaAccess_0x1a4 sync lwz r14, -0x0b90(r1) cmpwi cr1, r14, 0x00 li r14, 0x00 bne+ cr1, KCSetAreaAccess_0x1e4 mflr r14 bl panic KCSetAreaAccess_0x1e4 stw r14, -0x0b90(r1) ; r1 = kdp b ReleaseAndReturnZeroFromMPCall ; major_0x10cb8 ; Xrefs: ; createarea ; KCSetAreaAccess major_0x10cb8 ; OUTSIDE REFERER rlwinm r16, r16, 0, 29, 24 rlwinm r17, r17, 0, 27, 23 rlwinm r16, r16, 0, 0, 29 rlwinm r17, r17, 0, 31, 28 mtcr r18 bge- cr6, major_0x10cb8_0x20 ori r17, r17, 0x80 ori r16, r16, 0x08 major_0x10cb8_0x20 ble- cr6, major_0x10cb8_0x2c ori r16, r16, 0x40 b major_0x10cb8_0x30 major_0x10cb8_0x2c ori r17, r17, 0x20 major_0x10cb8_0x30 bne- cr6, major_0x10cb8_0x3c ori r17, r17, 0x40 ori r16, r16, 0x20 major_0x10cb8_0x3c ble- cr7, major_0x10cb8_0x40 major_0x10cb8_0x40 bge- cr7, major_0x10cb8_0x50 ori r17, r17, 0x06 ori r16, r16, 0x01 b major_0x10cb8_0x78 major_0x10cb8_0x50 bne- cr7, major_0x10cb8_0x60 ori r17, r17, 0x00 ori r16, r16, 0x02 b major_0x10cb8_0x78 major_0x10cb8_0x60 bns- cr7, major_0x10cb8_0x70 ori r17, r17, 0x04 ori r16, r16, 0x03 b major_0x10cb8_0x78 major_0x10cb8_0x70 ori r17, r17, 0x02 ori r16, r16, 0x00 major_0x10cb8_0x78 ori r16, r16, 0x10 blr ; major_0x10d38 ; Xrefs: ; convert_pmdts_to_areas ; KCSetAreaAccess ; MPCall_123 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.LogicalBase2(r31) lwz r18, 0x0020(r31) cmplw r4, r16 cmplw cr1, r4, r17 blt+ major_0x0b054 bgt+ cr1, major_0x0b054 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) sync lwz r14, -0x0b90(r1) cmpwi cr1, r14, 0x00 li r14, 0x00 bne+ cr1, MPCall_123_0xa4 mflr r14 bl panic MPCall_123_0xa4 stw r14, -0x0b90(r1) bl major_0x10d38 mr r5, r18 ; r1 = kdp b ReleaseAndReturnZeroFromMPCall DeclareMPCall 77, MPCall_77 MPCall_77 ; 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. r8, r4 beq- MPCall_77_0x40 ; r8 = id bl LookupID cmpwi r9, Notification.kIDClass bne+ ReleaseAndReturnMPCallInvalidIDErr MPCall_77_0x40 stw r4, 0x0018(r31) stw r5, 0x0084(r31) ; r1 = kdp 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+ major_0x0b054 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.Zero(r31) stw r16, 0x013c(r6) lwz r16, 0x0034(r31) stw r16, 0x0144(r6) lwz r16, Area.Length2(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+ major_0x0b054 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+ major_0x0b054 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+ major_0x0b054 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.LogicalBase2(r31) lwz r18, 0x0020(r31) cmplw r4, r16 cmplw cr1, r4, r17 blt+ major_0x0b054 bgt+ cr1, major_0x0b054 rlwinm. r8, r18, 0, 16, 16 lwz r19, 0x0070(r31) beq- MPCall_81_0x70 lwz r17, Area.Length2(r31) rlwinm r19, r19, 0, 0, 19 cmpwi r17, 0x00 subf r18, r16, r4 beq+ major_0x0b054 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 sync lwz r8, -0x0b90(r1) cmpwi cr1, r8, 0x00 li r8, 0x00 bne+ cr1, MPCall_81_0xc0 mflr r8 bl panic MPCall_81_0xc0 stw r8, -0x0b90(r1) b ReleaseAndReturnMPCall MPCall_81_0xc8 li r3, -0x7272 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.LogicalBase2(r31) mr r29, r5 add r5, r5, r4 lwz r18, 0x0020(r31) addi r5, r5, -0x01 cmplw r4, r16 cmplw cr1, r5, r17 blt+ major_0x0b054 bgt+ cr1, major_0x0b054 lwz r20, Area.Length2(r31) rlwinm. r8, r18, 0, 16, 16 cmpwi cr1, r20, 0x00 beq- MPCall_98_0x84 beq+ cr1, major_0x0b054 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, -0x7272 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) sync lwz r8, -0x0b90(r1) cmpwi cr1, r8, 0x00 li r8, 0x00 bne+ cr1, MPCall_98_0x138 mflr r8 bl panic MPCall_98_0x138 stw r8, -0x0b90(r1) 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, -0x0420(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, -0x0420(r1) ; r1 = kdp b ReleaseAndReturnZeroFromMPCall ; MPCall_83 ; Xrefs: ; kcMPDispatch ; KCMapPage DeclareMPCall 83, MPCall_83 MPCall_83 ; OUTSIDE REFERER _Lock PSA.PoolLock, scratch1=r16, scratch2=r17 bl MPCall_83_0x90 sync lwz r16, -0x0ad0(r1) cmpwi cr1, r16, 0x00 li r16, 0x00 bne+ cr1, MPCall_83_0x38 mflr r16 bl panic MPCall_83_0x38 stw r16, -0x0ad0(r1) mr. r4, r8 bne+ ReturnZeroFromMPCall _Lock PSA.SchLock, scratch1=r16, scratch2=r17 MPCall_83_0x5c ; OUTSIDE REFERER lwz r8, -0x0420(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 major_0x0d35c b ReleaseAndReturnMPCallOOM MPCall_83_0x90 ; OUTSIDE REFERER addi r18, r1, -0x450 lwz r8, -0x0448(r1) cmpw r8, r18 beq- MPCall_83_0xec lwz r16, 0x0008(r8) lwz r17, 0x000c(r8) stw r16, 0x0008(r17) stw r17, 0x000c(r16) li r16, 0x00 stw r16, 0x0008(r8) stw r16, 0x000c(r8) lwz r16, -0x0430(r1) addi r16, r16, -0x01 stw r16, -0x0430(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, -0x450 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 sync lwz r16, -0x0ad0(r1) cmpwi cr1, r16, 0x00 li r16, 0x00 bne+ cr1, MPCall_84_0x64 mflr r16 bl panic MPCall_84_0x64 stw r16, -0x0ad0(r1) b CommonMPCallReturnPath ; free_list_add_page ; Xrefs: ; setup ; MPCall_74 ; MPCall_75 ; MPCall_84 ; KCUnmapPages ; > 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.TwoFiftySix(r31) rlwinm. r8, r16, 0, 28, 28 bne+ major_0x0b054 lwz r16, Area.LogicalBase(r31) lwz r17, Area.LogicalBase2(r31) lwz r19, 0x0020(r31) cmplw r4, r16 cmplw cr1, r4, r17 blt+ major_0x0b054 bgt+ cr1, major_0x0b054 rlwinm. r8, r19, 0, 16, 16 cmplw cr1, r4, r16 lwz r20, Area.Length2(r31) beq- KCMapPage_0x8c bne+ cr1, major_0x0b054 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.Length2(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) sync lwz r14, -0x0b90(r1) cmpwi cr1, r14, 0x00 li r14, 0x00 bne+ cr1, KCMapPage_0xd0 mflr r14 bl panic KCMapPage_0xd0 stw r14, -0x0b90(r1) 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 sync lwz r16, -0x0ad0(r1) cmpwi cr1, r16, 0x00 li r16, 0x00 bne+ cr1, KCMapPage_0x120 mflr r16 bl panic KCMapPage_0x120 stw r16, -0x0ad0(r1) 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.Length2(r31) stw r29, 0x0000(r30) add r17, r17, r18 stw r17, Area.Length2(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.TwoFiftySix(r31) rlwinm. r16, r16, 0, 28, 28 bne+ major_0x0b054 clrlwi. r8, r8, 0x1f add r5, r5, r4 lwz r16, Area.LogicalBase(r31) lwz r17, Area.LogicalBase2(r31) lwz r19, 0x0020(r31) crmove 14, 2 addi r5, r5, -0x01 cmplw r4, r16 cmplw cr1, r5, r17 blt+ major_0x0b054 bgt+ cr1, major_0x0b054 lwz r29, 0x0068(r31) lwz r20, Area.Length2(r31) rlwinm. r8, r19, 0, 16, 16 cmplw cr1, r4, r16 beq- KCUnmapPages_0xd8 bne+ cr1, major_0x0b054 cmpwi r20, 0x00 li r20, 0x00 ble+ ReleaseAndReturnMPCallOOM stw r20, Area.Length2(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.Length2(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.Length2(r31) KCUnmapPages_0x158 sync lwz r14, -0x0b90(r1) cmpwi cr1, r14, 0x00 li r14, 0x00 bne+ cr1, KCUnmapPages_0x174 mflr r14 bl panic KCUnmapPages_0x174 stw r14, -0x0b90(r1) ; r1 = kdp bne+ cr3, ReleaseAndReturnZeroFromMPCall sync lwz r14, -0x0ad0(r1) cmpwi cr1, r14, 0x00 li r14, 0x00 bne+ cr1, KCUnmapPages_0x198 mflr r14 bl panic KCUnmapPages_0x198 stw r14, -0x0ad0(r1) ; 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.LogicalBase2(r31) addi r5, r5, -0x01 cmplw r4, r16 cmplw cr1, r5, r17 blt+ major_0x0b054 bgt+ cr1, major_0x0b054 lwz r19, 0x0020(r31) lwz r29, 0x0068(r31) rlwinm. r8, r19, 0, 16, 16 bne+ major_0x0b054 _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 sync lwz r14, -0x0b90(r1) cmpwi cr1, r14, 0x00 li r14, 0x00 bne+ cr1, NKMakePhysicallyContiguous_0xd8 mflr r14 bl panic NKMakePhysicallyContiguous_0xd8 stw r14, -0x0b90(r1) ; r1 = kdp b ReleaseAndReturnZeroFromMPCall NKMakePhysicallyContiguous_0xe0 sync lwz r14, -0x0b90(r1) cmpwi cr1, r14, 0x00 li r14, 0x00 bne+ cr1, NKMakePhysicallyContiguous_0xfc mflr r14 bl panic NKMakePhysicallyContiguous_0xfc stw r14, -0x0b90(r1) _Lock PSA.PoolLock, scratch1=r16, scratch2=r17 addi r18, r1, -0x450 lwz r8, -0x0448(r1) cmpw r8, r18 beq- NKMakePhysicallyContiguous_0x174 b NKMakePhysicallyContiguous_0x174 dc.l 0x7c0004ac ; probably dead code, not a jump table dc.l 0x8201f530 dc.l 0x2c900000 dc.l 0x3a000000 dc.l 0x40a6000c dc.l 0x7e0802a6 dc.l 0x48005905 dc.l 0x9201f530 dc.l 0x4bff9554 NKMakePhysicallyContiguous_0x150 sync lwz r16, -0x0b90(r1) cmpwi cr1, r16, 0x00 li r16, 0x00 bne+ cr1, NKMakePhysicallyContiguous_0x16c mflr r16 bl panic NKMakePhysicallyContiguous_0x16c stw r16, -0x0b90(r1) b ReleaseAndReturnMPCallOOM NKMakePhysicallyContiguous_0x174 sync lwz r16, -0x0ad0(r1) cmpwi cr1, r16, 0x00 li r16, 0x00 bne+ cr1, NKMakePhysicallyContiguous_0x190 mflr r16 bl panic NKMakePhysicallyContiguous_0x190 stw r16, -0x0ad0(r1) 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.LogicalBase2(r31) addi r5, r5, -0x01 cmplw r4, r16 cmplw cr1, r5, r17 blt+ major_0x0b054 bgt+ cr1, major_0x0b054 lwz r19, 0x0020(r31) lwz r29, 0x0068(r31) rlwinm. r8, r19, 0, 16, 16 bne+ major_0x0b054 mr r27, r4 li r28, 0x00 KCLockPages_0x68 mr r8, r27 bl MPCall_95_0x254 beq+ major_0x0b054 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 sync lwz r16, -0x0ad0(r1) cmpwi cr1, r16, 0x00 li r16, 0x00 bne+ cr1, KCLockPages_0xe4 mflr r16 bl panic KCLockPages_0xe4 stw r16, -0x0ad0(r1) 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.LogicalBase2(r31) addi r5, r5, -0x01 cmplw r4, r16 cmplw cr1, r5, r17 blt+ major_0x0b054 bgt+ cr1, major_0x0b054 lwz r19, 0x0020(r31) lwz r29, 0x0068(r31) rlwinm. r8, r19, 0, 16, 16 bne+ major_0x0b054 mr r27, r4 KCUnlockPages_0x60 mr r8, r27 bl MPCall_95_0x254 beq+ major_0x0b054 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+ major_0x0b054 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) sync lwz r16, -0x0ad0(r1) cmpwi cr1, r16, 0x00 li r16, 0x00 bne+ cr1, KCUnlockPages_0x114 mflr r16 bl panic KCUnlockPages_0x114 stw r16, -0x0ad0(r1) ; r1 = kdp b ReleaseAndReturnZeroFromMPCall ; KCHoldPages ; Xrefs: ; kcMPDispatch ; KCMapPage 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.LogicalBase2(r31) addi r5, r5, -0x01 cmplw r4, r16 cmplw cr1, r5, r17 blt+ major_0x0b054 bgt+ cr1, major_0x0b054 lwz r19, 0x0020(r31) lwz r29, 0x0068(r31) rlwinm. r8, r19, 0, 16, 16 bne+ major_0x0b054 mr r27, r4 li r28, 0x00 KCHoldPages_0x64 mr r8, r27 bl MPCall_95_0x254 beq+ major_0x0b054 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 sync lwz r16, -0x0ad0(r1) cmpwi cr1, r16, 0x00 li r16, 0x00 bne+ cr1, KCHoldPages_0xe0 mflr r16 bl panic KCHoldPages_0xe0 stw r16, -0x0ad0(r1) 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.LogicalBase2(r31) addi r5, r5, -0x01 cmplw r4, r16 cmplw cr1, r5, r17 blt+ major_0x0b054 bgt+ cr1, major_0x0b054 lwz r19, 0x0020(r31) lwz r29, 0x0068(r31) rlwinm. r8, r19, 0, 16, 16 bne+ major_0x0b054 mr r27, r4 KCUnholdPages_0x60 mr r8, r27 bl MPCall_95_0x254 beq+ major_0x0b054 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+ major_0x0b054 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) sync lwz r16, -0x0ad0(r1) cmpwi cr1, r16, 0x00 li r16, 0x00 bne+ cr1, KCUnholdPages_0x114 mflr r16 bl panic KCUnholdPages_0x114 stw r16, -0x0ad0(r1) ; 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.LogicalBase2(r31) cmplw r4, r16 cmplw cr1, r4, r17 blt+ major_0x0b054 bgt+ cr1, major_0x0b054 _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) sync lwz r14, -0x0b90(r1) cmpwi cr1, r14, 0x00 li r14, 0x00 bne+ cr1, MPCall_91_0x94 mflr r14 bl panic MPCall_91_0x94 stw r14, -0x0b90(r1) 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 sync lwz r14, -0x0b90(r1) cmpwi cr1, r14, 0x00 li r14, 0x00 bne+ cr1, MPCall_91_0xe8 mflr r14 bl panic MPCall_91_0xe8 stw r14, -0x0b90(r1) 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.TwoFiftySix(r31) rlwinm. r8, r16, 0, 28, 28 bne+ major_0x0b054 lwz r29, 0x0134(r6) li r8, 0x318 andc. r9, r5, r8 bne+ major_0x0b054 andc. r9, r29, r8 bne+ major_0x0b054 lwz r16, Area.LogicalBase(r31) lwz r17, Area.LogicalBase2(r31) cmplw r4, r16 cmplw cr1, r4, r17 blt+ major_0x0b054 bgt+ cr1, major_0x0b054 _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) sync lwz r14, -0x0b90(r1) cmpwi cr1, r14, 0x00 li r14, 0x00 bne+ cr1, MPCall_92_0xd0 mflr r14 bl panic MPCall_92_0xd0 stw r14, -0x0b90(r1) ; r1 = kdp b ReleaseAndReturnZeroFromMPCall MPCall_92_0xd8 sync lwz r14, -0x0b90(r1) cmpwi cr1, r14, 0x00 li r14, 0x00 bne+ cr1, MPCall_92_0xf4 mflr r14 bl panic MPCall_92_0xf4 stw r14, -0x0b90(r1) 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.LogicalBase2(r31) cmplw r4, r16 cmplw cr1, r4, r17 blt+ major_0x0b054 bgt+ cr1, major_0x0b054 mr r8, r4 bl MPCall_95_0x254 beq+ major_0x0b054 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.LogicalBase2(r31) cmplw r4, r16 cmplw cr1, r4, r17 blt+ major_0x0b054 bgt+ cr1, major_0x0b054 mr r8, r4 bl MPCall_95_0x254 beq+ major_0x0b054 cmplwi r5, 0x7fff bgt+ major_0x0b054 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 sync lwz r16, -0x0b90(r1) cmpwi cr1, r16, 0x00 li r16, 0x00 bne+ cr1, MPCall_94_0xbc mflr r16 bl panic MPCall_94_0xbc stw r16, -0x0b90(r1) ; 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.LogicalBase2(r31) cmplw r4, r16 cmplw cr1, r4, r17 blt+ major_0x0b054 bgt+ cr1, major_0x0b054 mr r8, r4 bl MPCall_95_0x254 beq+ major_0x0b054 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 ; MPCall_95 ; Xrefs: ; major_0x03324 ; IntDSIOtherOther ; PagingFunc1 ; kcMPDispatch ; NKxprintf ; MPCall_115 ; MPCall_75 ; MPCall_130 ; KCSetAreaAccess ; MPCall_123 ; MPCall_81 ; MPCall_98 ; KCMapPage ; KCUnmapPages ; KCMakePhysicallyContiguous ; KCLockPages ; KCUnlockPages ; KCHoldPages ; KCUnholdPages ; MPCall_91 ; MPCall_92 ; MPCall_93 ; MPCall_94 ; MPCall_129 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, -0x0438(r1) srwi r27, r27, 15 mfspr r8, dec subf r27, r27, r8 lwz r8, -0x03f8(r1) lwz r9, -0x03f4(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.TwoFiftySix(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 sync lwz r16, -0x0b90(r1) cmpwi cr1, r16, 0x00 li r16, 0x00 bne+ cr1, MPCall_95_0x134 mflr r16 bl panic MPCall_95_0x134 stw r16, -0x0b90(r1) 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.LogicalBase2(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, -0x03f4(r1) beq+ ReleaseAndReturnMPCallOOM lwz r8, 0x0068(r31) add r8, r8, r5 stw r8, -0x03f4(r1) ; r1 = kdp b ReleaseAndReturnZeroFromMPCall MPCall_95_0x1e4 ; OUTSIDE REFERER lwz r16, Area.LogicalBase(r31) lwz r18, Area.TwoFiftySix(r31) lwz r30, 0x0040(r31) subf r17, r16, r8 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 dc.l 0x821f0024 ; again, probably just dead code dc.l 0x825f0008 dc.l 0x83df0040 dc.l 0x56510739 dc.l 0x7e304050 dc.l 0x4182ffc4 dc.l 0x83df0044 dc.l 0x825f0080 dc.l 0x3bdeffbc dc.l 0x7e304050 dc.l 0x7e319214 dc.l 0x825e0008 dc.l 0x83de0040 dc.l 0x4bffffa4 MPCall_95_0x254 ; OUTSIDE REFERER lwz r16, Area.LogicalBase(r31) lwz r18, Area.TwoFiftySix(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) li r16, -0x01 stw r16, 0x0340(r1) stw r16, 0x0348(r1) stw r16, 0x0350(r1) stw r16, 0x0358(r1) 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