X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/cc9f6e38162d3c1bf6ca97536c2477f476c8e01b..3a60a9f5b85abb8c2cf24e1926c5c7b3f608a5e2:/osfmk/ppc/hw_vm.s diff --git a/osfmk/ppc/hw_vm.s b/osfmk/ppc/hw_vm.s index 988b3e373..e13bd5cfb 100644 --- a/osfmk/ppc/hw_vm.s +++ b/osfmk/ppc/hw_vm.s @@ -31,8 +31,6 @@ #include #include #include - -#define INSTRUMENT 0 .text @@ -199,53 +197,28 @@ hamRescan: lwz r4,mpVAddr(r31) ; Get the new vaddr top half mr r29,r4 ; Save top half of vaddr for later mr r30,r5 ; Save bottom half of vaddr for later -#if INSTRUMENT - mfspr r0,pmc1 ; INSTRUMENT - saveinstr[16] - Take stamp before mapSearchFull - stw r0,0x6100+(16*16)+0x0(0) ; INSTRUMENT - Save it - mfspr r0,pmc2 ; INSTRUMENT - Get stamp - stw r0,0x6100+(16*16)+0x4(0) ; INSTRUMENT - Save it - mfspr r0,pmc3 ; INSTRUMENT - Get stamp - stw r0,0x6100+(16*16)+0x8(0) ; INSTRUMENT - Save it - mfspr r0,pmc4 ; INSTRUMENT - Get stamp - stw r0,0x6100+(16*16)+0xC(0) ; INSTRUMENT - Save it -#endif - bl EXT(mapSearchFull) ; Go see if we can find it -#if INSTRUMENT - mfspr r0,pmc1 ; INSTRUMENT - saveinstr[14] - Take stamp after mapSearchFull - stw r0,0x6100+(17*16)+0x0(0) ; INSTRUMENT - Save it - mfspr r0,pmc2 ; INSTRUMENT - Get stamp - stw r0,0x6100+(17*16)+0x4(0) ; INSTRUMENT - Save it - mfspr r0,pmc3 ; INSTRUMENT - Get stamp - stw r0,0x6100+(17*16)+0x8(0) ; INSTRUMENT - Save it - mfspr r0,pmc4 ; INSTRUMENT - Get stamp - stw r0,0x6100+(17*16)+0xC(0) ; INSTRUMENT - Save it -#endif - - rlwinm r0,r24,0,mpType ; Isolate the mapping type - rlwinm r23,r23,12,0,19 ; Convert standard block size to bytes - cmplwi r0,mpNest ; Is this a nested type? - cmplwi cr1,r0,mpLinkage ; Linkage type? - cror cr0_eq,cr1_eq,cr0_eq ; Nested or linkage type? + li r22,lo16(0x800C) ; Get 0xFFFF800C + rlwinm r0,r24,mpBSub+1,31,31 ; Rotate to get 0 if 4K bsu or 1 if 32MB bsu + addi r23,r23,1 ; Get actual length + rlwnm r22,r22,r0,27,31 ; Rotate to get 12 or 25 lis r0,0x8000 ; Get 0xFFFFFFFF80000000 - li r22,0 ; Assume high part of size is 0 - bne++ hamNoNest ; This is not a nested or linkage type - - rlwinm r22,r23,16,16,31 ; Convert partially converted size to segments - rlwinm r23,r23,16,0,3 ; Finish shift - -hamNoNest: add r0,r0,r0 ; Get 0xFFFFFFFF00000000 for 64-bit or 0 for 32-bit + slw r9,r23,r22 ; Isolate the low part + rlwnm r22,r23,r22,22,31 ; Extract the high order + addic r23,r9,-4096 ; Get the length to the last page + add r0,r0,r0 ; Get 0xFFFFFFFF00000000 for 64-bit or 0 for 32-bit + addme r22,r22 ; Do high order as well... mr. r3,r3 ; Did we find a mapping here? - or r0,r0,r30 ; Make sure a carry will propagate all the way in 64-bit - crmove cr5_eq,cr0_eq ; Remember that if we found the mapping + or r0,r30,r0 ; Fill high word of 64-bit with 1s so we will properly carry + bne-- hamOverlay ; We found a mapping, this is no good, can not double map... + addc r9,r0,r23 ; Add size to get last page in new range or. r0,r4,r5 ; Are we beyond the end? adde r8,r29,r22 ; Add the rest of the length on - bne-- cr5,hamOverlay ; Yeah, this is no good, can not double map... rlwinm r9,r9,0,0,31 ; Clean top half of sum beq++ hamFits ; We are at the end... - + cmplw cr1,r9,r5 ; Is the bottom part of our end less? cmplw r8,r4 ; Is our end before the next (top part) crand cr0_eq,cr0_eq,cr1_lt ; Is the second half less and the first half equal? @@ -283,32 +256,10 @@ hamFits: mr. r21,r21 ; Do we already have the exclusive lock? .align 5 -hamGotX: -#if INSTRUMENT - mfspr r3,pmc1 ; INSTRUMENT - saveinstr[18] - Take stamp before mapSearchFull - stw r3,0x6100+(18*16)+0x0(0) ; INSTRUMENT - Save it - mfspr r3,pmc2 ; INSTRUMENT - Get stamp - stw r3,0x6100+(18*16)+0x4(0) ; INSTRUMENT - Save it - mfspr r3,pmc3 ; INSTRUMENT - Get stamp - stw r3,0x6100+(18*16)+0x8(0) ; INSTRUMENT - Save it - mfspr r3,pmc4 ; INSTRUMENT - Get stamp - stw r4,0x6100+(18*16)+0xC(0) ; INSTRUMENT - Save it -#endif - mr r3,r28 ; Get the pmap to insert into +hamGotX: mr r3,r28 ; Get the pmap to insert into mr r4,r31 ; Point to the mapping bl EXT(mapInsert) ; Insert the mapping into the list -#if INSTRUMENT - mfspr r4,pmc1 ; INSTRUMENT - saveinstr[19] - Take stamp before mapSearchFull - stw r4,0x6100+(19*16)+0x0(0) ; INSTRUMENT - Save it - mfspr r4,pmc2 ; INSTRUMENT - Get stamp - stw r4,0x6100+(19*16)+0x4(0) ; INSTRUMENT - Save it - mfspr r4,pmc3 ; INSTRUMENT - Get stamp - stw r4,0x6100+(19*16)+0x8(0) ; INSTRUMENT - Save it - mfspr r4,pmc4 ; INSTRUMENT - Get stamp - stw r4,0x6100+(19*16)+0xC(0) ; INSTRUMENT - Save it -#endif - rlwinm r11,r24,mpPcfgb+2,mpPcfg>>6 ; Get the index into the page config table lhz r8,mpSpace(r31) ; Get the address space lwz r11,lgpPcfg(r11) ; Get the page config @@ -384,18 +335,7 @@ hamReturn: bt++ pf64Bitb,hamR64 ; Yes... hamR64: mtmsrd r17 ; Restore enables/translation/etc. isync -hamReturnC: -#if INSTRUMENT - mfspr r0,pmc1 ; INSTRUMENT - saveinstr[20] - Take stamp before mapSearchFull - stw r0,0x6100+(20*16)+0x0(0) ; INSTRUMENT - Save it - mfspr r0,pmc2 ; INSTRUMENT - Get stamp - stw r0,0x6100+(20*16)+0x4(0) ; INSTRUMENT - Save it - mfspr r0,pmc3 ; INSTRUMENT - Get stamp - stw r0,0x6100+(20*16)+0x8(0) ; INSTRUMENT - Save it - mfspr r0,pmc4 ; INSTRUMENT - Get stamp - stw r0,0x6100+(20*16)+0xC(0) ; INSTRUMENT - Save it -#endif - lwz r0,(FM_ALIGN((31-17+1)*4)+FM_SIZE+FM_LR_SAVE)(r1) ; Get the return +hamReturnC: lwz r0,(FM_ALIGN((31-17+1)*4)+FM_SIZE+FM_LR_SAVE)(r1) ; Get the return lwz r17,FM_ARG0+0x00(r1) ; Save a register lwz r18,FM_ARG0+0x04(r1) ; Save a register lwz r19,FM_ARG0+0x08(r1) ; Save a register @@ -948,13 +888,18 @@ hrmPanic: lis r0,hi16(Choke) ; System abend .align 5 -hrmBlock32: - lhz r23,mpSpace(r31) ; Get the address space hash +hrmBlock32: lis r29,0xD000 ; Get shift to 32MB bsu + rlwinm r24,r20,mpBSub+1+2,29,29 ; Rotate to get 0 if 4K bsu or 13 if 32MB bsu lhz r25,mpBSize(r31) ; Get the number of pages in block + lhz r23,mpSpace(r31) ; Get the address space hash lwz r9,mpBlkRemCur(r31) ; Get our current remove position + rlwnm r29,r29,r24,28,31 ; Rotate to get 0 or 13 + addi r25,r25,1 ; Account for zero-based counting ori r0,r20,mpRIP ; Turn on the remove in progress flag + slw r25,r25,r29 ; Adjust for 32MB if needed mfsdr1 r29 ; Get the hash table base and size rlwinm r24,r23,maxAdrSpb,32-maxAdrSpb-maxAdrSpb,31-maxAdrSpb ; Get high order of hash + subi r25,r25,1 ; Convert back to zero-based counting lwz r27,mpVAddr+4(r31) ; Get the base vaddr sub r4,r25,r9 ; Get number of pages left cmplw cr1,r9,r25 ; Have we already hit the end? @@ -1279,13 +1224,18 @@ hrmRetn64: rldicr r8,r31,0,51 ; Find start of page .align 5 -hrmBlock64: +hrmBlock64: lis r29,0xD000 ; Get shift to 32MB bsu + rlwinm r10,r20,mpBSub+1+2,29,29 ; Rotate to get 0 if 4K bsu or 13 if 32MB bsu lhz r24,mpSpace(r31) ; Get the address space hash lhz r25,mpBSize(r31) ; Get the number of pages in block lwz r9,mpBlkRemCur(r31) ; Get our current remove position + rlwnm r29,r29,r10,28,31 ; Rotate to get 0 or 13 + addi r25,r25,1 ; Account for zero-based counting ori r0,r20,mpRIP ; Turn on the remove in progress flag + slw r25,r25,r29 ; Adjust for 32MB if needed mfsdr1 r29 ; Get the hash table base and size ld r27,mpVAddr(r31) ; Get the base vaddr + subi r25,r25,1 ; Convert back to zero-based counting rlwinm r5,r29,0,27,31 ; Isolate the size sub r4,r25,r9 ; Get number of pages left cmplw cr1,r9,r25 ; Have we already hit the end? @@ -2545,7 +2495,7 @@ hcmNextPhys32: addi r3,r3,physEntrySize ; Next phys_entry hcmNextMap32: - rlwinm. r4,r4,0,0,25 ; Clean and test mapping address + rlwinm. r4,r4,0,~ppFlags ; Clean and test mapping address beq hcmNoMap32 ; Did not find one... lwz r0,mpPte(r4) ; Grab the offset to the PTE @@ -2688,7 +2638,7 @@ LEXT(hw_walk_phys) blt hwpSrc32 ; Do TLB invalidate/purge/merge/reload for each mapping beq hwpMSrc32 ; Do TLB merge for each mapping -hwpQSrc32: rlwinm. r31,r31,0,0,25 ; Clean and test mapping address +hwpQSrc32: rlwinm. r31,r31,0,~ppFlags ; Clean and test mapping address beq hwpNone32 ; Did not find one... bctrl ; Call the op function @@ -2698,7 +2648,7 @@ hwpQSrc32: rlwinm. r31,r31,0,0,25 ; Clean and test mapping address b hwpQSrc32 ; Check it out... .align 5 -hwpMSrc32: rlwinm. r31,r31,0,0,25 ; Clean and test mapping address +hwpMSrc32: rlwinm. r31,r31,0,~ppFlags ; Clean and test mapping address beq hwpNone32 ; Did not find one... bl mapMergeRC32 ; Merge reference and change into mapping and physent @@ -3541,11 +3491,11 @@ mapFLPNitr: lwz r3,mrPhysTab(r9) ; Get the actual table address lwz r5,mrStart(r9) ; Get start of table entry lwz r0,mrEnd(r9) ; Get end of table entry addi r9,r9,mrSize ; Point to the next slot - cmplwi cr2,r3,0 ; Are we at the end of the table? + cmplwi cr7,r3,0 ; Are we at the end of the table? cmplw r2,r5 ; See if we are in this table cmplw cr1,r2,r0 ; Check end also sub r4,r2,r5 ; Calculate index to physical entry - beq-- cr2,mapFLPNmiss ; Leave if we did not find an entry... + beq-- cr7,mapFLPNmiss ; Leave if we did not find an entry... cror cr0_lt,cr0_lt,cr1_gt ; Set CR0_LT if it is NOT this entry slwi r4,r4,3 ; Get offset to physical entry