Reverse some VM functions (Daniel)

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.
This commit is contained in:
Elliot Nunn 2018-02-18 11:17:23 +08:00
parent 9722f8ba5e
commit a323be3c8b
2 changed files with 141 additions and 191 deletions

View File

@ -724,17 +724,17 @@ MPCall_0 ; OUTSIDE REFERER
_Lock PSA.HTABLock, scratch1=r17, scratch2=r18 _Lock PSA.HTABLock, scratch1=r17, scratch2=r18
bl VeryPopularFunction bl GetPARPageInfo
bge- cr4, MPCall_0_0xd8 bge- cr4, MPCall_0_0xd8
bgt- cr5, MPCall_0_0xd8 bgt- cr5, MPCall_0_0xd8
bns- cr7, MPCall_0_0xd8 bns- cr7, MPCall_0_0xd8
bgt- cr7, MPCall_0_0xd8 bgt- cr7, MPCall_0_0xd8
bltl+ cr5, VMDoSomethingWithTLB bltl+ cr5, RemovePageFromTLB
bgel+ cr5, VMSecondLastExportedFunc bgel+ cr5, VMSecondLastExportedFunc
ori r16, r16, 0x404 ori r16, r16, 0x404
li r31, 0x03 li r31, 0x03
rlwimi r9, r31, 0, 30, 31 rlwimi r9, r31, 0, 30, 31
bl VMDoSomeIO bl EditPTEInHTAB
mr r7, r30 mr r7, r30
mr r6, r29 mr r6, r29
_AssertAndRelease PSA.HTABLock, scratch=r16 _AssertAndRelease PSA.HTABLock, scratch=r16

View File

