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
204
205EXCEPTION_ENTRY(_data_page_fault_handler)
206
207 l.addi r3,r1,0
208
209 l.ori r5,r0,0x300
210
211
212
213
214
215
216
217#ifdef CONFIG_OPENRISC_NO_SPR_SR_DSX
218 l.lwz r6,PT_PC(r3)
219 l.lwz r6,0(r6)
220
221 l.srli r6,r6,26
222 l.sfeqi r6,0
223 l.bf 8f
224 l.sfeqi r6,1
225 l.bf 8f
226 l.sfeqi r6,3
227 l.bf 8f
228 l.sfeqi r6,4
229 l.bf 8f
230 l.sfeqi r6,0x11
231 l.bf 8f
232 l.sfeqi r6,0x12
233 l.bf 8f
234
235 l.nop
236
237 l.j 9f
238 l.nop
2398:
240
241 l.lwz r6,PT_PC(r3)
242 l.addi r6,r6,4
243 l.lwz r6,0(r6)
244 l.srli r6,r6,26
2459:
246
247#else
248
249 l.mfspr r6,r0,SPR_SR
250
251 l.andi r6,r6,SPR_SR_DSX
252 l.sfeqi r6,0x1
253 l.bnf 7f
254 l.lwz r6,PT_PC(r3)
255
256 l.addi r6,r6,4
2577:
258 l.lwz r6,0(r6)
259 l.srli r6,r6,26
260#endif
261
262 l.sfgeui r6,0x34
263 l.bnf 1f
264 l.sfleui r6,0x37
265 l.bnf 1f
266 l.ori r6,r0,0x1
267 l.j 2f
268 l.nop
2691: l.ori r6,r0,0x0
2702:
271
272
273 l.jal do_page_fault
274 l.nop
275 l.j _ret_from_exception
276 l.nop
277
278
279
280EXCEPTION_ENTRY(_insn_page_fault_handler)
281
282 l.addi r3,r1,0
283
284 l.ori r5,r0,0x400
285 l.ori r6,r0,0x0
286
287
288 l.jal do_page_fault
289 l.nop
290 l.j _ret_from_exception
291 l.nop
292
293
294
295
296EXCEPTION_ENTRY(_timer_handler)
297 l.jal timer_interrupt
298 l.addi r3,r1,0
299
300 l.j _ret_from_intr
301 l.nop
302
303
304
305EXCEPTION_ENTRY(_alignment_handler)
306
307 l.jal do_unaligned_access
308 l.addi r3,r1,0
309
310 l.j _ret_from_exception
311 l.nop
312
313
314EXCEPTION_ENTRY(_aligment_handler)
315
316 l.addi r2,r4,0
317
318 l.lwz r5,PT_PC(r1)
319
320 l.lwz r3,0(r5)
321 l.srli r4,r3,26
322
323 l.sfeqi r4,0x00
324 l.bf jmp
325 l.sfeqi r4,0x01
326 l.bf jmp
327 l.sfeqi r4,0x03
328 l.bf jmp
329 l.sfeqi r4,0x04
330 l.bf jmp
331 l.sfeqi r4,0x11
332 l.bf jr
333 l.sfeqi r4,0x12
334 l.bf jr
335 l.nop
336 l.j 1f
337 l.addi r5,r5,4
338
339jmp:
340 l.slli r4,r3,6
341 l.srai r4,r4,4
342
343 l.lwz r3,4(r5)
344
345 l.add r5,r5,r4
346
347 l.j 1f
348 l.srli r4,r3,26
349
350jr:
351 l.slli r4,r3,9
352 l.andi r4,r4,0x7c
353
354 l.lwz r3,4(r5)
355
356 l.add r4,r4,r1
357 l.lwz r5,0(r4)
358
359 l.srli r4,r3,26
360
361
3621:
363
364 l.sw PT_PC(r1),r5
365
366 l.sfeqi r4,0x26
367 l.bf lhs
368 l.sfeqi r4,0x25
369 l.bf lhz
370 l.sfeqi r4,0x22
371 l.bf lws
372 l.sfeqi r4,0x21
373 l.bf lwz
374 l.sfeqi r4,0x37
375 l.bf sh
376 l.sfeqi r4,0x35
377 l.bf sw
378 l.nop
379
3801: l.j 1b
381 l.nop
382
383lhs: l.lbs r5,0(r2)
384 l.slli r5,r5,8
385 l.lbz r6,1(r2)
386 l.or r5,r5,r6
387 l.srli r4,r3,19
388 l.andi r4,r4,0x7c
389 l.add r4,r4,r1
390 l.j align_end
391 l.sw 0(r4),r5
392
393lhz: l.lbz 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
403lws: l.lbs r5,0(r2)
404 l.slli r5,r5,24
405 l.lbz r6,1(r2)
406 l.slli r6,r6,16
407 l.or r5,r5,r6
408 l.lbz r6,2(r2)
409 l.slli r6,r6,8
410 l.or r5,r5,r6
411 l.lbz r6,3(r2)
412 l.or r5,r5,r6
413 l.srli r4,r3,19
414 l.andi r4,r4,0x7c
415 l.add r4,r4,r1
416 l.j align_end
417 l.sw 0(r4),r5
418
419lwz: l.lbz r5,0(r2)
420 l.slli r5,r5,24
421 l.lbz r6,1(r2)
422 l.slli r6,r6,16
423 l.or r5,r5,r6
424 l.lbz r6,2(r2)
425 l.slli r6,r6,8
426 l.or r5,r5,r6
427 l.lbz r6,3(r2)
428 l.or r5,r5,r6
429 l.srli r4,r3,19
430 l.andi r4,r4,0x7c
431 l.add r4,r4,r1
432 l.j align_end
433 l.sw 0(r4),r5
434
435sh:
436 l.srli r4,r3,9
437 l.andi r4,r4,0x7c
438 l.add r4,r4,r1
439 l.lwz r5,0(r4)
440 l.sb 1(r2),r5
441 l.srli r5,r5,8
442 l.j align_end
443 l.sb 0(r2),r5
444
445sw:
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 3(r2),r5
451 l.srli r5,r5,8
452 l.sb 2(r2),r5
453 l.srli r5,r5,8
454 l.sb 1(r2),r5
455 l.srli r5,r5,8
456 l.j align_end
457 l.sb 0(r2),r5
458
459align_end:
460 l.j _ret_from_intr
461 l.nop
462#endif
463
464
465
466EXCEPTION_ENTRY(_illegal_instruction_handler)
467
468 l.jal do_illegal_instruction
469 l.addi r3,r1,0
470
471 l.j _ret_from_exception
472 l.nop
473
474
475
476EXCEPTION_ENTRY(_external_irq_handler)
477#ifdef CONFIG_OPENRISC_ESR_EXCEPTION_BUG_CHECK
478 l.lwz r4,PT_SR(r1)
479 l.andi r4,r4,SPR_SR_IEE
480 l.sfeqi r4,0
481 l.bnf 1f
482 l.nop
483
484 l.addi r1,r1,-0x8
485 l.movhi r3,hi(42f)
486 l.ori r3,r3,lo(42f)
487 l.sw 0x0(r1),r3
488 l.jal printk
489 l.sw 0x4(r1),r4
490 l.addi r1,r1,0x8
491
492 .section .rodata, "a"
49342:
494 .string "\n\rESR interrupt bug: in _external_irq_handler (ESR %x)\n\r"
495 .align 4
496 .previous
497
498 l.ori r4,r4,SPR_SR_IEE
499
5001:
501#endif
502 l.addi r3,r1,0
503 l.movhi r8,hi(do_IRQ)
504 l.ori r8,r8,lo(do_IRQ)
505 l.jalr r8
506 l.nop
507 l.j _ret_from_intr
508 l.nop
509
510
511
512
513
514
515
516
517
518UNHANDLED_EXCEPTION(_vector_0xb00,0xb00)
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534_string_syscall_return:
535 .string "syscall return %ld \n\r\0"
536 .align 4
537
538ENTRY(_sys_call_handler)
539
540 ENABLE_INTERRUPTS(r29)
541
542
543 l.sw PT_GPR2(r1),r2
544
545
546
547
548 l.sw PT_GPR3(r1),r3
549
550
551 l.lwz r4,PT_GPR4(r1)
552 l.sw PT_GPR5(r1),r5
553 l.sw PT_GPR6(r1),r6
554 l.sw PT_GPR7(r1),r7
555 l.sw PT_GPR8(r1),r8
556 l.sw PT_GPR9(r1),r9
557
558 l.sw PT_GPR11(r1),r11
559
560 l.sw PT_ORIG_GPR11(r1),r11
561
562
563
564
565
566
567
568
569
570
571
572
573
574_syscall_check_trace_enter:
575
576 l.lwz r30,TI_FLAGS(r10)
577 l.andi r30,r30,_TIF_SYSCALL_TRACE
578 l.sfne r30,r0
579 l.bf _syscall_trace_enter
580 l.nop
581
582_syscall_check:
583
584 l.sfgeui r11,__NR_syscalls
585 l.bf _syscall_badsys
586 l.nop
587
588_syscall_call:
589 l.movhi r29,hi(sys_call_table)
590 l.ori r29,r29,lo(sys_call_table)
591 l.slli r11,r11,2
592 l.add r29,r29,r11
593 l.lwz r29,0(r29)
594
595 l.jalr r29
596 l.nop
597
598_syscall_return:
599
600
601
602 l.sw PT_GPR11(r1),r11
603
604
605_syscall_debug:
606 l.movhi r3,hi(_string_syscall_return)
607 l.ori r3,r3,lo(_string_syscall_return)
608 l.ori r27,r0,1
609 l.sw -4(r1),r27
610 l.sw -8(r1),r11
611 l.addi r1,r1,-8
612 l.movhi r27,hi(printk)
613 l.ori r27,r27,lo(printk)
614 l.jalr r27
615 l.nop
616 l.addi r1,r1,8
617#endif
618
619_syscall_check_trace_leave:
620
621
622
623
624 l.sfne r30,r0
625 l.bf _syscall_trace_leave
626 l.nop
627
628
629
630
631
632_syscall_check_work:
633
634 DISABLE_INTERRUPTS(r27,r29)
635 l.lwz r30,TI_FLAGS(r10)
636 l.andi r30,r30,_TIF_WORK_MASK
637 l.sfne r30,r0
638
639 l.bnf _syscall_resume_userspace
640 l.nop
641
642
643
644
645
646 l.sw PT_GPR14(r1),r14
647 l.sw PT_GPR16(r1),r16
648 l.sw PT_GPR18(r1),r18
649 l.sw PT_GPR20(r1),r20
650 l.sw PT_GPR22(r1),r22
651 l.sw PT_GPR24(r1),r24
652 l.sw PT_GPR26(r1),r26
653 l.sw PT_GPR28(r1),r28
654
655
656 l.j _work_pending
657 l.nop
658
659_syscall_resume_userspace:
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683 l.lwz r2,PT_GPR2(r1)
684
685
686
687
688
689 l.lwz r3,PT_GPR3(r1)
690 l.lwz r4,PT_GPR4(r1)
691 l.lwz r5,PT_GPR5(r1)
692 l.lwz r6,PT_GPR6(r1)
693 l.lwz r7,PT_GPR7(r1)
694 l.lwz r8,PT_GPR8(r1)
695
696 l.lwz r9,PT_GPR9(r1)
697 l.lwz r10,PT_GPR10(r1)
698 l.lwz r11,PT_GPR11(r1)
699
700
701 l.lwz r30,PT_GPR30(r1)
702
703
704 l.lwz r13,PT_PC(r1)
705 l.lwz r15,PT_SR(r1)
706 l.lwz r1,PT_SP(r1)
707
708
709
710 DISABLE_INTERRUPTS(r17,r19)
711 l.mtspr r0,r13,SPR_EPCR_BASE
712 l.mtspr r0,r15,SPR_ESR_BASE
713 l.rfe
714
715
716
717
718
719_syscall_trace_enter:
720
721
722
723
724
725
726
727 l.jal do_syscall_trace_enter
728 l.addi r3,r1,0
729
730
731
732
733
734 l.lwz r11,PT_GPR11(r1)
735 l.lwz r3,PT_GPR3(r1)
736 l.lwz r4,PT_GPR4(r1)
737 l.lwz r5,PT_GPR5(r1)
738 l.lwz r6,PT_GPR6(r1)
739 l.lwz r7,PT_GPR7(r1)
740
741 l.j _syscall_check
742 l.lwz r8,PT_GPR8(r1)
743
744_syscall_trace_leave:
745 l.jal do_syscall_trace_leave
746 l.addi r3,r1,0
747
748 l.j _syscall_check_work
749 l.nop
750
751_syscall_badsys:
752
753
754
755
756
757 l.j _syscall_return
758 l.addi r11,r0,-ENOSYS
759
760
761
762
763
764UNHANDLED_EXCEPTION(_vector_0xd00,0xd00)
765
766
767
768EXCEPTION_ENTRY(_trap_handler)
769
770 l.jal do_trap
771 l.addi r3,r1,0
772
773 l.j _ret_from_exception
774 l.nop
775
776
777
778UNHANDLED_EXCEPTION(_vector_0xf00,0xf00)
779
780
781
782UNHANDLED_EXCEPTION(_vector_0x1000,0x1000)
783
784
785
786UNHANDLED_EXCEPTION(_vector_0x1100,0x1100)
787
788
789
790UNHANDLED_EXCEPTION(_vector_0x1200,0x1200)
791
792
793
794UNHANDLED_EXCEPTION(_vector_0x1300,0x1300)
795
796
797
798UNHANDLED_EXCEPTION(_vector_0x1400,0x1400)
799
800
801
802UNHANDLED_EXCEPTION(_vector_0x1500,0x1500)
803
804
805
806UNHANDLED_EXCEPTION(_vector_0x1600,0x1600)
807
808
809
810UNHANDLED_EXCEPTION(_vector_0x1700,0x1700)
811
812
813
814UNHANDLED_EXCEPTION(_vector_0x1800,0x1800)
815
816
817
818UNHANDLED_EXCEPTION(_vector_0x1900,0x1900)
819
820
821
822UNHANDLED_EXCEPTION(_vector_0x1a00,0x1a00)
823
824
825
826UNHANDLED_EXCEPTION(_vector_0x1b00,0x1b00)
827
828
829
830UNHANDLED_EXCEPTION(_vector_0x1c00,0x1c00)
831
832
833
834UNHANDLED_EXCEPTION(_vector_0x1d00,0x1d00)
835
836
837
838UNHANDLED_EXCEPTION(_vector_0x1e00,0x1e00)
839
840
841
842UNHANDLED_EXCEPTION(_vector_0x1f00,0x1f00)
843
844
845
846_work_pending:
847
848
849
850
851 l.lwz r5,TI_FLAGS(r10)
852 l.andi r3,r5,_TIF_NEED_RESCHED
853 l.sfnei r3,0
854 l.bnf _work_notifysig
855 l.nop
856 l.jal schedule
857 l.nop
858 l.j _resume_userspace
859 l.nop
860
861
862
863
864
865
866_work_notifysig:
867 l.jal do_notify_resume
868 l.ori r3,r1,0
869
870_resume_userspace:
871 DISABLE_INTERRUPTS(r3,r4)
872 l.lwz r3,TI_FLAGS(r10)
873 l.andi r3,r3,_TIF_WORK_MASK
874 l.sfnei r3,0
875 l.bf _work_pending
876 l.nop
877
878_restore_all:
879 RESTORE_ALL
880
881
882
883ENTRY(_ret_from_intr)
884ENTRY(_ret_from_exception)
885 l.lwz r4,PT_SR(r1)
886 l.andi r3,r4,SPR_SR_SM
887 l.sfeqi r3,0
888 l.bnf _restore_all
889 l.nop
890 l.j _resume_userspace
891 l.nop
892
893ENTRY(ret_from_fork)
894 l.jal schedule_tail
895 l.nop
896
897
898 l.lwz r11,PT_GPR11(r1)
899
900
901
902
903
904
905 l.lwz r12,PT_GPR12(r1)
906 l.lwz r14,PT_GPR14(r1)
907 l.lwz r16,PT_GPR16(r1)
908 l.lwz r18,PT_GPR18(r1)
909 l.lwz r20,PT_GPR20(r1)
910 l.lwz r22,PT_GPR22(r1)
911 l.lwz r24,PT_GPR24(r1)
912 l.lwz r26,PT_GPR26(r1)
913 l.lwz r28,PT_GPR28(r1)
914
915 l.j _syscall_return
916 l.nop
917
918
919
920
921
922
923
924
925
926
927
928
929ENTRY(_kernel_thread_helper)
930 l.or r3,r20,r0
931 l.or r4,r22,r0
932 l.movhi r31,hi(kernel_thread_helper)
933 l.ori r31,r31,lo(kernel_thread_helper)
934 l.jr r31
935 l.nop
936
937
938
939
940
941
942
943
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 .align 0x400
978ENTRY(_switch)
979
980
981
982
983 l.addi r1,r1,-(INT_FRAME_SIZE)
984
985
986 l.sw PT_GPR2(r1),r2
987 l.sw PT_GPR9(r1),r9
988
989
990 l.sw PT_GPR12(r1),r12
991 l.sw PT_GPR14(r1),r14
992 l.sw PT_GPR16(r1),r16
993 l.sw PT_GPR18(r1),r18
994 l.sw PT_GPR20(r1),r20
995 l.sw PT_GPR22(r1),r22
996 l.sw PT_GPR24(r1),r24
997 l.sw PT_GPR26(r1),r26
998 l.sw PT_GPR28(r1),r28
999 l.sw PT_GPR30(r1),r30
1000
1001 l.addi r11,r10,0
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011 l.lwz r29,TI_KSP(r10)
1012 l.sw PT_SP(r1),r29
1013
1014
1015 l.sw TI_KSP(r10),r1
1016 l.or r10,r4,r0
1017 l.lwz r1,TI_KSP(r10)
1018
1019
1020 l.lwz r29,PT_SP(r1)
1021 l.sw TI_KSP(r10),r29
1022
1023
1024
1025
1026 l.lwz r2,PT_GPR2(r1)
1027 l.lwz r9,PT_GPR9(r1)
1028
1029
1030
1031
1032
1033 l.lwz r12,PT_GPR12(r1)
1034 l.lwz r14,PT_GPR14(r1)
1035 l.lwz r16,PT_GPR16(r1)
1036 l.lwz r18,PT_GPR18(r1)
1037 l.lwz r20,PT_GPR20(r1)
1038 l.lwz r22,PT_GPR22(r1)
1039 l.lwz r24,PT_GPR24(r1)
1040 l.lwz r26,PT_GPR26(r1)
1041 l.lwz r28,PT_GPR28(r1)
1042 l.lwz r30,PT_GPR30(r1)
1043
1044
1045 l.addi r1,r1,(INT_FRAME_SIZE)
1046
1047
1048
1049 l.jr r9
1050 l.nop
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068_fork_save_extra_regs_and_call:
1069 l.sw PT_GPR14(r1),r14
1070 l.sw PT_GPR16(r1),r16
1071 l.sw PT_GPR18(r1),r18
1072 l.sw PT_GPR20(r1),r20
1073 l.sw PT_GPR22(r1),r22
1074 l.sw PT_GPR24(r1),r24
1075 l.sw PT_GPR26(r1),r26
1076 l.jr r29
1077 l.sw PT_GPR28(r1),r28
1078
1079ENTRY(sys_clone)
1080 l.movhi r29,hi(_sys_clone)
1081 l.ori r29,r29,lo(_sys_clone)
1082 l.j _fork_save_extra_regs_and_call
1083 l.addi r7,r1,0
1084
1085ENTRY(sys_fork)
1086 l.movhi r29,hi(_sys_fork)
1087 l.ori r29,r29,lo(_sys_fork)
1088 l.j _fork_save_extra_regs_and_call
1089 l.addi r3,r1,0
1090
1091ENTRY(sys_execve)
1092 l.j _sys_execve
1093 l.addi r6,r1,0
1094
1095ENTRY(sys_sigaltstack)
1096 l.j _sys_sigaltstack
1097 l.addi r5,r1,0
1098
1099ENTRY(sys_rt_sigreturn)
1100 l.j _sys_rt_sigreturn
1101 l.addi r3,r1,0
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117ENTRY(sys_or1k_atomic)
1118
1119 DISABLE_INTERRUPTS(r17,r19)
1120 l.lwz r29,0(r4)
1121 l.lwz r27,0(r5)
1122 l.sw 0(r4),r27
1123 l.sw 0(r5),r29
1124 ENABLE_INTERRUPTS(r17)
1125 l.jr r9
1126 l.or r11,r0,r0
1127
1128
1129