Local_Panic set * b panic align 5 MaxVMCallCount equ 26 MACRO DeclareVMCall &n, &code @h org VMDispatchMainTable + &n * 4 dc.l &code - NKTop - &n * 4 org VMDispatchAltTable + &n * 4 dc.l &code - NKTop - &n * 4 org @h ENDM MACRO DeclareVMCallWithAlt &n, &code, &alt @h org VMDispatchMainTable + &n * 4 dc.l &code - NKTop - &n * 4 org VMDispatchAltTable + &n * 4 dc.l &alt - NKTop - &n * 4 org @h ENDM ; Accessed ONLY via Sup table kcVMDispatch ; OUTSIDE REFERER _Lock PSA.HTABLock, scratch1=r8, scratch2=r9 mfsprg r8, 0 stw r7, -0x0010(r8) lwz r6, EWA.r6(r8) stw r14, EWA.r14(r8) stw r15, EWA.r15(r8) stw r16, EWA.r16(r8) ; Whoa... where did cr0 get set? ; And why do we set cr2? mfpvr r9 srwi r9, r9, 16 cmpwi cr2, r9, 0x0009 beq @other_pvr_test cmpwi cr2, r9, 0x000a @other_pvr_test lwz r7, KDP.NanoKernelInfo + NKNanoKernelInfo.VMDispatchCountTblPtr(r1) rlwinm r8, r3, 2, 20, 29 cmplwi r7, 0 beq @no_count lwzx r9, r7, r8 addi r9, r9, 1 stwx r9, r7, r8 @no_count lwz r7, KDP.PA_NanoKernelCode(r1) b VMDispatchTableEnd VMDispatchMainTable dcb.l MaxVMCallCount, 0;Local_Panic - (* - VMDispatchMainTable) VMDispatchAltTable dcb.l MaxVMCallCount, 0;Local_Panic - (* - VMDispatchAltTable) VMDispatchTableEnd lwz r9, KDP.VMMaxVirtualPages(r1) cmplwi r3, MaxVMCallCount cmpwi cr1, r9, 0 rlwimi r7, r3, 2, 23, 29 llabel r8, VMDispatchMainTable bne cr1, @noalt llabel r8, VMDispatchAltTable @noalt lwzx r8, r8, r7 lwz r9, KDP.PrimaryAddrRangePages(r1) add r8, r8, r7 mtlr r8 bltlr ; UNIMPLEMENTED kcVMDispatch selectors: ; VMUnInit: 'un-init the MMU virtual space' DeclareVMCall 1, VMReturn ; VMGetPhysicalAddress: 'return phys address given log page (can be different from above!)' ; ('above' means VMGetPhysicalPage) DeclareVMCallWithAlt 11, VMReturnMinus1, VMReturnNotReady ; VMReload: 'reload the ATC with specified page' DeclareVMCall 13, VMReturn ; VMFlushAddressTranslationCache: 'just do it' DeclareVMCall 14, VMReturn ; VMFlushDataCache: 'wack the data cache' DeclareVMCall 15, VMReturn ; VMFlushCodeCache: 'wack the code cache' DeclareVMCall 16, VMReturn ; VMReturn ; VMGetPhysicalAddress_one VMReturnMinus1 ; OUTSIDE REFERER li r3, -0x01 b VMReturn VMReturnNotReady ; OUTSIDE REFERER b VMReturnMinus1 VMReturn0 ; OUTSIDE REFERER li r3, 0x00 b VMReturn VMReturn1 ; OUTSIDE REFERER li r3, 0x01 VMReturn ; OUTSIDE REFERER mfsprg r8, 0 lwz r14, 0x0038(r8) lwz r15, 0x003c(r8) lwz r16, 0x0040(r8) lwz r7, -0x0010(r8) lwz r6, -0x0014(r8) _AssertAndRelease PSA.HTABLock, scratch=r8 b IntReturn ; 'last chance to init after new memory dispatch is installed' ; ; Does protecting the kernel mean *wiring* the kernel? DeclareVMCall 2, VMFinalInit VMFinalInit ; OUTSIDE REFERER mfsprg r8, 0 stmw r29, EWA.r29(r8) lwz r29, KDP.TopOfFreePages(r1) lwz r30, KDP.PA_NanoKernelCode(r1) lwz r31, KDP.OtherFreeThing(r1) subf r30, r30, r29 cmpwi r31, 0 add r30, r30, r31 ; r30 = TopOfFreePages - PA_NanoKernelCode + OtherFreeThing beq @skip li r8, 0 stw r8, KDP.OtherFreeThing(r1) _log 'Protecting the nanokernel: ' mr r8, r31 bl printw mr r8, r30 bl printw _log '^n' addi r29, r1, 4096 @loop srwi r4, r31, 12 lwz r9, KDP.PrimaryAddrRangePages(r1) bl GetPARPageInfo bge cr4, @skip bltl cr5, RemovePageFromTLB bgel cr5, VMSecondLastExportedFunc ori r16, r16, 0x400 rlwimi r9, r29, 0, 0, 19 bl RemovePTEFromHTAB addi r31, r31, 0x1000 cmplw r31, r30 ble @loop @skip mfsprg r8, 0 lmw r29, EWA.r29(r8) b VMReturn1 ; 'init the MMU virtual space' DeclareVMCallWithAlt 0, VMInit, VMReturn1 VMInit ; OUTSIDE REFERER _log 'Legacy VMInit ' mr r8, r4 bl printw mr r8, r5 bl printw _log '^n' lwz r7, KDP.FlatPageListPtr(r1) ; check that zero seg isn't empty lwz r8, KDP.FlatPageListSegPtrs + 0(r1) cmpw r7, r8 bne VMReturn1 stw r4, KDP.PrimaryAddrRangePages(r1) ; resize PAR stw r5, KDP.FlatPageListPtr(r1) ; where did NK find this??? lwz r6, 0x05e8(r1) li r5, 0x00 li r4, 0x00 VMInit_BigLoop lwz r8, 0x0000(r6) addi r6, r6, 0x08 lhz r3, 0x0000(r8) lhz r7, 0x0002(r8) lwz r8, 0x0004(r8) addi r7, r7, 0x01 cmpwi cr1, r3, 0x00 andi. r3, r8, 0xc00 cmpwi r3, 0xc00 bne VMInit_0x110 bnel cr1, Local_Panic rlwinm r15, r8, 22, 0, 29 addi r3, r1, 0x6c0 rlwimi r3, r5, 2, 28, 29 stw r15, 0x0000(r3) slwi r3, r5, 16 cmpw r3, r4 bnel Local_Panic VMInit_0xa8 lwz r16, 0x0000(r15) addi r7, r7, -0x01 andi. r3, r16, 0x01 beql Local_Panic andi. r3, r16, 0x800 beq VMInit_0x100 lwz r14, KDP.HTABORG(r1) rlwinm r3, r16, 23, 9, 28 lwzux r8, r14, r3 lwz r9, 0x0004(r14) andis. r3, r8, 0x8000 beql Local_Panic andi. r3, r9, 0x03 cmpwi r3, 0x00 beql Local_Panic rlwinm r3, r16, 17, 22, 31 rlwimi r3, r8, 10, 16, 21 rlwimi r3, r8, 21, 12, 15 cmpw r3, r4 bnel Local_Panic bl RemovePageFromTLB bl RemovePTEFromHTAB VMInit_0x100 cmpwi r7, 0x00 addi r15, r15, 0x04 addi r4, r4, 0x01 bne VMInit_0xa8 VMInit_0x110 lwz r7, KDP.VMMaxVirtualPages(r1) addi r5, r5, 0x01 addi r7, r7, -0x01 srwi r7, r7, 16 cmpw r5, r7 ble VMInit_BigLoop lwz r7, KDP.TotalPhysicalPages(r1) cmpw r4, r7 bnel Local_Panic lwz r5, KDP.FlatPageListPtr(r1) lwz r4, KDP.PrimaryAddrRangePages(r1) andi. r7, r5, 0xfff li r3, 0x02 bne VMInit_Fail lwz r7, KDP.VMMaxVirtualPages(r1) cmplw r7, r4 li r3, 0x03 blt VMInit_Fail addi r7, r4, 0x3ff srwi r6, r7, 10 srwi r8, r5, 12 add r8, r8, r6 lwz r9, KDP.TotalPhysicalPages(r1) cmplw r8, r9 li r3, 0x04 bgt VMInit_Fail cmplw r4, r9 li r3, 0x05 blt VMInit_Fail srwi r7, r5, 12 bl major_0x09c9c stw r9, KDP.FlatPageListPtr(r1) mr r15, r9 srwi r7, r5, 12 add r7, r7, r6 addi r7, r7, -0x01 bl major_0x09c9c subf r9, r15, r9 srwi r9, r9, 12 addi r9, r9, 0x01 cmpw r9, r6 li r3, 0x06 bne VMInit_Fail stw r4, KDP.PrimaryAddrRangePages(r1) lwz r8, -0x0020(r1) slwi r7, r4, 12 stw r7, 0x0dc8(r8) slwi r7, r4, 2 li r8, 0x00 VMInit_0x1d4 subi r7, r7, 4 cmpwi r7, 0x00 stwx r8, r15, r7 bne VMInit_0x1d4 lwz r7, KDP.TotalPhysicalPages(r1) slwi r6, r7, 2 VMInit_0x1ec subi r6, r6, 4 srwi r7, r6, 2 bl major_0x09c9c cmpwi r6, 0x00 ori r16, r9, 0x21 stwx r16, r15, r6 bne VMInit_0x1ec lwz r15, KDP.FlatPageListPtr(r1) srwi r7, r5, 10 add r15, r15, r7 lwz r5, KDP.PrimaryAddrRangePages(r1) VMInit_0x218 lwz r16, 0x0000(r15) andi. r7, r16, 0x01 beql Local_Panic ori r16, r16, 0x404 stw r16, 0x0000(r15) addi r5, r5, -0x400 cmpwi r5, 0x00 addi r15, r15, 0x04 bgt VMInit_0x218 lwz r9, KDP.VMMaxVirtualPages(r1) lwz r6, 0x05e8(r1) addi r9, r9, -0x01 li r8, 0xa00 ori r7, r8, 0xffff VMInit_0x250 cmplwi r9, 0xffff lwz r3, 0x0000(r6) addi r6, r6, 0x08 stw r7, 0x0000(r3) stw r8, 0x0004(r3) stw r7, 0x0008(r3) stw r8, 0x000c(r3) addis r9, r9, -0x01 bgt VMInit_0x250 sth r9, 0x0002(r3) sth r9, 0x000a(r3) lwz r6, 0x05e8(r1) lwz r9, KDP.PrimaryAddrRangePages(r1) lwz r15, KDP.FlatPageListPtr(r1) VMInit_0x288 lwz r8, 0x0000(r6) lis r7, 0x01 rlwinm. r3, r9, 16, 16, 31 bne VMInit_0x29c mr r7, r9 VMInit_0x29c subf. r9, r7, r9 addi r7, r7, -0x01 stw r7, 0x0000(r8) rlwinm r7, r15, 10, 22, 19 ori r7, r7, 0xc00 stw r7, 0x0004(r8) addis r15, r15, 0x04 addi r6, r6, 0x08 bne VMInit_0x288 mfsprg r9, 0 lwz r6, EWA.PA_ContextBlock(r9) bl SchSaveStartingAtR14 ; need some registers lwz r8, EWA.PA_CurAddressSpace(r9) li r9, 0 bl FindAreaAbove ; find the PAR lwz r16, Area.LogicalBase(r8) cmpwi r16, 0 bne Local_Panic ; better be at address 0 li r16, 0 stw r16, Area.FaultCtrArrayPtr(r8) lwz r16, KDP.FlatPageListPtr(r1) stw r16, Area.PageMapArrayPtr(r8) lwz r16, KDP.PrimaryAddrRangePages(r1) slwi r16, r16, 12 stw r16, Area.Length(r8) subi r16, r16, 1 stw r16, Area.LogicalEnd(r8) mr r17, r8 _log 'Adjusting area ' lwz r8, Area.ID(r17) mr r8, r8 bl printw _log 'to size ' lwz r8, Area.Length(r17) mr r8, r8 bl printw _log '^n' bl SchRestoreStartingAtR14 b VMReturn0 VMInit_Fail lwz r7, KDP.TotalPhysicalPages(r1) lwz r8, KDP.FlatPageListSegPtrs + 0(r1) stw r7, KDP.PrimaryAddrRangePages(r1) stw r8, KDP.FlatPageListPtr(r1) b VMReturn ; 'exchange physical page contents' DeclareVMCallWithAlt 12, VMExchangePages, VMReturnNotReady VMExchangePages ; OUTSIDE REFERER bl GetPARPageInfo bge cr4, VMReturnMinus1 bgt cr5, VMReturnMinus1 bns cr7, VMReturnMinus1 bgt cr6, VMReturnMinus1 bne cr6, VMReturnMinus1 bltl cr5, RemovePageFromTLB bltl cr5, RemovePTEFromHTAB mr r6, r15 mr r4, r5 mr r5, r16 lwz r9, KDP.PrimaryAddrRangePages(r1) bl GetPARPageInfo bge cr4, VMReturnMinus1 bgt cr5, VMReturnMinus1 bns cr7, VMReturnMinus1 bgt cr6, VMReturnMinus1 bne cr6, VMReturnMinus1 bltl cr5, RemovePageFromTLB bltl cr5, RemovePTEFromHTAB stw r5, 0x0000(r15) stw r16, 0x0000(r6) rlwinm r4, r5, 0, 0, 19 rlwinm r5, r16, 0, 0, 19 li r9, 0x1000 li r6, 0x04 VMExchangePages_0x68 subf. r9, r6, r9 lwzx r7, r4, r9 lwzx r8, r5, r9 stwx r7, r5, r9 stwx r8, r4, r9 bne VMExchangePages_0x68 b VMReturn ; 'return phys page given log page' DeclareVMCall 10, VMGetPhysicalPage VMGetPhysicalPage ; OUTSIDE REFERER bne cr1, VMGetPhysicalPage_0x30 mfsprg r9, 0 lwz r6, -0x0014(r9) ; r6 = ewa bl SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) slwi r29, r4, 12 bl major_0x08d88 blt VMGetPhysicalPage_0x28 bns cr7, major_0x08d88_0xa8 srwi r3, r17, 12 b major_0x08d88_0xb0 VMGetPhysicalPage_0x28 ; r6 = ewa bl SchRestoreStartingAtR14 lwz r9, KDP.PrimaryAddrRangePages(r1) VMGetPhysicalPage_0x30 bl GetPARPageInfo bns cr7, VMReturnMinus1 srwi r3, r9, 12 b VMReturn ; 'given a page, get its 68K PTE' DeclareVMCall 19, getPTEntryGivenPage getPTEntryGivenPage ; OUTSIDE REFERER bne cr1, getPTEntryGivenPage_0x50 mfsprg r9, 0 lwz r6, -0x0014(r9) ; r6 = ewa bl SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) slwi r29, r4, 12 bl major_0x08d88 blt getPTEntryGivenPage_0x48 lwz r3, 0x0000(r30) beq getPTEntryGivenPage_0x3c bns cr7, getPTEntryGivenPage_0x3c bge cr5, getPTEntryGivenPage_0x3c bl MPCall_95_0x2e0 bl MPCall_95_0x334 lwz r3, 0x0000(r30) rlwimi r3, r17, 0, 0, 19 getPTEntryGivenPage_0x3c li r16, 0x882 andc r3, r3, r16 b major_0x08d88_0xb0 getPTEntryGivenPage_0x48 ; r6 = ewa bl SchRestoreStartingAtR14 lwz r9, KDP.PrimaryAddrRangePages(r1) getPTEntryGivenPage_0x50 bl GetPARPageInfo mr r3, r16 bns cr7, getPTEntryGivenPage_0x74 rlwimi r3, r9, 0, 0, 19 bge cr5, getPTEntryGivenPage_0x74 bl RemovePageFromTLB bl EditPTEOnlyInHTAB mr r3, r16 rlwimi r3, r9, 0, 0, 19 getPTEntryGivenPage_0x74 li r8, 0x882 andc r3, r3, r8 b VMReturn ; major_0x08d88 major_0x08d88 ; OUTSIDE REFERER mfsprg r28, 0 mflr r27 mr r9, r29 lwz r8, -0x001c(r28) bl FindAreaAbove mr r31, r8 lwz r16, 0x0024(r31) lwz r17, 0x0028(r31) lwz r18, 0x0020(r31) cmplw r29, r16 cmplw cr1, r29, r17 blt major_0x08d88_0x74 bgt cr1, major_0x08d88_0x74 rlwinm. r8, r18, 0, 16, 16 lwz r19, 0x0070(r31) beq major_0x08d88_0x8c lwz r17, 0x0038(r31) rlwinm r19, r19, 0, 0, 19 cmpwi r17, 0x00 subf r18, r16, r29 beq major_0x08d88_0x74 mtlr r27 crclr cr0_lt crset cr0_eq add r17, r18, r19 addi r30, r31, 0x74 crset cr7_so rlwimi r18, r17, 0, 0, 19 blr major_0x08d88_0x74 mtlr r27 srwi r8, r29, 28 cmpwi r8, 0x07 beq major_0x08d88_0xa8 crset cr0_lt blr major_0x08d88_0x8c mr r8, r29 bl MPCall_95_0x1e4 bl MPCall_95_0x2b0 mtlr r27 crclr cr0_lt crclr cr0_eq blr major_0x08d88_0xa8 ; OUTSIDE REFERER ; r6 = ewa bl SchRestoreStartingAtR14 b VMReturnMinus1 major_0x08d88_0xb0 ; OUTSIDE REFERER ; r6 = ewa bl SchRestoreStartingAtR14 b VMReturn ; 'ask about page status' (typo?) DeclareVMCallWithAlt 5, VMIsInited, VMReturnNotReady VMIsInited ; OUTSIDE REFERER bl GetPARPageInfo bso cr7, VMReturn1 rlwinm r3, r16, 16, 31, 31 b VMReturn ; 'ask about page status' (typo?) DeclareVMCall 3, VMIsResident VMIsResident ; OUTSIDE REFERER bne cr1, VMIsResident_0x30 mfsprg r9, 0 lwz r6, -0x0014(r9) ; r6 = ewa bl SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) slwi r29, r4, 12 bl major_0x08d88 blt VMIsResident_0x28 lwz r16, 0x0000(r30) srwi r3, r16, 31 b major_0x08d88_0xb0 VMIsResident_0x28 ; r6 = ewa bl SchRestoreStartingAtR14 lwz r9, KDP.PrimaryAddrRangePages(r1) VMIsResident_0x30 bl GetPARPageInfo clrlwi r3, r16, 0x1f b VMReturn ; 'ask about page status' (typo?) DeclareVMCallWithAlt 4, VMIsUnmodified, VMReturnNotReady VMIsUnmodified ; OUTSIDE REFERER bl GetPARPageInfo rlwinm r3, r16, 28, 31, 31 xori r3, r3, 0x01 bge cr5, VMReturn bl RemovePageFromTLB bl EditPTEOnlyInHTAB rlwinm r3, r16, 28, 31, 31 xori r3, r3, 0x01 b VMReturn ; Cube-E has no comment DeclareVMCallWithAlt 22, VMLRU, VMReturnNotReady VMLRU ; OUTSIDE REFERER rlwinm. r9, r9, 2, 0, 29 lwz r15, KDP.FlatPageListPtr(r1) lwz r14, KDP.HTABORG(r1) add r15, r15, r9 srwi r4, r9, 2 li r5, 0x100 li r6, 0x08 VMLRU_0x1c lwzu r16, -0x0004(r15) addi r4, r4, -0x01 mtcrf 0x07, r16 cmpwi r4, 0x00 rlwinm r7, r16, 23, 9, 28 bns cr7, VMLRU_0x5c bge cr5, VMLRU_0x50 add r14, r14, r7 lwz r8, 0x0000(r14) bl RemovePageFromTLB andc r9, r9, r5 bl RemovePTEFromHTAB subf r14, r7, r14 VMLRU_0x50 rlwimi r16, r16, 6, 22, 22 andc r16, r16, r6 stw r16, 0x0000(r15) VMLRU_0x5c bne VMLRU_0x1c b VMReturn ; major_0x08f14 major_0x08f14 ; OUTSIDE REFERER mflr r28 mr r29, r8 mr r30, r9 mfsprg r18, 0 slwi r9, r4, 12 lwz r8, -0x001c(r18) bl FindAreaAbove lwz r17, 0x0020(r8) lwz r16, 0x0024(r8) rlwinm. r18, r17, 0, 16, 16 cmplw cr1, r16, r9 beq Local_Panic bgt cr1, Local_Panic li r16, -0x01 mtlr r28 stw r16, 0x0038(r8) mr r8, r29 mr r9, r30 blr ; 'make it so' DeclareVMCall 17, VMMakePageCacheable VMMakePageCacheable ; OUTSIDE REFERER bne cr1, VMMakePageCacheable_0x4 VMMakePageCacheable_0x4 bl GetPARPageInfo rlwinm r7, r16, 0, 25, 26 cmpwi r7, 0x20 bns cr7, VMReturnMinus1 beq VMReturn bge cr4, VMMakePageCacheable_0x40 bltl cr5, RemovePageFromTLB bgel cr5, VMSecondLastExportedFunc rlwinm r16, r16, 0, 27, 24 rlwinm r9, r9, 0, 27, 24 lwz r7, KDP.PageAttributeInit(r1) rlwimi r9, r7, 0, 27, 28 ori r16, r16, 0x20 bl EditPTEInHTAB b VMReturn VMMakePageCacheable_0x40 rlwinm r7, r4, 16, 28, 31 cmpwi r7, 0x08 blt VMReturnMinus1 ble cr6, VMReturnMinus1 _log 'VMMakePageCacheable for I/O ' mr r8, r4 bl printw _log '^n' mfsprg r6, 0 lwz r6, -0x0014(r6) ; r6 = ewa bl SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) bl major_0x08f14 ; r6 = ewa bl SchRestoreStartingAtR14 lwz r5, 0x000c(r15) andi. r6, r5, 0xe01 cmpwi r6, 0xa01 beq VMMakePageCacheable_0xec addi r15, r15, -0x08 lwz r5, 0x0004(r15) lhz r6, 0x0000(r15) andi. r5, r5, 0xc00 lhz r5, 0x0002(r15) bne VMReturnMinus1 addi r5, r5, 0x01 add r6, r6, r5 xor r6, r6, r4 andi. r6, r6, 0xffff bne VMReturnMinus1 sth r5, 0x0002(r15) b PageSetCommon VMMakePageCacheable_0xec lwz r5, 0x0000(r15) lwz r6, 0x0004(r15) stw r5, 0x0008(r15) stw r6, 0x000c(r15) slwi r5, r4, 16 stw r5, 0x0000(r15) slwi r5, r4, 12 ori r5, r5, 0x12 stw r5, 0x0004(r15) b PageSetCommon ; Cube-E has no comment DeclareVMCall 24, VMMakePageWriteThrough VMMakePageWriteThrough ; OUTSIDE REFERER bne cr1, VMMakePageWriteThrough_0x4 VMMakePageWriteThrough_0x4 bl GetPARPageInfo rlwinm. r7, r16, 0, 25, 26 bns cr7, VMReturnMinus1 beq VMReturn bge cr4, VMMakePageWriteThrough_0x3c bltl cr5, RemovePageFromTLB bgel cr5, VMSecondLastExportedFunc rlwinm r16, r16, 0, 27, 24 rlwinm r9, r9, 0, 27, 24 lwz r7, KDP.PageAttributeInit(r1) rlwimi r9, r7, 0, 27, 28 ori r9, r9, 0x40 bl EditPTEInHTAB b VMMakePageNonCacheable_0x3c VMMakePageWriteThrough_0x3c rlwinm r7, r4, 16, 28, 31 cmpwi r7, 0x08 blt VMReturnMinus1 ble cr6, VMReturnMinus1 _log 'VMMakePageWriteThrough for I/O ' mr r8, r4 bl printw _log '^n' mfsprg r6, 0 lwz r6, -0x0014(r6) ; r6 = ewa bl SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) bl major_0x08f14 ; r6 = ewa bl SchRestoreStartingAtR14 lwz r5, 0x000c(r15) andi. r6, r5, 0xe01 cmpwi r6, 0xa01 beq VMMakePageWriteThrough_0xec addi r15, r15, -0x08 lwz r5, 0x0004(r15) lhz r6, 0x0000(r15) andi. r5, r5, 0xc00 lhz r5, 0x0002(r15) bne VMReturnMinus1 addi r5, r5, 0x01 add r6, r6, r5 xor r6, r6, r4 andi. r6, r6, 0xffff bne VMReturnMinus1 sth r5, 0x0002(r15) b PageSetCommon VMMakePageWriteThrough_0xec lwz r5, 0x0000(r15) lwz r6, 0x0004(r15) stw r5, 0x0008(r15) stw r6, 0x000c(r15) slwi r5, r4, 16 stw r5, 0x0000(r15) slwi r5, r4, 12 ori r5, r5, 0x52 stw r5, 0x0004(r15) ; PageSetCommon PageSetCommon ; OUTSIDE REFERER lwz r15, KDP.PTEGMask(r1) lwz r14, KDP.HTABORG(r1) slwi r6, r4, 12 mfsrin r6, r6 rlwinm r8, r6, 7, 0, 20 xor r6, r6, r4 slwi r7, r6, 6 and r15, r15, r7 rlwimi r8, r4, 22, 26, 31 crset cr0_eq oris r8, r8, 0x8000 PageSetCommon_0x2c lwzux r7, r14, r15 lwz r15, 0x0008(r14) lwz r6, 0x0010(r14) lwz r5, 0x0018(r14) cmplw cr1, r7, r8 cmplw cr2, r15, r8 cmplw cr3, r6, r8 cmplw cr4, r5, r8 beq cr1, PageSetCommon_0xc8 beq cr2, PageSetCommon_0xc4 beq cr3, PageSetCommon_0xc0 beq cr4, PageSetCommon_0xbc lwzu r7, 0x0020(r14) lwz r15, 0x0008(r14) lwz r6, 0x0010(r14) lwz r5, 0x0018(r14) cmplw cr1, r7, r8 cmplw cr2, r15, r8 cmplw cr3, r6, r8 cmplw cr4, r5, r8 beq cr1, PageSetCommon_0xc8 beq cr2, PageSetCommon_0xc4 beq cr3, PageSetCommon_0xc0 beq cr4, PageSetCommon_0xbc crnot 2, 2 lwz r15, KDP.PTEGMask(r1) lwz r14, KDP.HTABORG(r1) slwi r6, r4, 12 mfsrin r6, r6 xor r6, r6, r4 not r6, r6 slwi r7, r6, 6 and r15, r15, r7 xori r8, r8, 0x40 bne PageSetCommon_0x2c b VMReturn PageSetCommon_0xbc addi r14, r14, 0x08 PageSetCommon_0xc0 addi r14, r14, 0x08 PageSetCommon_0xc4 addi r14, r14, 0x08 PageSetCommon_0xc8 bl RemovePageFromTLB li r8, 0x00 li r9, 0x00 bl EditPTEOnlyInHTAB b VMReturn ; 'make it so' DeclareVMCall 18, VMMakePageNonCacheable VMMakePageNonCacheable ; OUTSIDE REFERER bne cr1, VMMakePageNonCacheable_0x4 VMMakePageNonCacheable_0x4 bl GetPARPageInfo rlwinm r7, r16, 0, 25, 26 cmpwi r7, 0x60 bns cr7, VMReturnMinus1 beq VMReturn bge cr4, VMMakePageNonCacheable_0x78 bltl cr5, RemovePageFromTLB bgel cr5, VMSecondLastExportedFunc rlwinm r9, r9, 0, 27, 24 lwz r7, KDP.PageAttributeInit(r1) rlwimi r9, r7, 0, 27, 28 ori r16, r16, 0x60 ori r9, r9, 0x20 bl EditPTEInHTAB VMMakePageNonCacheable_0x3c ; OUTSIDE REFERER rlwinm r4, r9, 0, 0, 19 lhz r8, 0x0f4a(r1) add r5, r4, r8 li r7, 0x1000 slwi r8, r8, 1 VMMakePageNonCacheable_0x50 subf. r7, r8, r7 dcbf r7, r4 dcbf r7, r5 sync icbi r7, r4 icbi r7, r5 bne VMMakePageNonCacheable_0x50 sync isync b VMReturn VMMakePageNonCacheable_0x78 rlwinm r7, r4, 16, 28, 31 cmpwi r7, 0x08 blt VMReturnMinus1 bgt cr6, VMReturnMinus1 _log 'VMMakePageNonCacheable for I/O ' mr r8, r4 bl printw _log '^n' mfsprg r6, 0 lwz r6, -0x0014(r6) ; r6 = ewa bl SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) bl major_0x08f14 ; r6 = ewa bl SchRestoreStartingAtR14 lwz r5, 0x0004(r15) srwi r6, r5, 12 cmpw r6, r4 bne VMReturnMinus1 lis r7, 0x00 lis r8, 0x00 lis r9, 0x00 srwi r6, r5, 12 lhz r8, 0x0002(r15) lhz r7, 0x0000(r15) addi r6, r6, 0x01 cmpwi r8, 0x00 beq VMMakePageNonCacheable_0x134 addi r7, r7, 0x01 addi r8, r8, -0x01 rlwimi r5, r6, 12, 0, 19 sth r7, 0x0000(r15) sth r8, 0x0002(r15) stw r5, 0x0004(r15) b PageSetCommon VMMakePageNonCacheable_0x134 lis r6, 0x00 lwz r7, 0x0008(r15) lwz r8, 0x000c(r15) lis r5, 0x00 ori r6, r6, 0xa01 stw r7, 0x0000(r15) stw r8, 0x0004(r15) stw r5, 0x0008(r15) stw r6, 0x000c(r15) dcbf 0, r15 b PageSetCommon ; 'set page status' DeclareVMCall 8, VMMarkBacking VMMarkBacking ; OUTSIDE REFERER bne cr1, VMMarkBacking_0x58 mfsprg r9, 0 lwz r6, -0x0014(r9) ; r6 = ewa bl SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) slwi r29, r4, 12 bl major_0x08d88 blt VMMarkBacking_0x50 beq major_0x08d88_0xa8 bns cr7, VMMarkBacking_0x30 bge cr5, VMMarkBacking_0x30 bl MPCall_95_0x2e0 bl MPCall_95_0x348 VMMarkBacking_0x30 lwz r18, 0x0000(r30) rlwinm r18, r18, 0, 0, 30 stw r18, 0x0000(r30) lwz r18, 0x0068(r31) lwz r17, 0x0038(r31) subf r17, r18, r17 stw r17, 0x0038(r31) b major_0x08d88_0xb0 VMMarkBacking_0x50 ; r6 = ewa bl SchRestoreStartingAtR14 lwz r9, KDP.PrimaryAddrRangePages(r1) VMMarkBacking_0x58 bl GetPARPageInfo bge cr4, VMReturnMinus1 bgt cr5, VMReturnMinus1 bltl cr5, RemovePageFromTLB bltl cr5, RemovePTEFromHTAB rlwimi r16, r5, 16, 15, 15 li r7, 0x01 andc r16, r16, r7 stw r16, 0x0000(r15) b VMReturn ; 'ask about page status' (typo?) DeclareVMCallWithAlt 9, VMMarkCleanUnused, VMReturnNotReady VMMarkCleanUnused ; OUTSIDE REFERER bl GetPARPageInfo bge cr4, VMReturnMinus1 bns cr7, VMReturnMinus1 bltl cr5, RemovePageFromTLB beq cr2, VMMarkCleanUnused_0x2c bgel cr5, VMSecondLastExportedFunc li r7, 0x180 andc r9, r9, r7 ori r16, r16, 0x100 bl EditPTEInHTAB b VMReturn VMMarkCleanUnused_0x2c bgel cr5, VMSecondLastExportedFunc ori r16, r16, 0x100 li r7, 0x18 andc r16, r16, r7 bl RemovePTEFromHTAB b VMReturn ; Cube-E has no comment DeclareVMCallWithAlt 23, VMMarkUndefined, VMReturnNotReady VMMarkUndefined ; OUTSIDE REFERER cmplw r4, r9 cmplw cr1, r5, r9 add r7, r4, r5 cmplw cr2, r7, r9 bge VMReturnMinus1 bgt cr1, VMReturnMinus1 bgt cr2, VMReturnMinus1 lwz r15, KDP.FlatPageListPtr(r1) slwi r8, r7, 2 li r7, 0x01 VMMarkUndefined_0x28 subi r8, r8, 4 subf. r5, r7, r5 lwzx r16, r15, r8 blt VMReturn rlwimi r16, r6, 7, 24, 24 stwx r16, r15, r8 b VMMarkUndefined_0x28 ; 'set page status' DeclareVMCall 7, VMMarkResident VMMarkResident ; OUTSIDE REFERER bne cr1, VMMarkResident_0x58 mfsprg r9, 0 lwz r6, -0x0014(r9) ; r6 = ewa bl SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) slwi r29, r4, 12 slwi r26, r5, 12 bl major_0x08d88 blt VMMarkResident_0x50 beq major_0x08d88_0xa8 bso cr7, major_0x08d88_0xa8 bltl cr5, Local_Panic lwz r16, 0x0000(r30) rlwimi r16, r5, 12, 0, 19 ori r16, r16, 0x01 stw r16, 0x0000(r30) lwz r18, 0x0068(r31) lwz r17, 0x0038(r31) add r17, r17, r18 stw r17, 0x0038(r31) b major_0x08d88_0xb0 VMMarkResident_0x50 ; r6 = ewa bl SchRestoreStartingAtR14 lwz r9, KDP.PrimaryAddrRangePages(r1) VMMarkResident_0x58 bl GetPARPageInfo bge cr4, VMReturnMinus1 bso cr7, VMReturnMinus1 bltl cr5, Local_Panic rlwimi r16, r5, 12, 0, 19 ori r16, r16, 0x01 stw r16, 0x0000(r15) bl VMSecondLastExportedFunc bl EditPTEInHTAB b VMReturn ; 'ask why we got this page fault' DeclareVMCallWithAlt 21, VMPTest, VMReturnNotReady VMPTest ; OUTSIDE REFERER srwi r4, r4, 12 cmplw r4, r9 li r3, 0x4000 bge VMReturn bl GetPARPageInfo li r3, 0x400 bns cr7, VMReturn li r3, 0x00 ori r3, r3, 0x8000 ble cr7, VMReturn cmpwi r6, 0x00 beq VMReturn li r3, 0x800 b VMReturn ; 'given a page & 68K pte, set the real PTE' DeclareVMCall 20, setPTEntryGivenPage setPTEntryGivenPage ; OUTSIDE REFERER bne cr1, setPTEntryGivenPage_0x64 mfsprg r9, 0 lwz r6, -0x0014(r9) ; r6 = ewa bl SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) mr r26, r4 slwi r29, r5, 12 bl major_0x08d88 blt setPTEntryGivenPage_0x5c beq major_0x08d88_0xa8 bns cr7, setPTEntryGivenPage_0x34 bge cr5, setPTEntryGivenPage_0x34 bl MPCall_95_0x2e0 bl MPCall_95_0x348 setPTEntryGivenPage_0x34 lwz r18, 0x0000(r30) xor r8, r18, r26 li r3, 0x461 rlwimi r3, r18, 24, 29, 29 and. r3, r3, r8 bne major_0x08d88_0xa8 andi. r8, r8, 0x11c xor r18, r18, r8 stw r18, 0x0000(r30) b major_0x08d88_0xb0 setPTEntryGivenPage_0x5c ; r6 = ewa bl SchRestoreStartingAtR14 lwz r9, KDP.PrimaryAddrRangePages(r1) setPTEntryGivenPage_0x64 mr r6, r4 mr r4, r5 bl GetPARPageInfo bge cr4, VMReturnMinus1 xor r7, r16, r6 li r3, 0x461 rlwimi r3, r16, 24, 29, 29 and. r3, r3, r7 bne VMReturnMinus1 andi. r7, r7, 0x11c xor r16, r16, r7 stw r16, 0x0000(r15) bge cr5, VMReturn bl RemovePageFromTLB lwz r16, 0x0000(r15) bne cr2, setPTEntryGivenPage_0xb4 andi. r7, r16, 0x08 bne setPTEntryGivenPage_0xb4 bl RemovePTEFromHTAB b VMReturn setPTEntryGivenPage_0xb4 rlwimi r9, r16, 5, 23, 23 rlwimi r9, r16, 3, 24, 24 rlwimi r9, r16, 30, 31, 31 bl EditPTEOnlyInHTAB b VMReturn ; 'ask about page status' (typo?) DeclareVMCallWithAlt 6, VMShouldClean, VMReturnNotReady VMShouldClean ; OUTSIDE REFERER bl GetPARPageInfo bns cr7, VMReturn0 bge cr4, VMReturnMinus1 bltl cr5, RemovePageFromTLB blt cr7, VMShouldClean_0x34 bns cr6, VMShouldClean_0x34 xori r16, r16, 0x10 ori r16, r16, 0x100 stw r16, 0x0000(r15) bge cr5, VMReturn1 xori r9, r9, 0x80 bl EditPTEOnlyInHTAB b VMReturn1 VMShouldClean_0x34 bltl cr5, EditPTEOnlyInHTAB b VMReturn0 ; Cube-E has no comment DeclareVMCallWithAlt 25, VMAllocateMemory, VMReturnNotReady VMAllocateMemory ; OUTSIDE REFERER lwz r7, KDP.FlatPageListPtr(r1) lwz r8, KDP.FlatPageListSegPtrs + 0(r1) cmpwi cr6, r5, 0x00 cmpw cr7, r7, r8 or r7, r4, r6 rlwinm. r7, r7, 0, 0, 11 ble cr6, VMReturnMinus1 lwz r9, KDP.PrimaryAddrRangePages(r1) bne cr7, VMReturnMinus1 mr r7, r4 bne VMReturnMinus1 mr r4, r9 slwi r6, r6, 12 lwz r9, -0x0408(r1) crclr cr3_eq cmpwi cr6, r6, 0x00 cmplw cr7, r9, r5 bne cr6, VMAllocateMemory_0x6c blt cr7, VMAllocateMemory_0x6c lwz r9, -0x040c(r1) subf r4, r5, r9 slwi r4, r4, 2 lwz r15, KDP.FlatPageListPtr(r1) add r15, r15, r4 srwi r4, r4, 2 crset cr3_eq b VMAllocateMemory_0xc0 VMAllocateMemory_0x6c lwz r9, KDP.PrimaryAddrRangePages(r1) addi r5, r5, -0x01 VMAllocateMemory_0x74 addi r4, r4, -0x01 bl GetPARPageInfo bltl cr5, RemovePageFromTLB bltl cr5, RemovePTEFromHTAB lwz r9, KDP.PrimaryAddrRangePages(r1) subf r8, r4, r9 cmplw cr7, r5, r8 and. r8, r16, r6 bge cr7, VMAllocateMemory_0x74 bne VMAllocateMemory_0x74 cmpwi cr6, r6, 0x00 beq cr6, VMAllocateMemory_0xc0 slwi r8, r5, 2 lwzx r8, r15, r8 slwi r14, r5, 12 add r14, r14, r16 xor r8, r8, r14 rlwinm. r8, r8, 0, 0, 19 bne VMAllocateMemory_0x74 VMAllocateMemory_0xc0 slwi r4, r7, 12 lwz r9, KDP.VMMaxVirtualPages(r1) cmplw cr7, r7, r9 rlwinm. r9, r7, 0, 0, 11 blt cr7, VMReturnMinus1 bne VMReturnMinus1 lwz r14, 0x05e8(r1) rlwinm r9, r7, 19, 25, 28 lwzx r14, r14, r9 clrlwi r9, r7, 0x10 lhz r8, 0x0000(r14) b VMAllocateMemory_0xf4 VMAllocateMemory_0xf0 lhzu r8, 0x0008(r14) VMAllocateMemory_0xf4 lhz r16, 0x0002(r14) subf r8, r8, r9 cmplw cr7, r8, r16 bgt cr7, VMAllocateMemory_0xf0 add r8, r8, r5 cmplw cr7, r8, r16 bgt cr7, VMReturnMinus1 lwz r16, 0x0004(r14) slwi r8, r7, 16 andi. r16, r16, 0xe01 cmpwi r16, 0xa01 or r8, r8, r5 addi r5, r5, 0x01 bne VMReturnMinus1 stw r8, 0x0000(r14) bnel cr6, VMAllocateMemory_0x2e8 mr r7, r15 rotlwi r15, r15, 0x0a ori r15, r15, 0xc00 stw r15, 0x0004(r14) bne cr3, VMAllocateMemory_0x164 lwz r8, -0x0408(r1) subf r8, r5, r8 stw r8, -0x0408(r1) lwz r8, -0x040c(r1) subf r8, r5, r8 stw r8, -0x040c(r1) b VMAllocateMemory_0x1a4 VMAllocateMemory_0x164 lwz r7, KDP.TotalPhysicalPages(r1) subf r7, r5, r7 stw r7, KDP.TotalPhysicalPages(r1) stw r7, KDP.PrimaryAddrRangePages(r1) lwz r5, -0x0020(r1) slwi r8, r7, 12 stw r8, 0x0dc4(r5) stw r8, 0x0dc8(r5) mr r5, r14 lwz r7, KDP.VMMaxVirtualPages(r1) li r8, 0xa00 bl VMAllocateMemory_0x33c lwz r7, KDP.TotalPhysicalPages(r1) li r8, 0xc00 bl VMAllocateMemory_0x33c mr r14, r5 VMAllocateMemory_0x1a4 mfsprg r6, 0 lwz r6, -0x0014(r6) ; r6 = ewa bl SchSaveStartingAtR14 ; r8 = sprg0 (not used by me) mr r30, r14 _log ' VMAllocateMemory - creating area' li r8, 160 ; r1 = kdp ; r8 = size bl PoolAllocClear ; r8 = ptr mr. r31, r8 beq Local_Panic lwz r17, 0x0004(r30) lhz r16, 0x0002(r30) lis r8, 0x6172 ori r8, r8, 0x6561 stw r8, 0x0004(r31) addi r16, r16, 0x01 mr r15, r4 slwi r16, r16, 12 lwz r8, -0x041c(r1) lwz r8, 0x0014(r8) stw r8, 0x006c(r31) stw r15, 0x0024(r31) stw r16, 0x002c(r31) stw r16, 0x0038(r31) li r8, 0x00 stw r8, 0x0030(r31) _log ' at 0x' mr r8, r15 bl printw mr r8, r16 bl printw _log '^n' 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, 0x0008(r31) ori r8, r8, 0xc0 stw r8, 0x0008(r31) mr r8, r31 bl createarea cmpwi r9, 0x00 bne Local_Panic mr r31, r8 mfsprg r9, 0 lwz r8, -0x001c(r9) li r9, 0x00 bl FindAreaAbove lwz r16, 0x0024(r8) cmpwi r16, 0x00 bne Local_Panic lwz r16, KDP.PrimaryAddrRangePages(r1) lwz r17, 0x002c(r8) slwi r16, r16, 12 cmpw r17, r16 beq VMAllocateMemory_0x2e0 stw r16, 0x002c(r8) addi r16, r16, -0x01 stw r16, 0x0028(r8) VMAllocateMemory_0x2e0 ; r6 = ewa bl SchRestoreStartingAtR14 b VMReturn1 VMAllocateMemory_0x2e8 lwz r16, 0x0000(r15) lwz r7, KDP.TotalPhysicalPages(r1) lwz r8, KDP.FlatPageListPtr(r1) slwi r7, r7, 2 add r7, r7, r8 slwi r8, r5, 2 subf r7, r8, r7 cmplw r15, r7 beqlr subi r7, r7, 4 VMAllocateMemory_0x310 lwzx r9, r15, r8 cmplw r15, r7 stw r9, 0x0000(r15) addi r15, r15, 0x04 blt VMAllocateMemory_0x310 VMAllocateMemory_0x324 cmpwi r8, 0x04 subi r8, r8, 4 stwu r16, 0x0004(r7) addi r16, r16, 0x1000 bgt VMAllocateMemory_0x324 blr VMAllocateMemory_0x33c addi r14, r1, 120 lwz r15, KDP.FlatPageListPtr(r1) addi r7, r7, -0x01 cmpwi cr7, r8, 0xc00 VMAllocateMemory_0x34c cmplwi r7, 0xffff lwzu r16, 0x0008(r14) bne cr7, VMAllocateMemory_0x360 rotlwi r8, r15, 0x0a ori r8, r8, 0xc00 VMAllocateMemory_0x360 stw r8, 0x0004(r16) addis r15, r15, 0x04 addis r7, r7, -0x01 bgt VMAllocateMemory_0x34c sth r7, 0x0002(r16) blr ;This function gets sent an page# for a page in the main mac os memory area and returns a bunch of useful info on it. ;Return values that mention HTAB are undefined when the PTE is not in the HTAB ;HTAB residence is determined by bit 20 (value 0x800) of the PTE. This is often checked by a bltl cr5 ; ARG page# r4, KDP.VMMaxVirtualPages r9, ; RET PTE_flags CR, HTAB_upper r8, HTAB_lower r9, PTE_value r16, HTAB_entry_loc r14, PTE_loc r15, GetPARPageInfo ; OUTSIDE REFERER cmplw cr4, r4, r9 ;r9 is VMMaxVirtualPages by convention lwz r15, KDP.FlatPageListPtr(r1) slwi r8, r4, 2 bge cr4, GetPARPageInfo_0x40 GetPARPageInfo_0x10 lwzux r16, r15, r8 ;get PTE from KDP.FlatPageListPointer lwz r14, KDP.HTABORG(r1) mtcrf 0x07, r16 ;copy bits 20-31 to cr rlwinm r8, r16, 23, 9, 28;convert page# into an index rlwinm r9, r16, 0, 0, 19;get unshifted page# bgelr cr5 ;return if PTE is not in HTAB lwzux r8, r14, r8 ;get first word of PTE from HTAB lwz r9, 0x0004(r14);get second word of PTE from HTAB mtcrf 0x80, r8 bns cr7, Local_Panic;panic if the PTE is in the HTAB but isn't mapped to a real page bltlr ;return if PTE is valid bl Local_Panic;panic if PTE isn't valid but is in the HTAB GetPARPageInfo_0x40 ;some kind of little-used code path for when VMMaxVirtualPages is invalid? ROM overlay? lwz r9, KDP.VMMaxVirtualPages(r1) cmplw cr4, r4, r9 rlwinm. r9, r4, 0, 0, 11 blt cr4, VMReturnMinus1;return failure if r4