Lines Matching +full:- +full:l

1 /* SPDX-License-Identifier: GPL-2.0-or-later */
12 * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se>
25 #include <asm/asm-offsets.h>
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
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
46 l.sw -8(r1),r2 /* store frame pointer */ ;\
47 l.sw -4(r1),r9 /* store return address */ ;\
48 l.addi r2,r1,0 /* move sp to fp */ ;\
49 l.jal trace_op ;\
50 l.addi r1,r1,-8 ;\
51 l.ori r1,r2,0 /* restore sp */ ;\
52 l.lwz r9,-4(r1) /* restore return address */ ;\
53 l.lwz r2,-8(r1) /* restore fp */ ;\
59 l.sw -12(r1),t1 /* save extra reg */ ;\
60 l.sw -8(r1),r2 /* store frame pointer */ ;\
61 l.sw -4(r1),r9 /* store return address */ ;\
62 l.addi r2,r1,0 /* move sp to fp */ ;\
63 l.jal trace_op ;\
64 l.addi r1,r1,-12 ;\
65 l.ori r1,r2,0 /* restore sp */ ;\
66 l.lwz r9,-4(r1) /* restore return address */ ;\
67 l.lwz r2,-8(r1) /* restore fp */ ;\
68 l.lwz t1,-12(r1) /* restore extra reg */
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)
82 l.lwz r5,PT_SR(r1) ;\
83 l.andi r3,r5,(SPR_SR_IEE|SPR_SR_TEE) ;\
84 l.sfeq r5,r0 /* skip trace if irqs were already off */;\
85 l.bf 1f ;\
86 l.nop ;\
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
147 l.sw PT_GPR2(r1),r2 ;\
148 l.sw PT_GPR3(r1),r3 ;\
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 ;\
156 l.sw PT_GPR11(r1),r11 ;\
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 ;\
176 /* l.sw PT_GPR30(r1),r30*/ ;\
177 l.sw PT_GPR31(r1),r31 ;\
179 /* Store -1 in orig_gpr11 for non-syscall exceptions */ ;\
180 l.addi r30,r0,-1 ;\
181 l.sw PT_ORIG_GPR11(r1),r30
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 ;\
195 l.sw PT_GPR11(r1),r11 ;\
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 ;\
215 l.sw PT_GPR30(r1),r30 ;\
216 /* l.sw PT_GPR31(r1),r31 */ ;\
217 /* Store -1 in orig_gpr11 for non-syscall exceptions */ ;\
218 l.addi r30,r0,-1 ;\
219 l.sw PT_ORIG_GPR11(r1),r30 ;\
220 l.addi r3,r1,0 ;\
222 l.addi r5,r0,vector ;\
223 l.jal unhandled_exception ;\
224 l.nop ;\
225 l.j _ret_from_exception ;\
226 l.nop
230 l.movhi reg,hi(lwa_flag) ;\
231 l.ori reg,reg,lo(lwa_flag) ;\
232 l.sw 0(reg),r0
244 /* ---[ 0x100: RESET exception ]----------------------------------------- */
247 l.jal _start
248 l.andi r0,r0,0
250 /* ---[ 0x200: BUS exception ]------------------------------------------- */
255 l.jal do_bus_fault
256 l.addi r3,r1,0 /* pt_regs */
258 l.j _ret_from_exception
259 l.nop
261 /* ---[ 0x300: Data Page Fault exception ]------------------------------- */
264 l.and r5,r5,r0
265 l.j 1f
266 l.nop
271 l.ori r5,r0,0x300 // exception vector
273 l.addi r3,r1,0 // pt_regs
277 l.lwz r6,PT_PC(r3) // address of an offending insn
278 l.lwz r6,0(r6) // instruction that caused pf
280 l.srli r6,r6,26 // check opcode for jump insn
281 l.sfeqi r6,0 // l.j
282 l.bf 8f
283 l.sfeqi r6,1 // l.jal
284 l.bf 8f
285 l.sfeqi r6,3 // l.bnf
286 l.bf 8f
287 l.sfeqi r6,4 // l.bf
288 l.bf 8f
289 l.sfeqi r6,0x11 // l.jr
290 l.bf 8f
291 l.sfeqi r6,0x12 // l.jalr
292 l.bf 8f
293 l.nop
295 l.j 9f
296 l.nop
299 l.lwz r6,PT_PC(r3) // address of an offending insn
300 l.addi r6,r6,4
301 l.lwz r6,0(r6) // instruction that caused pf
302 l.srli r6,r6,26 // get opcode
307 l.mfspr r6,r0,SPR_SR // SR
308 l.andi r6,r6,SPR_SR_DSX // check for delay slot exception
309 l.sfne r6,r0 // exception happened in delay slot
310 l.bnf 7f
311 l.lwz r6,PT_PC(r3) // address of an offending insn
313 l.addi r6,r6,4 // offending insn is in delay slot
315 l.lwz r6,0(r6) // instruction that caused pf
316 l.srli r6,r6,26 // check opcode for write access
319 l.sfgeui r6,0x33 // check opcode for write access
320 l.bnf 1f
321 l.sfleui r6,0x37
322 l.bnf 1f
323 l.ori r6,r0,0x1 // write access
324 l.j 2f
325 l.nop
326 1: l.ori r6,r0,0x0 // !write access
330 l.jal do_page_fault
331 l.nop
332 l.j _ret_from_exception
333 l.nop
335 /* ---[ 0x400: Insn Page Fault exception ]------------------------------- */
338 l.and r5,r5,r0
339 l.j 1f
340 l.nop
345 l.ori r5,r0,0x400 // exception vector
347 l.addi r3,r1,0 // pt_regs
349 l.ori r6,r0,0x0 // !write access
352 l.jal do_page_fault
353 l.nop
354 l.j _ret_from_exception
355 l.nop
358 /* ---[ 0x500: Timer exception ]----------------------------------------- */
362 l.jal timer_interrupt
363 l.addi r3,r1,0 /* pt_regs */
365 l.j _ret_from_intr
366 l.nop
368 /* ---[ 0x600: Alignment exception ]-------------------------------------- */
373 l.jal do_unaligned_access
374 l.addi r3,r1,0 /* pt_regs */
376 l.j _ret_from_exception
377 l.nop
381 // l.mfspr r2,r0,SPR_EEAR_BASE /* Load the effective address */
382 l.addi r2,r4,0
383 // l.mfspr r5,r0,SPR_EPCR_BASE /* Load the insn address */
384 l.lwz r5,PT_PC(r1)
386 l.lwz r3,0(r5) /* Load insn */
387 l.srli r4,r3,26 /* Shift left to get the insn opcode */
389 l.sfeqi r4,0x00 /* Check if the load/store insn is in delay slot */
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 /* Increment PC to get return insn address */
406 l.slli r4,r3,6 /* Get the signed extended jump length */
407 l.srai r4,r4,4
409 l.lwz r3,4(r5) /* Load the real load/store insn */
411 l.add r5,r5,r4 /* Calculate jump target address */
413 l.j 1f
414 l.srli r4,r3,26 /* Shift left to get the insn opcode */
417 l.slli r4,r3,9 /* Shift to get the reg nb */
418 l.andi r4,r4,0x7c
420 l.lwz r3,4(r5) /* Load the real load/store insn */
422 l.add r4,r4,r1 /* Load the jump register value from the stack */
423 l.lwz r5,0(r4)
425 l.srli r4,r3,26 /* Shift left to get the insn opcode */
429 // l.mtspr r0,r5,SPR_EPCR_BASE
430 l.sw PT_PC(r1),r5
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
446 1: l.j 1b /* I don't know what to do */
447 l.nop
449 lhs: 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
459 lhz: 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
469 lws: 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
485 lwz: 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
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
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
526 l.j _ret_from_intr
527 l.nop
530 /* ---[ 0x700: Illegal insn exception ]---------------------------------- */
534 l.jal do_illegal_instruction
535 l.addi r3,r1,0 /* pt_regs */
537 l.j _ret_from_exception
538 l.nop
540 /* ---[ 0x800: External interrupt exception ]---------------------------- */
544 l.lwz r4,PT_SR(r1) // were interrupts enabled ?
545 l.andi r4,r4,SPR_SR_IEE
546 l.sfeqi r4,0
547 l.bnf 1f // ext irq enabled, all ok.
548 l.nop
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
566 l.ori r4,r4,SPR_SR_IEE // fix the bug
567 // l.sw PT_SR(r1),r4
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
579 /* ---[ 0x900: DTLB miss exception ]------------------------------------- */
582 /* ---[ 0xa00: ITLB miss exception ]------------------------------------- */
585 /* ---[ 0xb00: Range exception ]----------------------------------------- */
589 /* ---[ 0xc00: Syscall exception ]--------------------------------------- */
599 /* Upon syscall entry we just save the callee-saved registers
600 * and not the call-clobbered ones.
609 l.sw PT_GPR2(r1),r2
610 /* r3-r8 must be saved because syscall restart relies
614 l.sw PT_GPR3(r1),r3
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
628 l.sw PT_GPR11(r1),r11
630 l.sw PT_ORIG_GPR11(r1),r11
633 /* r14-r28 (even) aren't touched by the syscall fast path below
642 /* l.sw PT_GPR30(r1),r30 */
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
658 l.sfgeui r11,__NR_syscalls
659 l.bf _syscall_badsys
660 l.nop
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)
669 l.jalr r29
670 l.nop
674 * which does it in a round-about way.
676 l.sw PT_GPR11(r1),r11 // save return value
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
694 /* r30 is a callee-saved register so this should still hold the
696 * _syscall_trace_leave expects syscall result to be in pt_regs->r11.
698 l.sfne r30,r0
699 l.bf _syscall_trace_leave
700 l.nop
702 /* This is where the exception-return code begins... interrupts need to be
710 l.lwz r30,TI_FLAGS(r10)
711 l.andi r30,r30,_TIF_WORK_MASK
712 l.sfne r30,r0
714 l.bnf _syscall_resume_userspace
715 l.nop
718 * make sure that all the call-saved registers get into pt_regs
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
731 l.j _work_pending
732 l.nop
742 * registers with whatever garbage is in pt_regs -- that's OK because those
749 /* The assumption here is that the registers r14-r28 (even) are untouched and
758 l.lwz r2,PT_GPR2(r1)
761 /* r3-r8 are technically clobbered, but syscall restart needs these
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)
771 l.lwz r9,PT_GPR9(r1)
772 l.lwz r10,PT_GPR10(r1)
773 l.lwz r11,PT_GPR11(r1)
776 l.lwz r30,PT_GPR30(r1)
778 /* Here we use r13-r19 (odd) as scratch regs */
779 l.lwz r13,PT_PC(r1)
780 l.lwz r15,PT_SR(r1)
781 l.lwz r1,PT_SP(r1)
784 * them before we can use them for our l.rfe */
786 l.mtspr r0,r13,SPR_EPCR_BASE
787 l.mtspr r0,r15,SPR_ESR_BASE
788 l.rfe
802 l.jal do_syscall_trace_enter
803 l.addi r3,r1,0
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)
816 l.j _syscall_check
817 l.lwz r8,PT_GPR8(r1)
820 l.jal do_syscall_trace_leave
821 l.addi r3,r1,0
823 l.j _syscall_check_work
824 l.nop
828 * syscall that returns -ENOSYS and then return to the regular
832 l.j _syscall_return
833 l.addi r11,r0,-ENOSYS
837 /* ---[ 0xd00: Trap exception ]------------------------------------------ */
841 /* ---[ 0xe00: Trap exception ]------------------------------------------ */
846 l.jal do_trap
847 l.addi r3,r1,0 /* pt_regs */
849 l.j _ret_from_exception
850 l.nop
852 /* ---[ 0xf00: Reserved exception ]-------------------------------------- */
856 /* ---[ 0x1000: Reserved exception ]------------------------------------- */
860 /* ---[ 0x1100: Reserved exception ]------------------------------------- */
864 /* ---[ 0x1200: Reserved exception ]------------------------------------- */
868 /* ---[ 0x1300: Reserved exception ]------------------------------------- */
872 /* ---[ 0x1400: Reserved exception ]------------------------------------- */
876 /* ---[ 0x1500: Reserved exception ]------------------------------------- */
880 /* ---[ 0x1600: Reserved exception ]------------------------------------- */
884 /* ---[ 0x1700: Reserved exception ]------------------------------------- */
888 /* ---[ 0x1800: Reserved exception ]------------------------------------- */
892 /* ---[ 0x1900: Reserved exception ]------------------------------------- */
896 /* ---[ 0x1a00: Reserved exception ]------------------------------------- */
900 /* ---[ 0x1b00: Reserved exception ]------------------------------------- */
904 /* ---[ 0x1c00: Reserved exception ]------------------------------------- */
908 /* ---[ 0x1d00: Reserved exception ]------------------------------------- */
912 /* ---[ 0x1e00: Reserved exception ]------------------------------------- */
916 /* ---[ 0x1f00: Reserved exception ]------------------------------------- */
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
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
938 l.jal do_work_pending
939 l.ori r3,r1,0 /* pt_regs */
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
952 l.lwz r11,PT_ORIG_GPR11(r1)
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)
964 l.lwz r4,PT_SR(r1)
965 l.andi r3,r4,(SPR_SR_IEE|SPR_SR_TEE)
966 l.sfeq r3,r0 /* skip trace if irqs were off */
967 l.bf skip_hardirqs_on
968 l.nop
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
987 l.jal schedule_tail
988 l.nop
991 l.sfeqi r20,0
992 l.bf 1f
993 l.nop
996 l.jalr r20
997 l.or r3,r22,r0
1001 l.lwz r11,PT_GPR11(r1)
1003 /* The syscall fast path return expects call-saved registers
1004 * r12-r28 to be untouched, so we restore them here as they
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)
1018 l.j _syscall_return
1019 l.nop
1045 * the l.rfe instruction. If get TLB miss in beetwen the EPCR register gets
1046 * garbled and we end up calling l.rfe with the wrong EPCR. (same probably
1055 * way, we are a function call and only need to preserve the callee-saved
1066 l.addi r1,r1,-(INT_FRAME_SIZE)
1069 l.sw PT_GPR2(r1),r2
1070 l.sw PT_GPR9(r1),r9
1072 * and expects r12 to be callee-saved... */
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
1084 l.addi r11,r10,0 /* Save old 'current' to 'last' return value*/
1086 /* We use thread_info->ksp for storing the address of the above
1088 * to lose the value of thread_info->ksp, though, so store it as
1089 * pt_regs->sp so that we can easily restore it when we are made
1093 /* Save the old value of thread_info->ksp as pt_regs->sp */
1094 l.lwz r29,TI_KSP(r10)
1095 l.sw PT_SP(r1),r29
1098 l.sw TI_KSP(r10),r1 /* Save old stack pointer */
1099 l.or r10,r4,r0 /* Set up new current_thread_info */
1100 l.lwz r1,TI_KSP(r10) /* Load new stack pointer */
1102 /* Restore the old value of thread_info->ksp */
1103 l.lwz r29,PT_SP(r1)
1104 l.sw TI_KSP(r10),r29
1109 l.lwz r2,PT_GPR2(r1)
1110 l.lwz r9,PT_GPR9(r1)
1115 * and expects r12 to be callee-saved... */
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)
1127 /* Unwind stack to pre-switch state */
1128 l.addi r1,r1,(INT_FRAME_SIZE)
1130 /* Return via the link-register back to where we 'came from', where
1136 l.lwz r3,TI_TASK(r3) /* Load 'prev' as schedule_tail arg */
1137 l.jr r9
1138 l.nop
1143 * jump is always happening after the l.addi instruction.
1145 * These are all just wrappers that don't touch the link-register r9, so the
1147 * code that did the l.jal that brought us here.
1150 /* fork requires that we save all the callee-saved registers because they
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
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
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
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
1188 l.j _resume_userspace
1189 l.nop
1191 /* This is a catch-all syscall for atomic instructions for the OpenRISC 1000.
1208 l.lwz r29,0(r4)
1209 l.lwz r27,0(r5)
1210 l.sw 0(r4),r27
1211 l.sw 0(r5),r29
1213 l.jr r9
1214 l.or r11,r0,r0