@ -164,7 +164,7 @@ VMDispatchTableEnd
; setPTEntryGivenPage ; setPTEntryGivenPage
; VMShouldClean ; VMShouldClean
; VMAllocateMemory ; VMAllocateMemory
; VeryPopularFunction ; GetPARPageInfo
; major_0x09c9c ; major_0x09c9c
VMReturnMinus1 ; OUTSIDE REFERER VMReturnMinus1 ; OUTSIDE REFERER
@ -231,13 +231,13 @@ VMFinalInit ; OUTSIDE REFERER
@loop @loop
srwi r4, r31, 12 srwi r4, r31, 12
lwz r9, KDP.PrimaryAddrRangePages(r1) lwz r9, KDP.PrimaryAddrRangePages(r1)
bl VeryPopularFunction bl GetPARPageInfo
bge- cr4, @skip bge- cr4, @skip
bltl- cr5, VMDoSomethingWithTLB bltl- cr5, RemovePageFromTLB
bgel- cr5, VMSecondLastExportedFunc bgel- cr5, VMSecondLastExportedFunc
ori r16, r16, 0x400 ori r16, r16, 0x400
rlwimi r9, r29, 0, 0, 19 rlwimi r9, r29, 0, 0, 19
bl major_0x09b40 bl RemovePTEFromHTAB
addi r31, r31, 0x1000 addi r31, r31, 0x1000
cmplw r31, r30 cmplw r31, r30
ble+ @loop ble+ @loop
@ -315,8 +315,8 @@ VMInit_0xa8
rlwimi r3, r8, 21, 12, 15 rlwimi r3, r8, 21, 12, 15
cmpw r3, r4 cmpw r3, r4
bnel+ Local_Panic bnel+ Local_Panic
bl VMDoSomethingWithTLB bl RemovePageFromTLB
bl major_0x09b40 bl RemovePTEFromHTAB
VMInit_0x100 VMInit_0x100
cmpwi r7, 0x00 cmpwi r7, 0x00
@ -514,26 +514,26 @@ VMInit_Fail
DeclareVMCallWithAlt 12, VMExchangePages, VMReturnNotReady DeclareVMCallWithAlt 12, VMExchangePages, VMReturnNotReady
VMExchangePages ; OUTSIDE REFERER VMExchangePages ; OUTSIDE REFERER
bl VeryPopularFunction bl GetPARPageInfo
bge+ cr4, VMReturnMinus1 bge+ cr4, VMReturnMinus1
bgt+ cr5, VMReturnMinus1 bgt+ cr5, VMReturnMinus1
bns+ cr7, VMReturnMinus1 bns+ cr7, VMReturnMinus1
bgt+ cr6, VMReturnMinus1 bgt+ cr6, VMReturnMinus1
bne+ cr6, VMReturnMinus1 bne+ cr6, VMReturnMinus1
bltl- cr5, VMDoSomethingWithTLB bltl- cr5, RemovePageFromTLB
bltl- cr5, major_0x09b40 bltl- cr5, RemovePTEFromHTAB
mr r6, r15 mr r6, r15
mr r4, r5 mr r4, r5
mr r5, r16 mr r5, r16
lwz r9, KDP.PrimaryAddrRangePages(r1) lwz r9, KDP.PrimaryAddrRangePages(r1)
bl VeryPopularFunction bl GetPARPageInfo
bge+ cr4, VMReturnMinus1 bge+ cr4, VMReturnMinus1
bgt+ cr5, VMReturnMinus1 bgt+ cr5, VMReturnMinus1
bns+ cr7, VMReturnMinus1 bns+ cr7, VMReturnMinus1
bgt+ cr6, VMReturnMinus1 bgt+ cr6, VMReturnMinus1
bne+ cr6, VMReturnMinus1 bne+ cr6, VMReturnMinus1
bltl- cr5, VMDoSomethingWithTLB bltl- cr5, RemovePageFromTLB
bltl- cr5, major_0x09b40 bltl- cr5, RemovePTEFromHTAB
stw r5, 0x0000(r15) stw r5, 0x0000(r15)
stw r16, 0x0000(r6) stw r16, 0x0000(r6)
rlwinm r4, r5, 0, 0, 19 rlwinm r4, r5, 0, 0, 19
@ -578,7 +578,7 @@ VMGetPhysicalPage_0x28
lwz r9, KDP.PrimaryAddrRangePages(r1) lwz r9, KDP.PrimaryAddrRangePages(r1)
VMGetPhysicalPage_0x30 VMGetPhysicalPage_0x30
bl VeryPopularFunction bl GetPARPageInfo
bns+ cr7, VMReturnMinus1 bns+ cr7, VMReturnMinus1
srwi r3, r9, 12 srwi r3, r9, 12
b VMReturn b VMReturn
@ -621,13 +621,13 @@ getPTEntryGivenPage_0x48
lwz r9, KDP.PrimaryAddrRangePages(r1) lwz r9, KDP.PrimaryAddrRangePages(r1)
getPTEntryGivenPage_0x50 getPTEntryGivenPage_0x50
bl VeryPopularFunction bl GetPARPageInfo
mr r3, r16 mr r3, r16
bns- cr7, getPTEntryGivenPage_0x74 bns- cr7, getPTEntryGivenPage_0x74
rlwimi r3, r9, 0, 0, 19 rlwimi r3, r9, 0, 0, 19
bge- cr5, getPTEntryGivenPage_0x74 bge- cr5, getPTEntryGivenPage_0x74
bl VMDoSomethingWithTLB bl RemovePageFromTLB
bl VMDoSomeIO_0x4 bl EditPTEOnlyInHTAB
mr r3, r16 mr r3, r16
rlwimi r3, r9, 0, 0, 19 rlwimi r3, r9, 0, 0, 19
@ -713,7 +713,7 @@ major_0x08d88_0xb0 ; OUTSIDE REFERER
DeclareVMCallWithAlt 5, VMIsInited, VMReturnNotReady DeclareVMCallWithAlt 5, VMIsInited, VMReturnNotReady
VMIsInited ; OUTSIDE REFERER VMIsInited ; OUTSIDE REFERER
bl VeryPopularFunction bl GetPARPageInfo
bso+ cr7, VMReturn1 bso+ cr7, VMReturn1
rlwinm r3, r16, 16, 31, 31 rlwinm r3, r16, 16, 31, 31
b VMReturn b VMReturn
@ -746,7 +746,7 @@ VMIsResident_0x28
lwz r9, KDP.PrimaryAddrRangePages(r1) lwz r9, KDP.PrimaryAddrRangePages(r1)
VMIsResident_0x30 VMIsResident_0x30
bl VeryPopularFunction bl GetPARPageInfo
clrlwi r3, r16, 0x1f clrlwi r3, r16, 0x1f
b VMReturn b VMReturn
@ -757,12 +757,12 @@ VMIsResident_0x30
DeclareVMCallWithAlt 4, VMIsUnmodified, VMReturnNotReady DeclareVMCallWithAlt 4, VMIsUnmodified, VMReturnNotReady
VMIsUnmodified ; OUTSIDE REFERER VMIsUnmodified ; OUTSIDE REFERER
bl VeryPopularFunction bl GetPARPageInfo
rlwinm r3, r16, 28, 31, 31 rlwinm r3, r16, 28, 31, 31
xori r3, r3, 0x01 xori r3, r3, 0x01
bge+ cr5, VMReturn bge+ cr5, VMReturn
bl VMDoSomethingWithTLB bl RemovePageFromTLB
bl VMDoSomeIO_0x4 bl EditPTEOnlyInHTAB
rlwinm r3, r16, 28, 31, 31 rlwinm r3, r16, 28, 31, 31
xori r3, r3, 0x01 xori r3, r3, 0x01
b VMReturn b VMReturn
@ -792,9 +792,9 @@ VMLRU_0x1c
bge- cr5, VMLRU_0x50 bge- cr5, VMLRU_0x50
add r14, r14, r7 add r14, r14, r7
lwz r8, 0x0000(r14) lwz r8, 0x0000(r14)
bl VMDoSomethingWithTLB bl RemovePageFromTLB
andc r9, r9, r5 andc r9, r9, r5
bl major_0x09b40 bl RemovePTEFromHTAB
subf r14, r7, r14 subf r14, r7, r14
VMLRU_0x50 VMLRU_0x50
@ -846,20 +846,20 @@ VMMakePageCacheable ; OUTSIDE REFERER
bne- cr1, VMMakePageCacheable_0x4 bne- cr1, VMMakePageCacheable_0x4
VMMakePageCacheable_0x4 VMMakePageCacheable_0x4
bl VeryPopularFunction bl GetPARPageInfo
rlwinm r7, r16, 0, 25, 26 rlwinm r7, r16, 0, 25, 26
cmpwi r7, 0x20 cmpwi r7, 0x20
bns+ cr7, VMReturnMinus1 bns+ cr7, VMReturnMinus1
beq+ VMReturn beq+ VMReturn
bge- cr4, VMMakePageCacheable_0x40 bge- cr4, VMMakePageCacheable_0x40
bltl- cr5, VMDoSomethingWithTLB bltl- cr5, RemovePageFromTLB
bgel- cr5, VMSecondLastExportedFunc bgel- cr5, VMSecondLastExportedFunc
rlwinm r16, r16, 0, 27, 24 rlwinm r16, r16, 0, 27, 24
rlwinm r9, r9, 0, 27, 24 rlwinm r9, r9, 0, 27, 24
lwz r7, KDP.PageAttributeInit(r1) lwz r7, KDP.PageAttributeInit(r1)
rlwimi r9, r7, 0, 27, 28 rlwimi r9, r7, 0, 27, 28
ori r16, r16, 0x20 ori r16, r16, 0x20
bl VMDoSomeIO bl EditPTEInHTAB
b VMReturn b VMReturn
VMMakePageCacheable_0x40 VMMakePageCacheable_0x40
@ -922,19 +922,19 @@ VMMakePageWriteThrough ; OUTSIDE REFERER
bne- cr1, VMMakePageWriteThrough_0x4 bne- cr1, VMMakePageWriteThrough_0x4
VMMakePageWriteThrough_0x4 VMMakePageWriteThrough_0x4
bl VeryPopularFunction bl GetPARPageInfo
rlwinm. r7, r16, 0, 25, 26 rlwinm. r7, r16, 0, 25, 26
bns+ cr7, VMReturnMinus1 bns+ cr7, VMReturnMinus1
beq+ VMReturn beq+ VMReturn
bge- cr4, VMMakePageWriteThrough_0x3c bge- cr4, VMMakePageWriteThrough_0x3c
bltl- cr5, VMDoSomethingWithTLB bltl- cr5, RemovePageFromTLB
bgel- cr5, VMSecondLastExportedFunc bgel- cr5, VMSecondLastExportedFunc
rlwinm r16, r16, 0, 27, 24 rlwinm r16, r16, 0, 27, 24
rlwinm r9, r9, 0, 27, 24 rlwinm r9, r9, 0, 27, 24
lwz r7, KDP.PageAttributeInit(r1) lwz r7, KDP.PageAttributeInit(r1)
rlwimi r9, r7, 0, 27, 28 rlwimi r9, r7, 0, 27, 28
ori r9, r9, 0x40 ori r9, r9, 0x40
bl VMDoSomeIO bl EditPTEInHTAB
b VMMakePageNonCacheable_0x3c b VMMakePageNonCacheable_0x3c
VMMakePageWriteThrough_0x3c VMMakePageWriteThrough_0x3c
@ -1056,10 +1056,10 @@ PageSetCommon_0xc4
addi r14, r14, 0x08 addi r14, r14, 0x08
PageSetCommon_0xc8 PageSetCommon_0xc8
bl VMDoSomethingWithTLB bl RemovePageFromTLB
li r8, 0x00 li r8, 0x00
li r9, 0x00 li r9, 0x00
bl VMDoSomeIO_0x4 bl EditPTEOnlyInHTAB
b VMReturn b VMReturn
@ -1072,20 +1072,20 @@ VMMakePageNonCacheable ; OUTSIDE REFERER
bne- cr1, VMMakePageNonCacheable_0x4 bne- cr1, VMMakePageNonCacheable_0x4
VMMakePageNonCacheable_0x4 VMMakePageNonCacheable_0x4
bl VeryPopularFunction bl GetPARPageInfo
rlwinm r7, r16, 0, 25, 26 rlwinm r7, r16, 0, 25, 26
cmpwi r7, 0x60 cmpwi r7, 0x60
bns+ cr7, VMReturnMinus1 bns+ cr7, VMReturnMinus1
beq+ VMReturn beq+ VMReturn
bge- cr4, VMMakePageNonCacheable_0x78 bge- cr4, VMMakePageNonCacheable_0x78
bltl- cr5, VMDoSomethingWithTLB bltl- cr5, RemovePageFromTLB
bgel- cr5, VMSecondLastExportedFunc bgel- cr5, VMSecondLastExportedFunc
rlwinm r9, r9, 0, 27, 24 rlwinm r9, r9, 0, 27, 24
lwz r7, KDP.PageAttributeInit(r1) lwz r7, KDP.PageAttributeInit(r1)
rlwimi r9, r7, 0, 27, 28 rlwimi r9, r7, 0, 27, 28
ori r16, r16, 0x60 ori r16, r16, 0x60
ori r9, r9, 0x20 ori r9, r9, 0x20
bl VMDoSomeIO bl EditPTEInHTAB
VMMakePageNonCacheable_0x3c ; OUTSIDE REFERER VMMakePageNonCacheable_0x3c ; OUTSIDE REFERER
rlwinm r4, r9, 0, 0, 19 rlwinm r4, r9, 0, 0, 19
@ -1200,11 +1200,11 @@ VMMarkBacking_0x50
lwz r9, KDP.PrimaryAddrRangePages(r1) lwz r9, KDP.PrimaryAddrRangePages(r1)
VMMarkBacking_0x58 VMMarkBacking_0x58
bl VeryPopularFunction bl GetPARPageInfo
bge+ cr4, VMReturnMinus1 bge+ cr4, VMReturnMinus1
bgt+ cr5, VMReturnMinus1 bgt+ cr5, VMReturnMinus1
bltl- cr5, VMDoSomethingWithTLB bltl- cr5, RemovePageFromTLB
bltl- cr5, major_0x09b40 bltl- cr5, RemovePTEFromHTAB
rlwimi r16, r5, 16, 15, 15 rlwimi r16, r5, 16, 15, 15
li r7, 0x01 li r7, 0x01
andc r16, r16, r7 andc r16, r16, r7
@ -1218,16 +1218,16 @@ VMMarkBacking_0x58
DeclareVMCallWithAlt 9, VMMarkCleanUnused, VMReturnNotReady DeclareVMCallWithAlt 9, VMMarkCleanUnused, VMReturnNotReady
VMMarkCleanUnused ; OUTSIDE REFERER VMMarkCleanUnused ; OUTSIDE REFERER
bl VeryPopularFunction bl GetPARPageInfo
bge+ cr4, VMReturnMinus1 bge+ cr4, VMReturnMinus1
bns+ cr7, VMReturnMinus1 bns+ cr7, VMReturnMinus1
bltl- cr5, VMDoSomethingWithTLB bltl- cr5, RemovePageFromTLB
beq- cr2, VMMarkCleanUnused_0x2c beq- cr2, VMMarkCleanUnused_0x2c
bgel- cr5, VMSecondLastExportedFunc bgel- cr5, VMSecondLastExportedFunc
li r7, 0x180 li r7, 0x180
andc r9, r9, r7 andc r9, r9, r7
ori r16, r16, 0x100 ori r16, r16, 0x100
bl VMDoSomeIO bl EditPTEInHTAB
b VMReturn b VMReturn
VMMarkCleanUnused_0x2c VMMarkCleanUnused_0x2c
@ -1235,7 +1235,7 @@ VMMarkCleanUnused_0x2c
ori r16, r16, 0x100 ori r16, r16, 0x100
li r7, 0x18 li r7, 0x18
andc r16, r16, r7 andc r16, r16, r7
bl major_0x09b40 bl RemovePTEFromHTAB
b VMReturn b VMReturn
@ -1303,7 +1303,7 @@ VMMarkResident_0x50
lwz r9, KDP.PrimaryAddrRangePages(r1) lwz r9, KDP.PrimaryAddrRangePages(r1)
VMMarkResident_0x58 VMMarkResident_0x58
bl VeryPopularFunction bl GetPARPageInfo
bge+ cr4, VMReturnMinus1 bge+ cr4, VMReturnMinus1
bso+ cr7, VMReturnMinus1 bso+ cr7, VMReturnMinus1
bltl+ cr5, Local_Panic bltl+ cr5, Local_Panic
@ -1311,7 +1311,7 @@ VMMarkResident_0x58
ori r16, r16, 0x01 ori r16, r16, 0x01
stw r16, 0x0000(r15) stw r16, 0x0000(r15)
bl VMSecondLastExportedFunc bl VMSecondLastExportedFunc
bl VMDoSomeIO bl EditPTEInHTAB
b VMReturn b VMReturn
@ -1325,7 +1325,7 @@ VMPTest ; OUTSIDE REFERER
cmplw r4, r9 cmplw r4, r9
li r3, 0x4000 li r3, 0x4000
bge+ VMReturn bge+ VMReturn
bl VeryPopularFunction bl GetPARPageInfo
li r3, 0x400 li r3, 0x400
bns+ cr7, VMReturn bns+ cr7, VMReturn
li r3, 0x00 li r3, 0x00
@ -1381,7 +1381,7 @@ setPTEntryGivenPage_0x5c
setPTEntryGivenPage_0x64 setPTEntryGivenPage_0x64
mr r6, r4 mr r6, r4
mr r4, r5 mr r4, r5
bl VeryPopularFunction bl GetPARPageInfo
bge+ cr4, VMReturnMinus1 bge+ cr4, VMReturnMinus1
xor r7, r16, r6 xor r7, r16, r6
li r3, 0x461 li r3, 0x461
@ -1392,19 +1392,19 @@ setPTEntryGivenPage_0x64
xor r16, r16, r7 xor r16, r16, r7
stw r16, 0x0000(r15) stw r16, 0x0000(r15)
bge+ cr5, VMReturn bge+ cr5, VMReturn
bl VMDoSomethingWithTLB bl RemovePageFromTLB
lwz r16, 0x0000(r15) lwz r16, 0x0000(r15)
bne- cr2, setPTEntryGivenPage_0xb4 bne- cr2, setPTEntryGivenPage_0xb4
andi. r7, r16, 0x08 andi. r7, r16, 0x08
bne- setPTEntryGivenPage_0xb4 bne- setPTEntryGivenPage_0xb4
bl major_0x09b40 bl RemovePTEFromHTAB
b VMReturn b VMReturn
setPTEntryGivenPage_0xb4 setPTEntryGivenPage_0xb4
rlwimi r9, r16, 5, 23, 23 rlwimi r9, r16, 5, 23, 23
rlwimi r9, r16, 3, 24, 24 rlwimi r9, r16, 3, 24, 24
rlwimi r9, r16, 30, 31, 31 rlwimi r9, r16, 30, 31, 31
bl VMDoSomeIO_0x4 bl EditPTEOnlyInHTAB
b VMReturn b VMReturn
@ -1414,10 +1414,10 @@ setPTEntryGivenPage_0xb4
DeclareVMCallWithAlt 6, VMShouldClean, VMReturnNotReady DeclareVMCallWithAlt 6, VMShouldClean, VMReturnNotReady
VMShouldClean ; OUTSIDE REFERER VMShouldClean ; OUTSIDE REFERER
bl VeryPopularFunction bl GetPARPageInfo
bns+ cr7, VMReturn0 bns+ cr7, VMReturn0
bge+ cr4, VMReturnMinus1 bge+ cr4, VMReturnMinus1
bltl- cr5, VMDoSomethingWithTLB bltl- cr5, RemovePageFromTLB
blt- cr7, VMShouldClean_0x34 blt- cr7, VMShouldClean_0x34
bns- cr6, VMShouldClean_0x34 bns- cr6, VMShouldClean_0x34
xori r16, r16, 0x10 xori r16, r16, 0x10
@ -1425,11 +1425,11 @@ VMShouldClean ; OUTSIDE REFERER
stw r16, 0x0000(r15) stw r16, 0x0000(r15)
bge+ cr5, VMReturn1 bge+ cr5, VMReturn1
xori r9, r9, 0x80 xori r9, r9, 0x80
bl VMDoSomeIO_0x4 bl EditPTEOnlyInHTAB
b VMReturn1 b VMReturn1
VMShouldClean_0x34 VMShouldClean_0x34
bltl- cr5, VMDoSomeIO_0x4 bltl- cr5, EditPTEOnlyInHTAB
b VMReturn0 b VMReturn0
@ -1473,9 +1473,9 @@ VMAllocateMemory_0x6c
VMAllocateMemory_0x74 VMAllocateMemory_0x74
addi r4, r4, -0x01 addi r4, r4, -0x01
bl VeryPopularFunction bl GetPARPageInfo
bltl- cr5, VMDoSomethingWithTLB bltl- cr5, RemovePageFromTLB
bltl- cr5, major_0x09b40 bltl- cr5, RemovePTEFromHTAB
lwz r9, KDP.PrimaryAddrRangePages(r1) lwz r9, KDP.PrimaryAddrRangePages(r1)
subf r8, r4, r9 subf r8, r4, r9
cmplw cr7, r5, r8 cmplw cr7, r5, r8
@ -1684,87 +1684,72 @@ VMAllocateMemory_0x360
; VeryPopularFunction ;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
; Xrefs: ; ARG page# r4, KDP.VMMaxVirtualPages r9,
; VMFinalInit ; RET PTE_flags CR, HTAB_upper r8, HTAB_lower r9, PTE_value r16, HTAB_entry_loc r14, PTE_loc r15,
; VMExchangePages
; VMGetPhysicalPage
; getPTEntryGivenPage
; VMIsInited
; VMIsResident
; VMIsUnmodified
; VMMakePageCacheable
; VMMakePageWriteThrough
; VMMakePageNonCacheable
; VMMarkBacking
; VMMarkCleanUnused
; VMMarkResident
; VMPTest
; setPTEntryGivenPage
; VMShouldClean
; VMAllocateMemory
; VMLastExportedFunc
; major_0x0b144
VeryPopularFunction ; OUTSIDE REFERER
cmplw cr4, r4, r9 GetPARPageInfo ; OUTSIDE REFERER
cmplw cr4, r4, r9 ;r9 is VMMaxVirtualPages by convention
lwz r15, KDP.FlatPageListPtr(r1) lwz r15, KDP.FlatPageListPtr(r1)
slwi r8, r4, 2 slwi r8, r4, 2
bge- cr4, VeryPopularFunction_0x40 bge- cr4, GetPARPageInfo_0x40
VeryPopularFunction_0x10 GetPARPageInfo_0x10
lwzux r16, r15, r8 lwzux r16, r15, r8 ;get PTE from KDP.FlatPageListPointer
lwz r14, KDP.HTABORG(r1) lwz r14, KDP.HTABORG(r1)
mtcrf 0x07, r16 mtcrf 0x07, r16 ;copy bits 20-31 to cr
rlwinm r8, r16, 23, 9, 28 rlwinm r8, r16, 23, 9, 28;convert page# into an index
rlwinm r9, r16, 0, 0, 19 rlwinm r9, r16, 0, 0, 19;get unshifted page#
bgelr- cr5 bgelr- cr5 ;return if PTE is not in HTAB
lwzux r8, r14, r8 lwzux r8, r14, r8 ;get first word of PTE from HTAB
lwz r9, 0x0004(r14) lwz r9, 0x0004(r14);get second word of PTE from HTAB
mtcrf 0x80, r8 mtcrf 0x80, r8
bns+ cr7, Local_Panic bns+ cr7, Local_Panic;panic if the PTE is in the HTAB but isn't mapped to a real page
bltlr- bltlr- ;return if PTE is valid
bl Local_Panic bl Local_Panic;panic if PTE isn't valid but is in the HTAB
VeryPopularFunction_0x40 GetPARPageInfo_0x40 ;some kind of little-used code path for when VMMaxVirtualPages is invalid? ROM overlay?
lwz r9, KDP.VMMaxVirtualPages(r1) lwz r9, KDP.VMMaxVirtualPages(r1)
cmplw cr4, r4, r9 cmplw cr4, r4, r9
rlwinm. r9, r4, 0, 0, 11 rlwinm. r9, r4, 0, 0, 11
blt+ cr4, VMReturnMinus1 blt+ cr4, VMReturnMinus1;return failure if r4<VMMaxVirtualPages
bne+ VMReturnMinus1 bne+ VMReturnMinus1 ;return failure if bits 0-11 of r4 are non-zero
lwz r15, 0x05e8(r1) lwz r15, 0x05e8(r1);this appears to be an array of 8-byte structures.
rlwinm r9, r4, 19, 25, 28 rlwinm r9, r4, 19, 25, 28;copy bits 12-15 or r4 to bits 25-28 of r9
lwzx r15, r15, r9 lwzx r15, r15, r9 ;do an index for some reason
clrlwi r9, r4, 0x10 clrlwi r9, r4, 0x10 ;copy bits 16-31 to r9
lhz r8, 0x0000(r15) lhz r8, 0x0000(r15)
b VeryPopularFunction_0x70 b GetPARPageInfo_0x70
VeryPopularFunction_0x6c GetPARPageInfo_0x6c
lhzu r8, 0x0008(r15) lhzu r8, 0x0008(r15)
VeryPopularFunction_0x70 GetPARPageInfo_0x70
lhz r16, 0x0002(r15) lhz r16, 0x0002(r15)
subf r8, r8, r9 subf r8, r8, r9
cmplw cr4, r8, r16 cmplw cr4, r8, r16
bgt+ cr4, VeryPopularFunction_0x6c bgt+ cr4, GetPARPageInfo_0x6c
lwz r9, 0x0004(r15) lwz r9, 0x0004(r15)
andi. r16, r9, 0xc00 andi. r16, r9, 0xc00
cmpwi cr6, r16, 0x400 cmpwi cr6, r16, 0x400
cmpwi cr7, r16, 0xc00 cmpwi cr7, r16, 0xc00
beq- VeryPopularFunction_0xac beq- GetPARPageInfo_0xac
beq- cr6, VeryPopularFunction_0xb4 beq- cr6, GetPARPageInfo_0xb4
bne+ cr7, VMReturnMinus1 bne+ cr7, VMReturnMinus1
slwi r8, r8, 2 slwi r8, r8, 2
rlwinm r15, r9, 22, 0, 29 rlwinm r15, r9, 22, 0, 29
crset cr4_lt crset cr4_lt
b VeryPopularFunction_0x10 b GetPARPageInfo_0x10
VeryPopularFunction_0xac GetPARPageInfo_0xac
slwi r8, r8, 12 slwi r8, r8, 12
add r9, r9, r8 add r9, r9, r8
VeryPopularFunction_0xb4 GetPARPageInfo_0xb4
rlwinm r16, r9, 0, 0, 19 rlwinm r16, r9, 0, 0, 19
crclr cr4_lt crclr cr4_lt
rlwinm r9, r9, 0, 22, 19 rlwinm r9, r9, 0, 22, 19
@ -1780,40 +1765,24 @@ VeryPopularFunction_0xb4
; VMDoSomethingWithTLB ;invalidates TLB entry for page?
;registers are assumed to be unmodified after call to VeryPopularFunction
; Xrefs: ;r4 is address
; VMFinalInit ;r14 is address of HTAB entry
; VMInit ;r8 is upper word of HTAB entry
; VMExchangePages RemovePageFromTLB ; OUTSIDE REFERER
; getPTEntryGivenPage
; VMIsUnmodified
; VMLRU
; VMMakePageCacheable
; VMMakePageWriteThrough
; PageSetCommon
; VMMakePageNonCacheable
; VMMarkBacking
; VMMarkCleanUnused
; setPTEntryGivenPage
; VMShouldClean
; VMAllocateMemory
; VMLastExportedFunc
; major_0x0b144
VMDoSomethingWithTLB ; OUTSIDE REFERER
mfpvr r9 mfpvr r9
clrlwi r8, r8, 0x01 clrlwi r8, r8, 0x01 ;clear valid bit from upper word of HTAB entry
rlwinm. r9, r9, 0, 0, 14 rlwinm. r9, r9, 0, 0, 14
stw r8, 0x0000(r14) stw r8, 0x0000(r14);store invalidated version of entry
slwi r9, r4, 12 slwi r9, r4, 12 ;get page number of address
sync sync
tlbie r9 tlbie r9
beq- VMDoSomethingWithTLB_0x28 beq- @is_601
sync sync
tlbsync tlbsync
VMDoSomethingWithTLB_0x28 @is_601
sync sync
isync isync
lwz r9, 0x0004(r14) lwz r9, 0x0004(r14)
@ -1821,69 +1790,50 @@ VMDoSomethingWithTLB_0x28
rlwimi r16, r9, 29, 27, 27 rlwimi r16, r9, 29, 27, 27
rlwimi r16, r9, 27, 28, 28 rlwimi r16, r9, 27, 28, 28
mtcrf 0x07, r16 mtcrf 0x07, r16
blr blr
; VMDoSomeIO ;updates stored PTE and HTAB entry for PTE
;r16 is PTE value
; Xrefs: ;r15 is address of stored PTE
; getPTEntryGivenPage ;r8 is lower word of HTAB entry
; VMIsUnmodified ;r9 is upper word of HTAB entry
; VMMakePageCacheable ;r14 is address of HTAB entry
; VMMakePageWriteThrough EditPTEInHTAB ; OUTSIDE REFERER
; PageSetCommon
; VMMakePageNonCacheable
; VMMarkCleanUnused
; VMMarkResident
; setPTEntryGivenPage
; VMShouldClean
; major_0x09b40
; major_0x0b144
VMDoSomeIO ; OUTSIDE REFERER
stw r16, 0x0000(r15) stw r16, 0x0000(r15)
;just updates HTAB entry
VMDoSomeIO_0x4 ; OUTSIDE REFERER EditPTEOnlyInHTAB ; OUTSIDE REFERER
stw r9, 0x0004(r14) stw r9, 0x0004(r14);upper word of HTAB entry contains valid bit
eieio eieio
stw r8, 0x0000(r14) stw r8, 0x0000(r14)
sync sync
blr blr
; major_0x09b40 ;Removes a page from the HTAB.
;Called right after GetPARPageInfo, with either a bl or a bltl cr5
; Xrefs: ;
; VMFinalInit ;also updates NK statistics?
; VMInit ;r9 is low word of HTAB entry
; VMExchangePages ;r14 ia address of HTAB entry
; VMLRU ;r15 is address of stored PTE
; VMMakePageCacheable ;r16 is PTE value
; VMMakePageWriteThrough RemovePTEFromHTAB ; OUTSIDE REFERER
; VMMakePageNonCacheable lwz r8, 0x0e98(r1);update a value in NanoKernelInfo
; VMMarkBacking rlwinm r16, r16, 0, 21, 19 ;update PTE flags to indicate not in HTAB
; VMMarkCleanUnused
; VMMarkResident
; setPTEntryGivenPage
; VMAllocateMemory
; major_0x0b144
major_0x09b40 ; OUTSIDE REFERER
lwz r8, 0x0e98(r1)
rlwinm r16, r16, 0, 21, 19
addi r8, r8, 0x01 addi r8, r8, 0x01
stw r8, 0x0e98(r1) stw r8, 0x0e98(r1)
rlwimi r16, r9, 0, 0, 19 rlwimi r16, r9, 0, 0, 19 ;move page# back into PTE
li r8, -0x01 li r8, -0x01
stw r8, 0x0340(r1) stw r8, KDP. MinusOne1(r1)
stw r8, 0x0348(r1) stw r8, KDP. MinusOne2(r1)
stw r8, 0x0350(r1) stw r8, KDP. MinusOne3(r1)
stw r8, 0x0358(r1) stw r8, KDP. MinusOne4(r1)
li r8, 0x00 li r8, 0x00 ;0 upper HTAB word
li r9, 0x00 li r9, 0x00 ;0 lower HTAB word
b VMDoSomeIO b EditPTEInHTAB ;update stored PTE and invalidate HTAB entry
VMSecondLastExportedFunc ; OUTSIDE REFERER VMSecondLastExportedFunc ; OUTSIDE REFERER
lwz r8, KDP.PTEGMask(r1) lwz r8, KDP.PTEGMask(r1)
@ -1893,7 +1843,7 @@ VMSecondLastExportedFunc ; OUTSIDE REFERER
; VMLastExportedFunc ; VMLastExportedFunc
; Xrefs: ; Xrefs:
; major_0x09b40 ; RemovePTEFromHTAB
VMLastExportedFunc VMLastExportedFunc
@ -1977,9 +1927,9 @@ VMLastExportedFunc_0xd7
mr r28, r16 mr r28, r16
mr r26, r14 mr r26, r14
lwz r9, KDP.PrimaryAddrRangePages(r1) lwz r9, KDP.PrimaryAddrRangePages(r1)
bl VeryPopularFunction bl GetPARPageInfo
mtlr r6 mtlr r6
b VMDoSomethingWithTLB b RemovePageFromTLB