1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#include <asm/asm-offsets.h>
26
27
28
29
30
31
32#include <asm/psw.h>
33#include <asm/cache.h>
34#include <asm/assembly.h>
35#include <asm/pgtable.h>
36#include <asm/signal.h>
37#include <asm/unistd.h>
38#include <asm/ldcw.h>
39#include <asm/thread_info.h>
40
41#include <linux/linkage.h>
42
43#ifdef CONFIG_64BIT
44 .level 2.0w
45#else
46 .level 2.0
47#endif
48
49 .import pa_tlb_lock,data
50 .macro load_pa_tlb_lock reg
51
52 load32 PA(pa_tlb_lock) + __PA_LDCW_ALIGNMENT-1, \reg
53 depi 0,31,__PA_LDCW_ALIGN_ORDER, \reg
54#else
55 load32 PA(pa_tlb_lock), \reg
56#endif
57 .endm
58
59
60
61
62 .macro space_to_prot spc prot
63 depd,z \spc,62,31,\prot
64 .endm
65#else
66 .macro space_to_prot spc prot
67 extrd,u \spc,(64 - (SPACEID_SHIFT)),32,\prot
68 .endm
69#endif
70
71
72 .macro virt_map
73
74 rsm PSW_SM_I, %r0
75 mtsp %r0, %sr4
76 mtsp %r0, %sr5
77 mtsp %r0, %sr6
78 tovirt_r1 %r29
79 load32 KERNEL_PSW, %r1
80
81 rsm PSW_SM_QUIET,%r0
82 mtctl %r0, %cr17
83 mtctl %r0, %cr17
84 mtctl %r1, %ipsw
85 load32 4f, %r1
86 mtctl %r1, %cr18
87 ldo 4(%r1), %r1
88 mtctl %r1, %cr18
89 rfir
90 nop
914:
92 .endm
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123 .macro get_stack_use_cr30
124
125
126
127 copy %r30, %r17
128 mfctl %cr30, %r1
129 ldo THREAD_SZ_ALGN(%r1), %r30
130 mtsp %r0,%sr7
131 mtsp %r16,%sr3
132 tophys %r1,%r9
133 LDREG TI_TASK(%r9), %r1
134 tophys %r1,%r9
135 ldo TASK_REGS(%r9),%r9
136 STREG %r17,PT_GR30(%r9)
137 STREG %r29,PT_GR29(%r9)
138 STREG %r26,PT_GR26(%r9)
139 STREG %r16,PT_SR7(%r9)
140 copy %r9,%r29
141 .endm
142
143 .macro get_stack_use_r30
144
145
146
147 tophys %r30,%r9
148 copy %r30,%r1
149 ldo PT_SZ_ALGN(%r30),%r30
150 STREG %r1,PT_GR30(%r9)
151 STREG %r29,PT_GR29(%r9)
152 STREG %r26,PT_GR26(%r9)
153 STREG %r16,PT_SR7(%r9)
154 copy %r9,%r29
155 .endm
156
157 .macro rest_stack
158 LDREG PT_GR1(%r29), %r1
159 LDREG PT_GR30(%r29),%r30
160 LDREG PT_GR29(%r29),%r29
161 .endm
162
163
164
165 .macro def code
166 b intr_save
167 ldi \code, %r8
168 .align 32
169 .endm
170
171
172
173 .macro extint code
174 b intr_extint
175 mfsp %sr7,%r16
176 .align 32
177 .endm
178
179 .import os_hpmc, code
180
181
182 .macro hpmc code
183 nop
184 load32 PA(os_hpmc), %r3
185 bv,n 0(%r3)
186 nop
187 .word 0
188 .word PA(os_hpmc)
189 .word 0
190 .endm
191
192
193
194
195
196
197
198
199
200 va = r8
201 spc = r24
202
203#ifndef CONFIG_64BIT
204
205
206
207
208
209 .macro itlb_11 code
210
211 mfctl %pcsq, spc
212 b itlb_miss_11
213 mfctl %pcoq, va
214
215 .align 32
216 .endm
217#endif
218
219
220
221
222
223 .macro itlb_20 code
224 mfctl %pcsq, spc
225#ifdef CONFIG_64BIT
226 b itlb_miss_20w
227#else
228 b itlb_miss_20
229#endif
230 mfctl %pcoq, va
231
232 .align 32
233 .endm
234
235#ifndef CONFIG_64BIT
236
237
238
239
240 .macro naitlb_11 code
241
242 mfctl %isr,spc
243 b naitlb_miss_11
244 mfctl %ior,va
245
246 .align 32
247 .endm
248#endif
249
250
251
252
253
254 .macro naitlb_20 code
255
256 mfctl %isr,spc
257#ifdef CONFIG_64BIT
258 b naitlb_miss_20w
259#else
260 b naitlb_miss_20
261#endif
262 mfctl %ior,va
263
264 .align 32
265 .endm
266
267#ifndef CONFIG_64BIT
268
269
270
271
272 .macro dtlb_11 code
273
274 mfctl %isr, spc
275 b dtlb_miss_11
276 mfctl %ior, va
277
278 .align 32
279 .endm
280#endif
281
282
283
284
285
286 .macro dtlb_20 code
287
288 mfctl %isr, spc
289#ifdef CONFIG_64BIT
290 b dtlb_miss_20w
291#else
292 b dtlb_miss_20
293#endif
294 mfctl %ior, va
295
296 .align 32
297 .endm
298
299#ifndef CONFIG_64BIT
300
301
302 .macro nadtlb_11 code
303
304 mfctl %isr,spc
305 b nadtlb_miss_11
306 mfctl %ior,va
307
308 .align 32
309 .endm
310#endif
311
312
313
314 .macro nadtlb_20 code
315
316 mfctl %isr,spc
317#ifdef CONFIG_64BIT
318 b nadtlb_miss_20w
319#else
320 b nadtlb_miss_20
321#endif
322 mfctl %ior,va
323
324 .align 32
325 .endm
326
327#ifndef CONFIG_64BIT
328
329
330
331
332 .macro dbit_11 code
333
334 mfctl %isr,spc
335 b dbit_trap_11
336 mfctl %ior,va
337
338 .align 32
339 .endm
340#endif
341
342
343
344
345
346 .macro dbit_20 code
347
348 mfctl %isr,spc
349#ifdef CONFIG_64BIT
350 b dbit_trap_20w
351#else
352 b dbit_trap_20
353#endif
354 mfctl %ior,va
355
356 .align 32
357 .endm
358
359
360
361
362 .macro space_adjust spc,va,tmp
363#ifdef CONFIG_64BIT
364 extrd,u \spc,63,SPACEID_SHIFT,\tmp
365 depd %r0,63,SPACEID_SHIFT,\spc
366 depd \tmp,31,SPACEID_SHIFT,\va
367#endif
368 .endm
369
370 .import swapper_pg_dir,code
371
372
373
374
375 .macro get_pgd spc,reg
376 ldil L%PA(swapper_pg_dir),\reg
377 ldo R%PA(swapper_pg_dir)(\reg),\reg
378 or,COND(=) %r0,\spc,%r0
379 mfctl %cr25,\reg
380 .endm
381
382
383
384
385
386
387
388
389
390
391
392
393 .macro space_check spc,tmp,fault
394 mfsp %sr7,\tmp
395 or,COND(<>) %r0,\spc,%r0
396
397
398 copy \spc,\tmp
399 or,COND(=) %r0,\tmp,%r0
400 cmpb,COND(<>),n \tmp,\spc,\fault
401 .endm
402
403
404
405
406
407
408
409 .macro L2_ptep pmd,pte,index,va,fault
410
411 extru \va,31-ASM_PMD_SHIFT,ASM_BITS_PER_PMD,\index
412#else
413
414 extrd,u \va,63-ASM_PGDIR_SHIFT,ASM_BITS_PER_PGD,\index
415 #else
416
417 extru \va,31-ASM_PGDIR_SHIFT,32-ASM_PGDIR_SHIFT,\index
418 # else
419 extru \va,31-ASM_PGDIR_SHIFT,ASM_BITS_PER_PGD,\index
420 # endif
421# endif
422#endif
423 dep %r0,31,PAGE_SHIFT,\pmd
424 copy %r0,\pte
425 ldw,s \index(\pmd),\pmd
426 bb,>=,n \pmd,_PxD_PRESENT_BIT,\fault
427 dep %r0,31,PxD_FLAG_SHIFT,\pmd
428 copy \pmd,%r9
429 SHLREG %r9,PxD_VALUE_SHIFT,\pmd
430 extru \va,31-PAGE_SHIFT,ASM_BITS_PER_PTE,\index
431 dep %r0,31,PAGE_SHIFT,\pmd
432 shladd \index,BITS_PER_PTE_ENTRY,\pmd,\pmd
433 LDREG %r0(\pmd),\pte
434 bb,>=,n \pte,_PAGE_PRESENT_BIT,\fault
435 .endm
436
437
438
439
440
441
442
443
444
445
446
447 .macro L3_ptep pgd,pte,index,va,fault
448
449 extrd,u \va,63-ASM_PGDIR_SHIFT,ASM_BITS_PER_PGD,\index
450 copy %r0,\pte
451 extrd,u,*= \va,63-ASM_PGDIR_SHIFT,64-ASM_PGDIR_SHIFT,%r0
452 ldw,s \index(\pgd),\pgd
453 extrd,u,*= \va,63-ASM_PGDIR_SHIFT,64-ASM_PGDIR_SHIFT,%r0
454 bb,>=,n \pgd,_PxD_PRESENT_BIT,\fault
455 extrd,u,*= \va,63-ASM_PGDIR_SHIFT,64-ASM_PGDIR_SHIFT,%r0
456 shld \pgd,PxD_VALUE_SHIFT,\index
457 extrd,u,*= \va,63-ASM_PGDIR_SHIFT,64-ASM_PGDIR_SHIFT,%r0
458 copy \index,\pgd
459 extrd,u,*<> \va,63-ASM_PGDIR_SHIFT,64-ASM_PGDIR_SHIFT,%r0
460 ldo ASM_PGD_PMD_OFFSET(\pgd),\pgd
461#endif
462 L2_ptep \pgd,\pte,\index,\va,\fault
463 .endm
464
465
466 .macro tlb_lock spc,ptp,pte,tmp,tmp1,fault
467#ifdef CONFIG_SMP
468 cmpib,COND(=),n 0,\spc,2f
469 load_pa_tlb_lock \tmp
4701: LDCW 0(\tmp),\tmp1
471 cmpib,COND(=) 0,\tmp1,1b
472 nop
473 LDREG 0(\ptp),\pte
474 bb,<,n \pte,_PAGE_PRESENT_BIT,2f
475 b \fault
476 stw \spc,0(\tmp)
4772:
478#endif
479 .endm
480
481
482 .macro tlb_unlock0 spc,tmp
483#ifdef CONFIG_SMP
484 or,COND(=) %r0,\spc,%r0
485 stw \spc,0(\tmp)
486#endif
487 .endm
488
489
490 .macro tlb_unlock1 spc,tmp
491#ifdef CONFIG_SMP
492 load_pa_tlb_lock \tmp
493 tlb_unlock0 \spc,\tmp
494#endif
495 .endm
496
497
498
499 .macro update_accessed ptp,pte,tmp,tmp1
500 ldi _PAGE_ACCESSED,\tmp1
501 or \tmp1,\pte,\tmp
502 and,COND(<>) \tmp1,\pte,%r0
503 STREG \tmp,0(\ptp)
504 .endm
505
506
507
508 .macro update_dirty ptp,pte,tmp
509 ldi _PAGE_ACCESSED|_PAGE_DIRTY,\tmp
510 or \tmp,\pte,\pte
511 STREG \pte,0(\ptp)
512 .endm
513
514
515
516
517
518
519
520 #define PAGE_ADD_SHIFT (PAGE_SHIFT-12)
521 #define PAGE_ADD_HUGE_SHIFT (REAL_HPAGE_SHIFT-12)
522
523
524 .macro convert_for_tlb_insert20 pte,tmp
525#ifdef CONFIG_HUGETLB_PAGE
526 copy \pte,\tmp
527 extrd,u \tmp,(63-ASM_PFN_PTE_SHIFT)+(63-58)+PAGE_ADD_SHIFT,\
528 64-PAGE_SHIFT-PAGE_ADD_SHIFT,\pte
529
530 depdi _PAGE_SIZE_ENCODING_DEFAULT,63,\
531 (63-58)+PAGE_ADD_SHIFT,\pte
532 extrd,u,*= \tmp,_PAGE_HPAGE_BIT+32,1,%r0
533 depdi _HUGE_PAGE_SIZE_ENCODING_DEFAULT,63,\
534 (63-58)+PAGE_ADD_HUGE_SHIFT,\pte
535#else
536 extrd,u \pte,(63-ASM_PFN_PTE_SHIFT)+(63-58)+PAGE_ADD_SHIFT,\
537 64-PAGE_SHIFT-PAGE_ADD_SHIFT,\pte
538 depdi _PAGE_SIZE_ENCODING_DEFAULT,63,\
539 (63-58)+PAGE_ADD_SHIFT,\pte
540#endif
541 .endm
542
543
544
545 .macro make_insert_tlb spc,pte,prot,tmp
546 space_to_prot \spc \prot
547
548
549
550
551
552
553
554
555
556
557
558
559 depd \pte,8,7,\prot
560
561
562
563
564 extrd,u,*= \pte,_PAGE_USER_BIT+32,1,%r0
565 depdi 7,11,3,\prot
566
567
568
569 extrd,u,*= \pte,_PAGE_GATEWAY_BIT+32,1,%r0
570 depd %r0,11,2,\prot
571
572
573
574
575
576
577
578 extrd,u,*= \pte,_PAGE_NO_CACHE_BIT+32,1,%r0
579 depdi 1,12,1,\prot
580
581
582 convert_for_tlb_insert20 \pte \tmp
583 .endm
584
585
586
587
588 .macro make_insert_tlb_11 spc,pte,prot
589 zdep \spc,30,15,\prot
590 dep \pte,8,7,\prot
591 extru,= \pte,_PAGE_NO_CACHE_BIT,1,%r0
592 depi 1,12,1,\prot
593 extru,= \pte,_PAGE_USER_BIT,1,%r0
594 depi 7,11,3,\prot
595 extru,= \pte,_PAGE_GATEWAY_BIT,1,%r0
596 depi 0,11,2,\prot
597
598
599
600 depi 0,31,ASM_PFN_PTE_SHIFT,\pte
601 SHRREG \pte,(ASM_PFN_PTE_SHIFT-(31-26)),\pte
602 .endm
603
604
605
606
607
608 .macro f_extend pte,tmp
609 extrd,s \pte,42,4,\tmp
610 addi,<> 1,\tmp,%r0
611 extrd,s \pte,63,25,\pte
612 .endm
613
614
615
616
617
618
619
620
621
622 .macro do_alias spc,tmp,tmp1,va,pte,prot,fault,patype
623 cmpib,COND(<>),n 0,\spc,\fault
624 ldil L%(TMPALIAS_MAP_START),\tmp
625
626
627
628 depdi 0,31,32,\tmp
629#endif
630 copy \va,\tmp1
631 depi 0,31,23,\tmp1
632 cmpb,COND(<>),n \tmp,\tmp1,\fault
633 mfctl %cr19,\tmp
634
635 extrw,u \tmp,5,6,\tmp
636
637
638
639
640
641
642
643 ldi (_PAGE_REFTRAP|_PAGE_READ|_PAGE_WRITE),\prot
644
645
646
647
648
649 cmpiclr,= 0x01,\tmp,%r0
650 ldi (_PAGE_DIRTY|_PAGE_READ|_PAGE_WRITE),\prot
651.ifc \patype,20
652 depd,z \prot,8,7,\prot
653.else
654.ifc \patype,11
655 depw,z \prot,8,7,\prot
656.else
657 .error "undefined PA type to do_alias"
658.endif
659.endif
660
661
662
663
664#ifdef CONFIG_64BIT
665 extrd,u,*= \va,41,1,%r0
666#else
667 extrw,u,= \va,9,1,%r0
668#endif
669 or,COND(tr) %r23,%r0,\pte
670 or %r26,%r0,\pte
671 .endm
672
673
674
675
676
677
678
679 .section .text.hot
680 .align 2048
681
682ENTRY(fault_vector_20)
683
684 .ascii "cows can fly"
685 .byte 0
686 .align 32
687
688 hpmc 1
689 def 2
690 def 3
691 extint 4
692 def 5
693 itlb_20 6
694 def 7
695 def 8
696 def 9
697 def 10
698 def 11
699 def 12
700 def 13
701 def 14
702 dtlb_20 15
703 naitlb_20 16
704 nadtlb_20 17
705 def 18
706 def 19
707 dbit_20 20
708 def 21
709 def 22
710 def 23
711 def 24
712 def 25
713 def 26
714 def 27
715 def 28
716 def 29
717 def 30
718 def 31
719END(fault_vector_20)
720
721#ifndef CONFIG_64BIT
722
723 .align 2048
724
725ENTRY(fault_vector_11)
726
727 .ascii "cows can fly"
728 .byte 0
729 .align 32
730
731 hpmc 1
732 def 2
733 def 3
734 extint 4
735 def 5
736 itlb_11 6
737 def 7
738 def 8
739 def 9
740 def 10
741 def 11
742 def 12
743 def 13
744 def 14
745 dtlb_11 15
746 naitlb_11 16
747 nadtlb_11 17
748 def 18
749 def 19
750 dbit_11 20
751 def 21
752 def 22
753 def 23
754 def 24
755 def 25
756 def 26
757 def 27
758 def 28
759 def 29
760 def 30
761 def 31
762END(fault_vector_11)
763
764#endif
765
766 .align PAGE_SIZE
767ENTRY(end_fault_vector)
768
769 .import handle_interruption,code
770 .import do_cpu_irq_mask,code
771
772
773
774
775
776
777
778ENTRY_CFI(ret_from_kernel_thread)
779
780
781 BL schedule_tail, %r2
782 nop
783
784 LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30), %r1
785 LDREG TASK_PT_GR25(%r1), %r26
786#ifdef CONFIG_64BIT
787 LDREG TASK_PT_GR27(%r1), %r27
788#endif
789 LDREG TASK_PT_GR26(%r1), %r1
790 ble 0(%sr7, %r1)
791 copy %r31, %r2
792 b finish_child_return
793 nop
794ENDPROC_CFI(ret_from_kernel_thread)
795
796
797
798
799
800
801
802ENTRY_CFI(_switch_to)
803 STREG %r2, -RP_OFFSET(%r30)
804
805 callee_save_float
806 callee_save
807
808 load32 _switch_to_ret, %r2
809
810 STREG %r2, TASK_PT_KPC(%r26)
811 LDREG TASK_PT_KPC(%r25), %r2
812
813 STREG %r30, TASK_PT_KSP(%r26)
814 LDREG TASK_PT_KSP(%r25), %r30
815 LDREG TASK_THREAD_INFO(%r25), %r25
816 bv %r0(%r2)
817 mtctl %r25,%cr30
818
819_switch_to_ret:
820 mtctl %r0, %cr0
821 callee_rest
822 callee_rest_float
823
824 LDREG -RP_OFFSET(%r30), %r2
825 bv %r0(%r2)
826 copy %r26, %r28
827ENDPROC_CFI(_switch_to)
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843 .align PAGE_SIZE
844
845ENTRY_CFI(syscall_exit_rfi)
846 mfctl %cr30,%r16
847 LDREG TI_TASK(%r16), %r16
848 ldo TASK_REGS(%r16),%r16
849
850
851
852 LDREG PT_IAOQ0(%r16),%r19
853 depi 3,31,2,%r19
854 STREG %r19,PT_IAOQ0(%r16)
855 LDREG PT_IAOQ1(%r16),%r19
856 depi 3,31,2,%r19
857 STREG %r19,PT_IAOQ1(%r16)
858 LDREG PT_PSW(%r16),%r19
859 load32 USER_PSW_MASK,%r1
860#ifdef CONFIG_64BIT
861 load32 USER_PSW_HI_MASK,%r20
862 depd %r20,31,32,%r1
863#endif
864 and %r19,%r1,%r19
865 load32 USER_PSW,%r1
866 or %r19,%r1,%r19
867 STREG %r19,PT_PSW(%r16)
868
869
870
871
872
873
874
875
876
877
878
879 STREG %r0,PT_SR2(%r16)
880 mfsp %sr3,%r19
881 STREG %r19,PT_SR0(%r16)
882 STREG %r19,PT_SR1(%r16)
883 STREG %r19,PT_SR3(%r16)
884 STREG %r19,PT_SR4(%r16)
885 STREG %r19,PT_SR5(%r16)
886 STREG %r19,PT_SR6(%r16)
887 STREG %r19,PT_SR7(%r16)
888
889intr_return:
890
891 mfctl %cr30,%r1
892 LDREG TI_FLAGS(%r1),%r19
893 bb,<,n %r19,31-TIF_NEED_RESCHED,intr_do_resched
894
895 .import do_notify_resume,code
896intr_check_sig:
897
898 mfctl %cr30,%r1
899 LDREG TI_FLAGS(%r1),%r19
900 ldi (_TIF_SIGPENDING|_TIF_NOTIFY_RESUME), %r20
901 and,COND(<>) %r19, %r20, %r0
902 b,n intr_restore
903
904
905
906
907
908
909
910
911 LDREG PT_IASQ0(%r16), %r20
912 cmpib,COND(=),n 0,%r20,intr_restore
913 LDREG PT_IASQ1(%r16), %r20
914 cmpib,COND(=),n 0,%r20,intr_restore
915
916
917
918
919 ssm PSW_SM_I, %r0
920
921 copy %r0, %r25
922#ifdef CONFIG_64BIT
923 ldo -16(%r30),%r29
924#endif
925
926 BL do_notify_resume,%r2
927 copy %r16, %r26
928
929 b,n intr_check_sig
930
931intr_restore:
932 copy %r16,%r29
933 ldo PT_FR31(%r29),%r1
934 rest_fp %r1
935 rest_general %r29
936
937
938 pcxt_ssm_bug
939 rsm PSW_SM_QUIET,%r0
940 tophys_r1 %r29
941
942
943
944
945 rest_specials %r29
946
947
948
949
950 rest_stack
951
952 rfi
953 nop
954
955#ifndef CONFIG_PREEMPT
956# define intr_do_preempt intr_restore
957#endif
958
959 .import schedule,code
960intr_do_resched:
961
962
963
964
965 LDREG PT_IASQ0(%r16), %r20
966 cmpib,COND(=) 0, %r20, intr_do_preempt
967 nop
968 LDREG PT_IASQ1(%r16), %r20
969 cmpib,COND(=) 0, %r20, intr_do_preempt
970 nop
971
972
973
974 ssm PSW_SM_I, %r0
975
976#ifdef CONFIG_64BIT
977 ldo -16(%r30),%r29
978#endif
979
980 ldil L%intr_check_sig, %r2
981#ifndef CONFIG_64BIT
982 b schedule
983#else
984 load32 schedule, %r20
985 bv %r0(%r20)
986#endif
987 ldo R%intr_check_sig(%r2), %r2
988
989
990
991
992
993
994#ifdef CONFIG_PREEMPT
995 .import preempt_schedule_irq,code
996intr_do_preempt:
997 rsm PSW_SM_I, %r0
998
999
1000 mfctl %cr30, %r1
1001 LDREG TI_PRE_COUNT(%r1), %r19
1002 cmpib,COND(<>) 0, %r19, intr_restore
1003 nop
1004
1005
1006 LDREG PT_PSW(%r16), %r20
1007 bb,<,n %r20, 31 - PSW_SM_I, intr_restore
1008 nop
1009
1010 BL preempt_schedule_irq, %r2
1011 nop
1012
1013 b,n intr_restore
1014#endif
1015
1016
1017
1018
1019
1020intr_extint:
1021 cmpib,COND(=),n 0,%r16,1f
1022
1023 get_stack_use_cr30
1024 b,n 2f
1025
10261:
1027 get_stack_use_r30
10282:
1029 save_specials %r29
1030 virt_map
1031 save_general %r29
1032
1033 ldo PT_FR0(%r29), %r24
1034 save_fp %r24
1035
1036 loadgp
1037
1038 copy %r29, %r26
1039 copy %r29, %r16
1040
1041 ldil L%intr_return, %r2
1042
1043#ifdef CONFIG_64BIT
1044 ldo -16(%r30),%r29
1045#endif
1046
1047 b do_cpu_irq_mask
1048 ldo R%intr_return(%r2), %r2
1049ENDPROC_CFI(syscall_exit_rfi)
1050
1051
1052
1053
1054ENTRY_CFI(intr_save)
1055 mfsp %sr7,%r16
1056 cmpib,COND(=),n 0,%r16,1f
1057 get_stack_use_cr30
1058 b 2f
1059 copy %r8,%r26
1060
10611:
1062 get_stack_use_r30
1063 copy %r8,%r26
1064
10652:
1066 save_specials %r29
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078 cmpib,COND(=),n 6,%r26,skip_save_ior
1079
1080
1081 mfctl %cr20, %r16
1082 nop
1083 mfctl %cr21, %r17
1084
1085
1086#ifdef CONFIG_64BIT
1087
1088
1089
1090
1091
1092 extrd,u,*<> %r8,PSW_W_BIT,1,%r0
1093 depdi 0,1,2,%r17
1094
1095
1096
1097
1098
1099
1100
1101
1102 extrd,u %r16,63,SPACEID_SHIFT,%r1
1103 depd %r1,31,SPACEID_SHIFT,%r17
1104 depdi 0,63,SPACEID_SHIFT,%r16
1105#endif
1106 STREG %r16, PT_ISR(%r29)
1107 STREG %r17, PT_IOR(%r29)
1108
1109
1110skip_save_ior:
1111 virt_map
1112 save_general %r29
1113
1114 ldo PT_FR0(%r29), %r25
1115 save_fp %r25
1116
1117 loadgp
1118
1119 copy %r29, %r25
1120#ifdef CONFIG_64BIT
1121 ldo -16(%r30),%r29
1122#endif
1123
1124 ldil L%intr_check_sig, %r2
1125 copy %r25, %r16
1126
1127 b handle_interruption
1128 ldo R%intr_check_sig(%r2), %r2
1129ENDPROC_CFI(intr_save)
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151 t0 = r1
1152 va = r8
1153 t1 = r9
1154 pte = r16
1155 prot = r17
1156 spc = r24
1157 ptp = r25
1158
1159#ifdef CONFIG_64BIT
1160
1161dtlb_miss_20w:
1162 space_adjust spc,va,t0
1163 get_pgd spc,ptp
1164 space_check spc,t0,dtlb_fault
1165
1166 L3_ptep ptp,pte,t0,va,dtlb_check_alias_20w
1167
1168 tlb_lock spc,ptp,pte,t0,t1,dtlb_check_alias_20w
1169 update_accessed ptp,pte,t0,t1
1170
1171 make_insert_tlb spc,pte,prot,t1
1172
1173 idtlbt pte,prot
1174
1175 tlb_unlock1 spc,t0
1176 rfir
1177 nop
1178
1179dtlb_check_alias_20w:
1180 do_alias spc,t0,t1,va,pte,prot,dtlb_fault,20
1181
1182 idtlbt pte,prot
1183
1184 rfir
1185 nop
1186
1187nadtlb_miss_20w:
1188 space_adjust spc,va,t0
1189 get_pgd spc,ptp
1190 space_check spc,t0,nadtlb_fault
1191
1192 L3_ptep ptp,pte,t0,va,nadtlb_check_alias_20w
1193
1194 tlb_lock spc,ptp,pte,t0,t1,nadtlb_check_alias_20w
1195 update_accessed ptp,pte,t0,t1
1196
1197 make_insert_tlb spc,pte,prot,t1
1198
1199 idtlbt pte,prot
1200
1201 tlb_unlock1 spc,t0
1202 rfir
1203 nop
1204
1205nadtlb_check_alias_20w:
1206 do_alias spc,t0,t1,va,pte,prot,nadtlb_emulate,20
1207
1208 idtlbt pte,prot
1209
1210 rfir
1211 nop
1212
1213#else
1214
1215dtlb_miss_11:
1216 get_pgd spc,ptp
1217
1218 space_check spc,t0,dtlb_fault
1219
1220 L2_ptep ptp,pte,t0,va,dtlb_check_alias_11
1221
1222 tlb_lock spc,ptp,pte,t0,t1,dtlb_check_alias_11
1223 update_accessed ptp,pte,t0,t1
1224
1225 make_insert_tlb_11 spc,pte,prot
1226
1227 mfsp %sr1,t1
1228 mtsp spc,%sr1
1229
1230 idtlba pte,(%sr1,va)
1231 idtlbp prot,(%sr1,va)
1232
1233 mtsp t1, %sr1
1234
1235 tlb_unlock1 spc,t0
1236 rfir
1237 nop
1238
1239dtlb_check_alias_11:
1240 do_alias spc,t0,t1,va,pte,prot,dtlb_fault,11
1241
1242 idtlba pte,(va)
1243 idtlbp prot,(va)
1244
1245 rfir
1246 nop
1247
1248nadtlb_miss_11:
1249 get_pgd spc,ptp
1250
1251 space_check spc,t0,nadtlb_fault
1252
1253 L2_ptep ptp,pte,t0,va,nadtlb_check_alias_11
1254
1255 tlb_lock spc,ptp,pte,t0,t1,nadtlb_check_alias_11
1256 update_accessed ptp,pte,t0,t1
1257
1258 make_insert_tlb_11 spc,pte,prot
1259
1260 mfsp %sr1,t1
1261 mtsp spc,%sr1
1262
1263 idtlba pte,(%sr1,va)
1264 idtlbp prot,(%sr1,va)
1265
1266 mtsp t1, %sr1
1267
1268 tlb_unlock1 spc,t0
1269 rfir
1270 nop
1271
1272nadtlb_check_alias_11:
1273 do_alias spc,t0,t1,va,pte,prot,nadtlb_emulate,11
1274
1275 idtlba pte,(va)
1276 idtlbp prot,(va)
1277
1278 rfir
1279 nop
1280
1281dtlb_miss_20:
1282 space_adjust spc,va,t0
1283 get_pgd spc,ptp
1284 space_check spc,t0,dtlb_fault
1285
1286 L2_ptep ptp,pte,t0,va,dtlb_check_alias_20
1287
1288 tlb_lock spc,ptp,pte,t0,t1,dtlb_check_alias_20
1289 update_accessed ptp,pte,t0,t1
1290
1291 make_insert_tlb spc,pte,prot,t1
1292
1293 f_extend pte,t1
1294
1295 idtlbt pte,prot
1296
1297 tlb_unlock1 spc,t0
1298 rfir
1299 nop
1300
1301dtlb_check_alias_20:
1302 do_alias spc,t0,t1,va,pte,prot,dtlb_fault,20
1303
1304 idtlbt pte,prot
1305
1306 rfir
1307 nop
1308
1309nadtlb_miss_20:
1310 get_pgd spc,ptp
1311
1312 space_check spc,t0,nadtlb_fault
1313
1314 L2_ptep ptp,pte,t0,va,nadtlb_check_alias_20
1315
1316 tlb_lock spc,ptp,pte,t0,t1,nadtlb_check_alias_20
1317 update_accessed ptp,pte,t0,t1
1318
1319 make_insert_tlb spc,pte,prot,t1
1320
1321 f_extend pte,t1
1322
1323 idtlbt pte,prot
1324
1325 tlb_unlock1 spc,t0
1326 rfir
1327 nop
1328
1329nadtlb_check_alias_20:
1330 do_alias spc,t0,t1,va,pte,prot,nadtlb_emulate,20
1331
1332 idtlbt pte,prot
1333
1334 rfir
1335 nop
1336
1337#endif
1338
1339nadtlb_emulate:
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356 mfctl %cr19,%r9
1357
1358
1359
1360
1361
1362 ldi 0x280,%r16
1363 and %r9,%r16,%r17
1364 cmpb,<>,n %r16,%r17,nadtlb_probe_check
1365 bb,>=,n %r9,26,nadtlb_nullify
1366 BL get_register,%r25
1367 extrw,u %r9,15,5,%r8
1368 cmpib,COND(=),n -1,%r1,nadtlb_fault
1369 copy %r1,%r24
1370 BL get_register,%r25
1371 extrw,u %r9,10,5,%r8
1372 cmpib,COND(=),n -1,%r1,nadtlb_fault
1373 BL set_register,%r25
1374 add,l %r1,%r24,%r1
1375
1376nadtlb_nullify:
1377 mfctl %ipsw,%r8
1378 ldil L%PSW_N,%r9
1379 or %r8,%r9,%r8
1380 mtctl %r8,%ipsw
1381
1382 rfir
1383 nop
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398nadtlb_probe_check:
1399 ldi 0x80,%r16
1400 and %r9,%r16,%r17
1401 cmpb,<>,n %r16,%r17,nadtlb_fault
1402 BL get_register,%r25
1403 extrw,u %r9,31,5,%r8
1404 cmpib,COND(=),n -1,%r1,nadtlb_fault
1405 BL set_register,%r25
1406 copy %r0,%r1
1407 b nadtlb_nullify
1408 nop
1409
1410
1411#ifdef CONFIG_64BIT
1412itlb_miss_20w:
1413
1414
1415
1416
1417
1418
1419 space_adjust spc,va,t0
1420 get_pgd spc,ptp
1421 space_check spc,t0,itlb_fault
1422
1423 L3_ptep ptp,pte,t0,va,itlb_fault
1424
1425 tlb_lock spc,ptp,pte,t0,t1,itlb_fault
1426 update_accessed ptp,pte,t0,t1
1427
1428 make_insert_tlb spc,pte,prot,t1
1429
1430 iitlbt pte,prot
1431
1432 tlb_unlock1 spc,t0
1433 rfir
1434 nop
1435
1436naitlb_miss_20w:
1437
1438
1439
1440
1441
1442
1443 space_adjust spc,va,t0
1444 get_pgd spc,ptp
1445 space_check spc,t0,naitlb_fault
1446
1447 L3_ptep ptp,pte,t0,va,naitlb_check_alias_20w
1448
1449 tlb_lock spc,ptp,pte,t0,t1,naitlb_check_alias_20w
1450 update_accessed ptp,pte,t0,t1
1451
1452 make_insert_tlb spc,pte,prot,t1
1453
1454 iitlbt pte,prot
1455
1456 tlb_unlock1 spc,t0
1457 rfir
1458 nop
1459
1460naitlb_check_alias_20w:
1461 do_alias spc,t0,t1,va,pte,prot,naitlb_fault,20
1462
1463 iitlbt pte,prot
1464
1465 rfir
1466 nop
1467
1468#else
1469
1470itlb_miss_11:
1471 get_pgd spc,ptp
1472
1473 space_check spc,t0,itlb_fault
1474
1475 L2_ptep ptp,pte,t0,va,itlb_fault
1476
1477 tlb_lock spc,ptp,pte,t0,t1,itlb_fault
1478 update_accessed ptp,pte,t0,t1
1479
1480 make_insert_tlb_11 spc,pte,prot
1481
1482 mfsp %sr1,t1
1483 mtsp spc,%sr1
1484
1485 iitlba pte,(%sr1,va)
1486 iitlbp prot,(%sr1,va)
1487
1488 mtsp t1, %sr1
1489
1490 tlb_unlock1 spc,t0
1491 rfir
1492 nop
1493
1494naitlb_miss_11:
1495 get_pgd spc,ptp
1496
1497 space_check spc,t0,naitlb_fault
1498
1499 L2_ptep ptp,pte,t0,va,naitlb_check_alias_11
1500
1501 tlb_lock spc,ptp,pte,t0,t1,naitlb_check_alias_11
1502 update_accessed ptp,pte,t0,t1
1503
1504 make_insert_tlb_11 spc,pte,prot
1505
1506 mfsp %sr1,t1
1507 mtsp spc,%sr1
1508
1509 iitlba pte,(%sr1,va)
1510 iitlbp prot,(%sr1,va)
1511
1512 mtsp t1, %sr1
1513
1514 tlb_unlock1 spc,t0
1515 rfir
1516 nop
1517
1518naitlb_check_alias_11:
1519 do_alias spc,t0,t1,va,pte,prot,itlb_fault,11
1520
1521 iitlba pte,(%sr0, va)
1522 iitlbp prot,(%sr0, va)
1523
1524 rfir
1525 nop
1526
1527
1528itlb_miss_20:
1529 get_pgd spc,ptp
1530
1531 space_check spc,t0,itlb_fault
1532
1533 L2_ptep ptp,pte,t0,va,itlb_fault
1534
1535 tlb_lock spc,ptp,pte,t0,t1,itlb_fault
1536 update_accessed ptp,pte,t0,t1
1537
1538 make_insert_tlb spc,pte,prot,t1
1539
1540 f_extend pte,t1
1541
1542 iitlbt pte,prot
1543
1544 tlb_unlock1 spc,t0
1545 rfir
1546 nop
1547
1548naitlb_miss_20:
1549 get_pgd spc,ptp
1550
1551 space_check spc,t0,naitlb_fault
1552
1553 L2_ptep ptp,pte,t0,va,naitlb_check_alias_20
1554
1555 tlb_lock spc,ptp,pte,t0,t1,naitlb_check_alias_20
1556 update_accessed ptp,pte,t0,t1
1557
1558 make_insert_tlb spc,pte,prot,t1
1559
1560 f_extend pte,t1
1561
1562 iitlbt pte,prot
1563
1564 tlb_unlock1 spc,t0
1565 rfir
1566 nop
1567
1568naitlb_check_alias_20:
1569 do_alias spc,t0,t1,va,pte,prot,naitlb_fault,20
1570
1571 iitlbt pte,prot
1572
1573 rfir
1574 nop
1575
1576#endif
1577
1578#ifdef CONFIG_64BIT
1579
1580dbit_trap_20w:
1581 space_adjust spc,va,t0
1582 get_pgd spc,ptp
1583 space_check spc,t0,dbit_fault
1584
1585 L3_ptep ptp,pte,t0,va,dbit_fault
1586
1587 tlb_lock spc,ptp,pte,t0,t1,dbit_fault
1588 update_dirty ptp,pte,t1
1589
1590 make_insert_tlb spc,pte,prot,t1
1591
1592 idtlbt pte,prot
1593
1594 tlb_unlock0 spc,t0
1595 rfir
1596 nop
1597#else
1598
1599dbit_trap_11:
1600
1601 get_pgd spc,ptp
1602
1603 space_check spc,t0,dbit_fault
1604
1605 L2_ptep ptp,pte,t0,va,dbit_fault
1606
1607 tlb_lock spc,ptp,pte,t0,t1,dbit_fault
1608 update_dirty ptp,pte,t1
1609
1610 make_insert_tlb_11 spc,pte,prot
1611
1612 mfsp %sr1,t1
1613 mtsp spc,%sr1
1614
1615 idtlba pte,(%sr1,va)
1616 idtlbp prot,(%sr1,va)
1617
1618 mtsp t1, %sr1
1619
1620 tlb_unlock0 spc,t0
1621 rfir
1622 nop
1623
1624dbit_trap_20:
1625 get_pgd spc,ptp
1626
1627 space_check spc,t0,dbit_fault
1628
1629 L2_ptep ptp,pte,t0,va,dbit_fault
1630
1631 tlb_lock spc,ptp,pte,t0,t1,dbit_fault
1632 update_dirty ptp,pte,t1
1633
1634 make_insert_tlb spc,pte,prot,t1
1635
1636 f_extend pte,t1
1637
1638 idtlbt pte,prot
1639
1640 tlb_unlock0 spc,t0
1641 rfir
1642 nop
1643#endif
1644
1645 .import handle_interruption,code
1646
1647kernel_bad_space:
1648 b intr_save
1649 ldi 31,%r8
1650
1651dbit_fault:
1652 b intr_save
1653 ldi 20,%r8
1654
1655itlb_fault:
1656 b intr_save
1657 ldi 6,%r8
1658
1659nadtlb_fault:
1660 b intr_save
1661 ldi 17,%r8
1662
1663naitlb_fault:
1664 b intr_save
1665 ldi 16,%r8
1666
1667dtlb_fault:
1668 b intr_save
1669 ldi 15,%r8
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693 .macro reg_save regs
1694 STREG %r3, PT_GR3(\regs)
1695 STREG %r4, PT_GR4(\regs)
1696 STREG %r5, PT_GR5(\regs)
1697 STREG %r6, PT_GR6(\regs)
1698 STREG %r7, PT_GR7(\regs)
1699 STREG %r8, PT_GR8(\regs)
1700 STREG %r9, PT_GR9(\regs)
1701 STREG %r10,PT_GR10(\regs)
1702 STREG %r11,PT_GR11(\regs)
1703 STREG %r12,PT_GR12(\regs)
1704 STREG %r13,PT_GR13(\regs)
1705 STREG %r14,PT_GR14(\regs)
1706 STREG %r15,PT_GR15(\regs)
1707 STREG %r16,PT_GR16(\regs)
1708 STREG %r17,PT_GR17(\regs)
1709 STREG %r18,PT_GR18(\regs)
1710 .endm
1711
1712 .macro reg_restore regs
1713 LDREG PT_GR3(\regs), %r3
1714 LDREG PT_GR4(\regs), %r4
1715 LDREG PT_GR5(\regs), %r5
1716 LDREG PT_GR6(\regs), %r6
1717 LDREG PT_GR7(\regs), %r7
1718 LDREG PT_GR8(\regs), %r8
1719 LDREG PT_GR9(\regs), %r9
1720 LDREG PT_GR10(\regs),%r10
1721 LDREG PT_GR11(\regs),%r11
1722 LDREG PT_GR12(\regs),%r12
1723 LDREG PT_GR13(\regs),%r13
1724 LDREG PT_GR14(\regs),%r14
1725 LDREG PT_GR15(\regs),%r15
1726 LDREG PT_GR16(\regs),%r16
1727 LDREG PT_GR17(\regs),%r17
1728 LDREG PT_GR18(\regs),%r18
1729 .endm
1730
1731 .macro fork_like name
1732ENTRY_CFI(sys_\name\()_wrapper)
1733 LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30), %r1
1734 ldo TASK_REGS(%r1),%r1
1735 reg_save %r1
1736 mfctl %cr27, %r28
1737 ldil L%sys_\name, %r31
1738 be R%sys_\name(%sr4,%r31)
1739 STREG %r28, PT_CR27(%r1)
1740ENDPROC_CFI(sys_\name\()_wrapper)
1741 .endm
1742
1743fork_like clone
1744fork_like fork
1745fork_like vfork
1746
1747
1748ENTRY_CFI(child_return)
1749 BL schedule_tail, %r2
1750 nop
1751finish_child_return:
1752 LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30), %r1
1753 ldo TASK_REGS(%r1),%r1
1754
1755 LDREG PT_CR27(%r1), %r3
1756 mtctl %r3, %cr27
1757 reg_restore %r1
1758 b syscall_exit
1759 copy %r0,%r28
1760ENDPROC_CFI(child_return)
1761
1762ENTRY_CFI(sys_rt_sigreturn_wrapper)
1763 LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r26
1764 ldo TASK_REGS(%r26),%r26
1765
1766 STREG %r2, -RP_OFFSET(%r30)
1767#ifdef CONFIG_64BIT
1768 ldo FRAME_SIZE(%r30), %r30
1769 BL sys_rt_sigreturn,%r2
1770 ldo -16(%r30),%r29
1771#else
1772 BL sys_rt_sigreturn,%r2
1773 ldo FRAME_SIZE(%r30), %r30
1774#endif
1775
1776 ldo -FRAME_SIZE(%r30), %r30
1777 LDREG -RP_OFFSET(%r30), %r2
1778
1779
1780 LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1
1781 ldo TASK_REGS(%r1),%r1
1782 reg_restore %r1
1783
1784
1785
1786
1787
1788 bv %r0(%r2)
1789 LDREG PT_GR28(%r1),%r28
1790ENDPROC_CFI(sys_rt_sigreturn_wrapper)
1791
1792ENTRY_CFI(syscall_exit)
1793
1794
1795
1796
1797
1798
1799
1800 mfctl %cr30, %r1
1801 LDREG TI_TASK(%r1),%r1
1802 STREG %r28,TASK_PT_GR28(%r1)
1803
1804
1805
1806
1807 loadgp
1808
1809syscall_check_resched:
1810
1811
1812
1813 LDREG TI_FLAGS-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r19
1814 bb,<,n %r19, 31-TIF_NEED_RESCHED, syscall_do_resched
1815
1816 .import do_signal,code
1817syscall_check_sig:
1818 LDREG TI_FLAGS-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r19
1819 ldi (_TIF_SIGPENDING|_TIF_NOTIFY_RESUME), %r26
1820 and,COND(<>) %r19, %r26, %r0
1821 b,n syscall_restore
1822
1823syscall_do_signal:
1824
1825
1826
1827
1828
1829 LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1
1830 ldo TASK_REGS(%r1), %r26
1831 reg_save %r26
1832
1833#ifdef CONFIG_64BIT
1834 ldo -16(%r30),%r29
1835#endif
1836
1837 BL do_notify_resume,%r2
1838 ldi 1, %r25
1839
1840 LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1
1841 ldo TASK_REGS(%r1), %r20
1842 reg_restore %r20
1843
1844 b,n syscall_check_sig
1845
1846syscall_restore:
1847 LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1
1848
1849
1850 ldw TASK_FLAGS(%r1),%r19
1851 ldi _TIF_SYSCALL_TRACE_MASK,%r2
1852 and,COND(=) %r19,%r2,%r0
1853 b,n syscall_restore_rfi
1854
1855 ldo TASK_PT_FR31(%r1),%r19
1856 rest_fp %r19
1857
1858 LDREG TASK_PT_SAR(%r1),%r19
1859 mtsar %r19
1860
1861 LDREG TASK_PT_GR2(%r1),%r2
1862 LDREG TASK_PT_GR19(%r1),%r19
1863 LDREG TASK_PT_GR20(%r1),%r20
1864 LDREG TASK_PT_GR21(%r1),%r21
1865 LDREG TASK_PT_GR22(%r1),%r22
1866 LDREG TASK_PT_GR23(%r1),%r23
1867 LDREG TASK_PT_GR24(%r1),%r24
1868 LDREG TASK_PT_GR25(%r1),%r25
1869 LDREG TASK_PT_GR26(%r1),%r26
1870 LDREG TASK_PT_GR27(%r1),%r27
1871 LDREG TASK_PT_GR28(%r1),%r28
1872 LDREG TASK_PT_GR29(%r1),%r29
1873 LDREG TASK_PT_GR31(%r1),%r31
1874
1875
1876 LDREG TASK_PT_GR30(%r1),%r1
1877 rsm PSW_SM_I, %r0
1878 copy %r1,%r30
1879 mfsp %sr3,%r1
1880 mtsp %r1,%sr7
1881 ssm PSW_SM_I, %r0
1882
1883
1884 mtsp %r0,%sr2
1885 mtsp %r1,%sr4
1886 mtsp %r1,%sr5
1887 mtsp %r1,%sr6
1888
1889 depi 3,31,2,%r31
1890
1891#ifdef CONFIG_64BIT
1892
1893
1894
1895
1896 extrd,u,*<> %r30,63,1,%r1
1897 rsm PSW_SM_W, %r0
1898
1899 xor %r30,%r1,%r30
1900#endif
1901 be,n 0(%sr3,%r31)
1902
1903
1904
1905
1906
1907
1908syscall_restore_rfi:
1909 ldo -1(%r0),%r2
1910 mtctl %r2,%cr0
1911 LDREG TASK_PT_PSW(%r1),%r2
1912 ldi 0x0b,%r20
1913 depi -1,13,1,%r20
1914
1915
1916
1917
1918
1919
1920 extru,= %r19,TIF_SINGLESTEP_PA_BIT,1,%r0
1921 depi -1,27,1,%r20
1922
1923
1924 extru,= %r19,TIF_BLOCKSTEP_PA_BIT,1,%r0
1925 depi -1,7,1,%r20
1926
1927 STREG %r20,TASK_PT_PSW(%r1)
1928
1929
1930
1931 mfsp %sr3,%r25
1932 STREG %r25,TASK_PT_SR3(%r1)
1933 STREG %r25,TASK_PT_SR4(%r1)
1934 STREG %r25,TASK_PT_SR5(%r1)
1935 STREG %r25,TASK_PT_SR6(%r1)
1936 STREG %r25,TASK_PT_SR7(%r1)
1937 STREG %r25,TASK_PT_IASQ0(%r1)
1938 STREG %r25,TASK_PT_IASQ1(%r1)
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949 bb,< %r2,30,pt_regs_ok
1950 ldo TASK_REGS(%r1),%r25
1951 reg_save %r25
1952
1953
1954 mfsp %sr0,%r2
1955 STREG %r2,TASK_PT_SR0(%r1)
1956
1957
1958 mfsp %sr1,%r2
1959 STREG %r2,TASK_PT_SR1(%r1)
1960
1961
1962 STREG %r0,TASK_PT_SR2(%r1)
1963
1964 LDREG TASK_PT_GR31(%r1),%r2
1965 depi 3,31,2,%r2
1966 STREG %r2,TASK_PT_IAOQ0(%r1)
1967 ldo 4(%r2),%r2
1968 STREG %r2,TASK_PT_IAOQ1(%r1)
1969 b intr_restore
1970 copy %r25,%r16
1971
1972pt_regs_ok:
1973 LDREG TASK_PT_IAOQ0(%r1),%r2
1974 depi 3,31,2,%r2
1975 STREG %r2,TASK_PT_IAOQ0(%r1)
1976 LDREG TASK_PT_IAOQ1(%r1),%r2
1977 depi 3,31,2,%r2
1978 STREG %r2,TASK_PT_IAOQ1(%r1)
1979 b intr_restore
1980 copy %r25,%r16
1981
1982syscall_do_resched:
1983 load32 syscall_check_resched,%r2
1984 load32 schedule,%r19
1985 bv %r0(%r19)
1986#ifdef CONFIG_64BIT
1987 ldo -16(%r30),%r29
1988#else
1989 nop
1990#endif
1991ENDPROC_CFI(syscall_exit)
1992
1993
1994#ifdef CONFIG_FUNCTION_TRACER
1995
1996 .import ftrace_function_trampoline,code
1997 .align L1_CACHE_BYTES
1998 .globl mcount
1999 .type mcount, @function
2000ENTRY(mcount)
2001_mcount:
2002 .export _mcount,data
2003 .proc
2004 .callinfo caller,frame=0
2005 .entry
2006
2007
2008
2009
2010
2011
2012 b ftrace_function_trampoline
2013 copy %r3, %arg2
2014ftrace_stub:
2015 .globl ftrace_stub
2016 .type ftrace_stub, @function
2017#ifdef CONFIG_64BIT
2018 bve (%rp)
2019#else
2020 bv %r0(%rp)
2021#endif
2022 nop
2023#ifdef CONFIG_64BIT
2024 .dword mcount
2025 .dword 0
2026#endif
2027 .exit
2028 .procend
2029ENDPROC(mcount)
2030
2031#ifdef CONFIG_FUNCTION_GRAPH_TRACER
2032 .align 8
2033 .globl return_to_handler
2034 .type return_to_handler, @function
2035ENTRY_CFI(return_to_handler)
2036 .proc
2037 .callinfo caller,frame=FRAME_SIZE
2038 .entry
2039 .export parisc_return_to_handler,data
2040parisc_return_to_handler:
2041 copy %r3,%r1
2042 STREG %r0,-RP_OFFSET(%sp)
2043 copy %sp,%r3
2044 STREGM %r1,FRAME_SIZE(%sp)
2045 STREG %ret0,8(%r3)
2046 STREG %ret1,16(%r3)
2047
2048#ifdef CONFIG_64BIT
2049 loadgp
2050#endif
2051
2052
2053 .import ftrace_return_to_handler,code
2054 load32 ftrace_return_to_handler,%ret0
2055 load32 .Lftrace_ret,%r2
2056#ifdef CONFIG_64BIT
2057 ldo -16(%sp),%ret1
2058 bve (%ret0)
2059#else
2060 bv %r0(%ret0)
2061#endif
2062 ldi 0,%r26
2063.Lftrace_ret:
2064 copy %ret0,%rp
2065
2066
2067 LDREG 8(%r3),%ret0
2068 LDREG 16(%r3),%ret1
2069
2070
2071#ifdef CONFIG_64BIT
2072 bve (%rp)
2073#else
2074 bv %r0(%rp)
2075#endif
2076 LDREGM -FRAME_SIZE(%sp),%r3
2077 .exit
2078 .procend
2079ENDPROC_CFI(return_to_handler)
2080
2081#endif
2082
2083#endif
2084
2085#ifdef CONFIG_IRQSTACKS
2086
2087
2088ENTRY_CFI(call_on_stack)
2089 copy %sp, %r1
2090
2091
2092
2093
2094
2095# ifdef CONFIG_64BIT
2096
2097 ldo 256(%arg2), %sp
2098
2099 STREG %rp, -144(%sp)
2100
2101 LDREG 16(%arg1), %arg1
2102 bve,l (%arg1), %rp
2103 STREG %r1, -136(%sp)
2104 LDREG -144(%sp), %rp
2105 bve (%rp)
2106 LDREG -136(%sp), %sp
2107# else
2108
2109 ldo 128(%arg2), %sp
2110
2111 STREG %r1, -68(%sp)
2112 STREG %rp, -84(%sp)
2113
2114 bb,>=,n %arg1, 30, 1f
2115 depwi 0,31,2, %arg1
2116 LDREG 0(%arg1), %arg1
21171:
2118 be,l 0(%sr4,%arg1), %sr0, %r31
2119 copy %r31, %rp
2120 LDREG -84(%sp), %rp
2121 bv (%rp)
2122 LDREG -68(%sp), %sp
2123# endif
2124ENDPROC_CFI(call_on_stack)
2125#endif
2126
2127ENTRY_CFI(get_register)
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138 blr %r8,%r0
2139 nop
2140 bv %r0(%r25)
2141 copy %r0,%r1
2142 bv %r0(%r25)
2143 ldi -1,%r1
2144 bv %r0(%r25)
2145 copy %r2,%r1
2146 bv %r0(%r25)
2147 copy %r3,%r1
2148 bv %r0(%r25)
2149 copy %r4,%r1
2150 bv %r0(%r25)
2151 copy %r5,%r1
2152 bv %r0(%r25)
2153 copy %r6,%r1
2154 bv %r0(%r25)
2155 copy %r7,%r1
2156 bv %r0(%r25)
2157 ldi -1,%r1
2158 bv %r0(%r25)
2159 ldi -1,%r1
2160 bv %r0(%r25)
2161 copy %r10,%r1
2162 bv %r0(%r25)
2163 copy %r11,%r1
2164 bv %r0(%r25)
2165 copy %r12,%r1
2166 bv %r0(%r25)
2167 copy %r13,%r1
2168 bv %r0(%r25)
2169 copy %r14,%r1
2170 bv %r0(%r25)
2171 copy %r15,%r1
2172 bv %r0(%r25)
2173 ldi -1,%r1
2174 bv %r0(%r25)
2175 ldi -1,%r1
2176 bv %r0(%r25)
2177 copy %r18,%r1
2178 bv %r0(%r25)
2179 copy %r19,%r1
2180 bv %r0(%r25)
2181 copy %r20,%r1
2182 bv %r0(%r25)
2183 copy %r21,%r1
2184 bv %r0(%r25)
2185 copy %r22,%r1
2186 bv %r0(%r25)
2187 copy %r23,%r1
2188 bv %r0(%r25)
2189 ldi -1,%r1
2190 bv %r0(%r25)
2191 ldi -1,%r1
2192 bv %r0(%r25)
2193 copy %r26,%r1
2194 bv %r0(%r25)
2195 copy %r27,%r1
2196 bv %r0(%r25)
2197 copy %r28,%r1
2198 bv %r0(%r25)
2199 copy %r29,%r1
2200 bv %r0(%r25)
2201 copy %r30,%r1
2202 bv %r0(%r25)
2203 copy %r31,%r1
2204ENDPROC_CFI(get_register)
2205
2206
2207ENTRY_CFI(set_register)
2208
2209
2210
2211
2212
2213 blr %r8,%r0
2214 nop
2215 bv %r0(%r25)
2216 copy %r1,%r0
2217 bv %r0(%r25)
2218 copy %r1,%r1
2219 bv %r0(%r25)
2220 copy %r1,%r2
2221 bv %r0(%r25)
2222 copy %r1,%r3
2223 bv %r0(%r25)
2224 copy %r1,%r4
2225 bv %r0(%r25)
2226 copy %r1,%r5
2227 bv %r0(%r25)
2228 copy %r1,%r6
2229 bv %r0(%r25)
2230 copy %r1,%r7
2231 bv %r0(%r25)
2232 copy %r1,%r8
2233 bv %r0(%r25)
2234 copy %r1,%r9
2235 bv %r0(%r25)
2236 copy %r1,%r10
2237 bv %r0(%r25)
2238 copy %r1,%r11
2239 bv %r0(%r25)
2240 copy %r1,%r12
2241 bv %r0(%r25)
2242 copy %r1,%r13
2243 bv %r0(%r25)
2244 copy %r1,%r14
2245 bv %r0(%r25)
2246 copy %r1,%r15
2247 bv %r0(%r25)
2248 copy %r1,%r16
2249 bv %r0(%r25)
2250 copy %r1,%r17
2251 bv %r0(%r25)
2252 copy %r1,%r18
2253 bv %r0(%r25)
2254 copy %r1,%r19
2255 bv %r0(%r25)
2256 copy %r1,%r20
2257 bv %r0(%r25)
2258 copy %r1,%r21
2259 bv %r0(%r25)
2260 copy %r1,%r22
2261 bv %r0(%r25)
2262 copy %r1,%r23
2263 bv %r0(%r25)
2264 copy %r1,%r24
2265 bv %r0(%r25)
2266 copy %r1,%r25
2267 bv %r0(%r25)
2268 copy %r1,%r26
2269 bv %r0(%r25)
2270 copy %r1,%r27
2271 bv %r0(%r25)
2272 copy %r1,%r28
2273 bv %r0(%r25)
2274 copy %r1,%r29
2275 bv %r0(%r25)
2276 copy %r1,%r30
2277 bv %r0(%r25)
2278 copy %r1,%r31
2279ENDPROC_CFI(set_register)
2280
2281