Linux 6.7-rc7
[linux-modified.git] / arch / arm64 / kernel / entry-common.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Exception handling code
4  *
5  * Copyright (C) 2019 ARM Ltd.
6  */
7
8 #include <linux/context_tracking.h>
9 #include <linux/kasan.h>
10 #include <linux/linkage.h>
11 #include <linux/lockdep.h>
12 #include <linux/ptrace.h>
13 #include <linux/sched.h>
14 #include <linux/sched/debug.h>
15 #include <linux/thread_info.h>
16
17 #include <asm/cpufeature.h>
18 #include <asm/daifflags.h>
19 #include <asm/esr.h>
20 #include <asm/exception.h>
21 #include <asm/irq_regs.h>
22 #include <asm/kprobes.h>
23 #include <asm/mmu.h>
24 #include <asm/processor.h>
25 #include <asm/sdei.h>
26 #include <asm/stacktrace.h>
27 #include <asm/sysreg.h>
28 #include <asm/system_misc.h>
29
30 /*
31  * Handle IRQ/context state management when entering from kernel mode.
32  * Before this function is called it is not safe to call regular kernel code,
33  * instrumentable code, or any code which may trigger an exception.
34  *
35  * This is intended to match the logic in irqentry_enter(), handling the kernel
36  * mode transitions only.
37  */
38 static __always_inline void __enter_from_kernel_mode(struct pt_regs *regs)
39 {
40         regs->exit_rcu = false;
41
42         if (!IS_ENABLED(CONFIG_TINY_RCU) && is_idle_task(current)) {
43                 lockdep_hardirqs_off(CALLER_ADDR0);
44                 ct_irq_enter();
45                 trace_hardirqs_off_finish();
46
47                 regs->exit_rcu = true;
48                 return;
49         }
50
51         lockdep_hardirqs_off(CALLER_ADDR0);
52         rcu_irq_enter_check_tick();
53         trace_hardirqs_off_finish();
54 }
55
56 static void noinstr enter_from_kernel_mode(struct pt_regs *regs)
57 {
58         __enter_from_kernel_mode(regs);
59         mte_check_tfsr_entry();
60         mte_disable_tco_entry(current);
61 }
62
63 /*
64  * Handle IRQ/context state management when exiting to kernel mode.
65  * After this function returns it is not safe to call regular kernel code,
66  * instrumentable code, or any code which may trigger an exception.
67  *
68  * This is intended to match the logic in irqentry_exit(), handling the kernel
69  * mode transitions only, and with preemption handled elsewhere.
70  */
71 static __always_inline void __exit_to_kernel_mode(struct pt_regs *regs)
72 {
73         lockdep_assert_irqs_disabled();
74
75         if (interrupts_enabled(regs)) {
76                 if (regs->exit_rcu) {
77                         trace_hardirqs_on_prepare();
78                         lockdep_hardirqs_on_prepare();
79                         ct_irq_exit();
80                         lockdep_hardirqs_on(CALLER_ADDR0);
81                         return;
82                 }
83
84                 trace_hardirqs_on();
85         } else {
86                 if (regs->exit_rcu)
87                         ct_irq_exit();
88         }
89 }
90
91 static void noinstr exit_to_kernel_mode(struct pt_regs *regs)
92 {
93         mte_check_tfsr_exit();
94         __exit_to_kernel_mode(regs);
95 }
96
97 /*
98  * Handle IRQ/context state management when entering from user mode.
99  * Before this function is called it is not safe to call regular kernel code,
100  * instrumentable code, or any code which may trigger an exception.
101  */
102 static __always_inline void __enter_from_user_mode(void)
103 {
104         lockdep_hardirqs_off(CALLER_ADDR0);
105         CT_WARN_ON(ct_state() != CONTEXT_USER);
106         user_exit_irqoff();
107         trace_hardirqs_off_finish();
108         mte_disable_tco_entry(current);
109 }
110
111 static __always_inline void enter_from_user_mode(struct pt_regs *regs)
112 {
113         __enter_from_user_mode();
114 }
115
116 /*
117  * Handle IRQ/context state management when exiting to user mode.
118  * After this function returns it is not safe to call regular kernel code,
119  * instrumentable code, or any code which may trigger an exception.
120  */
121 static __always_inline void __exit_to_user_mode(void)
122 {
123         trace_hardirqs_on_prepare();
124         lockdep_hardirqs_on_prepare();
125         user_enter_irqoff();
126         lockdep_hardirqs_on(CALLER_ADDR0);
127 }
128
129 static __always_inline void exit_to_user_mode_prepare(struct pt_regs *regs)
130 {
131         unsigned long flags;
132
133         local_daif_mask();
134
135         flags = read_thread_flags();
136         if (unlikely(flags & _TIF_WORK_MASK))
137                 do_notify_resume(regs, flags);
138
139         lockdep_sys_exit();
140 }
141
142 static __always_inline void exit_to_user_mode(struct pt_regs *regs)
143 {
144         exit_to_user_mode_prepare(regs);
145         mte_check_tfsr_exit();
146         __exit_to_user_mode();
147 }
148
149 asmlinkage void noinstr asm_exit_to_user_mode(struct pt_regs *regs)
150 {
151         exit_to_user_mode(regs);
152 }
153
154 /*
155  * Handle IRQ/context state management when entering an NMI from user/kernel
156  * mode. Before this function is called it is not safe to call regular kernel
157  * code, instrumentable code, or any code which may trigger an exception.
158  */
159 static void noinstr arm64_enter_nmi(struct pt_regs *regs)
160 {
161         regs->lockdep_hardirqs = lockdep_hardirqs_enabled();
162
163         __nmi_enter();
164         lockdep_hardirqs_off(CALLER_ADDR0);
165         lockdep_hardirq_enter();
166         ct_nmi_enter();
167
168         trace_hardirqs_off_finish();
169         ftrace_nmi_enter();
170 }
171
172 /*
173  * Handle IRQ/context state management when exiting an NMI from user/kernel
174  * mode. After this function returns it is not safe to call regular kernel
175  * code, instrumentable code, or any code which may trigger an exception.
176  */
177 static void noinstr arm64_exit_nmi(struct pt_regs *regs)
178 {
179         bool restore = regs->lockdep_hardirqs;
180
181         ftrace_nmi_exit();
182         if (restore) {
183                 trace_hardirqs_on_prepare();
184                 lockdep_hardirqs_on_prepare();
185         }
186
187         ct_nmi_exit();
188         lockdep_hardirq_exit();
189         if (restore)
190                 lockdep_hardirqs_on(CALLER_ADDR0);
191         __nmi_exit();
192 }
193
194 /*
195  * Handle IRQ/context state management when entering a debug exception from
196  * kernel mode. Before this function is called it is not safe to call regular
197  * kernel code, instrumentable code, or any code which may trigger an exception.
198  */
199 static void noinstr arm64_enter_el1_dbg(struct pt_regs *regs)
200 {
201         regs->lockdep_hardirqs = lockdep_hardirqs_enabled();
202
203         lockdep_hardirqs_off(CALLER_ADDR0);
204         ct_nmi_enter();
205
206         trace_hardirqs_off_finish();
207 }
208
209 /*
210  * Handle IRQ/context state management when exiting a debug exception from
211  * kernel mode. After this function returns it is not safe to call regular
212  * kernel code, instrumentable code, or any code which may trigger an exception.
213  */
214 static void noinstr arm64_exit_el1_dbg(struct pt_regs *regs)
215 {
216         bool restore = regs->lockdep_hardirqs;
217
218         if (restore) {
219                 trace_hardirqs_on_prepare();
220                 lockdep_hardirqs_on_prepare();
221         }
222
223         ct_nmi_exit();
224         if (restore)
225                 lockdep_hardirqs_on(CALLER_ADDR0);
226 }
227
228 #ifdef CONFIG_PREEMPT_DYNAMIC
229 DEFINE_STATIC_KEY_TRUE(sk_dynamic_irqentry_exit_cond_resched);
230 #define need_irq_preemption() \
231         (static_branch_unlikely(&sk_dynamic_irqentry_exit_cond_resched))
232 #else
233 #define need_irq_preemption()   (IS_ENABLED(CONFIG_PREEMPTION))
234 #endif
235
236 static void __sched arm64_preempt_schedule_irq(void)
237 {
238         if (!need_irq_preemption())
239                 return;
240
241         /*
242          * Note: thread_info::preempt_count includes both thread_info::count
243          * and thread_info::need_resched, and is not equivalent to
244          * preempt_count().
245          */
246         if (READ_ONCE(current_thread_info()->preempt_count) != 0)
247                 return;
248
249         /*
250          * DAIF.DA are cleared at the start of IRQ/FIQ handling, and when GIC
251          * priority masking is used the GIC irqchip driver will clear DAIF.IF
252          * using gic_arch_enable_irqs() for normal IRQs. If anything is set in
253          * DAIF we must have handled an NMI, so skip preemption.
254          */
255         if (system_uses_irq_prio_masking() && read_sysreg(daif))
256                 return;
257
258         /*
259          * Preempting a task from an IRQ means we leave copies of PSTATE
260          * on the stack. cpufeature's enable calls may modify PSTATE, but
261          * resuming one of these preempted tasks would undo those changes.
262          *
263          * Only allow a task to be preempted once cpufeatures have been
264          * enabled.
265          */
266         if (system_capabilities_finalized())
267                 preempt_schedule_irq();
268 }
269
270 static void do_interrupt_handler(struct pt_regs *regs,
271                                  void (*handler)(struct pt_regs *))
272 {
273         struct pt_regs *old_regs = set_irq_regs(regs);
274
275         if (on_thread_stack())
276                 call_on_irq_stack(regs, handler);
277         else
278                 handler(regs);
279
280         set_irq_regs(old_regs);
281 }
282
283 extern void (*handle_arch_irq)(struct pt_regs *);
284 extern void (*handle_arch_fiq)(struct pt_regs *);
285
286 static void noinstr __panic_unhandled(struct pt_regs *regs, const char *vector,
287                                       unsigned long esr)
288 {
289         arm64_enter_nmi(regs);
290
291         console_verbose();
292
293         pr_crit("Unhandled %s exception on CPU%d, ESR 0x%016lx -- %s\n",
294                 vector, smp_processor_id(), esr,
295                 esr_get_class_string(esr));
296
297         __show_regs(regs);
298         panic("Unhandled exception");
299 }
300
301 #define UNHANDLED(el, regsize, vector)                                                  \
302 asmlinkage void noinstr el##_##regsize##_##vector##_handler(struct pt_regs *regs)       \
303 {                                                                                       \
304         const char *desc = #regsize "-bit " #el " " #vector;                            \
305         __panic_unhandled(regs, desc, read_sysreg(esr_el1));                            \
306 }
307
308 #ifdef CONFIG_ARM64_ERRATUM_1463225
309 static DEFINE_PER_CPU(int, __in_cortex_a76_erratum_1463225_wa);
310
311 static void cortex_a76_erratum_1463225_svc_handler(void)
312 {
313         u32 reg, val;
314
315         if (!unlikely(test_thread_flag(TIF_SINGLESTEP)))
316                 return;
317
318         if (!unlikely(this_cpu_has_cap(ARM64_WORKAROUND_1463225)))
319                 return;
320
321         __this_cpu_write(__in_cortex_a76_erratum_1463225_wa, 1);
322         reg = read_sysreg(mdscr_el1);
323         val = reg | DBG_MDSCR_SS | DBG_MDSCR_KDE;
324         write_sysreg(val, mdscr_el1);
325         asm volatile("msr daifclr, #8");
326         isb();
327
328         /* We will have taken a single-step exception by this point */
329
330         write_sysreg(reg, mdscr_el1);
331         __this_cpu_write(__in_cortex_a76_erratum_1463225_wa, 0);
332 }
333
334 static __always_inline bool
335 cortex_a76_erratum_1463225_debug_handler(struct pt_regs *regs)
336 {
337         if (!__this_cpu_read(__in_cortex_a76_erratum_1463225_wa))
338                 return false;
339
340         /*
341          * We've taken a dummy step exception from the kernel to ensure
342          * that interrupts are re-enabled on the syscall path. Return back
343          * to cortex_a76_erratum_1463225_svc_handler() with debug exceptions
344          * masked so that we can safely restore the mdscr and get on with
345          * handling the syscall.
346          */
347         regs->pstate |= PSR_D_BIT;
348         return true;
349 }
350 #else /* CONFIG_ARM64_ERRATUM_1463225 */
351 static void cortex_a76_erratum_1463225_svc_handler(void) { }
352 static bool cortex_a76_erratum_1463225_debug_handler(struct pt_regs *regs)
353 {
354         return false;
355 }
356 #endif /* CONFIG_ARM64_ERRATUM_1463225 */
357
358 /*
359  * As per the ABI exit SME streaming mode and clear the SVE state not
360  * shared with FPSIMD on syscall entry.
361  */
362 static inline void fp_user_discard(void)
363 {
364         /*
365          * If SME is active then exit streaming mode.  If ZA is active
366          * then flush the SVE registers but leave userspace access to
367          * both SVE and SME enabled, otherwise disable SME for the
368          * task and fall through to disabling SVE too.  This means
369          * that after a syscall we never have any streaming mode
370          * register state to track, if this changes the KVM code will
371          * need updating.
372          */
373         if (system_supports_sme())
374                 sme_smstop_sm();
375
376         if (!system_supports_sve())
377                 return;
378
379         if (test_thread_flag(TIF_SVE)) {
380                 unsigned int sve_vq_minus_one;
381
382                 sve_vq_minus_one = sve_vq_from_vl(task_get_sve_vl(current)) - 1;
383                 sve_flush_live(true, sve_vq_minus_one);
384         }
385 }
386
387 UNHANDLED(el1t, 64, sync)
388 UNHANDLED(el1t, 64, irq)
389 UNHANDLED(el1t, 64, fiq)
390 UNHANDLED(el1t, 64, error)
391
392 static void noinstr el1_abort(struct pt_regs *regs, unsigned long esr)
393 {
394         unsigned long far = read_sysreg(far_el1);
395
396         enter_from_kernel_mode(regs);
397         local_daif_inherit(regs);
398         do_mem_abort(far, esr, regs);
399         local_daif_mask();
400         exit_to_kernel_mode(regs);
401 }
402
403 static void noinstr el1_pc(struct pt_regs *regs, unsigned long esr)
404 {
405         unsigned long far = read_sysreg(far_el1);
406
407         enter_from_kernel_mode(regs);
408         local_daif_inherit(regs);
409         do_sp_pc_abort(far, esr, regs);
410         local_daif_mask();
411         exit_to_kernel_mode(regs);
412 }
413
414 static void noinstr el1_undef(struct pt_regs *regs, unsigned long esr)
415 {
416         enter_from_kernel_mode(regs);
417         local_daif_inherit(regs);
418         do_el1_undef(regs, esr);
419         local_daif_mask();
420         exit_to_kernel_mode(regs);
421 }
422
423 static void noinstr el1_bti(struct pt_regs *regs, unsigned long esr)
424 {
425         enter_from_kernel_mode(regs);
426         local_daif_inherit(regs);
427         do_el1_bti(regs, esr);
428         local_daif_mask();
429         exit_to_kernel_mode(regs);
430 }
431
432 static void noinstr el1_dbg(struct pt_regs *regs, unsigned long esr)
433 {
434         unsigned long far = read_sysreg(far_el1);
435
436         arm64_enter_el1_dbg(regs);
437         if (!cortex_a76_erratum_1463225_debug_handler(regs))
438                 do_debug_exception(far, esr, regs);
439         arm64_exit_el1_dbg(regs);
440 }
441
442 static void noinstr el1_fpac(struct pt_regs *regs, unsigned long esr)
443 {
444         enter_from_kernel_mode(regs);
445         local_daif_inherit(regs);
446         do_el1_fpac(regs, esr);
447         local_daif_mask();
448         exit_to_kernel_mode(regs);
449 }
450
451 asmlinkage void noinstr el1h_64_sync_handler(struct pt_regs *regs)
452 {
453         unsigned long esr = read_sysreg(esr_el1);
454
455         switch (ESR_ELx_EC(esr)) {
456         case ESR_ELx_EC_DABT_CUR:
457         case ESR_ELx_EC_IABT_CUR:
458                 el1_abort(regs, esr);
459                 break;
460         /*
461          * We don't handle ESR_ELx_EC_SP_ALIGN, since we will have hit a
462          * recursive exception when trying to push the initial pt_regs.
463          */
464         case ESR_ELx_EC_PC_ALIGN:
465                 el1_pc(regs, esr);
466                 break;
467         case ESR_ELx_EC_SYS64:
468         case ESR_ELx_EC_UNKNOWN:
469                 el1_undef(regs, esr);
470                 break;
471         case ESR_ELx_EC_BTI:
472                 el1_bti(regs, esr);
473                 break;
474         case ESR_ELx_EC_BREAKPT_CUR:
475         case ESR_ELx_EC_SOFTSTP_CUR:
476         case ESR_ELx_EC_WATCHPT_CUR:
477         case ESR_ELx_EC_BRK64:
478                 el1_dbg(regs, esr);
479                 break;
480         case ESR_ELx_EC_FPAC:
481                 el1_fpac(regs, esr);
482                 break;
483         default:
484                 __panic_unhandled(regs, "64-bit el1h sync", esr);
485         }
486 }
487
488 static __always_inline void __el1_pnmi(struct pt_regs *regs,
489                                        void (*handler)(struct pt_regs *))
490 {
491         arm64_enter_nmi(regs);
492         do_interrupt_handler(regs, handler);
493         arm64_exit_nmi(regs);
494 }
495
496 static __always_inline void __el1_irq(struct pt_regs *regs,
497                                       void (*handler)(struct pt_regs *))
498 {
499         enter_from_kernel_mode(regs);
500
501         irq_enter_rcu();
502         do_interrupt_handler(regs, handler);
503         irq_exit_rcu();
504
505         arm64_preempt_schedule_irq();
506
507         exit_to_kernel_mode(regs);
508 }
509 static void noinstr el1_interrupt(struct pt_regs *regs,
510                                   void (*handler)(struct pt_regs *))
511 {
512         write_sysreg(DAIF_PROCCTX_NOIRQ, daif);
513
514         if (IS_ENABLED(CONFIG_ARM64_PSEUDO_NMI) && !interrupts_enabled(regs))
515                 __el1_pnmi(regs, handler);
516         else
517                 __el1_irq(regs, handler);
518 }
519
520 asmlinkage void noinstr el1h_64_irq_handler(struct pt_regs *regs)
521 {
522         el1_interrupt(regs, handle_arch_irq);
523 }
524
525 asmlinkage void noinstr el1h_64_fiq_handler(struct pt_regs *regs)
526 {
527         el1_interrupt(regs, handle_arch_fiq);
528 }
529
530 asmlinkage void noinstr el1h_64_error_handler(struct pt_regs *regs)
531 {
532         unsigned long esr = read_sysreg(esr_el1);
533
534         local_daif_restore(DAIF_ERRCTX);
535         arm64_enter_nmi(regs);
536         do_serror(regs, esr);
537         arm64_exit_nmi(regs);
538 }
539
540 static void noinstr el0_da(struct pt_regs *regs, unsigned long esr)
541 {
542         unsigned long far = read_sysreg(far_el1);
543
544         enter_from_user_mode(regs);
545         local_daif_restore(DAIF_PROCCTX);
546         do_mem_abort(far, esr, regs);
547         exit_to_user_mode(regs);
548 }
549
550 static void noinstr el0_ia(struct pt_regs *regs, unsigned long esr)
551 {
552         unsigned long far = read_sysreg(far_el1);
553
554         /*
555          * We've taken an instruction abort from userspace and not yet
556          * re-enabled IRQs. If the address is a kernel address, apply
557          * BP hardening prior to enabling IRQs and pre-emption.
558          */
559         if (!is_ttbr0_addr(far))
560                 arm64_apply_bp_hardening();
561
562         enter_from_user_mode(regs);
563         local_daif_restore(DAIF_PROCCTX);
564         do_mem_abort(far, esr, regs);
565         exit_to_user_mode(regs);
566 }
567
568 static void noinstr el0_fpsimd_acc(struct pt_regs *regs, unsigned long esr)
569 {
570         enter_from_user_mode(regs);
571         local_daif_restore(DAIF_PROCCTX);
572         do_fpsimd_acc(esr, regs);
573         exit_to_user_mode(regs);
574 }
575
576 static void noinstr el0_sve_acc(struct pt_regs *regs, unsigned long esr)
577 {
578         enter_from_user_mode(regs);
579         local_daif_restore(DAIF_PROCCTX);
580         do_sve_acc(esr, regs);
581         exit_to_user_mode(regs);
582 }
583
584 static void noinstr el0_sme_acc(struct pt_regs *regs, unsigned long esr)
585 {
586         enter_from_user_mode(regs);
587         local_daif_restore(DAIF_PROCCTX);
588         do_sme_acc(esr, regs);
589         exit_to_user_mode(regs);
590 }
591
592 static void noinstr el0_fpsimd_exc(struct pt_regs *regs, unsigned long esr)
593 {
594         enter_from_user_mode(regs);
595         local_daif_restore(DAIF_PROCCTX);
596         do_fpsimd_exc(esr, regs);
597         exit_to_user_mode(regs);
598 }
599
600 static void noinstr el0_sys(struct pt_regs *regs, unsigned long esr)
601 {
602         enter_from_user_mode(regs);
603         local_daif_restore(DAIF_PROCCTX);
604         do_el0_sys(esr, regs);
605         exit_to_user_mode(regs);
606 }
607
608 static void noinstr el0_pc(struct pt_regs *regs, unsigned long esr)
609 {
610         unsigned long far = read_sysreg(far_el1);
611
612         if (!is_ttbr0_addr(instruction_pointer(regs)))
613                 arm64_apply_bp_hardening();
614
615         enter_from_user_mode(regs);
616         local_daif_restore(DAIF_PROCCTX);
617         do_sp_pc_abort(far, esr, regs);
618         exit_to_user_mode(regs);
619 }
620
621 static void noinstr el0_sp(struct pt_regs *regs, unsigned long esr)
622 {
623         enter_from_user_mode(regs);
624         local_daif_restore(DAIF_PROCCTX);
625         do_sp_pc_abort(regs->sp, esr, regs);
626         exit_to_user_mode(regs);
627 }
628
629 static void noinstr el0_undef(struct pt_regs *regs, unsigned long esr)
630 {
631         enter_from_user_mode(regs);
632         local_daif_restore(DAIF_PROCCTX);
633         do_el0_undef(regs, esr);
634         exit_to_user_mode(regs);
635 }
636
637 static void noinstr el0_bti(struct pt_regs *regs)
638 {
639         enter_from_user_mode(regs);
640         local_daif_restore(DAIF_PROCCTX);
641         do_el0_bti(regs);
642         exit_to_user_mode(regs);
643 }
644
645 static void noinstr el0_mops(struct pt_regs *regs, unsigned long esr)
646 {
647         enter_from_user_mode(regs);
648         local_daif_restore(DAIF_PROCCTX);
649         do_el0_mops(regs, esr);
650         exit_to_user_mode(regs);
651 }
652
653 static void noinstr el0_inv(struct pt_regs *regs, unsigned long esr)
654 {
655         enter_from_user_mode(regs);
656         local_daif_restore(DAIF_PROCCTX);
657         bad_el0_sync(regs, 0, esr);
658         exit_to_user_mode(regs);
659 }
660
661 static void noinstr el0_dbg(struct pt_regs *regs, unsigned long esr)
662 {
663         /* Only watchpoints write FAR_EL1, otherwise its UNKNOWN */
664         unsigned long far = read_sysreg(far_el1);
665
666         enter_from_user_mode(regs);
667         do_debug_exception(far, esr, regs);
668         local_daif_restore(DAIF_PROCCTX);
669         exit_to_user_mode(regs);
670 }
671
672 static void noinstr el0_svc(struct pt_regs *regs)
673 {
674         enter_from_user_mode(regs);
675         cortex_a76_erratum_1463225_svc_handler();
676         fp_user_discard();
677         local_daif_restore(DAIF_PROCCTX);
678         do_el0_svc(regs);
679         exit_to_user_mode(regs);
680 }
681
682 static void noinstr el0_fpac(struct pt_regs *regs, unsigned long esr)
683 {
684         enter_from_user_mode(regs);
685         local_daif_restore(DAIF_PROCCTX);
686         do_el0_fpac(regs, esr);
687         exit_to_user_mode(regs);
688 }
689
690 asmlinkage void noinstr el0t_64_sync_handler(struct pt_regs *regs)
691 {
692         unsigned long esr = read_sysreg(esr_el1);
693
694         switch (ESR_ELx_EC(esr)) {
695         case ESR_ELx_EC_SVC64:
696                 el0_svc(regs);
697                 break;
698         case ESR_ELx_EC_DABT_LOW:
699                 el0_da(regs, esr);
700                 break;
701         case ESR_ELx_EC_IABT_LOW:
702                 el0_ia(regs, esr);
703                 break;
704         case ESR_ELx_EC_FP_ASIMD:
705                 el0_fpsimd_acc(regs, esr);
706                 break;
707         case ESR_ELx_EC_SVE:
708                 el0_sve_acc(regs, esr);
709                 break;
710         case ESR_ELx_EC_SME:
711                 el0_sme_acc(regs, esr);
712                 break;
713         case ESR_ELx_EC_FP_EXC64:
714                 el0_fpsimd_exc(regs, esr);
715                 break;
716         case ESR_ELx_EC_SYS64:
717         case ESR_ELx_EC_WFx:
718                 el0_sys(regs, esr);
719                 break;
720         case ESR_ELx_EC_SP_ALIGN:
721                 el0_sp(regs, esr);
722                 break;
723         case ESR_ELx_EC_PC_ALIGN:
724                 el0_pc(regs, esr);
725                 break;
726         case ESR_ELx_EC_UNKNOWN:
727                 el0_undef(regs, esr);
728                 break;
729         case ESR_ELx_EC_BTI:
730                 el0_bti(regs);
731                 break;
732         case ESR_ELx_EC_MOPS:
733                 el0_mops(regs, esr);
734                 break;
735         case ESR_ELx_EC_BREAKPT_LOW:
736         case ESR_ELx_EC_SOFTSTP_LOW:
737         case ESR_ELx_EC_WATCHPT_LOW:
738         case ESR_ELx_EC_BRK64:
739                 el0_dbg(regs, esr);
740                 break;
741         case ESR_ELx_EC_FPAC:
742                 el0_fpac(regs, esr);
743                 break;
744         default:
745                 el0_inv(regs, esr);
746         }
747 }
748
749 static void noinstr el0_interrupt(struct pt_regs *regs,
750                                   void (*handler)(struct pt_regs *))
751 {
752         enter_from_user_mode(regs);
753
754         write_sysreg(DAIF_PROCCTX_NOIRQ, daif);
755
756         if (regs->pc & BIT(55))
757                 arm64_apply_bp_hardening();
758
759         irq_enter_rcu();
760         do_interrupt_handler(regs, handler);
761         irq_exit_rcu();
762
763         exit_to_user_mode(regs);
764 }
765
766 static void noinstr __el0_irq_handler_common(struct pt_regs *regs)
767 {
768         el0_interrupt(regs, handle_arch_irq);
769 }
770
771 asmlinkage void noinstr el0t_64_irq_handler(struct pt_regs *regs)
772 {
773         __el0_irq_handler_common(regs);
774 }
775
776 static void noinstr __el0_fiq_handler_common(struct pt_regs *regs)
777 {
778         el0_interrupt(regs, handle_arch_fiq);
779 }
780
781 asmlinkage void noinstr el0t_64_fiq_handler(struct pt_regs *regs)
782 {
783         __el0_fiq_handler_common(regs);
784 }
785
786 static void noinstr __el0_error_handler_common(struct pt_regs *regs)
787 {
788         unsigned long esr = read_sysreg(esr_el1);
789
790         enter_from_user_mode(regs);
791         local_daif_restore(DAIF_ERRCTX);
792         arm64_enter_nmi(regs);
793         do_serror(regs, esr);
794         arm64_exit_nmi(regs);
795         local_daif_restore(DAIF_PROCCTX);
796         exit_to_user_mode(regs);
797 }
798
799 asmlinkage void noinstr el0t_64_error_handler(struct pt_regs *regs)
800 {
801         __el0_error_handler_common(regs);
802 }
803
804 #ifdef CONFIG_COMPAT
805 static void noinstr el0_cp15(struct pt_regs *regs, unsigned long esr)
806 {
807         enter_from_user_mode(regs);
808         local_daif_restore(DAIF_PROCCTX);
809         do_el0_cp15(esr, regs);
810         exit_to_user_mode(regs);
811 }
812
813 static void noinstr el0_svc_compat(struct pt_regs *regs)
814 {
815         enter_from_user_mode(regs);
816         cortex_a76_erratum_1463225_svc_handler();
817         local_daif_restore(DAIF_PROCCTX);
818         do_el0_svc_compat(regs);
819         exit_to_user_mode(regs);
820 }
821
822 asmlinkage void noinstr el0t_32_sync_handler(struct pt_regs *regs)
823 {
824         unsigned long esr = read_sysreg(esr_el1);
825
826         switch (ESR_ELx_EC(esr)) {
827         case ESR_ELx_EC_SVC32:
828                 el0_svc_compat(regs);
829                 break;
830         case ESR_ELx_EC_DABT_LOW:
831                 el0_da(regs, esr);
832                 break;
833         case ESR_ELx_EC_IABT_LOW:
834                 el0_ia(regs, esr);
835                 break;
836         case ESR_ELx_EC_FP_ASIMD:
837                 el0_fpsimd_acc(regs, esr);
838                 break;
839         case ESR_ELx_EC_FP_EXC32:
840                 el0_fpsimd_exc(regs, esr);
841                 break;
842         case ESR_ELx_EC_PC_ALIGN:
843                 el0_pc(regs, esr);
844                 break;
845         case ESR_ELx_EC_UNKNOWN:
846         case ESR_ELx_EC_CP14_MR:
847         case ESR_ELx_EC_CP14_LS:
848         case ESR_ELx_EC_CP14_64:
849                 el0_undef(regs, esr);
850                 break;
851         case ESR_ELx_EC_CP15_32:
852         case ESR_ELx_EC_CP15_64:
853                 el0_cp15(regs, esr);
854                 break;
855         case ESR_ELx_EC_BREAKPT_LOW:
856         case ESR_ELx_EC_SOFTSTP_LOW:
857         case ESR_ELx_EC_WATCHPT_LOW:
858         case ESR_ELx_EC_BKPT32:
859                 el0_dbg(regs, esr);
860                 break;
861         default:
862                 el0_inv(regs, esr);
863         }
864 }
865
866 asmlinkage void noinstr el0t_32_irq_handler(struct pt_regs *regs)
867 {
868         __el0_irq_handler_common(regs);
869 }
870
871 asmlinkage void noinstr el0t_32_fiq_handler(struct pt_regs *regs)
872 {
873         __el0_fiq_handler_common(regs);
874 }
875
876 asmlinkage void noinstr el0t_32_error_handler(struct pt_regs *regs)
877 {
878         __el0_error_handler_common(regs);
879 }
880 #else /* CONFIG_COMPAT */
881 UNHANDLED(el0t, 32, sync)
882 UNHANDLED(el0t, 32, irq)
883 UNHANDLED(el0t, 32, fiq)
884 UNHANDLED(el0t, 32, error)
885 #endif /* CONFIG_COMPAT */
886
887 #ifdef CONFIG_VMAP_STACK
888 asmlinkage void noinstr __noreturn handle_bad_stack(struct pt_regs *regs)
889 {
890         unsigned long esr = read_sysreg(esr_el1);
891         unsigned long far = read_sysreg(far_el1);
892
893         arm64_enter_nmi(regs);
894         panic_bad_stack(regs, esr, far);
895 }
896 #endif /* CONFIG_VMAP_STACK */
897
898 #ifdef CONFIG_ARM_SDE_INTERFACE
899 asmlinkage noinstr unsigned long
900 __sdei_handler(struct pt_regs *regs, struct sdei_registered_event *arg)
901 {
902         unsigned long ret;
903
904         /*
905          * We didn't take an exception to get here, so the HW hasn't
906          * set/cleared bits in PSTATE that we may rely on.
907          *
908          * The original SDEI spec (ARM DEN 0054A) can be read ambiguously as to
909          * whether PSTATE bits are inherited unchanged or generated from
910          * scratch, and the TF-A implementation always clears PAN and always
911          * clears UAO. There are no other known implementations.
912          *
913          * Subsequent revisions (ARM DEN 0054B) follow the usual rules for how
914          * PSTATE is modified upon architectural exceptions, and so PAN is
915          * either inherited or set per SCTLR_ELx.SPAN, and UAO is always
916          * cleared.
917          *
918          * We must explicitly reset PAN to the expected state, including
919          * clearing it when the host isn't using it, in case a VM had it set.
920          */
921         if (system_uses_hw_pan())
922                 set_pstate_pan(1);
923         else if (cpu_has_pan())
924                 set_pstate_pan(0);
925
926         arm64_enter_nmi(regs);
927         ret = do_sdei_event(regs, arg);
928         arm64_exit_nmi(regs);
929
930         return ret;
931 }
932 #endif /* CONFIG_ARM_SDE_INTERFACE */