1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#include <linux/linkage.h>
16#include <linux/pgtable.h>
17
18#include <asm/processor.h>
19#include <asm/unistd.h>
20#include <asm/thread_info.h>
21#include <asm/errno.h>
22#include <asm/spr_defs.h>
23#include <asm/page.h>
24#include <asm/mmu.h>
25#include <asm/asm-offsets.h>
26
27#define DISABLE_INTERRUPTS(t1,t2) \
28 l.mfspr t2,r0,SPR_SR ;\
29 l.movhi t1,hi(~(SPR_SR_IEE|SPR_SR_TEE)) ;\
30 l.ori t1,t1,lo(~(SPR_SR_IEE|SPR_SR_TEE)) ;\
31 l.and t2,t2,t1 ;\
32 l.mtspr r0,t2,SPR_SR
33
34#define ENABLE_INTERRUPTS(t1) \
35 l.mfspr t1,r0,SPR_SR ;\
36 l.ori t1,t1,lo(SPR_SR_IEE|SPR_SR_TEE) ;\
37 l.mtspr r0,t1,SPR_SR
38
39
40
41#ifdef CONFIG_TRACE_IRQFLAGS
42
43
44
45#define TRACE_IRQS_OP(trace_op) \
46 l.sw -8(r1),r2 ;\
47 l.sw -4(r1),r9 ;\
48 l.addi r2,r1,0 ;\
49 l.jal trace_op ;\
50 l.addi r1,r1,-8 ;\
51 l.ori r1,r2,0 ;\
52 l.lwz r9,-4(r1) ;\
53 l.lwz r2,-8(r1) ;\
54
55
56
57
58#define TRACE_IRQS_SAVE(t1,trace_op) \
59 l.sw -12(r1),t1 ;\
60 l.sw -8(r1),r2 ;\
61 l.sw -4(r1),r9 ;\
62 l.addi r2,r1,0 ;\
63 l.jal trace_op ;\
64 l.addi r1,r1,-12 ;\
65 l.ori r1,r2,0 ;\
66 l.lwz r9,-4(r1) ;\
67 l.lwz r2,-8(r1) ;\
68 l.lwz t1,-12(r1)
69
70#define TRACE_IRQS_OFF TRACE_IRQS_OP(trace_hardirqs_off)
71#define TRACE_IRQS_ON TRACE_IRQS_OP(trace_hardirqs_on)
72#define TRACE_IRQS_ON_SYSCALL \
73 TRACE_IRQS_SAVE(r10,trace_hardirqs_on) ;\
74 l.lwz r3,PT_GPR3(r1) ;\
75 l.lwz r4,PT_GPR4(r1) ;\
76 l.lwz r5,PT_GPR5(r1) ;\
77 l.lwz r6,PT_GPR6(r1) ;\
78 l.lwz r7,PT_GPR7(r1) ;\
79 l.lwz r8,PT_GPR8(r1) ;\
80 l.lwz r11,PT_GPR11(r1)
81#define TRACE_IRQS_OFF_ENTRY \
82 l.lwz r5,PT_SR(r1) ;\
83 l.andi r3,r5,(SPR_SR_IEE|SPR_SR_TEE) ;\
84 l.sfeq r5,r0 ;\
85 l.bf 1f ;\
86 l.nop ;\
87 TRACE_IRQS_SAVE(r4,trace_hardirqs_off) ;\
881:
89#else
90#define TRACE_IRQS_OFF
91#define TRACE_IRQS_ON
92#define TRACE_IRQS_OFF_ENTRY
93#define TRACE_IRQS_ON_SYSCALL
94#endif
95
96
97
98
99
100
101
102
103#define RESTORE_ALL \
104 DISABLE_INTERRUPTS(r3,r4) ;\
105 l.lwz r3,PT_PC(r1) ;\
106 l.mtspr r0,r3,SPR_EPCR_BASE ;\
107 l.lwz r3,PT_SR(r1) ;\
108 l.mtspr r0,r3,SPR_ESR_BASE ;\
109 l.lwz r2,PT_GPR2(r1) ;\
110 l.lwz r3,PT_GPR3(r1) ;\
111 l.lwz r4,PT_GPR4(r1) ;\
112 l.lwz r5,PT_GPR5(r1) ;\
113 l.lwz r6,PT_GPR6(r1) ;\
114 l.lwz r7,PT_GPR7(r1) ;\
115 l.lwz r8,PT_GPR8(r1) ;\
116 l.lwz r9,PT_GPR9(r1) ;\
117 l.lwz r10,PT_GPR10(r1) ;\
118 l.lwz r11,PT_GPR11(r1) ;\
119 l.lwz r12,PT_GPR12(r1) ;\
120 l.lwz r13,PT_GPR13(r1) ;\
121 l.lwz r14,PT_GPR14(r1) ;\
122 l.lwz r15,PT_GPR15(r1) ;\
123 l.lwz r16,PT_GPR16(r1) ;\
124 l.lwz r17,PT_GPR17(r1) ;\
125 l.lwz r18,PT_GPR18(r1) ;\
126 l.lwz r19,PT_GPR19(r1) ;\
127 l.lwz r20,PT_GPR20(r1) ;\
128 l.lwz r21,PT_GPR21(r1) ;\
129 l.lwz r22,PT_GPR22(r1) ;\
130 l.lwz r23,PT_GPR23(r1) ;\
131 l.lwz r24,PT_GPR24(r1) ;\
132 l.lwz r25,PT_GPR25(r1) ;\
133 l.lwz r26,PT_GPR26(r1) ;\
134 l.lwz r27,PT_GPR27(r1) ;\
135 l.lwz r28,PT_GPR28(r1) ;\
136 l.lwz r29,PT_GPR29(r1) ;\
137 l.lwz r30,PT_GPR30(r1) ;\
138 l.lwz r31,PT_GPR31(r1) ;\
139 l.lwz r1,PT_SP(r1) ;\
140 l.rfe
141
142
143#define EXCEPTION_ENTRY(handler) \
144 .global handler ;\
145handler: ;\
146 ;\
147 l.sw PT_GPR2(r1),r2 ;\
148 l.sw PT_GPR3(r1),r3 ;\
149 ;\
150 l.sw PT_GPR5(r1),r5 ;\
151 l.sw PT_GPR6(r1),r6 ;\
152 l.sw PT_GPR7(r1),r7 ;\
153 l.sw PT_GPR8(r1),r8 ;\
154 l.sw PT_GPR9(r1),r9 ;\
155 ;\
156 l.sw PT_GPR11(r1),r11 ;\
157 ;\
158 l.sw PT_GPR13(r1),r13 ;\
159 l.sw PT_GPR14(r1),r14 ;\
160 l.sw PT_GPR15(r1),r15 ;\
161 l.sw PT_GPR16(r1),r16 ;\
162 l.sw PT_GPR17(r1),r17 ;\
163 l.sw PT_GPR18(r1),r18 ;\
164 l.sw PT_GPR19(r1),r19 ;\
165 l.sw PT_GPR20(r1),r20 ;\
166 l.sw PT_GPR21(r1),r21 ;\
167 l.sw PT_GPR22(r1),r22 ;\
168 l.sw PT_GPR23(r1),r23 ;\
169 l.sw PT_GPR24(r1),r24 ;\
170 l.sw PT_GPR25(r1),r25 ;\
171 l.sw PT_GPR26(r1),r26 ;\
172 l.sw PT_GPR27(r1),r27 ;\
173 l.sw PT_GPR28(r1),r28 ;\
174 l.sw PT_GPR29(r1),r29 ;\
175 ;\
176 ;\
177 l.sw PT_GPR31(r1),r31 ;\
178 TRACE_IRQS_OFF_ENTRY ;\
179 ;\
180 l.addi r30,r0,-1 ;\
181 l.sw PT_ORIG_GPR11(r1),r30
182
183#define UNHANDLED_EXCEPTION(handler,vector) \
184 .global handler ;\
185handler: ;\
186 ;\
187 l.sw PT_GPR2(r1),r2 ;\
188 l.sw PT_GPR3(r1),r3 ;\
189 l.sw PT_GPR5(r1),r5 ;\
190 l.sw PT_GPR6(r1),r6 ;\
191 l.sw PT_GPR7(r1),r7 ;\
192 l.sw PT_GPR8(r1),r8 ;\
193 l.sw PT_GPR9(r1),r9 ;\
194 ;\
195 l.sw PT_GPR11(r1),r11 ;\
196 ;\
197 l.sw PT_GPR13(r1),r13 ;\
198 l.sw PT_GPR14(r1),r14 ;\
199 l.sw PT_GPR15(r1),r15 ;\
200 l.sw PT_GPR16(r1),r16 ;\
201 l.sw PT_GPR17(r1),r17 ;\
202 l.sw PT_GPR18(r1),r18 ;\
203 l.sw PT_GPR19(r1),r19 ;\
204 l.sw PT_GPR20(r1),r20 ;\
205 l.sw PT_GPR21(r1),r21 ;\
206 l.sw PT_GPR22(r1),r22 ;\
207 l.sw PT_GPR23(r1),r23 ;\
208 l.sw PT_GPR24(r1),r24 ;\
209 l.sw PT_GPR25(r1),r25 ;\
210 l.sw PT_GPR26(r1),r26 ;\
211 l.sw PT_GPR27(r1),r27 ;\
212 l.sw PT_GPR28(r1),r28 ;\
213 l.sw PT_GPR29(r1),r29 ;\
214 ;\
215 l.sw PT_GPR30(r1),r30 ;\
216 ;\
217 ;\
218 l.addi r30,r0,-1 ;\
219 l.sw PT_ORIG_GPR11(r1),r30 ;\
220 l.addi r3,r1,0 ;\
221 ;\
222 l.addi r5,r0,vector ;\
223 l.jal unhandled_exception ;\
224 l.nop ;\
225 l.j _ret_from_exception ;\
226 l.nop
227
228
229#define CLEAR_LWA_FLAG(reg) \
230 l.movhi reg,hi(lwa_flag) ;\
231 l.ori reg,reg,lo(lwa_flag) ;\
232 l.sw 0(reg),r0
233
234
235
236
237
238
239
240
241
242
243
244
245
246EXCEPTION_ENTRY(_tng_kernel_start)
247 l.jal _start
248 l.andi r0,r0,0
249
250
251
252EXCEPTION_ENTRY(_bus_fault_handler)
253 CLEAR_LWA_FLAG(r3)
254
255 l.jal do_bus_fault
256 l.addi r3,r1,0
257
258 l.j _ret_from_exception
259 l.nop
260
261
262EXCEPTION_ENTRY(_dtlb_miss_page_fault_handler)
263 CLEAR_LWA_FLAG(r3)
264 l.and r5,r5,r0
265 l.j 1f
266 l.nop
267
268EXCEPTION_ENTRY(_data_page_fault_handler)
269 CLEAR_LWA_FLAG(r3)
270
271 l.ori r5,r0,0x300
2721:
273 l.addi r3,r1,0
274
275
276#ifdef CONFIG_OPENRISC_NO_SPR_SR_DSX
277 l.lwz r6,PT_PC(r3)
278 l.lwz r6,0(r6)
279
280 l.srli r6,r6,26
281 l.sfeqi r6,0
282 l.bf 8f
283 l.sfeqi r6,1
284 l.bf 8f
285 l.sfeqi r6,3
286 l.bf 8f
287 l.sfeqi r6,4
288 l.bf 8f
289 l.sfeqi r6,0x11
290 l.bf 8f
291 l.sfeqi r6,0x12
292 l.bf 8f
293 l.nop
294
295 l.j 9f
296 l.nop
297
2988:
299 l.lwz r6,PT_PC(r3)
300 l.addi r6,r6,4
301 l.lwz r6,0(r6)
302 l.srli r6,r6,26
3039:
304
305#else
306
307 l.mfspr r6,r0,SPR_SR
308 l.andi r6,r6,SPR_SR_DSX
309 l.sfne r6,r0
310 l.bnf 7f
311 l.lwz r6,PT_PC(r3)
312
313 l.addi r6,r6,4
3147:
315 l.lwz r6,0(r6)
316 l.srli r6,r6,26
317#endif
318
319 l.sfgeui r6,0x33
320 l.bnf 1f
321 l.sfleui r6,0x37
322 l.bnf 1f
323 l.ori r6,r0,0x1
324 l.j 2f
325 l.nop
3261: l.ori r6,r0,0x0
3272:
328
329
330 l.jal do_page_fault
331 l.nop
332 l.j _ret_from_exception
333 l.nop
334
335
336EXCEPTION_ENTRY(_itlb_miss_page_fault_handler)
337 CLEAR_LWA_FLAG(r3)
338 l.and r5,r5,r0
339 l.j 1f
340 l.nop
341
342EXCEPTION_ENTRY(_insn_page_fault_handler)
343 CLEAR_LWA_FLAG(r3)
344
345 l.ori r5,r0,0x400
3461:
347 l.addi r3,r1,0
348
349 l.ori r6,r0,0x0
350
351
352 l.jal do_page_fault
353 l.nop
354 l.j _ret_from_exception
355 l.nop
356
357
358
359
360EXCEPTION_ENTRY(_timer_handler)
361 CLEAR_LWA_FLAG(r3)
362 l.jal timer_interrupt
363 l.addi r3,r1,0
364
365 l.j _ret_from_intr
366 l.nop
367
368
369
370EXCEPTION_ENTRY(_alignment_handler)
371 CLEAR_LWA_FLAG(r3)
372
373 l.jal do_unaligned_access
374 l.addi r3,r1,0
375
376 l.j _ret_from_exception
377 l.nop
378
379
380EXCEPTION_ENTRY(_alignment_handler)
381
382 l.addi r2,r4,0
383
384 l.lwz r5,PT_PC(r1)
385
386 l.lwz r3,0(r5)
387 l.srli r4,r3,26
388
389 l.sfeqi r4,0x00
390 l.bf jmp
391 l.sfeqi r4,0x01
392 l.bf jmp
393 l.sfeqi r4,0x03
394 l.bf jmp
395 l.sfeqi r4,0x04
396 l.bf jmp
397 l.sfeqi r4,0x11
398 l.bf jr
399 l.sfeqi r4,0x12
400 l.bf jr
401 l.nop
402 l.j 1f
403 l.addi r5,r5,4
404
405jmp:
406 l.slli r4,r3,6
407 l.srai r4,r4,4
408
409 l.lwz r3,4(r5)
410
411 l.add r5,r5,r4
412
413 l.j 1f
414 l.srli r4,r3,26
415
416jr:
417 l.slli r4,r3,9
418 l.andi r4,r4,0x7c
419
420 l.lwz r3,4(r5)
421
422 l.add r4,r4,r1
423 l.lwz r5,0(r4)
424
425 l.srli r4,r3,26
426
427
4281:
429
430 l.sw PT_PC(r1),r5
431
432 l.sfeqi r4,0x26
433 l.bf lhs
434 l.sfeqi r4,0x25
435 l.bf lhz
436 l.sfeqi r4,0x22
437 l.bf lws
438 l.sfeqi r4,0x21
439 l.bf lwz
440 l.sfeqi r4,0x37
441 l.bf sh
442 l.sfeqi r4,0x35
443 l.bf sw
444 l.nop
445
4461: l.j 1b
447 l.nop
448
449lhs: l.lbs r5,0(r2)
450 l.slli r5,r5,8
451 l.lbz r6,1(r2)
452 l.or r5,r5,r6
453 l.srli r4,r3,19
454 l.andi r4,r4,0x7c
455 l.add r4,r4,r1
456 l.j align_end
457 l.sw 0(r4),r5
458
459lhz: l.lbz r5,0(r2)
460 l.slli r5,r5,8
461 l.lbz r6,1(r2)
462 l.or r5,r5,r6
463 l.srli r4,r3,19
464 l.andi r4,r4,0x7c
465 l.add r4,r4,r1
466 l.j align_end
467 l.sw 0(r4),r5
468
469lws: l.lbs r5,0(r2)
470 l.slli r5,r5,24
471 l.lbz r6,1(r2)
472 l.slli r6,r6,16
473 l.or r5,r5,r6
474 l.lbz r6,2(r2)
475 l.slli r6,r6,8
476 l.or r5,r5,r6
477 l.lbz r6,3(r2)
478 l.or r5,r5,r6
479 l.srli r4,r3,19
480 l.andi r4,r4,0x7c
481 l.add r4,r4,r1
482 l.j align_end
483 l.sw 0(r4),r5
484
485lwz: l.lbz r5,0(r2)
486 l.slli r5,r5,24
487 l.lbz r6,1(r2)
488 l.slli r6,r6,16
489 l.or r5,r5,r6
490 l.lbz r6,2(r2)
491 l.slli r6,r6,8
492 l.or r5,r5,r6
493 l.lbz r6,3(r2)
494 l.or r5,r5,r6
495 l.srli r4,r3,19
496 l.andi r4,r4,0x7c
497 l.add r4,r4,r1
498 l.j align_end
499 l.sw 0(r4),r5
500
501sh:
502 l.srli r4,r3,9
503 l.andi r4,r4,0x7c
504 l.add r4,r4,r1
505 l.lwz r5,0(r4)
506 l.sb 1(r2),r5
507 l.srli r5,r5,8
508 l.j align_end
509 l.sb 0(r2),r5
510
511sw:
512 l.srli r4,r3,9
513 l.andi r4,r4,0x7c
514 l.add r4,r4,r1
515 l.lwz r5,0(r4)
516 l.sb 3(r2),r5
517 l.srli r5,r5,8
518 l.sb 2(r2),r5
519 l.srli r5,r5,8
520 l.sb 1(r2),r5
521 l.srli r5,r5,8
522 l.j align_end
523 l.sb 0(r2),r5
524
525align_end:
526 l.j _ret_from_intr
527 l.nop
528#endif
529
530
531
532EXCEPTION_ENTRY(_illegal_instruction_handler)
533
534 l.jal do_illegal_instruction
535 l.addi r3,r1,0
536
537 l.j _ret_from_exception
538 l.nop
539
540
541
542EXCEPTION_ENTRY(_external_irq_handler)
543#ifdef CONFIG_OPENRISC_ESR_EXCEPTION_BUG_CHECK
544 l.lwz r4,PT_SR(r1)
545 l.andi r4,r4,SPR_SR_IEE
546 l.sfeqi r4,0
547 l.bnf 1f
548 l.nop
549
550#ifdef CONFIG_PRINTK
551 l.addi r1,r1,-0x8
552 l.movhi r3,hi(42f)
553 l.ori r3,r3,lo(42f)
554 l.sw 0x0(r1),r3
555 l.jal _printk
556 l.sw 0x4(r1),r4
557 l.addi r1,r1,0x8
558
559 .section .rodata, "a"
56042:
561 .string "\n\rESR interrupt bug: in _external_irq_handler (ESR %x)\n\r"
562 .align 4
563 .previous
564#endif
565
566 l.ori r4,r4,SPR_SR_IEE
567
5681:
569#endif
570 CLEAR_LWA_FLAG(r3)
571 l.addi r3,r1,0
572 l.movhi r8,hi(do_IRQ)
573 l.ori r8,r8,lo(do_IRQ)
574 l.jalr r8
575 l.nop
576 l.j _ret_from_intr
577 l.nop
578
579
580
581
582
583
584
585
586
587UNHANDLED_EXCEPTION(_vector_0xb00,0xb00)
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603_string_syscall_return:
604 .string "syscall return %ld \n\r\0"
605 .align 4
606
607ENTRY(_sys_call_handler)
608
609 l.sw PT_GPR2(r1),r2
610
611
612
613
614 l.sw PT_GPR3(r1),r3
615
616
617
618
619
620 CLEAR_LWA_FLAG(r4)
621 l.lwz r4,PT_GPR4(r1)
622 l.sw PT_GPR5(r1),r5
623 l.sw PT_GPR6(r1),r6
624 l.sw PT_GPR7(r1),r7
625 l.sw PT_GPR8(r1),r8
626 l.sw PT_GPR9(r1),r9
627
628 l.sw PT_GPR11(r1),r11
629
630 l.sw PT_ORIG_GPR11(r1),r11
631
632
633
634
635
636
637
638
639
640
641
642
643
644_syscall_check_trace_enter:
645
646 TRACE_IRQS_ON_SYSCALL
647 ENABLE_INTERRUPTS(r29)
648
649
650 l.lwz r30,TI_FLAGS(r10)
651 l.andi r30,r30,_TIF_SYSCALL_TRACE
652 l.sfne r30,r0
653 l.bf _syscall_trace_enter
654 l.nop
655
656_syscall_check:
657
658 l.sfgeui r11,__NR_syscalls
659 l.bf _syscall_badsys
660 l.nop
661
662_syscall_call:
663 l.movhi r29,hi(sys_call_table)
664 l.ori r29,r29,lo(sys_call_table)
665 l.slli r11,r11,2
666 l.add r29,r29,r11
667 l.lwz r29,0(r29)
668
669 l.jalr r29
670 l.nop
671
672_syscall_return:
673
674
675
676 l.sw PT_GPR11(r1),r11
677
678
679_syscall_debug:
680 l.movhi r3,hi(_string_syscall_return)
681 l.ori r3,r3,lo(_string_syscall_return)
682 l.ori r27,r0,1
683 l.sw -4(r1),r27
684 l.sw -8(r1),r11
685 l.addi r1,r1,-8
686 l.movhi r27,hi(_printk)
687 l.ori r27,r27,lo(_printk)
688 l.jalr r27
689 l.nop
690 l.addi r1,r1,8
691#endif
692
693_syscall_check_trace_leave:
694
695
696
697
698 l.sfne r30,r0
699 l.bf _syscall_trace_leave
700 l.nop
701
702
703
704
705
706_syscall_check_work:
707
708 DISABLE_INTERRUPTS(r27,r29)
709 TRACE_IRQS_OFF
710 l.lwz r30,TI_FLAGS(r10)
711 l.andi r30,r30,_TIF_WORK_MASK
712 l.sfne r30,r0
713
714 l.bnf _syscall_resume_userspace
715 l.nop
716
717
718
719
720
721 l.sw PT_GPR14(r1),r14
722 l.sw PT_GPR16(r1),r16
723 l.sw PT_GPR18(r1),r18
724 l.sw PT_GPR20(r1),r20
725 l.sw PT_GPR22(r1),r22
726 l.sw PT_GPR24(r1),r24
727 l.sw PT_GPR26(r1),r26
728 l.sw PT_GPR28(r1),r28
729
730
731 l.j _work_pending
732 l.nop
733
734_syscall_resume_userspace:
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758 l.lwz r2,PT_GPR2(r1)
759
760
761
762
763
764 l.lwz r3,PT_GPR3(r1)
765 l.lwz r4,PT_GPR4(r1)
766 l.lwz r5,PT_GPR5(r1)
767 l.lwz r6,PT_GPR6(r1)
768 l.lwz r7,PT_GPR7(r1)
769 l.lwz r8,PT_GPR8(r1)
770
771 l.lwz r9,PT_GPR9(r1)
772 l.lwz r10,PT_GPR10(r1)
773 l.lwz r11,PT_GPR11(r1)
774
775
776 l.lwz r30,PT_GPR30(r1)
777
778
779 l.lwz r13,PT_PC(r1)
780 l.lwz r15,PT_SR(r1)
781 l.lwz r1,PT_SP(r1)
782
783
784
785 DISABLE_INTERRUPTS(r17,r19)
786 l.mtspr r0,r13,SPR_EPCR_BASE
787 l.mtspr r0,r15,SPR_ESR_BASE
788 l.rfe
789
790
791
792
793
794_syscall_trace_enter:
795
796
797
798
799
800
801
802 l.jal do_syscall_trace_enter
803 l.addi r3,r1,0
804
805
806
807
808
809 l.lwz r11,PT_GPR11(r1)
810 l.lwz r3,PT_GPR3(r1)
811 l.lwz r4,PT_GPR4(r1)
812 l.lwz r5,PT_GPR5(r1)
813 l.lwz r6,PT_GPR6(r1)
814 l.lwz r7,PT_GPR7(r1)
815
816 l.j _syscall_check
817 l.lwz r8,PT_GPR8(r1)
818
819_syscall_trace_leave:
820 l.jal do_syscall_trace_leave
821 l.addi r3,r1,0
822
823 l.j _syscall_check_work
824 l.nop
825
826_syscall_badsys:
827
828
829
830
831
832 l.j _syscall_return
833 l.addi r11,r0,-ENOSYS
834
835
836
837
838
839UNHANDLED_EXCEPTION(_vector_0xd00,0xd00)
840
841
842
843EXCEPTION_ENTRY(_trap_handler)
844 CLEAR_LWA_FLAG(r3)
845
846 l.jal do_trap
847 l.addi r3,r1,0
848
849 l.j _ret_from_exception
850 l.nop
851
852
853
854UNHANDLED_EXCEPTION(_vector_0xf00,0xf00)
855
856
857
858UNHANDLED_EXCEPTION(_vector_0x1000,0x1000)
859
860
861
862UNHANDLED_EXCEPTION(_vector_0x1100,0x1100)
863
864
865
866UNHANDLED_EXCEPTION(_vector_0x1200,0x1200)
867
868
869
870UNHANDLED_EXCEPTION(_vector_0x1300,0x1300)
871
872
873
874UNHANDLED_EXCEPTION(_vector_0x1400,0x1400)
875
876
877
878UNHANDLED_EXCEPTION(_vector_0x1500,0x1500)
879
880
881
882UNHANDLED_EXCEPTION(_vector_0x1600,0x1600)
883
884
885
886UNHANDLED_EXCEPTION(_vector_0x1700,0x1700)
887
888
889
890UNHANDLED_EXCEPTION(_vector_0x1800,0x1800)
891
892
893
894UNHANDLED_EXCEPTION(_vector_0x1900,0x1900)
895
896
897
898UNHANDLED_EXCEPTION(_vector_0x1a00,0x1a00)
899
900
901
902UNHANDLED_EXCEPTION(_vector_0x1b00,0x1b00)
903
904
905
906UNHANDLED_EXCEPTION(_vector_0x1c00,0x1c00)
907
908
909
910UNHANDLED_EXCEPTION(_vector_0x1d00,0x1d00)
911
912
913
914UNHANDLED_EXCEPTION(_vector_0x1e00,0x1e00)
915
916
917
918UNHANDLED_EXCEPTION(_vector_0x1f00,0x1f00)
919
920
921
922_resume_userspace:
923 DISABLE_INTERRUPTS(r3,r4)
924 TRACE_IRQS_OFF
925 l.lwz r4,TI_FLAGS(r10)
926 l.andi r13,r4,_TIF_WORK_MASK
927 l.sfeqi r13,0
928 l.bf _restore_all
929 l.nop
930
931_work_pending:
932 l.lwz r5,PT_ORIG_GPR11(r1)
933 l.sfltsi r5,0
934 l.bnf 1f
935 l.nop
936 l.andi r5,r5,0
9371:
938 l.jal do_work_pending
939 l.ori r3,r1,0
940
941 l.sfeqi r11,0
942 l.bf _restore_all
943 l.nop
944 l.sfltsi r11,0
945 l.bnf 1f
946 l.nop
947 l.and r11,r11,r0
948 l.ori r11,r11,__NR_restart_syscall
949 l.j _syscall_check_trace_enter
950 l.nop
9511:
952 l.lwz r11,PT_ORIG_GPR11(r1)
953
954 l.lwz r3,PT_GPR3(r1)
955 l.lwz r4,PT_GPR4(r1)
956 l.lwz r5,PT_GPR5(r1)
957 l.lwz r6,PT_GPR6(r1)
958 l.lwz r7,PT_GPR7(r1)
959 l.j _syscall_check_trace_enter
960 l.lwz r8,PT_GPR8(r1)
961
962_restore_all:
963#ifdef CONFIG_TRACE_IRQFLAGS
964 l.lwz r4,PT_SR(r1)
965 l.andi r3,r4,(SPR_SR_IEE|SPR_SR_TEE)
966 l.sfeq r3,r0
967 l.bf skip_hardirqs_on
968 l.nop
969 TRACE_IRQS_ON
970skip_hardirqs_on:
971#endif
972 RESTORE_ALL
973
974
975
976ENTRY(_ret_from_intr)
977ENTRY(_ret_from_exception)
978 l.lwz r4,PT_SR(r1)
979 l.andi r3,r4,SPR_SR_SM
980 l.sfeqi r3,0
981 l.bnf _restore_all
982 l.nop
983 l.j _resume_userspace
984 l.nop
985
986ENTRY(ret_from_fork)
987 l.jal schedule_tail
988 l.nop
989
990
991 l.sfeqi r20,0
992 l.bf 1f
993 l.nop
994
995
996 l.jalr r20
997 l.or r3,r22,r0
998
9991:
1000
1001 l.lwz r11,PT_GPR11(r1)
1002
1003
1004
1005
1006
1007
1008 l.lwz r12,PT_GPR12(r1)
1009 l.lwz r14,PT_GPR14(r1)
1010 l.lwz r16,PT_GPR16(r1)
1011 l.lwz r18,PT_GPR18(r1)
1012 l.lwz r20,PT_GPR20(r1)
1013 l.lwz r22,PT_GPR22(r1)
1014 l.lwz r24,PT_GPR24(r1)
1015 l.lwz r26,PT_GPR26(r1)
1016 l.lwz r28,PT_GPR28(r1)
1017
1018 l.j _syscall_return
1019 l.nop
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060 .align 0x400
1061ENTRY(_switch)
1062
1063
1064
1065
1066 l.addi r1,r1,-(INT_FRAME_SIZE)
1067
1068
1069 l.sw PT_GPR2(r1),r2
1070 l.sw PT_GPR9(r1),r9
1071
1072
1073 l.sw PT_GPR12(r1),r12
1074 l.sw PT_GPR14(r1),r14
1075 l.sw PT_GPR16(r1),r16
1076 l.sw PT_GPR18(r1),r18
1077 l.sw PT_GPR20(r1),r20
1078 l.sw PT_GPR22(r1),r22
1079 l.sw PT_GPR24(r1),r24
1080 l.sw PT_GPR26(r1),r26
1081 l.sw PT_GPR28(r1),r28
1082 l.sw PT_GPR30(r1),r30
1083
1084 l.addi r11,r10,0
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094 l.lwz r29,TI_KSP(r10)
1095 l.sw PT_SP(r1),r29
1096
1097
1098 l.sw TI_KSP(r10),r1
1099 l.or r10,r4,r0
1100 l.lwz r1,TI_KSP(r10)
1101
1102
1103 l.lwz r29,PT_SP(r1)
1104 l.sw TI_KSP(r10),r29
1105
1106
1107
1108
1109 l.lwz r2,PT_GPR2(r1)
1110 l.lwz r9,PT_GPR9(r1)
1111
1112
1113
1114
1115
1116 l.lwz r12,PT_GPR12(r1)
1117 l.lwz r14,PT_GPR14(r1)
1118 l.lwz r16,PT_GPR16(r1)
1119 l.lwz r18,PT_GPR18(r1)
1120 l.lwz r20,PT_GPR20(r1)
1121 l.lwz r22,PT_GPR22(r1)
1122 l.lwz r24,PT_GPR24(r1)
1123 l.lwz r26,PT_GPR26(r1)
1124 l.lwz r28,PT_GPR28(r1)
1125 l.lwz r30,PT_GPR30(r1)
1126
1127
1128 l.addi r1,r1,(INT_FRAME_SIZE)
1129
1130
1131
1132
1133
1134
1135
1136 l.lwz r3,TI_TASK(r3)
1137 l.jr r9
1138 l.nop
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156_fork_save_extra_regs_and_call:
1157 l.sw PT_GPR14(r1),r14
1158 l.sw PT_GPR16(r1),r16
1159 l.sw PT_GPR18(r1),r18
1160 l.sw PT_GPR20(r1),r20
1161 l.sw PT_GPR22(r1),r22
1162 l.sw PT_GPR24(r1),r24
1163 l.sw PT_GPR26(r1),r26
1164 l.jr r29
1165 l.sw PT_GPR28(r1),r28
1166
1167ENTRY(__sys_clone)
1168 l.movhi r29,hi(sys_clone)
1169 l.ori r29,r29,lo(sys_clone)
1170 l.j _fork_save_extra_regs_and_call
1171 l.nop
1172
1173ENTRY(__sys_fork)
1174 l.movhi r29,hi(sys_fork)
1175 l.ori r29,r29,lo(sys_fork)
1176 l.j _fork_save_extra_regs_and_call
1177 l.nop
1178
1179ENTRY(sys_rt_sigreturn)
1180 l.jal _sys_rt_sigreturn
1181 l.addi r3,r1,0
1182 l.sfne r30,r0
1183 l.bnf _no_syscall_trace
1184 l.nop
1185 l.jal do_syscall_trace_leave
1186 l.addi r3,r1,0
1187_no_syscall_trace:
1188 l.j _resume_userspace
1189 l.nop
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205ENTRY(sys_or1k_atomic)
1206
1207 DISABLE_INTERRUPTS(r17,r19)
1208 l.lwz r29,0(r4)
1209 l.lwz r27,0(r5)
1210 l.sw 0(r4),r27
1211 l.sw 0(r5),r29
1212 ENABLE_INTERRUPTS(r17)
1213 l.jr r9
1214 l.or r11,r0,r0
1215
1216
1217