1
2
3
4
5
6
7
8
9
10
11
12
13#include <asm/reg.h>
14#include <asm/pgtable.h>
15#include <asm/mmu.h>
16#include <asm/page.h>
17#include <asm/types.h>
18#include <asm/ppc_asm.h>
19#include <asm/asm-offsets.h>
20#include <asm/cputable.h>
21
22 .text
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37#define STACKFRAMESIZE 256
38
39
40#define STK_PARM(i) (STACKFRAMESIZE + 48 + ((i)-3)*8)
41
42
43#define STK_REG(i) (112 + ((i)-14)*8)
44
45
46#ifndef CONFIG_PPC_64K_PAGES
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62_GLOBAL(__hash_page_4K)
63 mflr r0
64 std r0,16(r1)
65 stdu r1,-STACKFRAMESIZE(r1)
66
67 std r6,STK_PARM(r6)(r1)
68 std r8,STK_PARM(r8)(r1)
69 std r9,STK_PARM(r9)(r1)
70
71
72
73
74
75
76
77
78 std r27,STK_REG(r27)(r1)
79 std r28,STK_REG(r28)(r1)
80 std r29,STK_REG(r29)(r1)
81 std r30,STK_REG(r30)(r1)
82 std r31,STK_REG(r31)(r1)
83
84
85
86
87
88
891:
90 ldarx r31,0,r6
91
92 andc. r0,r4,r31
93 bne- htab_wrong_access
94
95 andi. r0,r31,_PAGE_BUSY
96
97
98
99 bne- htab_bail_ok
100
101
102
103
104 rlwinm r30,r4,32-9+7,31-7,31-7
105 or r30,r30,r31
106 ori r30,r30,_PAGE_BUSY | _PAGE_ACCESSED | _PAGE_HASHPTE
107
108 stdcx. r30,0,r6
109 bne- 1b
110 isync
111
112
113
114
115
116
117
118BEGIN_FTR_SECTION
119 cmpdi r9,0
120 bne 3f
121END_FTR_SECTION_IFSET(CPU_FTR_1T_SEGMENT)
122
123 rldicr r29,r5,28,63-28
124 rldicl r3,r3,0,36
125 or r29,r3,r29
126
127
128 rldicl r5,r5,0,25
129 rldicl r0,r3,64-12,48
130 xor r28,r5,r0
131 b 4f
132
1333:
134 sldi r29,r5,40
135 clrldi r3,r3,24
136 rldic r28,r5,25,25
137 clrldi r5,r5,40
138 rldicl r0,r3,64-12,36
139 xor r28,r28,r5
140 or r29,r3,r29
141 xor r28,r28,r0
142
143
1444: andi. r3,r30,0x1fe
145 xori r3,r3,HPTE_R_N
146 rlwinm r0,r30,32-9+1,30,30
147 rlwinm r4,r30,32-7+1,30,30
148 and r0,r0,r4
149 andc r0,r30,r0
150 rlwimi r3,r0,32-1,31,31
151 ori r3,r3,HPTE_R_C
152
153
154
155
156BEGIN_FTR_SECTION
157 mr r4,r30
158 mr r5,r7
159 bl .hash_page_do_lazy_icache
160END_FTR_SECTION(CPU_FTR_NOEXECUTE|CPU_FTR_COHERENT_ICACHE, CPU_FTR_NOEXECUTE)
161
162
163
164
165 std r3,STK_PARM(r4)(r1)
166
167
168 ld r4,htab_hash_mask@got(2)
169 ld r27,0(r4)
170
171
172
173
174 andi. r0,r31,_PAGE_HASHPTE
175 bne htab_modify_pte
176
177htab_insert_pte:
178
179
180
181 lis r0,_PAGE_HPTEFLAGS@h
182 ori r0,r0,_PAGE_HPTEFLAGS@l
183 andc r30,r30,r0
184 ori r30,r30,_PAGE_HASHPTE
185
186
187 rldicl r5,r31,64-PTE_RPN_SHIFT,PTE_RPN_SHIFT
188 sldi r5,r5,PAGE_SHIFT
189
190
191 and r0,r28,r27
192 rldicr r3,r0,3,63-3
193
194
195 ld r6,STK_PARM(r4)(r1)
196 mr r4,r29
197 li r7,0
198 li r8,MMU_PAGE_4K
199 ld r9,STK_PARM(r9)(r1)
200_GLOBAL(htab_call_hpte_insert1)
201 bl .
202 cmpdi 0,r3,0
203 bge htab_pte_insert_ok
204 cmpdi 0,r3,-2
205 beq- htab_pte_insert_failure
206
207
208
209
210 rldicl r5,r31,64-PTE_RPN_SHIFT,PTE_RPN_SHIFT
211 sldi r5,r5,PAGE_SHIFT
212
213
214 andc r0,r27,r28
215 rldicr r3,r0,3,63-3
216
217
218 ld r6,STK_PARM(r4)(r1)
219 mr r4,r29
220 li r7,HPTE_V_SECONDARY
221 li r8,MMU_PAGE_4K
222 ld r9,STK_PARM(r9)(r1)
223_GLOBAL(htab_call_hpte_insert2)
224 bl .
225 cmpdi 0,r3,0
226 bge+ htab_pte_insert_ok
227 cmpdi 0,r3,-2
228 beq- htab_pte_insert_failure
229
230
231 mftb r0
232
233 andi. r0,r0,1
234 mr r5,r28
235 bne 2f
236 not r5,r5
2372: and r0,r5,r27
238 rldicr r3,r0,3,63-3
239
240_GLOBAL(htab_call_hpte_remove)
241 bl .
242
243
244 b htab_insert_pte
245
246htab_bail_ok:
247 li r3,0
248 b htab_bail
249
250htab_pte_insert_ok:
251
252 rldimi r30,r3,12,63-15
253
254
255
256
257htab_write_out_pte:
258 ld r6,STK_PARM(r6)(r1)
259 std r30,0(r6)
260 li r3, 0
261htab_bail:
262 ld r27,STK_REG(r27)(r1)
263 ld r28,STK_REG(r28)(r1)
264 ld r29,STK_REG(r29)(r1)
265 ld r30,STK_REG(r30)(r1)
266 ld r31,STK_REG(r31)(r1)
267 addi r1,r1,STACKFRAMESIZE
268 ld r0,16(r1)
269 mtlr r0
270 blr
271
272htab_modify_pte:
273
274 mr r4,r3
275 rlwinm r3,r31,32-12,29,31
276
277
278 mr r5,r28
279 andi. r0,r31,_PAGE_SECONDARY
280 beq 1f
281 not r5,r5
2821:
283
284 and r0,r5,r27
285 rldicr r0,r0,3,63-3
286 add r3,r0,r3
287
288
289 mr r5,r29
290 li r6,MMU_PAGE_4K
291 ld r7,STK_PARM(r9)(r1)
292 ld r8,STK_PARM(r8)(r1)
293_GLOBAL(htab_call_hpte_updatepp)
294 bl .
295
296
297
298
299 cmpdi 0,r3,-1
300 beq- htab_insert_pte
301
302
303 li r0,_PAGE_BUSY
304 andc r30,r30,r0
305 b htab_write_out_pte
306
307htab_wrong_access:
308
309 stdcx. r31,0,r6
310 li r3,1
311 b htab_bail
312
313htab_pte_insert_failure:
314
315 ld r6,STK_PARM(r6)(r1)
316 std r31,0(r6)
317 li r3,-1
318 b htab_bail
319
320
321#else
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338_GLOBAL(__hash_page_4K)
339 mflr r0
340 std r0,16(r1)
341 stdu r1,-STACKFRAMESIZE(r1)
342
343 std r6,STK_PARM(r6)(r1)
344 std r8,STK_PARM(r8)(r1)
345 std r9,STK_PARM(r9)(r1)
346
347
348
349
350
351
352
353
354
355
356 std r25,STK_REG(r25)(r1)
357 std r26,STK_REG(r26)(r1)
358 std r27,STK_REG(r27)(r1)
359 std r28,STK_REG(r28)(r1)
360 std r29,STK_REG(r29)(r1)
361 std r30,STK_REG(r30)(r1)
362 std r31,STK_REG(r31)(r1)
363
364
365
366
367
368
3691:
370 ldarx r31,0,r6
371
372 andc. r0,r4,r31
373 bne- htab_wrong_access
374
375 andi. r0,r31,_PAGE_BUSY
376
377
378
379 bne- htab_bail_ok
380
381
382
383 rlwinm r30,r4,32-9+7,31-7,31-7
384 or r30,r30,r31
385 ori r30,r30,_PAGE_BUSY | _PAGE_ACCESSED
386 oris r30,r30,_PAGE_COMBO@h
387
388 stdcx. r30,0,r6
389 bne- 1b
390 isync
391
392
393
394
395
396
397
398
399 rldicl r25,r3,64-12,60
400
401BEGIN_FTR_SECTION
402 cmpdi r9,0
403 bne 3f
404END_FTR_SECTION_IFSET(CPU_FTR_1T_SEGMENT)
405
406 rldicr r29,r5,28,63-28
407 rldicl r3,r3,0,36
408 or r29,r3,r29
409
410
411 rldicl r5,r5,0,25
412 rldicl r0,r3,64-12,48
413 xor r28,r5,r0
414 b 4f
415
4163:
417 sldi r29,r5,40
418 clrldi r3,r3,24
419 rldic r28,r5,25,25
420 clrldi r5,r5,40
421 rldicl r0,r3,64-12,36
422 xor r28,r28,r5
423 or r29,r3,r29
424 xor r28,r28,r0
425
426
4274:
428#ifdef CONFIG_PPC_SUBPAGE_PROT
429 andc r10,r30,r10
430 andi. r3,r10,0x1fe
431 rlwinm r0,r10,32-9+1,30,30
432#else
433 andi. r3,r30,0x1fe
434 rlwinm r0,r30,32-9+1,30,30
435#endif
436 xori r3,r3,HPTE_R_N
437 rlwinm r4,r30,32-7+1,30,30
438 and r0,r0,r4
439 andc r0,r3,r0
440 rlwimi r3,r0,32-1,31,31
441 ori r3,r3,HPTE_R_C
442
443
444
445
446BEGIN_FTR_SECTION
447 mr r4,r30
448 mr r5,r7
449 bl .hash_page_do_lazy_icache
450END_FTR_SECTION(CPU_FTR_NOEXECUTE|CPU_FTR_COHERENT_ICACHE, CPU_FTR_NOEXECUTE)
451
452
453
454
455 std r3,STK_PARM(r4)(r1)
456
457
458 ld r4,htab_hash_mask@got(2)
459 ld r27,0(r4)
460
461
462
463
464
465 rldicl. r0,r31,64-12,48
466 li r26,0
467 beq htab_insert_pte
468
469
470
471
472
473 andis. r0,r31,_PAGE_COMBO@h
474 beq htab_inval_old_hpte
475
476 ld r6,STK_PARM(r6)(r1)
477 ori r26,r6,0x8000
478 ld r26,0(r26)
479 addi r5,r25,36
480 rldcr. r0,r31,r5,0
481 bne htab_modify_pte
482
483htab_insert_pte:
484
485 andis. r0,r31,_PAGE_4K_PFN@h
486 srdi r5,r31,PTE_RPN_SHIFT
487 bne- htab_special_pfn
488 sldi r5,r5,PAGE_SHIFT-HW_PAGE_SHIFT
489 add r5,r5,r25
490htab_special_pfn:
491 sldi r5,r5,HW_PAGE_SHIFT
492
493
494 and r0,r28,r27
495 rldicr r3,r0,3,63-3
496
497
498 ld r6,STK_PARM(r4)(r1)
499 mr r4,r29
500 li r7,0
501 li r8,MMU_PAGE_4K
502 ld r9,STK_PARM(r9)(r1)
503_GLOBAL(htab_call_hpte_insert1)
504 bl .
505 cmpdi 0,r3,0
506 bge htab_pte_insert_ok
507 cmpdi 0,r3,-2
508 beq- htab_pte_insert_failure
509
510
511
512
513 andis. r0,r31,_PAGE_4K_PFN@h
514 srdi r5,r31,PTE_RPN_SHIFT
515 bne- 3f
516 sldi r5,r5,PAGE_SHIFT-HW_PAGE_SHIFT
517 add r5,r5,r25
5183: sldi r5,r5,HW_PAGE_SHIFT
519
520
521 andc r0,r27,r28
522 rldicr r3,r0,3,63-3
523
524
525 ld r6,STK_PARM(r4)(r1)
526 mr r4,r29
527 li r7,HPTE_V_SECONDARY
528 li r8,MMU_PAGE_4K
529 ld r9,STK_PARM(r9)(r1)
530_GLOBAL(htab_call_hpte_insert2)
531 bl .
532 cmpdi 0,r3,0
533 bge+ htab_pte_insert_ok
534 cmpdi 0,r3,-2
535 beq- htab_pte_insert_failure
536
537
538 mftb r0
539
540 andi. r0,r0,1
541 mr r5,r28
542 bne 2f
543 not r5,r5
5442: and r0,r5,r27
545 rldicr r3,r0,3,63-3
546
547_GLOBAL(htab_call_hpte_remove)
548 bl .
549
550
551 b htab_insert_pte
552
553
554
555
556
557htab_inval_old_hpte:
558 mr r3,r29
559 mr r4,r31
560 li r5,0
561 li r6,MMU_PAGE_64K
562 ld r7,STK_PARM(r9)(r1)
563 ld r8,STK_PARM(r8)(r1)
564 bl .flush_hash_page
565
566 lis r0,_PAGE_HPTE_SUB@h
567 ori r0,r0,_PAGE_HPTE_SUB@l
568 andc r30,r30,r0
569 b htab_insert_pte
570
571htab_bail_ok:
572 li r3,0
573 b htab_bail
574
575htab_pte_insert_ok:
576
577
578
579 ld r6,STK_PARM(r6)(r1)
580 li r0,_PAGE_BUSY
581 andc r30,r30,r0
582
583 li r0,1
584 subfic r5,r25,27
585 sld r0,r0,r5
586 or r30,r30,r0
587
588 sldi r5,r25,2
589 sld r3,r3,r5
590 li r4,0xf
591 sld r4,r4,r5
592 andc r26,r26,r4
593 or r26,r26,r3
594 ori r5,r6,0x8000
595 std r26,0(r5)
596 lwsync
597 std r30,0(r6)
598 li r3, 0
599htab_bail:
600 ld r25,STK_REG(r25)(r1)
601 ld r26,STK_REG(r26)(r1)
602 ld r27,STK_REG(r27)(r1)
603 ld r28,STK_REG(r28)(r1)
604 ld r29,STK_REG(r29)(r1)
605 ld r30,STK_REG(r30)(r1)
606 ld r31,STK_REG(r31)(r1)
607 addi r1,r1,STACKFRAMESIZE
608 ld r0,16(r1)
609 mtlr r0
610 blr
611
612htab_modify_pte:
613
614 mr r4,r3
615 sldi r5,r25,2
616 srd r3,r26,r5
617
618
619 mr r5,r28
620 andi. r0,r3,0x8
621 beq 1f
622 not r5,r5
6231: andi. r3,r3,0x7
624
625
626 and r0,r5,r27
627 rldicr r0,r0,3,63-3
628 add r3,r0,r3
629
630
631 mr r5,r29
632 li r6,MMU_PAGE_4K
633 ld r7,STK_PARM(r9)(r1)
634 ld r8,STK_PARM(r8)(r1)
635_GLOBAL(htab_call_hpte_updatepp)
636 bl .
637
638
639
640
641 cmpdi 0,r3,-1
642 beq- htab_insert_pte
643
644
645 li r0,_PAGE_BUSY
646 andc r30,r30,r0
647 ld r6,STK_PARM(r6)(r1)
648 std r30,0(r6)
649 li r3,0
650 b htab_bail
651
652htab_wrong_access:
653
654 stdcx. r31,0,r6
655 li r3,1
656 b htab_bail
657
658htab_pte_insert_failure:
659
660 ld r6,STK_PARM(r6)(r1)
661 std r31,0(r6)
662 li r3,-1
663 b htab_bail
664
665#endif
666
667#ifdef CONFIG_PPC_HAS_HASH_64K
668
669
670
671
672
673
674
675_GLOBAL(__hash_page_64K)
676 mflr r0
677 std r0,16(r1)
678 stdu r1,-STACKFRAMESIZE(r1)
679
680 std r6,STK_PARM(r6)(r1)
681 std r8,STK_PARM(r8)(r1)
682 std r9,STK_PARM(r9)(r1)
683
684
685
686
687
688
689
690
691 std r27,STK_REG(r27)(r1)
692 std r28,STK_REG(r28)(r1)
693 std r29,STK_REG(r29)(r1)
694 std r30,STK_REG(r30)(r1)
695 std r31,STK_REG(r31)(r1)
696
697
698
699
700
701
7021:
703 ldarx r31,0,r6
704
705 andc. r0,r4,r31
706 bne- ht64_wrong_access
707
708 andi. r0,r31,_PAGE_BUSY
709
710
711
712 bne- ht64_bail_ok
713BEGIN_FTR_SECTION
714
715 andi. r0,r31,_PAGE_NO_CACHE
716
717 bne- ht64_bail_ok
718END_FTR_SECTION_IFCLR(CPU_FTR_CI_LARGE_PAGE)
719
720
721
722 rlwinm r30,r4,32-9+7,31-7,31-7
723 or r30,r30,r31
724 ori r30,r30,_PAGE_BUSY | _PAGE_ACCESSED
725
726 stdcx. r30,0,r6
727 bne- 1b
728 isync
729
730
731
732
733
734
735
736BEGIN_FTR_SECTION
737 cmpdi r9,0
738 bne 3f
739END_FTR_SECTION_IFSET(CPU_FTR_1T_SEGMENT)
740
741 rldicr r29,r5,28,63-28
742 rldicl r3,r3,0,36
743 or r29,r3,r29
744
745
746 rldicl r5,r5,0,25
747 rldicl r0,r3,64-16,52
748 xor r28,r5,r0
749 b 4f
750
7513:
752 sldi r29,r5,40
753 clrldi r3,r3,24
754 rldic r28,r5,25,25
755 clrldi r5,r5,40
756 rldicl r0,r3,64-16,40
757 xor r28,r28,r5
758 or r29,r3,r29
759 xor r28,r28,r0
760
761
7624: andi. r3,r30,0x1fe
763 xori r3,r3,HPTE_R_N
764 rlwinm r0,r30,32-9+1,30,30
765 rlwinm r4,r30,32-7+1,30,30
766 and r0,r0,r4
767 andc r0,r30,r0
768 rlwimi r3,r0,32-1,31,31
769 ori r3,r3,HPTE_R_C
770
771
772
773
774BEGIN_FTR_SECTION
775 mr r4,r30
776 mr r5,r7
777 bl .hash_page_do_lazy_icache
778END_FTR_SECTION(CPU_FTR_NOEXECUTE|CPU_FTR_COHERENT_ICACHE, CPU_FTR_NOEXECUTE)
779
780
781
782
783 std r3,STK_PARM(r4)(r1)
784
785
786 ld r4,htab_hash_mask@got(2)
787 ld r27,0(r4)
788
789
790
791
792 rldicl. r0,r31,64-12,48
793 bne ht64_modify_pte
794
795ht64_insert_pte:
796
797
798
799 lis r0,_PAGE_HPTEFLAGS@h
800 ori r0,r0,_PAGE_HPTEFLAGS@l
801 andc r30,r30,r0
802#ifdef CONFIG_PPC_64K_PAGES
803 oris r30,r30,_PAGE_HPTE_SUB0@h
804#else
805 ori r30,r30,_PAGE_HASHPTE
806#endif
807
808 rldicl r5,r31,64-PTE_RPN_SHIFT,PTE_RPN_SHIFT
809 sldi r5,r5,PAGE_SHIFT
810
811
812 and r0,r28,r27
813 rldicr r3,r0,3,63-3
814
815
816 ld r6,STK_PARM(r4)(r1)
817 mr r4,r29
818 li r7,0
819 li r8,MMU_PAGE_64K
820 ld r9,STK_PARM(r9)(r1)
821_GLOBAL(ht64_call_hpte_insert1)
822 bl .
823 cmpdi 0,r3,0
824 bge ht64_pte_insert_ok
825 cmpdi 0,r3,-2
826 beq- ht64_pte_insert_failure
827
828
829
830
831 rldicl r5,r31,64-PTE_RPN_SHIFT,PTE_RPN_SHIFT
832 sldi r5,r5,PAGE_SHIFT
833
834
835 andc r0,r27,r28
836 rldicr r3,r0,3,63-3
837
838
839 ld r6,STK_PARM(r4)(r1)
840 mr r4,r29
841 li r7,HPTE_V_SECONDARY
842 li r8,MMU_PAGE_64K
843 ld r9,STK_PARM(r9)(r1)
844_GLOBAL(ht64_call_hpte_insert2)
845 bl .
846 cmpdi 0,r3,0
847 bge+ ht64_pte_insert_ok
848 cmpdi 0,r3,-2
849 beq- ht64_pte_insert_failure
850
851
852 mftb r0
853
854 andi. r0,r0,1
855 mr r5,r28
856 bne 2f
857 not r5,r5
8582: and r0,r5,r27
859 rldicr r3,r0,3,63-3
860
861_GLOBAL(ht64_call_hpte_remove)
862 bl .
863
864
865 b ht64_insert_pte
866
867ht64_bail_ok:
868 li r3,0
869 b ht64_bail
870
871ht64_pte_insert_ok:
872
873 rldimi r30,r3,12,63-15
874
875
876
877
878ht64_write_out_pte:
879 ld r6,STK_PARM(r6)(r1)
880 std r30,0(r6)
881 li r3, 0
882ht64_bail:
883 ld r27,STK_REG(r27)(r1)
884 ld r28,STK_REG(r28)(r1)
885 ld r29,STK_REG(r29)(r1)
886 ld r30,STK_REG(r30)(r1)
887 ld r31,STK_REG(r31)(r1)
888 addi r1,r1,STACKFRAMESIZE
889 ld r0,16(r1)
890 mtlr r0
891 blr
892
893ht64_modify_pte:
894
895 mr r4,r3
896 rlwinm r3,r31,32-12,29,31
897
898
899 mr r5,r28
900 andi. r0,r31,_PAGE_F_SECOND
901 beq 1f
902 not r5,r5
9031:
904
905 and r0,r5,r27
906 rldicr r0,r0,3,63-3
907 add r3,r0,r3
908
909
910 mr r5,r29
911 li r6,MMU_PAGE_64K
912 ld r7,STK_PARM(r9)(r1)
913 ld r8,STK_PARM(r8)(r1)
914_GLOBAL(ht64_call_hpte_updatepp)
915 bl .
916
917
918
919
920 cmpdi 0,r3,-1
921 beq- ht64_insert_pte
922
923
924 li r0,_PAGE_BUSY
925 andc r30,r30,r0
926 b ht64_write_out_pte
927
928ht64_wrong_access:
929
930 stdcx. r31,0,r6
931 li r3,1
932 b ht64_bail
933
934ht64_pte_insert_failure:
935
936 ld r6,STK_PARM(r6)(r1)
937 std r31,0(r6)
938 li r3,-1
939 b ht64_bail
940
941
942#endif
943
944
945
946
947
948
949
950