mirror of
https://github.com/elliotnunn/powermac-rom.git
synced 2024-11-29 12:49:58 +00:00
1899 lines
36 KiB
ArmAsm
1899 lines
36 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
|
|
|
|
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<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
|
|
|
|
_InvalNCBPointerCache scratch=r8
|
|
|
|
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
|
|
|
|
|
|
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
|
|
|
|
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
|