mirror of
https://github.com/elliotnunn/powermac-rom.git
synced 2024-06-06 17:29:32 +00:00
a323be3c8b
VeryPopularFunction (now GetPARPageInfo) takes a page number in the PAR and returns a bunch of info on it. The flags of the PTE are copied into cr5-cr7 of the condition register so that VMCalls can easily make decisions off of them. I had already figured out the bit flags of the PTEs Mac OS 9 uses when I reversed PagingFunc1. The definitions are in the end of the 'Area Definitions.txt' file I sent you a while ago. If you see a ' bltl cr5, VMDoSomethingWithTLB' (now RemovePageFromTLB) followed by a ' bltl cr5, major_0x09b40' (now RemovePTEFromHTAB), you know that the function is manipulating pages directly. RemovePageFromTLB clears a page from the TLB if it follows a VeryPopularFunction call. RemovePTEFromHTAB takes a page that is resident in the HTAB and removes its HTAB entry. cr5_lt is bit 20 (mask 0x800), which my notes tell me is set when the PTE is in the HTAB. Altogether, the sequence translates to 'if the page is in the HTAB, flush it from the TLB and delete its HTAB entry'. VMExchangePages uses this (twice) to make sure there are no race conditions when it is swapping the data in the pages. I still don't have proof, but I am very very strongly convinced that KDP.FlatPageListPointer is always equal to the PAR's PageMapArrayPtr. On an unrelated note, KCMapPage seems to always panic when called on an area where the PageMapArrayPtr is 2d. I have absolutely no idea why this happens, but it is bad news for MPMapper because the threshold for 2-dimensionality is around 1 MB. I would have to make 512 separate CreateArea calls to map all the memory without the NK panicking. I will have to look into this.
1952 lines
37 KiB
ArmAsm
1952 lines
37 KiB
ArmAsm
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
|
|
|
|
; Xrefs:
|
|
; kcVMDispatch
|
|
; VMFinalInit
|
|
; VMInit
|
|
; VMExchangePages
|
|
; VMGetPhysicalPage
|
|
; getPTEntryGivenPage
|
|
; major_0x08d88
|
|
; VMIsInited
|
|
; VMIsResident
|
|
; VMIsUnmodified
|
|
; VMLRU
|
|
; VMMakePageCacheable
|
|
; VMMakePageWriteThrough
|
|
; PageSetCommon
|
|
; VMMakePageNonCacheable
|
|
; VMMarkBacking
|
|
; VMMarkCleanUnused
|
|
; VMMarkUndefined
|
|
; VMMarkResident
|
|
; VMPTest
|
|
; setPTEntryGivenPage
|
|
; VMShouldClean
|
|
; VMAllocateMemory
|
|
; GetPARPageInfo
|
|
; major_0x09c9c
|
|
|
|
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 Save_r14_r31 ; 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 Restore_r14_r31
|
|
|
|
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 Save_r14_r31
|
|
; 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 Restore_r14_r31
|
|
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 Save_r14_r31
|
|
; 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 Restore_r14_r31
|
|
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
|
|
|
|
; Xrefs:
|
|
; VMGetPhysicalPage
|
|
; getPTEntryGivenPage
|
|
; VMIsResident
|
|
; VMMarkBacking
|
|
; VMMarkResident
|
|
; setPTEntryGivenPage
|
|
|
|
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 Restore_r14_r31
|
|
b VMReturnMinus1
|
|
|
|
major_0x08d88_0xb0 ; OUTSIDE REFERER
|
|
; r6 = ewa
|
|
bl Restore_r14_r31
|
|
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 Save_r14_r31
|
|
; 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 Restore_r14_r31
|
|
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
|
|
|
|
; Xrefs:
|
|
; VMMakePageCacheable
|
|
; VMMakePageWriteThrough
|
|
; VMMakePageNonCacheable
|
|
|
|
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 Save_r14_r31
|
|
; r8 = sprg0 (not used by me)
|
|
|
|
bl major_0x08f14
|
|
|
|
; r6 = ewa
|
|
bl Restore_r14_r31
|
|
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 Save_r14_r31
|
|
; r8 = sprg0 (not used by me)
|
|
|
|
bl major_0x08f14
|
|
|
|
; r6 = ewa
|
|
bl Restore_r14_r31
|
|
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
|
|
|
|
; Xrefs:
|
|
; VMMakePageCacheable
|
|
; VMMakePageWriteThrough
|
|
; VMMakePageNonCacheable
|
|
|
|
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 Save_r14_r31
|
|
; r8 = sprg0 (not used by me)
|
|
|
|
bl major_0x08f14
|
|
|
|
; r6 = ewa
|
|
bl Restore_r14_r31
|
|
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 Save_r14_r31
|
|
; 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 Restore_r14_r31
|
|
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 Save_r14_r31
|
|
; 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 Restore_r14_r31
|
|
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 Save_r14_r31
|
|
; 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 Restore_r14_r31
|
|
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 Save_r14_r31
|
|
; r8 = sprg0 (not used by me)
|
|
|
|
mr r30, r14
|
|
_log ' VMAllocateMemory - creating area'
|
|
li r8, 160
|
|
|
|
; r1 = kdp
|
|
; r8 = size
|
|
bl PoolAlloc
|
|
; 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 Restore_r14_r31
|
|
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<VMMaxVirtualPages
|
|
bne+ VMReturnMinus1 ;return failure if bits 0-11 of r4 are non-zero
|
|
lwz r15, 0x05e8(r1);this appears to be an array of 8-byte structures.
|
|
rlwinm r9, r4, 19, 25, 28;copy bits 12-15 or r4 to bits 25-28 of r9
|
|
lwzx r15, r15, r9 ;do an index for some reason
|
|
clrlwi r9, r4, 0x10 ;copy bits 16-31 to r9
|
|
lhz r8, 0x0000(r15)
|
|
b GetPARPageInfo_0x70
|
|
|
|
GetPARPageInfo_0x6c
|
|
lhzu r8, 0x0008(r15)
|
|
|
|
GetPARPageInfo_0x70
|
|
lhz r16, 0x0002(r15)
|
|
subf r8, r8, r9
|
|
cmplw cr4, r8, r16
|
|
bgt+ cr4, GetPARPageInfo_0x6c
|
|
lwz r9, 0x0004(r15)
|
|
andi. r16, r9, 0xc00
|
|
cmpwi cr6, r16, 0x400
|
|
cmpwi cr7, r16, 0xc00
|
|
beq- GetPARPageInfo_0xac
|
|
beq- cr6, GetPARPageInfo_0xb4
|
|
bne+ cr7, VMReturnMinus1
|
|
slwi r8, r8, 2
|
|
rlwinm r15, r9, 22, 0, 29
|
|
crset cr4_lt
|
|
b GetPARPageInfo_0x10
|
|
|
|
GetPARPageInfo_0xac
|
|
slwi r8, r8, 12
|
|
add r9, r9, r8
|
|
|
|
GetPARPageInfo_0xb4
|
|
rlwinm r16, r9, 0, 0, 19
|
|
crclr cr4_lt
|
|
rlwinm r9, r9, 0, 22, 19
|
|
rlwimi r16, r9, 1, 25, 25
|
|
rlwimi r16, r9, 31, 26, 26
|
|
xori r16, r16, 0x20
|
|
rlwimi r16, r9, 29, 27, 27
|
|
rlwimi r16, r9, 27, 28, 28
|
|
rlwimi r16, r9, 2, 29, 29
|
|
ori r16, r16, 0x01
|
|
mtcrf 0x07, r16
|
|
blr
|
|
|
|
|
|
|
|
;invalidates TLB entry for page?
|
|
;registers are assumed to be unmodified after call to VeryPopularFunction
|
|
;r4 is address
|
|
;r14 is address of HTAB entry
|
|
;r8 is upper word of HTAB entry
|
|
RemovePageFromTLB ; OUTSIDE REFERER
|
|
mfpvr r9
|
|
clrlwi r8, r8, 0x01 ;clear valid bit from upper word of HTAB entry
|
|
rlwinm. r9, r9, 0, 0, 14
|
|
stw r8, 0x0000(r14);store invalidated version of entry
|
|
slwi r9, r4, 12 ;get page number of address
|
|
sync
|
|
tlbie r9
|
|
beq- @is_601
|
|
sync
|
|
tlbsync
|
|
|
|
@is_601
|
|
sync
|
|
isync
|
|
lwz r9, 0x0004(r14)
|
|
oris r8, r8, 0x8000
|
|
rlwimi r16, r9, 29, 27, 27
|
|
rlwimi r16, r9, 27, 28, 28
|
|
mtcrf 0x07, r16
|
|
blr
|
|
|
|
|
|
|
|
;updates stored PTE and HTAB entry for PTE
|
|
;r16 is PTE value
|
|
;r15 is address of stored PTE
|
|
;r8 is lower word of HTAB entry
|
|
;r9 is upper word of HTAB entry
|
|
;r14 is address of HTAB entry
|
|
EditPTEInHTAB ; OUTSIDE REFERER
|
|
stw r16, 0x0000(r15)
|
|
;just updates HTAB entry
|
|
EditPTEOnlyInHTAB ; OUTSIDE REFERER
|
|
stw r9, 0x0004(r14);upper word of HTAB entry contains valid bit
|
|
eieio
|
|
stw r8, 0x0000(r14)
|
|
sync
|
|
blr
|
|
|
|
|
|
|
|
;Removes a page from the HTAB.
|
|
;Called right after GetPARPageInfo, with either a bl or a bltl cr5
|
|
;
|
|
;also updates NK statistics?
|
|
;r9 is low word of HTAB entry
|
|
;r14 ia address of HTAB entry
|
|
;r15 is address of stored PTE
|
|
;r16 is PTE value
|
|
RemovePTEFromHTAB ; OUTSIDE REFERER
|
|
lwz r8, 0x0e98(r1);update a value in NanoKernelInfo
|
|
rlwinm r16, r16, 0, 21, 19 ;update PTE flags to indicate not in HTAB
|
|
addi r8, r8, 0x01
|
|
stw r8, 0x0e98(r1)
|
|
rlwimi r16, r9, 0, 0, 19 ;move page# back into PTE
|
|
li r8, -0x01
|
|
stw r8, KDP. MinusOne1(r1)
|
|
stw r8, KDP. MinusOne2(r1)
|
|
stw r8, KDP. MinusOne3(r1)
|
|
stw r8, KDP. MinusOne4(r1)
|
|
li r8, 0x00 ;0 upper HTAB word
|
|
li r9, 0x00 ;0 lower HTAB word
|
|
b EditPTEInHTAB ;update stored PTE and invalidate HTAB entry
|
|
|
|
VMSecondLastExportedFunc ; OUTSIDE REFERER
|
|
lwz r8, KDP.PTEGMask(r1)
|
|
|
|
|
|
|
|
; VMLastExportedFunc
|
|
|
|
; Xrefs:
|
|
; RemovePTEFromHTAB
|
|
|
|
|
|
VMLastExportedFunc
|
|
lwz r14, KDP.HTABORG(r1)
|
|
slwi r9, r4, 12
|
|
mfsrin r6, r9
|
|
xor r9, r6, r4
|
|
slwi r7, r9, 6
|
|
and r8, r8, r7
|
|
lwzux r7, r14, r8
|
|
lwz r8, 0x0008(r14)
|
|
lwz r9, 0x0010(r14)
|
|
lwz r5, 0x0018(r14)
|
|
cmpwi r7, 0x00
|
|
cmpwi cr1, r8, 0x00
|
|
cmpwi cr2, r9, 0x00
|
|
cmpwi cr3, r5, 0x00
|
|
bge- VMLastExportedFunc_0x87
|
|
bge- cr1, VMLastExportedFunc_0x83
|
|
bge- cr2, VMLastExportedFunc_0x7f
|
|
bge- cr3, VMLastExportedFunc_0x7b
|
|
lwzu r7, 0x0020(r14)
|
|
lwz r8, 0x0008(r14)
|
|
lwz r9, 0x0010(r14)
|
|
lwz r5, 0x0018(r14)
|
|
cmpwi r7, 0x00
|
|
cmpwi cr1, r8, 0x00
|
|
cmpwi cr2, r9, 0x00
|
|
cmpwi cr3, r5, 0x00
|
|
bge- VMLastExportedFunc_0x87
|
|
bge- cr1, VMLastExportedFunc_0x83
|
|
bge- cr2, VMLastExportedFunc_0x7f
|
|
blt- cr3, VMLastExportedFunc_0xd7
|
|
|
|
VMLastExportedFunc_0x7b
|
|
addi r14, r14, 0x08
|
|
|
|
VMLastExportedFunc_0x7f
|
|
addi r14, r14, 0x08
|
|
|
|
VMLastExportedFunc_0x83
|
|
addi r14, r14, 0x08
|
|
|
|
VMLastExportedFunc_0x87
|
|
lwz r9, 0x0e94(r1)
|
|
rlwinm r8, r6, 7, 1, 24
|
|
addi r9, r9, 0x01
|
|
stw r9, 0x0e94(r1)
|
|
rlwimi r8, r4, 22, 26, 31
|
|
lwz r9, KDP.PageAttributeInit(r1)
|
|
oris r8, r8, 0x8000
|
|
rlwimi r9, r16, 0, 0, 19
|
|
ori r9, r9, 0x100
|
|
ori r16, r16, 0x08
|
|
rlwimi r9, r16, 3, 24, 24
|
|
rlwimi r9, r16, 31, 26, 26
|
|
rlwimi r9, r16, 1, 25, 25
|
|
xori r9, r9, 0x40
|
|
rlwimi r9, r16, 30, 31, 31
|
|
lwz r7, KDP.HTABORG(r1)
|
|
ori r16, r16, 0x801
|
|
subf r7, r7, r14
|
|
rlwimi r16, r7, 9, 0, 19
|
|
blr
|
|
|
|
VMLastExportedFunc_0xd7
|
|
mr r7, r27
|
|
mr r8, r29
|
|
mr r9, r30
|
|
mr r5, r31
|
|
mr r16, r28
|
|
mr r14, r26
|
|
mflr r6
|
|
slwi r27, r4, 12
|
|
bl PagingFunc1
|
|
bnel+ Local_Panic
|
|
mr r27, r7
|
|
mr r29, r8
|
|
mr r30, r9
|
|
mr r31, r5
|
|
mr r28, r16
|
|
mr r26, r14
|
|
lwz r9, KDP.PrimaryAddrRangePages(r1)
|
|
bl GetPARPageInfo
|
|
mtlr r6
|
|
b RemovePageFromTLB
|
|
|
|
|
|
|
|
; major_0x09c9c
|
|
|
|
; Xrefs:
|
|
; VMInit
|
|
|
|
major_0x09c9c ; OUTSIDE REFERER
|
|
addi r8, r1, 0x6c0
|
|
lwz r9, KDP.TotalPhysicalPages(r1)
|
|
rlwimi r8, r7, 18, 26, 29
|
|
cmplw r7, r9
|
|
lwz r8, 0x0000(r8)
|
|
rlwinm r7, r7, 2, 14, 29
|
|
bge+ VMReturnMinus1
|
|
lwzx r9, r8, r7
|
|
rlwinm r9, r9, 0, 0, 19
|
|
blr
|