diff options
Diffstat (limited to 'arch/powerpc/mm/hash_low_64.S')
-rw-r--r-- | arch/powerpc/mm/hash_low_64.S | 97 |
1 files changed, 60 insertions, 37 deletions
diff --git a/arch/powerpc/mm/hash_low_64.S b/arch/powerpc/mm/hash_low_64.S index 602aeb06d298..56585086413a 100644 --- a/arch/powerpc/mm/hash_low_64.S +++ b/arch/powerpc/mm/hash_low_64.S | |||
@@ -63,7 +63,7 @@ _GLOBAL(__hash_page_4K) | |||
63 | /* Save non-volatile registers. | 63 | /* Save non-volatile registers. |
64 | * r31 will hold "old PTE" | 64 | * r31 will hold "old PTE" |
65 | * r30 is "new PTE" | 65 | * r30 is "new PTE" |
66 | * r29 is "va" | 66 | * r29 is vpn |
67 | * r28 is a hash value | 67 | * r28 is a hash value |
68 | * r27 is hashtab mask (maybe dynamic patched instead ?) | 68 | * r27 is hashtab mask (maybe dynamic patched instead ?) |
69 | */ | 69 | */ |
@@ -111,10 +111,10 @@ BEGIN_FTR_SECTION | |||
111 | cmpdi r9,0 /* check segment size */ | 111 | cmpdi r9,0 /* check segment size */ |
112 | bne 3f | 112 | bne 3f |
113 | END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT) | 113 | END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT) |
114 | /* Calc va and put it in r29 */ | 114 | /* Calc vpn and put it in r29 */ |
115 | rldicr r29,r5,28,63-28 | 115 | sldi r29,r5,SID_SHIFT - VPN_SHIFT |
116 | rldicl r3,r3,0,36 | 116 | rldicl r28,r3,64 - VPN_SHIFT,64 - (SID_SHIFT - VPN_SHIFT) |
117 | or r29,r3,r29 | 117 | or r29,r28,r29 |
118 | 118 | ||
119 | /* Calculate hash value for primary slot and store it in r28 */ | 119 | /* Calculate hash value for primary slot and store it in r28 */ |
120 | rldicl r5,r5,0,25 /* vsid & 0x0000007fffffffff */ | 120 | rldicl r5,r5,0,25 /* vsid & 0x0000007fffffffff */ |
@@ -122,14 +122,19 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT) | |||
122 | xor r28,r5,r0 | 122 | xor r28,r5,r0 |
123 | b 4f | 123 | b 4f |
124 | 124 | ||
125 | 3: /* Calc VA and hash in r29 and r28 for 1T segment */ | 125 | 3: /* Calc vpn and put it in r29 */ |
126 | sldi r29,r5,40 /* vsid << 40 */ | 126 | sldi r29,r5,SID_SHIFT_1T - VPN_SHIFT |
127 | clrldi r3,r3,24 /* ea & 0xffffffffff */ | 127 | rldicl r28,r3,64 - VPN_SHIFT,64 - (SID_SHIFT_1T - VPN_SHIFT) |
128 | or r29,r28,r29 | ||
129 | |||
130 | /* | ||
131 | * calculate hash value for primary slot and | ||
132 | * store it in r28 for 1T segment | ||
133 | */ | ||
128 | rldic r28,r5,25,25 /* (vsid << 25) & 0x7fffffffff */ | 134 | rldic r28,r5,25,25 /* (vsid << 25) & 0x7fffffffff */ |
129 | clrldi r5,r5,40 /* vsid & 0xffffff */ | 135 | clrldi r5,r5,40 /* vsid & 0xffffff */ |
130 | rldicl r0,r3,64-12,36 /* (ea >> 12) & 0xfffffff */ | 136 | rldicl r0,r3,64-12,36 /* (ea >> 12) & 0xfffffff */ |
131 | xor r28,r28,r5 | 137 | xor r28,r28,r5 |
132 | or r29,r3,r29 /* VA */ | ||
133 | xor r28,r28,r0 /* hash */ | 138 | xor r28,r28,r0 /* hash */ |
134 | 139 | ||
135 | /* Convert linux PTE bits into HW equivalents */ | 140 | /* Convert linux PTE bits into HW equivalents */ |
@@ -185,7 +190,7 @@ htab_insert_pte: | |||
185 | 190 | ||
186 | /* Call ppc_md.hpte_insert */ | 191 | /* Call ppc_md.hpte_insert */ |
187 | ld r6,STK_PARAM(R4)(r1) /* Retrieve new pp bits */ | 192 | ld r6,STK_PARAM(R4)(r1) /* Retrieve new pp bits */ |
188 | mr r4,r29 /* Retrieve va */ | 193 | mr r4,r29 /* Retrieve vpn */ |
189 | li r7,0 /* !bolted, !secondary */ | 194 | li r7,0 /* !bolted, !secondary */ |
190 | li r8,MMU_PAGE_4K /* page size */ | 195 | li r8,MMU_PAGE_4K /* page size */ |
191 | ld r9,STK_PARAM(R9)(r1) /* segment size */ | 196 | ld r9,STK_PARAM(R9)(r1) /* segment size */ |
@@ -208,7 +213,7 @@ _GLOBAL(htab_call_hpte_insert1) | |||
208 | 213 | ||
209 | /* Call ppc_md.hpte_insert */ | 214 | /* Call ppc_md.hpte_insert */ |
210 | ld r6,STK_PARAM(R4)(r1) /* Retrieve new pp bits */ | 215 | ld r6,STK_PARAM(R4)(r1) /* Retrieve new pp bits */ |
211 | mr r4,r29 /* Retrieve va */ | 216 | mr r4,r29 /* Retrieve vpn */ |
212 | li r7,HPTE_V_SECONDARY /* !bolted, secondary */ | 217 | li r7,HPTE_V_SECONDARY /* !bolted, secondary */ |
213 | li r8,MMU_PAGE_4K /* page size */ | 218 | li r8,MMU_PAGE_4K /* page size */ |
214 | ld r9,STK_PARAM(R9)(r1) /* segment size */ | 219 | ld r9,STK_PARAM(R9)(r1) /* segment size */ |
@@ -278,7 +283,7 @@ htab_modify_pte: | |||
278 | add r3,r0,r3 /* add slot idx */ | 283 | add r3,r0,r3 /* add slot idx */ |
279 | 284 | ||
280 | /* Call ppc_md.hpte_updatepp */ | 285 | /* Call ppc_md.hpte_updatepp */ |
281 | mr r5,r29 /* va */ | 286 | mr r5,r29 /* vpn */ |
282 | li r6,MMU_PAGE_4K /* page size */ | 287 | li r6,MMU_PAGE_4K /* page size */ |
283 | ld r7,STK_PARAM(R9)(r1) /* segment size */ | 288 | ld r7,STK_PARAM(R9)(r1) /* segment size */ |
284 | ld r8,STK_PARAM(R8)(r1) /* get "local" param */ | 289 | ld r8,STK_PARAM(R8)(r1) /* get "local" param */ |
@@ -339,7 +344,7 @@ _GLOBAL(__hash_page_4K) | |||
339 | /* Save non-volatile registers. | 344 | /* Save non-volatile registers. |
340 | * r31 will hold "old PTE" | 345 | * r31 will hold "old PTE" |
341 | * r30 is "new PTE" | 346 | * r30 is "new PTE" |
342 | * r29 is "va" | 347 | * r29 is vpn |
343 | * r28 is a hash value | 348 | * r28 is a hash value |
344 | * r27 is hashtab mask (maybe dynamic patched instead ?) | 349 | * r27 is hashtab mask (maybe dynamic patched instead ?) |
345 | * r26 is the hidx mask | 350 | * r26 is the hidx mask |
@@ -394,10 +399,14 @@ BEGIN_FTR_SECTION | |||
394 | cmpdi r9,0 /* check segment size */ | 399 | cmpdi r9,0 /* check segment size */ |
395 | bne 3f | 400 | bne 3f |
396 | END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT) | 401 | END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT) |
397 | /* Calc va and put it in r29 */ | 402 | /* Calc vpn and put it in r29 */ |
398 | rldicr r29,r5,28,63-28 /* r29 = (vsid << 28) */ | 403 | sldi r29,r5,SID_SHIFT - VPN_SHIFT |
399 | rldicl r3,r3,0,36 /* r3 = (ea & 0x0fffffff) */ | 404 | /* |
400 | or r29,r3,r29 /* r29 = va */ | 405 | * clrldi r3,r3,64 - SID_SHIFT --> ea & 0xfffffff |
406 | * srdi r28,r3,VPN_SHIFT | ||
407 | */ | ||
408 | rldicl r28,r3,64 - VPN_SHIFT,64 - (SID_SHIFT - VPN_SHIFT) | ||
409 | or r29,r28,r29 | ||
401 | 410 | ||
402 | /* Calculate hash value for primary slot and store it in r28 */ | 411 | /* Calculate hash value for primary slot and store it in r28 */ |
403 | rldicl r5,r5,0,25 /* vsid & 0x0000007fffffffff */ | 412 | rldicl r5,r5,0,25 /* vsid & 0x0000007fffffffff */ |
@@ -405,14 +414,23 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT) | |||
405 | xor r28,r5,r0 | 414 | xor r28,r5,r0 |
406 | b 4f | 415 | b 4f |
407 | 416 | ||
408 | 3: /* Calc VA and hash in r29 and r28 for 1T segment */ | 417 | 3: /* Calc vpn and put it in r29 */ |
409 | sldi r29,r5,40 /* vsid << 40 */ | 418 | sldi r29,r5,SID_SHIFT_1T - VPN_SHIFT |
410 | clrldi r3,r3,24 /* ea & 0xffffffffff */ | 419 | /* |
420 | * clrldi r3,r3,64 - SID_SHIFT_1T --> ea & 0xffffffffff | ||
421 | * srdi r28,r3,VPN_SHIFT | ||
422 | */ | ||
423 | rldicl r28,r3,64 - VPN_SHIFT,64 - (SID_SHIFT_1T - VPN_SHIFT) | ||
424 | or r29,r28,r29 | ||
425 | |||
426 | /* | ||
427 | * Calculate hash value for primary slot and | ||
428 | * store it in r28 for 1T segment | ||
429 | */ | ||
411 | rldic r28,r5,25,25 /* (vsid << 25) & 0x7fffffffff */ | 430 | rldic r28,r5,25,25 /* (vsid << 25) & 0x7fffffffff */ |
412 | clrldi r5,r5,40 /* vsid & 0xffffff */ | 431 | clrldi r5,r5,40 /* vsid & 0xffffff */ |
413 | rldicl r0,r3,64-12,36 /* (ea >> 12) & 0xfffffff */ | 432 | rldicl r0,r3,64-12,36 /* (ea >> 12) & 0xfffffff */ |
414 | xor r28,r28,r5 | 433 | xor r28,r28,r5 |
415 | or r29,r3,r29 /* VA */ | ||
416 | xor r28,r28,r0 /* hash */ | 434 | xor r28,r28,r0 /* hash */ |
417 | 435 | ||
418 | /* Convert linux PTE bits into HW equivalents */ | 436 | /* Convert linux PTE bits into HW equivalents */ |
@@ -488,7 +506,7 @@ htab_special_pfn: | |||
488 | 506 | ||
489 | /* Call ppc_md.hpte_insert */ | 507 | /* Call ppc_md.hpte_insert */ |
490 | ld r6,STK_PARAM(R4)(r1) /* Retrieve new pp bits */ | 508 | ld r6,STK_PARAM(R4)(r1) /* Retrieve new pp bits */ |
491 | mr r4,r29 /* Retrieve va */ | 509 | mr r4,r29 /* Retrieve vpn */ |
492 | li r7,0 /* !bolted, !secondary */ | 510 | li r7,0 /* !bolted, !secondary */ |
493 | li r8,MMU_PAGE_4K /* page size */ | 511 | li r8,MMU_PAGE_4K /* page size */ |
494 | ld r9,STK_PARAM(R9)(r1) /* segment size */ | 512 | ld r9,STK_PARAM(R9)(r1) /* segment size */ |
@@ -515,7 +533,7 @@ _GLOBAL(htab_call_hpte_insert1) | |||
515 | 533 | ||
516 | /* Call ppc_md.hpte_insert */ | 534 | /* Call ppc_md.hpte_insert */ |
517 | ld r6,STK_PARAM(R4)(r1) /* Retrieve new pp bits */ | 535 | ld r6,STK_PARAM(R4)(r1) /* Retrieve new pp bits */ |
518 | mr r4,r29 /* Retrieve va */ | 536 | mr r4,r29 /* Retrieve vpn */ |
519 | li r7,HPTE_V_SECONDARY /* !bolted, secondary */ | 537 | li r7,HPTE_V_SECONDARY /* !bolted, secondary */ |
520 | li r8,MMU_PAGE_4K /* page size */ | 538 | li r8,MMU_PAGE_4K /* page size */ |
521 | ld r9,STK_PARAM(R9)(r1) /* segment size */ | 539 | ld r9,STK_PARAM(R9)(r1) /* segment size */ |
@@ -547,7 +565,7 @@ _GLOBAL(htab_call_hpte_remove) | |||
547 | * useless now that the segment has been switched to 4k pages. | 565 | * useless now that the segment has been switched to 4k pages. |
548 | */ | 566 | */ |
549 | htab_inval_old_hpte: | 567 | htab_inval_old_hpte: |
550 | mr r3,r29 /* virtual addr */ | 568 | mr r3,r29 /* vpn */ |
551 | mr r4,r31 /* PTE.pte */ | 569 | mr r4,r31 /* PTE.pte */ |
552 | li r5,0 /* PTE.hidx */ | 570 | li r5,0 /* PTE.hidx */ |
553 | li r6,MMU_PAGE_64K /* psize */ | 571 | li r6,MMU_PAGE_64K /* psize */ |
@@ -620,7 +638,7 @@ htab_modify_pte: | |||
620 | add r3,r0,r3 /* add slot idx */ | 638 | add r3,r0,r3 /* add slot idx */ |
621 | 639 | ||
622 | /* Call ppc_md.hpte_updatepp */ | 640 | /* Call ppc_md.hpte_updatepp */ |
623 | mr r5,r29 /* va */ | 641 | mr r5,r29 /* vpn */ |
624 | li r6,MMU_PAGE_4K /* page size */ | 642 | li r6,MMU_PAGE_4K /* page size */ |
625 | ld r7,STK_PARAM(R9)(r1) /* segment size */ | 643 | ld r7,STK_PARAM(R9)(r1) /* segment size */ |
626 | ld r8,STK_PARAM(R8)(r1) /* get "local" param */ | 644 | ld r8,STK_PARAM(R8)(r1) /* get "local" param */ |
@@ -676,7 +694,7 @@ _GLOBAL(__hash_page_64K) | |||
676 | /* Save non-volatile registers. | 694 | /* Save non-volatile registers. |
677 | * r31 will hold "old PTE" | 695 | * r31 will hold "old PTE" |
678 | * r30 is "new PTE" | 696 | * r30 is "new PTE" |
679 | * r29 is "va" | 697 | * r29 is vpn |
680 | * r28 is a hash value | 698 | * r28 is a hash value |
681 | * r27 is hashtab mask (maybe dynamic patched instead ?) | 699 | * r27 is hashtab mask (maybe dynamic patched instead ?) |
682 | */ | 700 | */ |
@@ -729,10 +747,10 @@ BEGIN_FTR_SECTION | |||
729 | cmpdi r9,0 /* check segment size */ | 747 | cmpdi r9,0 /* check segment size */ |
730 | bne 3f | 748 | bne 3f |
731 | END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT) | 749 | END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT) |
732 | /* Calc va and put it in r29 */ | 750 | /* Calc vpn and put it in r29 */ |
733 | rldicr r29,r5,28,63-28 | 751 | sldi r29,r5,SID_SHIFT - VPN_SHIFT |
734 | rldicl r3,r3,0,36 | 752 | rldicl r28,r3,64 - VPN_SHIFT,64 - (SID_SHIFT - VPN_SHIFT) |
735 | or r29,r3,r29 | 753 | or r29,r28,r29 |
736 | 754 | ||
737 | /* Calculate hash value for primary slot and store it in r28 */ | 755 | /* Calculate hash value for primary slot and store it in r28 */ |
738 | rldicl r5,r5,0,25 /* vsid & 0x0000007fffffffff */ | 756 | rldicl r5,r5,0,25 /* vsid & 0x0000007fffffffff */ |
@@ -740,14 +758,19 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT) | |||
740 | xor r28,r5,r0 | 758 | xor r28,r5,r0 |
741 | b 4f | 759 | b 4f |
742 | 760 | ||
743 | 3: /* Calc VA and hash in r29 and r28 for 1T segment */ | 761 | 3: /* Calc vpn and put it in r29 */ |
744 | sldi r29,r5,40 /* vsid << 40 */ | 762 | sldi r29,r5,SID_SHIFT_1T - VPN_SHIFT |
745 | clrldi r3,r3,24 /* ea & 0xffffffffff */ | 763 | rldicl r28,r3,64 - VPN_SHIFT,64 - (SID_SHIFT_1T - VPN_SHIFT) |
764 | or r29,r28,r29 | ||
765 | |||
766 | /* | ||
767 | * calculate hash value for primary slot and | ||
768 | * store it in r28 for 1T segment | ||
769 | */ | ||
746 | rldic r28,r5,25,25 /* (vsid << 25) & 0x7fffffffff */ | 770 | rldic r28,r5,25,25 /* (vsid << 25) & 0x7fffffffff */ |
747 | clrldi r5,r5,40 /* vsid & 0xffffff */ | 771 | clrldi r5,r5,40 /* vsid & 0xffffff */ |
748 | rldicl r0,r3,64-16,40 /* (ea >> 16) & 0xffffff */ | 772 | rldicl r0,r3,64-16,40 /* (ea >> 16) & 0xffffff */ |
749 | xor r28,r28,r5 | 773 | xor r28,r28,r5 |
750 | or r29,r3,r29 /* VA */ | ||
751 | xor r28,r28,r0 /* hash */ | 774 | xor r28,r28,r0 /* hash */ |
752 | 775 | ||
753 | /* Convert linux PTE bits into HW equivalents */ | 776 | /* Convert linux PTE bits into HW equivalents */ |
@@ -806,7 +829,7 @@ ht64_insert_pte: | |||
806 | 829 | ||
807 | /* Call ppc_md.hpte_insert */ | 830 | /* Call ppc_md.hpte_insert */ |
808 | ld r6,STK_PARAM(R4)(r1) /* Retrieve new pp bits */ | 831 | ld r6,STK_PARAM(R4)(r1) /* Retrieve new pp bits */ |
809 | mr r4,r29 /* Retrieve va */ | 832 | mr r4,r29 /* Retrieve vpn */ |
810 | li r7,0 /* !bolted, !secondary */ | 833 | li r7,0 /* !bolted, !secondary */ |
811 | li r8,MMU_PAGE_64K | 834 | li r8,MMU_PAGE_64K |
812 | ld r9,STK_PARAM(R9)(r1) /* segment size */ | 835 | ld r9,STK_PARAM(R9)(r1) /* segment size */ |
@@ -829,7 +852,7 @@ _GLOBAL(ht64_call_hpte_insert1) | |||
829 | 852 | ||
830 | /* Call ppc_md.hpte_insert */ | 853 | /* Call ppc_md.hpte_insert */ |
831 | ld r6,STK_PARAM(R4)(r1) /* Retrieve new pp bits */ | 854 | ld r6,STK_PARAM(R4)(r1) /* Retrieve new pp bits */ |
832 | mr r4,r29 /* Retrieve va */ | 855 | mr r4,r29 /* Retrieve vpn */ |
833 | li r7,HPTE_V_SECONDARY /* !bolted, secondary */ | 856 | li r7,HPTE_V_SECONDARY /* !bolted, secondary */ |
834 | li r8,MMU_PAGE_64K | 857 | li r8,MMU_PAGE_64K |
835 | ld r9,STK_PARAM(R9)(r1) /* segment size */ | 858 | ld r9,STK_PARAM(R9)(r1) /* segment size */ |
@@ -899,7 +922,7 @@ ht64_modify_pte: | |||
899 | add r3,r0,r3 /* add slot idx */ | 922 | add r3,r0,r3 /* add slot idx */ |
900 | 923 | ||
901 | /* Call ppc_md.hpte_updatepp */ | 924 | /* Call ppc_md.hpte_updatepp */ |
902 | mr r5,r29 /* va */ | 925 | mr r5,r29 /* vpn */ |
903 | li r6,MMU_PAGE_64K | 926 | li r6,MMU_PAGE_64K |
904 | ld r7,STK_PARAM(R9)(r1) /* segment size */ | 927 | ld r7,STK_PARAM(R9)(r1) /* segment size */ |
905 | ld r8,STK_PARAM(R8)(r1) /* get "local" param */ | 928 | ld r8,STK_PARAM(R8)(r1) /* get "local" param */ |