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