Merge branch 'linux-linaro-lsk-v4.4' into linux-linaro-lsk-v4.4-android
[firefly-linux-kernel-4.4.55.git] / arch / arm64 / kernel / entry.S
1 /*
2  * Low-level exception handling code
3  *
4  * Copyright (C) 2012 ARM Ltd.
5  * Authors:     Catalin Marinas <catalin.marinas@arm.com>
6  *              Will Deacon <will.deacon@arm.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <linux/init.h>
22 #include <linux/linkage.h>
23
24 #include <asm/alternative.h>
25 #include <asm/assembler.h>
26 #include <asm/asm-offsets.h>
27 #include <asm/cpufeature.h>
28 #include <asm/errno.h>
29 #include <asm/esr.h>
30 #include <asm/irq.h>
31 #include <asm/memory.h>
32 #include <asm/ptrace.h>
33 #include <asm/thread_info.h>
34 #include <asm/uaccess.h>
35 #include <asm/asm-uaccess.h>
36 #include <asm/unistd.h>
37
38 /*
39  * Context tracking subsystem.  Used to instrument transitions
40  * between user and kernel mode.
41  */
42         .macro ct_user_exit, syscall = 0
43 #ifdef CONFIG_CONTEXT_TRACKING
44         bl      context_tracking_user_exit
45         .if \syscall == 1
46         /*
47          * Save/restore needed during syscalls.  Restore syscall arguments from
48          * the values already saved on stack during kernel_entry.
49          */
50         ldp     x0, x1, [sp]
51         ldp     x2, x3, [sp, #S_X2]
52         ldp     x4, x5, [sp, #S_X4]
53         ldp     x6, x7, [sp, #S_X6]
54         .endif
55 #endif
56         .endm
57
58         .macro ct_user_enter
59 #ifdef CONFIG_CONTEXT_TRACKING
60         bl      context_tracking_user_enter
61 #endif
62         .endm
63
64 /*
65  * Bad Abort numbers
66  *-----------------
67  */
68 #define BAD_SYNC        0
69 #define BAD_IRQ         1
70 #define BAD_FIQ         2
71 #define BAD_ERROR       3
72
73         .macro  kernel_entry, el, regsize = 64
74         sub     sp, sp, #S_FRAME_SIZE
75         .if     \regsize == 32
76         mov     w0, w0                          // zero upper 32 bits of x0
77         .endif
78         stp     x0, x1, [sp, #16 * 0]
79         stp     x2, x3, [sp, #16 * 1]
80         stp     x4, x5, [sp, #16 * 2]
81         stp     x6, x7, [sp, #16 * 3]
82         stp     x8, x9, [sp, #16 * 4]
83         stp     x10, x11, [sp, #16 * 5]
84         stp     x12, x13, [sp, #16 * 6]
85         stp     x14, x15, [sp, #16 * 7]
86         stp     x16, x17, [sp, #16 * 8]
87         stp     x18, x19, [sp, #16 * 9]
88         stp     x20, x21, [sp, #16 * 10]
89         stp     x22, x23, [sp, #16 * 11]
90         stp     x24, x25, [sp, #16 * 12]
91         stp     x26, x27, [sp, #16 * 13]
92         stp     x28, x29, [sp, #16 * 14]
93
94         .if     \el == 0
95         mrs     x21, sp_el0
96         mov     tsk, sp
97         and     tsk, tsk, #~(THREAD_SIZE - 1)   // Ensure MDSCR_EL1.SS is clear,
98         ldr     x19, [tsk, #TI_FLAGS]           // since we can unmask debug
99         disable_step_tsk x19, x20               // exceptions when scheduling.
100
101         mov     x29, xzr                        // fp pointed to user-space
102         .else
103         add     x21, sp, #S_FRAME_SIZE
104         get_thread_info tsk
105         /* Save the task's original addr_limit and set USER_DS (TASK_SIZE_64) */
106         ldr     x20, [tsk, #TI_ADDR_LIMIT]
107         str     x20, [sp, #S_ORIG_ADDR_LIMIT]
108         mov     x20, #TASK_SIZE_64
109         str     x20, [tsk, #TI_ADDR_LIMIT]
110         .endif /* \el == 0 */
111         mrs     x22, elr_el1
112         mrs     x23, spsr_el1
113         stp     lr, x21, [sp, #S_LR]
114
115 #ifdef CONFIG_ARM64_SW_TTBR0_PAN
116         /*
117          * Set the TTBR0 PAN bit in SPSR. When the exception is taken from
118          * EL0, there is no need to check the state of TTBR0_EL1 since
119          * accesses are always enabled.
120          * Note that the meaning of this bit differs from the ARMv8.1 PAN
121          * feature as all TTBR0_EL1 accesses are disabled, not just those to
122          * user mappings.
123          */
124 alternative_if ARM64_HAS_PAN
125         b       1f                              // skip TTBR0 PAN
126 alternative_else_nop_endif
127
128         .if     \el != 0
129         mrs     x21, ttbr0_el1
130         tst     x21, #0xffff << 48              // Check for the reserved ASID
131         orr     x23, x23, #PSR_PAN_BIT          // Set the emulated PAN in the saved SPSR
132         b.eq    1f                              // TTBR0 access already disabled
133         and     x23, x23, #~PSR_PAN_BIT         // Clear the emulated PAN in the saved SPSR
134         .endif
135
136         __uaccess_ttbr0_disable x21
137 1:
138 #endif
139
140         stp     x22, x23, [sp, #S_PC]
141
142         /*
143          * Set syscallno to -1 by default (overridden later if real syscall).
144          */
145         .if     \el == 0
146         mvn     x21, xzr
147         str     x21, [sp, #S_SYSCALLNO]
148         .endif
149
150         /*
151          * Set sp_el0 to current thread_info.
152          */
153         .if     \el == 0
154         msr     sp_el0, tsk
155         .endif
156
157         /*
158          * Registers that may be useful after this macro is invoked:
159          *
160          * x21 - aborted SP
161          * x22 - aborted PC
162          * x23 - aborted PSTATE
163         */
164         .endm
165
166         .macro  kernel_exit, el
167         .if     \el != 0
168         /* Restore the task's original addr_limit. */
169         ldr     x20, [sp, #S_ORIG_ADDR_LIMIT]
170         str     x20, [tsk, #TI_ADDR_LIMIT]
171         .endif
172
173         ldp     x21, x22, [sp, #S_PC]           // load ELR, SPSR
174         .if     \el == 0
175         ct_user_enter
176         .endif
177
178 #ifdef CONFIG_ARM64_SW_TTBR0_PAN
179         /*
180          * Restore access to TTBR0_EL1. If returning to EL0, no need for SPSR
181          * PAN bit checking.
182          */
183 alternative_if ARM64_HAS_PAN
184         b       2f                              // skip TTBR0 PAN
185 alternative_else_nop_endif
186
187         .if     \el != 0
188         tbnz    x22, #22, 1f                    // Skip re-enabling TTBR0 access if the PSR_PAN_BIT is set
189         .endif
190
191         __uaccess_ttbr0_enable x0
192
193         .if     \el == 0
194         /*
195          * Enable errata workarounds only if returning to user. The only
196          * workaround currently required for TTBR0_EL1 changes are for the
197          * Cavium erratum 27456 (broadcast TLBI instructions may cause I-cache
198          * corruption).
199          */
200         post_ttbr0_update_workaround
201         .endif
202 1:
203         .if     \el != 0
204         and     x22, x22, #~PSR_PAN_BIT         // ARMv8.0 CPUs do not understand this bit
205         .endif
206 2:
207 #endif
208
209         .if     \el == 0
210         ldr     x23, [sp, #S_SP]                // load return stack pointer
211         msr     sp_el0, x23
212 #ifdef CONFIG_ARM64_ERRATUM_845719
213 alternative_if_not ARM64_WORKAROUND_845719
214         nop
215         nop
216 #ifdef CONFIG_PID_IN_CONTEXTIDR
217         nop
218 #endif
219 alternative_else
220         tbz     x22, #4, 1f
221 #ifdef CONFIG_PID_IN_CONTEXTIDR
222         mrs     x29, contextidr_el1
223         msr     contextidr_el1, x29
224 #else
225         msr contextidr_el1, xzr
226 #endif
227 1:
228 alternative_endif
229 #endif
230         .endif
231
232         msr     elr_el1, x21                    // set up the return data
233         msr     spsr_el1, x22
234         ldp     x0, x1, [sp, #16 * 0]
235         ldp     x2, x3, [sp, #16 * 1]
236         ldp     x4, x5, [sp, #16 * 2]
237         ldp     x6, x7, [sp, #16 * 3]
238         ldp     x8, x9, [sp, #16 * 4]
239         ldp     x10, x11, [sp, #16 * 5]
240         ldp     x12, x13, [sp, #16 * 6]
241         ldp     x14, x15, [sp, #16 * 7]
242         ldp     x16, x17, [sp, #16 * 8]
243         ldp     x18, x19, [sp, #16 * 9]
244         ldp     x20, x21, [sp, #16 * 10]
245         ldp     x22, x23, [sp, #16 * 11]
246         ldp     x24, x25, [sp, #16 * 12]
247         ldp     x26, x27, [sp, #16 * 13]
248         ldp     x28, x29, [sp, #16 * 14]
249         ldr     lr, [sp, #S_LR]
250         add     sp, sp, #S_FRAME_SIZE           // restore sp
251         eret                                    // return to kernel
252         .endm
253
254         .macro  irq_stack_entry
255         mov     x19, sp                 // preserve the original sp
256
257         /*
258          * Compare sp with the current thread_info, if the top
259          * ~(THREAD_SIZE - 1) bits match, we are on a task stack, and
260          * should switch to the irq stack.
261          */
262         and     x25, x19, #~(THREAD_SIZE - 1)
263         cmp     x25, tsk
264         b.ne    9998f
265
266         this_cpu_ptr irq_stack, x25, x26
267         mov     x26, #IRQ_STACK_START_SP
268         add     x26, x25, x26
269
270         /* switch to the irq stack */
271         mov     sp, x26
272
273         /*
274          * Add a dummy stack frame, this non-standard format is fixed up
275          * by unwind_frame()
276          */
277         stp     x29, x19, [sp, #-16]!
278         mov     x29, sp
279
280 9998:
281         .endm
282
283         /*
284          * x19 should be preserved between irq_stack_entry and
285          * irq_stack_exit.
286          */
287         .macro  irq_stack_exit
288         mov     sp, x19
289         .endm
290
291 /*
292  * These are the registers used in the syscall handler, and allow us to
293  * have in theory up to 7 arguments to a function - x0 to x6.
294  *
295  * x7 is reserved for the system call number in 32-bit mode.
296  */
297 sc_nr   .req    x25             // number of system calls
298 scno    .req    x26             // syscall number
299 stbl    .req    x27             // syscall table pointer
300 tsk     .req    x28             // current thread_info
301
302 /*
303  * Interrupt handling.
304  */
305         .macro  irq_handler
306         ldr_l   x1, handle_arch_irq
307         mov     x0, sp
308         irq_stack_entry
309         blr     x1
310         irq_stack_exit
311         .endm
312
313         .text
314
315 /*
316  * Exception vectors.
317  */
318         .pushsection ".entry.text", "ax"
319
320         .align  11
321 ENTRY(vectors)
322         ventry  el1_sync_invalid                // Synchronous EL1t
323         ventry  el1_irq_invalid                 // IRQ EL1t
324         ventry  el1_fiq_invalid                 // FIQ EL1t
325         ventry  el1_error_invalid               // Error EL1t
326
327         ventry  el1_sync                        // Synchronous EL1h
328         ventry  el1_irq                         // IRQ EL1h
329         ventry  el1_fiq_invalid                 // FIQ EL1h
330         ventry  el1_error_invalid               // Error EL1h
331
332         ventry  el0_sync                        // Synchronous 64-bit EL0
333         ventry  el0_irq                         // IRQ 64-bit EL0
334         ventry  el0_fiq_invalid                 // FIQ 64-bit EL0
335         ventry  el0_error_invalid               // Error 64-bit EL0
336
337 #ifdef CONFIG_COMPAT
338         ventry  el0_sync_compat                 // Synchronous 32-bit EL0
339         ventry  el0_irq_compat                  // IRQ 32-bit EL0
340         ventry  el0_fiq_invalid_compat          // FIQ 32-bit EL0
341         ventry  el0_error_invalid_compat        // Error 32-bit EL0
342 #else
343         ventry  el0_sync_invalid                // Synchronous 32-bit EL0
344         ventry  el0_irq_invalid                 // IRQ 32-bit EL0
345         ventry  el0_fiq_invalid                 // FIQ 32-bit EL0
346         ventry  el0_error_invalid               // Error 32-bit EL0
347 #endif
348 END(vectors)
349
350 /*
351  * Invalid mode handlers
352  */
353         .macro  inv_entry, el, reason, regsize = 64
354         kernel_entry \el, \regsize
355         mov     x0, sp
356         mov     x1, #\reason
357         mrs     x2, esr_el1
358         b       bad_mode
359         .endm
360
361 el0_sync_invalid:
362         inv_entry 0, BAD_SYNC
363 ENDPROC(el0_sync_invalid)
364
365 el0_irq_invalid:
366         inv_entry 0, BAD_IRQ
367 ENDPROC(el0_irq_invalid)
368
369 el0_fiq_invalid:
370         inv_entry 0, BAD_FIQ
371 ENDPROC(el0_fiq_invalid)
372
373 el0_error_invalid:
374         inv_entry 0, BAD_ERROR
375 ENDPROC(el0_error_invalid)
376
377 #ifdef CONFIG_COMPAT
378 el0_fiq_invalid_compat:
379         inv_entry 0, BAD_FIQ, 32
380 ENDPROC(el0_fiq_invalid_compat)
381
382 el0_error_invalid_compat:
383         inv_entry 0, BAD_ERROR, 32
384 ENDPROC(el0_error_invalid_compat)
385 #endif
386
387 el1_sync_invalid:
388         inv_entry 1, BAD_SYNC
389 ENDPROC(el1_sync_invalid)
390
391 el1_irq_invalid:
392         inv_entry 1, BAD_IRQ
393 ENDPROC(el1_irq_invalid)
394
395 el1_fiq_invalid:
396         inv_entry 1, BAD_FIQ
397 ENDPROC(el1_fiq_invalid)
398
399 el1_error_invalid:
400         inv_entry 1, BAD_ERROR
401 ENDPROC(el1_error_invalid)
402
403 /*
404  * EL1 mode handlers.
405  */
406         .align  6
407 el1_sync:
408         kernel_entry 1
409         mrs     x1, esr_el1                     // read the syndrome register
410         lsr     x24, x1, #ESR_ELx_EC_SHIFT      // exception class
411         cmp     x24, #ESR_ELx_EC_DABT_CUR       // data abort in EL1
412         b.eq    el1_da
413         cmp     x24, #ESR_ELx_EC_IABT_CUR       // instruction abort in EL1
414         b.eq    el1_ia
415         cmp     x24, #ESR_ELx_EC_SYS64          // configurable trap
416         b.eq    el1_undef
417         cmp     x24, #ESR_ELx_EC_SP_ALIGN       // stack alignment exception
418         b.eq    el1_sp_pc
419         cmp     x24, #ESR_ELx_EC_PC_ALIGN       // pc alignment exception
420         b.eq    el1_sp_pc
421         cmp     x24, #ESR_ELx_EC_UNKNOWN        // unknown exception in EL1
422         b.eq    el1_undef
423         cmp     x24, #ESR_ELx_EC_BREAKPT_CUR    // debug exception in EL1
424         b.ge    el1_dbg
425         b       el1_inv
426
427 el1_ia:
428         /*
429          * Fall through to the Data abort case
430          */
431 el1_da:
432         /*
433          * Data abort handling
434          */
435         mrs     x3, far_el1
436         enable_dbg
437         // re-enable interrupts if they were enabled in the aborted context
438         tbnz    x23, #7, 1f                     // PSR_I_BIT
439         enable_irq
440 1:
441         clear_address_tag x0, x3
442         mov     x2, sp                          // struct pt_regs
443         bl      do_mem_abort
444
445         // disable interrupts before pulling preserved data off the stack
446         disable_irq
447         kernel_exit 1
448 el1_sp_pc:
449         /*
450          * Stack or PC alignment exception handling
451          */
452         mrs     x0, far_el1
453         enable_dbg
454         mov     x2, sp
455         b       do_sp_pc_abort
456 el1_undef:
457         /*
458          * Undefined instruction
459          */
460         enable_dbg
461         mov     x0, sp
462         b       do_undefinstr
463 el1_dbg:
464         /*
465          * Debug exception handling
466          */
467         cmp     x24, #ESR_ELx_EC_BRK64          // if BRK64
468         cinc    x24, x24, eq                    // set bit '0'
469         tbz     x24, #0, el1_inv                // EL1 only
470         mrs     x0, far_el1
471         mov     x2, sp                          // struct pt_regs
472         bl      do_debug_exception
473         kernel_exit 1
474 el1_inv:
475         // TODO: add support for undefined instructions in kernel mode
476         enable_dbg
477         mov     x0, sp
478         mov     x2, x1
479         mov     x1, #BAD_SYNC
480         b       bad_mode
481 ENDPROC(el1_sync)
482
483         .align  6
484 el1_irq:
485         kernel_entry 1
486         enable_dbg
487 #ifdef CONFIG_TRACE_IRQFLAGS
488         bl      trace_hardirqs_off
489 #endif
490
491         get_thread_info tsk
492         irq_handler
493
494 #ifdef CONFIG_PREEMPT
495         ldr     w24, [tsk, #TI_PREEMPT]         // get preempt count
496         cbnz    w24, 1f                         // preempt count != 0
497         ldr     x0, [tsk, #TI_FLAGS]            // get flags
498         tbz     x0, #TIF_NEED_RESCHED, 1f       // needs rescheduling?
499         bl      el1_preempt
500 1:
501 #endif
502 #ifdef CONFIG_TRACE_IRQFLAGS
503         bl      trace_hardirqs_on
504 #endif
505         kernel_exit 1
506 ENDPROC(el1_irq)
507
508 #ifdef CONFIG_PREEMPT
509 el1_preempt:
510         mov     x24, lr
511 1:      bl      preempt_schedule_irq            // irq en/disable is done inside
512         ldr     x0, [tsk, #TI_FLAGS]            // get new tasks TI_FLAGS
513         tbnz    x0, #TIF_NEED_RESCHED, 1b       // needs rescheduling?
514         ret     x24
515 #endif
516
517 /*
518  * EL0 mode handlers.
519  */
520         .align  6
521 el0_sync:
522         kernel_entry 0
523         mrs     x25, esr_el1                    // read the syndrome register
524         lsr     x24, x25, #ESR_ELx_EC_SHIFT     // exception class
525         cmp     x24, #ESR_ELx_EC_SVC64          // SVC in 64-bit state
526         b.eq    el0_svc
527         cmp     x24, #ESR_ELx_EC_DABT_LOW       // data abort in EL0
528         b.eq    el0_da
529         cmp     x24, #ESR_ELx_EC_IABT_LOW       // instruction abort in EL0
530         b.eq    el0_ia
531         cmp     x24, #ESR_ELx_EC_FP_ASIMD       // FP/ASIMD access
532         b.eq    el0_fpsimd_acc
533         cmp     x24, #ESR_ELx_EC_FP_EXC64       // FP/ASIMD exception
534         b.eq    el0_fpsimd_exc
535         cmp     x24, #ESR_ELx_EC_SYS64          // configurable trap
536         b.eq    el0_undef
537         cmp     x24, #ESR_ELx_EC_SP_ALIGN       // stack alignment exception
538         b.eq    el0_sp_pc
539         cmp     x24, #ESR_ELx_EC_PC_ALIGN       // pc alignment exception
540         b.eq    el0_sp_pc
541         cmp     x24, #ESR_ELx_EC_UNKNOWN        // unknown exception in EL0
542         b.eq    el0_undef
543         cmp     x24, #ESR_ELx_EC_BREAKPT_LOW    // debug exception in EL0
544         b.ge    el0_dbg
545         b       el0_inv
546
547 #ifdef CONFIG_COMPAT
548         .align  6
549 el0_sync_compat:
550         kernel_entry 0, 32
551         mrs     x25, esr_el1                    // read the syndrome register
552         lsr     x24, x25, #ESR_ELx_EC_SHIFT     // exception class
553         cmp     x24, #ESR_ELx_EC_SVC32          // SVC in 32-bit state
554         b.eq    el0_svc_compat
555         cmp     x24, #ESR_ELx_EC_DABT_LOW       // data abort in EL0
556         b.eq    el0_da
557         cmp     x24, #ESR_ELx_EC_IABT_LOW       // instruction abort in EL0
558         b.eq    el0_ia
559         cmp     x24, #ESR_ELx_EC_FP_ASIMD       // FP/ASIMD access
560         b.eq    el0_fpsimd_acc
561         cmp     x24, #ESR_ELx_EC_FP_EXC32       // FP/ASIMD exception
562         b.eq    el0_fpsimd_exc
563         cmp     x24, #ESR_ELx_EC_PC_ALIGN       // pc alignment exception
564         b.eq    el0_sp_pc
565         cmp     x24, #ESR_ELx_EC_UNKNOWN        // unknown exception in EL0
566         b.eq    el0_undef
567         cmp     x24, #ESR_ELx_EC_CP15_32        // CP15 MRC/MCR trap
568         b.eq    el0_undef
569         cmp     x24, #ESR_ELx_EC_CP15_64        // CP15 MRRC/MCRR trap
570         b.eq    el0_undef
571         cmp     x24, #ESR_ELx_EC_CP14_MR        // CP14 MRC/MCR trap
572         b.eq    el0_undef
573         cmp     x24, #ESR_ELx_EC_CP14_LS        // CP14 LDC/STC trap
574         b.eq    el0_undef
575         cmp     x24, #ESR_ELx_EC_CP14_64        // CP14 MRRC/MCRR trap
576         b.eq    el0_undef
577         cmp     x24, #ESR_ELx_EC_BREAKPT_LOW    // debug exception in EL0
578         b.ge    el0_dbg
579         b       el0_inv
580 el0_svc_compat:
581         /*
582          * AArch32 syscall handling
583          */
584         adrp    stbl, compat_sys_call_table     // load compat syscall table pointer
585         uxtw    scno, w7                        // syscall number in w7 (r7)
586         mov     sc_nr, #__NR_compat_syscalls
587         b       el0_svc_naked
588
589         .align  6
590 el0_irq_compat:
591         kernel_entry 0, 32
592         b       el0_irq_naked
593 #endif
594
595 el0_da:
596         /*
597          * Data abort handling
598          */
599         mrs     x26, far_el1
600         // enable interrupts before calling the main handler
601         enable_dbg_and_irq
602         ct_user_exit
603         clear_address_tag x0, x26
604         mov     x1, x25
605         mov     x2, sp
606         bl      do_mem_abort
607         b       ret_to_user
608 el0_ia:
609         /*
610          * Instruction abort handling
611          */
612         mrs     x26, far_el1
613         // enable interrupts before calling the main handler
614         enable_dbg_and_irq
615         ct_user_exit
616         mov     x0, x26
617         mov     x1, x25
618         mov     x2, sp
619         bl      do_mem_abort
620         b       ret_to_user
621 el0_fpsimd_acc:
622         /*
623          * Floating Point or Advanced SIMD access
624          */
625         enable_dbg
626         ct_user_exit
627         mov     x0, x25
628         mov     x1, sp
629         bl      do_fpsimd_acc
630         b       ret_to_user
631 el0_fpsimd_exc:
632         /*
633          * Floating Point or Advanced SIMD exception
634          */
635         enable_dbg
636         ct_user_exit
637         mov     x0, x25
638         mov     x1, sp
639         bl      do_fpsimd_exc
640         b       ret_to_user
641 el0_sp_pc:
642         /*
643          * Stack or PC alignment exception handling
644          */
645         mrs     x26, far_el1
646         // enable interrupts before calling the main handler
647         enable_dbg_and_irq
648         ct_user_exit
649         mov     x0, x26
650         mov     x1, x25
651         mov     x2, sp
652         bl      do_sp_pc_abort
653         b       ret_to_user
654 el0_undef:
655         /*
656          * Undefined instruction
657          */
658         // enable interrupts before calling the main handler
659         enable_dbg_and_irq
660         ct_user_exit
661         mov     x0, sp
662         bl      do_undefinstr
663         b       ret_to_user
664 el0_dbg:
665         /*
666          * Debug exception handling
667          */
668         tbnz    x24, #0, el0_inv                // EL0 only
669         mrs     x0, far_el1
670         mov     x1, x25
671         mov     x2, sp
672         bl      do_debug_exception
673         enable_dbg
674         ct_user_exit
675         b       ret_to_user
676 el0_inv:
677         enable_dbg
678         ct_user_exit
679         mov     x0, sp
680         mov     x1, #BAD_SYNC
681         mov     x2, x25
682         bl      bad_el0_sync
683         b       ret_to_user
684 ENDPROC(el0_sync)
685
686         .align  6
687 el0_irq:
688         kernel_entry 0
689 el0_irq_naked:
690         enable_dbg
691 #ifdef CONFIG_TRACE_IRQFLAGS
692         bl      trace_hardirqs_off
693 #endif
694
695         ct_user_exit
696         irq_handler
697
698 #ifdef CONFIG_TRACE_IRQFLAGS
699         bl      trace_hardirqs_on
700 #endif
701         b       ret_to_user
702 ENDPROC(el0_irq)
703
704 /*
705  * Register switch for AArch64. The callee-saved registers need to be saved
706  * and restored. On entry:
707  *   x0 = previous task_struct (must be preserved across the switch)
708  *   x1 = next task_struct
709  * Previous and next are guaranteed not to be the same.
710  *
711  */
712 ENTRY(cpu_switch_to)
713         mov     x10, #THREAD_CPU_CONTEXT
714         add     x8, x0, x10
715         mov     x9, sp
716         stp     x19, x20, [x8], #16             // store callee-saved registers
717         stp     x21, x22, [x8], #16
718         stp     x23, x24, [x8], #16
719         stp     x25, x26, [x8], #16
720         stp     x27, x28, [x8], #16
721         stp     x29, x9, [x8], #16
722         str     lr, [x8]
723         add     x8, x1, x10
724         ldp     x19, x20, [x8], #16             // restore callee-saved registers
725         ldp     x21, x22, [x8], #16
726         ldp     x23, x24, [x8], #16
727         ldp     x25, x26, [x8], #16
728         ldp     x27, x28, [x8], #16
729         ldp     x29, x9, [x8], #16
730         ldr     lr, [x8]
731         mov     sp, x9
732         and     x9, x9, #~(THREAD_SIZE - 1)
733         msr     sp_el0, x9
734         ret
735 ENDPROC(cpu_switch_to)
736
737 /*
738  * This is the fast syscall return path.  We do as little as possible here,
739  * and this includes saving x0 back into the kernel stack.
740  */
741 ret_fast_syscall:
742         disable_irq                             // disable interrupts
743         str     x0, [sp, #S_X0]                 // returned x0
744         ldr     x1, [tsk, #TI_FLAGS]            // re-check for syscall tracing
745         and     x2, x1, #_TIF_SYSCALL_WORK
746         cbnz    x2, ret_fast_syscall_trace
747         and     x2, x1, #_TIF_WORK_MASK
748         cbnz    x2, work_pending
749         enable_step_tsk x1, x2
750         kernel_exit 0
751 ret_fast_syscall_trace:
752         enable_irq                              // enable interrupts
753         b       __sys_trace_return_skipped      // we already saved x0
754
755 /*
756  * Ok, we need to do extra processing, enter the slow path.
757  */
758 work_pending:
759         tbnz    x1, #TIF_NEED_RESCHED, work_resched
760         /* TIF_SIGPENDING, TIF_NOTIFY_RESUME or TIF_FOREIGN_FPSTATE case */
761         mov     x0, sp                          // 'regs'
762         enable_irq                              // enable interrupts for do_notify_resume()
763         bl      do_notify_resume
764         b       ret_to_user
765 work_resched:
766 #ifdef CONFIG_TRACE_IRQFLAGS
767         bl      trace_hardirqs_off              // the IRQs are off here, inform the tracing code
768 #endif
769         bl      schedule
770
771 /*
772  * "slow" syscall return path.
773  */
774 ret_to_user:
775         disable_irq                             // disable interrupts
776         ldr     x1, [tsk, #TI_FLAGS]
777         and     x2, x1, #_TIF_WORK_MASK
778         cbnz    x2, work_pending
779         enable_step_tsk x1, x2
780         kernel_exit 0
781 ENDPROC(ret_to_user)
782
783 /*
784  * This is how we return from a fork.
785  */
786 ENTRY(ret_from_fork)
787         bl      schedule_tail
788         cbz     x19, 1f                         // not a kernel thread
789         mov     x0, x20
790         blr     x19
791 1:      get_thread_info tsk
792         b       ret_to_user
793 ENDPROC(ret_from_fork)
794
795 /*
796  * SVC handler.
797  */
798         .align  6
799 el0_svc:
800         adrp    stbl, sys_call_table            // load syscall table pointer
801         uxtw    scno, w8                        // syscall number in w8
802         mov     sc_nr, #__NR_syscalls
803 el0_svc_naked:                                  // compat entry point
804         stp     x0, scno, [sp, #S_ORIG_X0]      // save the original x0 and syscall number
805         enable_dbg_and_irq
806         ct_user_exit 1
807
808         ldr     x16, [tsk, #TI_FLAGS]           // check for syscall hooks
809         tst     x16, #_TIF_SYSCALL_WORK
810         b.ne    __sys_trace
811         cmp     scno, sc_nr                     // check upper syscall limit
812         b.hs    ni_sys
813         ldr     x16, [stbl, scno, lsl #3]       // address in the syscall table
814         blr     x16                             // call sys_* routine
815         b       ret_fast_syscall
816 ni_sys:
817         mov     x0, sp
818         bl      do_ni_syscall
819         b       ret_fast_syscall
820 ENDPROC(el0_svc)
821
822         /*
823          * This is the really slow path.  We're going to be doing context
824          * switches, and waiting for our parent to respond.
825          */
826 __sys_trace:
827         mov     w0, #-1                         // set default errno for
828         cmp     scno, x0                        // user-issued syscall(-1)
829         b.ne    1f
830         mov     x0, #-ENOSYS
831         str     x0, [sp, #S_X0]
832 1:      mov     x0, sp
833         bl      syscall_trace_enter
834         cmp     w0, #-1                         // skip the syscall?
835         b.eq    __sys_trace_return_skipped
836         uxtw    scno, w0                        // syscall number (possibly new)
837         mov     x1, sp                          // pointer to regs
838         cmp     scno, sc_nr                     // check upper syscall limit
839         b.hs    __ni_sys_trace
840         ldp     x0, x1, [sp]                    // restore the syscall args
841         ldp     x2, x3, [sp, #S_X2]
842         ldp     x4, x5, [sp, #S_X4]
843         ldp     x6, x7, [sp, #S_X6]
844         ldr     x16, [stbl, scno, lsl #3]       // address in the syscall table
845         blr     x16                             // call sys_* routine
846
847 __sys_trace_return:
848         str     x0, [sp, #S_X0]                 // save returned x0
849 __sys_trace_return_skipped:
850         mov     x0, sp
851         bl      syscall_trace_exit
852         b       ret_to_user
853
854 __ni_sys_trace:
855         mov     x0, sp
856         bl      do_ni_syscall
857         b       __sys_trace_return
858
859         .popsection                             // .entry.text
860
861 /*
862  * Special system call wrappers.
863  */
864 ENTRY(sys_rt_sigreturn_wrapper)
865         mov     x0, sp
866         b       sys_rt_sigreturn
867 ENDPROC(sys_rt_sigreturn_wrapper)