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