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/linkage.h> 10 #include <linux/lockdep.h> 11 #include <linux/ptrace.h> 12 #include <linux/sched.h> 13 #include <linux/sched/debug.h> 14 #include <linux/thread_info.h> 15 16 #include <asm/cpufeature.h> 17 #include <asm/daifflags.h> 18 #include <asm/esr.h> 19 #include <asm/exception.h> 20 #include <asm/kprobes.h> 21 #include <asm/mmu.h> 22 #include <asm/processor.h> 23 #include <asm/sdei.h> 24 #include <asm/stacktrace.h> 25 #include <asm/sysreg.h> 26 #include <asm/system_misc.h> 27 28 /* 29 * This is intended to match the logic in irqentry_enter(), handling the kernel 30 * mode transitions only. 31 */ 32 static void noinstr enter_from_kernel_mode(struct pt_regs *regs) 33 { 34 regs->exit_rcu = false; 35 36 if (!IS_ENABLED(CONFIG_TINY_RCU) && is_idle_task(current)) { 37 lockdep_hardirqs_off(CALLER_ADDR0); 38 rcu_irq_enter(); 39 trace_hardirqs_off_finish(); 40 41 regs->exit_rcu = true; 42 return; 43 } 44 45 lockdep_hardirqs_off(CALLER_ADDR0); 46 rcu_irq_enter_check_tick(); 47 trace_hardirqs_off_finish(); 48 49 mte_check_tfsr_entry(); 50 } 51 52 /* 53 * This is intended to match the logic in irqentry_exit(), handling the kernel 54 * mode transitions only, and with preemption handled elsewhere. 55 */ 56 static void noinstr exit_to_kernel_mode(struct pt_regs *regs) 57 { 58 lockdep_assert_irqs_disabled(); 59 60 mte_check_tfsr_exit(); 61 62 if (interrupts_enabled(regs)) { 63 if (regs->exit_rcu) { 64 trace_hardirqs_on_prepare(); 65 lockdep_hardirqs_on_prepare(CALLER_ADDR0); 66 rcu_irq_exit(); 67 lockdep_hardirqs_on(CALLER_ADDR0); 68 return; 69 } 70 71 trace_hardirqs_on(); 72 } else { 73 if (regs->exit_rcu) 74 rcu_irq_exit(); 75 } 76 } 77 78 static void noinstr arm64_enter_nmi(struct pt_regs *regs) 79 { 80 regs->lockdep_hardirqs = lockdep_hardirqs_enabled(); 81 82 __nmi_enter(); 83 lockdep_hardirqs_off(CALLER_ADDR0); 84 lockdep_hardirq_enter(); 85 rcu_nmi_enter(); 86 87 trace_hardirqs_off_finish(); 88 ftrace_nmi_enter(); 89 } 90 91 static void noinstr arm64_exit_nmi(struct pt_regs *regs) 92 { 93 bool restore = regs->lockdep_hardirqs; 94 95 ftrace_nmi_exit(); 96 if (restore) { 97 trace_hardirqs_on_prepare(); 98 lockdep_hardirqs_on_prepare(CALLER_ADDR0); 99 } 100 101 rcu_nmi_exit(); 102 lockdep_hardirq_exit(); 103 if (restore) 104 lockdep_hardirqs_on(CALLER_ADDR0); 105 __nmi_exit(); 106 } 107 108 static void noinstr enter_el1_irq_or_nmi(struct pt_regs *regs) 109 { 110 if (IS_ENABLED(CONFIG_ARM64_PSEUDO_NMI) && !interrupts_enabled(regs)) 111 arm64_enter_nmi(regs); 112 else 113 enter_from_kernel_mode(regs); 114 } 115 116 static void noinstr exit_el1_irq_or_nmi(struct pt_regs *regs) 117 { 118 if (IS_ENABLED(CONFIG_ARM64_PSEUDO_NMI) && !interrupts_enabled(regs)) 119 arm64_exit_nmi(regs); 120 else 121 exit_to_kernel_mode(regs); 122 } 123 124 static void __sched arm64_preempt_schedule_irq(void) 125 { 126 lockdep_assert_irqs_disabled(); 127 128 /* 129 * DAIF.DA are cleared at the start of IRQ/FIQ handling, and when GIC 130 * priority masking is used the GIC irqchip driver will clear DAIF.IF 131 * using gic_arch_enable_irqs() for normal IRQs. If anything is set in 132 * DAIF we must have handled an NMI, so skip preemption. 133 */ 134 if (system_uses_irq_prio_masking() && read_sysreg(daif)) 135 return; 136 137 /* 138 * Preempting a task from an IRQ means we leave copies of PSTATE 139 * on the stack. cpufeature's enable calls may modify PSTATE, but 140 * resuming one of these preempted tasks would undo those changes. 141 * 142 * Only allow a task to be preempted once cpufeatures have been 143 * enabled. 144 */ 145 if (system_capabilities_finalized()) 146 preempt_schedule_irq(); 147 } 148 149 static void do_interrupt_handler(struct pt_regs *regs, 150 void (*handler)(struct pt_regs *)) 151 { 152 if (on_thread_stack()) 153 call_on_irq_stack(regs, handler); 154 else 155 handler(regs); 156 } 157 158 extern void (*handle_arch_irq)(struct pt_regs *); 159 extern void (*handle_arch_fiq)(struct pt_regs *); 160 161 static void noinstr __panic_unhandled(struct pt_regs *regs, const char *vector, 162 unsigned int esr) 163 { 164 arm64_enter_nmi(regs); 165 166 console_verbose(); 167 168 pr_crit("Unhandled %s exception on CPU%d, ESR 0x%08x -- %s\n", 169 vector, smp_processor_id(), esr, 170 esr_get_class_string(esr)); 171 172 __show_regs(regs); 173 panic("Unhandled exception"); 174 } 175 176 #define UNHANDLED(el, regsize, vector) \ 177 asmlinkage void noinstr el##_##regsize##_##vector##_handler(struct pt_regs *regs) \ 178 { \ 179 const char *desc = #regsize "-bit " #el " " #vector; \ 180 __panic_unhandled(regs, desc, read_sysreg(esr_el1)); \ 181 } 182 183 #ifdef CONFIG_ARM64_ERRATUM_1463225 184 static DEFINE_PER_CPU(int, __in_cortex_a76_erratum_1463225_wa); 185 186 static void cortex_a76_erratum_1463225_svc_handler(void) 187 { 188 u32 reg, val; 189 190 if (!unlikely(test_thread_flag(TIF_SINGLESTEP))) 191 return; 192 193 if (!unlikely(this_cpu_has_cap(ARM64_WORKAROUND_1463225))) 194 return; 195 196 __this_cpu_write(__in_cortex_a76_erratum_1463225_wa, 1); 197 reg = read_sysreg(mdscr_el1); 198 val = reg | DBG_MDSCR_SS | DBG_MDSCR_KDE; 199 write_sysreg(val, mdscr_el1); 200 asm volatile("msr daifclr, #8"); 201 isb(); 202 203 /* We will have taken a single-step exception by this point */ 204 205 write_sysreg(reg, mdscr_el1); 206 __this_cpu_write(__in_cortex_a76_erratum_1463225_wa, 0); 207 } 208 209 static bool cortex_a76_erratum_1463225_debug_handler(struct pt_regs *regs) 210 { 211 if (!__this_cpu_read(__in_cortex_a76_erratum_1463225_wa)) 212 return false; 213 214 /* 215 * We've taken a dummy step exception from the kernel to ensure 216 * that interrupts are re-enabled on the syscall path. Return back 217 * to cortex_a76_erratum_1463225_svc_handler() with debug exceptions 218 * masked so that we can safely restore the mdscr and get on with 219 * handling the syscall. 220 */ 221 regs->pstate |= PSR_D_BIT; 222 return true; 223 } 224 #else /* CONFIG_ARM64_ERRATUM_1463225 */ 225 static void cortex_a76_erratum_1463225_svc_handler(void) { } 226 static bool cortex_a76_erratum_1463225_debug_handler(struct pt_regs *regs) 227 { 228 return false; 229 } 230 #endif /* CONFIG_ARM64_ERRATUM_1463225 */ 231 232 UNHANDLED(el1t, 64, sync) 233 UNHANDLED(el1t, 64, irq) 234 UNHANDLED(el1t, 64, fiq) 235 UNHANDLED(el1t, 64, error) 236 237 static void noinstr el1_abort(struct pt_regs *regs, unsigned long esr) 238 { 239 unsigned long far = read_sysreg(far_el1); 240 241 enter_from_kernel_mode(regs); 242 local_daif_inherit(regs); 243 do_mem_abort(far, esr, regs); 244 local_daif_mask(); 245 exit_to_kernel_mode(regs); 246 } 247 248 static void noinstr el1_pc(struct pt_regs *regs, unsigned long esr) 249 { 250 unsigned long far = read_sysreg(far_el1); 251 252 enter_from_kernel_mode(regs); 253 local_daif_inherit(regs); 254 do_sp_pc_abort(far, esr, regs); 255 local_daif_mask(); 256 exit_to_kernel_mode(regs); 257 } 258 259 static void noinstr el1_undef(struct pt_regs *regs) 260 { 261 enter_from_kernel_mode(regs); 262 local_daif_inherit(regs); 263 do_undefinstr(regs); 264 local_daif_mask(); 265 exit_to_kernel_mode(regs); 266 } 267 268 static void noinstr arm64_enter_el1_dbg(struct pt_regs *regs) 269 { 270 regs->lockdep_hardirqs = lockdep_hardirqs_enabled(); 271 272 lockdep_hardirqs_off(CALLER_ADDR0); 273 rcu_nmi_enter(); 274 275 trace_hardirqs_off_finish(); 276 } 277 278 static void noinstr arm64_exit_el1_dbg(struct pt_regs *regs) 279 { 280 bool restore = regs->lockdep_hardirqs; 281 282 if (restore) { 283 trace_hardirqs_on_prepare(); 284 lockdep_hardirqs_on_prepare(CALLER_ADDR0); 285 } 286 287 rcu_nmi_exit(); 288 if (restore) 289 lockdep_hardirqs_on(CALLER_ADDR0); 290 } 291 292 static void noinstr el1_dbg(struct pt_regs *regs, unsigned long esr) 293 { 294 unsigned long far = read_sysreg(far_el1); 295 296 arm64_enter_el1_dbg(regs); 297 if (!cortex_a76_erratum_1463225_debug_handler(regs)) 298 do_debug_exception(far, esr, regs); 299 arm64_exit_el1_dbg(regs); 300 } 301 302 static void noinstr el1_fpac(struct pt_regs *regs, unsigned long esr) 303 { 304 enter_from_kernel_mode(regs); 305 local_daif_inherit(regs); 306 do_ptrauth_fault(regs, esr); 307 local_daif_mask(); 308 exit_to_kernel_mode(regs); 309 } 310 311 asmlinkage void noinstr el1h_64_sync_handler(struct pt_regs *regs) 312 { 313 unsigned long esr = read_sysreg(esr_el1); 314 315 switch (ESR_ELx_EC(esr)) { 316 case ESR_ELx_EC_DABT_CUR: 317 case ESR_ELx_EC_IABT_CUR: 318 el1_abort(regs, esr); 319 break; 320 /* 321 * We don't handle ESR_ELx_EC_SP_ALIGN, since we will have hit a 322 * recursive exception when trying to push the initial pt_regs. 323 */ 324 case ESR_ELx_EC_PC_ALIGN: 325 el1_pc(regs, esr); 326 break; 327 case ESR_ELx_EC_SYS64: 328 case ESR_ELx_EC_UNKNOWN: 329 el1_undef(regs); 330 break; 331 case ESR_ELx_EC_BREAKPT_CUR: 332 case ESR_ELx_EC_SOFTSTP_CUR: 333 case ESR_ELx_EC_WATCHPT_CUR: 334 case ESR_ELx_EC_BRK64: 335 el1_dbg(regs, esr); 336 break; 337 case ESR_ELx_EC_FPAC: 338 el1_fpac(regs, esr); 339 break; 340 default: 341 __panic_unhandled(regs, "64-bit el1h sync", esr); 342 } 343 } 344 345 static void noinstr el1_interrupt(struct pt_regs *regs, 346 void (*handler)(struct pt_regs *)) 347 { 348 write_sysreg(DAIF_PROCCTX_NOIRQ, daif); 349 350 enter_el1_irq_or_nmi(regs); 351 do_interrupt_handler(regs, handler); 352 353 /* 354 * Note: thread_info::preempt_count includes both thread_info::count 355 * and thread_info::need_resched, and is not equivalent to 356 * preempt_count(). 357 */ 358 if (IS_ENABLED(CONFIG_PREEMPTION) && 359 READ_ONCE(current_thread_info()->preempt_count) == 0) 360 arm64_preempt_schedule_irq(); 361 362 exit_el1_irq_or_nmi(regs); 363 } 364 365 asmlinkage void noinstr el1h_64_irq_handler(struct pt_regs *regs) 366 { 367 el1_interrupt(regs, handle_arch_irq); 368 } 369 370 asmlinkage void noinstr el1h_64_fiq_handler(struct pt_regs *regs) 371 { 372 el1_interrupt(regs, handle_arch_fiq); 373 } 374 375 asmlinkage void noinstr el1h_64_error_handler(struct pt_regs *regs) 376 { 377 unsigned long esr = read_sysreg(esr_el1); 378 379 local_daif_restore(DAIF_ERRCTX); 380 arm64_enter_nmi(regs); 381 do_serror(regs, esr); 382 arm64_exit_nmi(regs); 383 } 384 385 asmlinkage void noinstr enter_from_user_mode(void) 386 { 387 lockdep_hardirqs_off(CALLER_ADDR0); 388 CT_WARN_ON(ct_state() != CONTEXT_USER); 389 user_exit_irqoff(); 390 trace_hardirqs_off_finish(); 391 } 392 393 asmlinkage void noinstr exit_to_user_mode(void) 394 { 395 mte_check_tfsr_exit(); 396 397 trace_hardirqs_on_prepare(); 398 lockdep_hardirqs_on_prepare(CALLER_ADDR0); 399 user_enter_irqoff(); 400 lockdep_hardirqs_on(CALLER_ADDR0); 401 } 402 403 static void noinstr el0_da(struct pt_regs *regs, unsigned long esr) 404 { 405 unsigned long far = read_sysreg(far_el1); 406 407 enter_from_user_mode(); 408 local_daif_restore(DAIF_PROCCTX); 409 do_mem_abort(far, esr, regs); 410 } 411 412 static void noinstr el0_ia(struct pt_regs *regs, unsigned long esr) 413 { 414 unsigned long far = read_sysreg(far_el1); 415 416 /* 417 * We've taken an instruction abort from userspace and not yet 418 * re-enabled IRQs. If the address is a kernel address, apply 419 * BP hardening prior to enabling IRQs and pre-emption. 420 */ 421 if (!is_ttbr0_addr(far)) 422 arm64_apply_bp_hardening(); 423 424 enter_from_user_mode(); 425 local_daif_restore(DAIF_PROCCTX); 426 do_mem_abort(far, esr, regs); 427 } 428 429 static void noinstr el0_fpsimd_acc(struct pt_regs *regs, unsigned long esr) 430 { 431 enter_from_user_mode(); 432 local_daif_restore(DAIF_PROCCTX); 433 do_fpsimd_acc(esr, regs); 434 } 435 436 static void noinstr el0_sve_acc(struct pt_regs *regs, unsigned long esr) 437 { 438 enter_from_user_mode(); 439 local_daif_restore(DAIF_PROCCTX); 440 do_sve_acc(esr, regs); 441 } 442 443 static void noinstr el0_fpsimd_exc(struct pt_regs *regs, unsigned long esr) 444 { 445 enter_from_user_mode(); 446 local_daif_restore(DAIF_PROCCTX); 447 do_fpsimd_exc(esr, regs); 448 } 449 450 static void noinstr el0_sys(struct pt_regs *regs, unsigned long esr) 451 { 452 enter_from_user_mode(); 453 local_daif_restore(DAIF_PROCCTX); 454 do_sysinstr(esr, regs); 455 } 456 457 static void noinstr el0_pc(struct pt_regs *regs, unsigned long esr) 458 { 459 unsigned long far = read_sysreg(far_el1); 460 461 if (!is_ttbr0_addr(instruction_pointer(regs))) 462 arm64_apply_bp_hardening(); 463 464 enter_from_user_mode(); 465 local_daif_restore(DAIF_PROCCTX); 466 do_sp_pc_abort(far, esr, regs); 467 } 468 469 static void noinstr el0_sp(struct pt_regs *regs, unsigned long esr) 470 { 471 enter_from_user_mode(); 472 local_daif_restore(DAIF_PROCCTX); 473 do_sp_pc_abort(regs->sp, esr, regs); 474 } 475 476 static void noinstr el0_undef(struct pt_regs *regs) 477 { 478 enter_from_user_mode(); 479 local_daif_restore(DAIF_PROCCTX); 480 do_undefinstr(regs); 481 } 482 483 static void noinstr el0_bti(struct pt_regs *regs) 484 { 485 enter_from_user_mode(); 486 local_daif_restore(DAIF_PROCCTX); 487 do_bti(regs); 488 } 489 490 static void noinstr el0_inv(struct pt_regs *regs, unsigned long esr) 491 { 492 enter_from_user_mode(); 493 local_daif_restore(DAIF_PROCCTX); 494 bad_el0_sync(regs, 0, esr); 495 } 496 497 static void noinstr el0_dbg(struct pt_regs *regs, unsigned long esr) 498 { 499 /* Only watchpoints write FAR_EL1, otherwise its UNKNOWN */ 500 unsigned long far = read_sysreg(far_el1); 501 502 enter_from_user_mode(); 503 do_debug_exception(far, esr, regs); 504 local_daif_restore(DAIF_PROCCTX); 505 } 506 507 static void noinstr el0_svc(struct pt_regs *regs) 508 { 509 enter_from_user_mode(); 510 cortex_a76_erratum_1463225_svc_handler(); 511 do_el0_svc(regs); 512 } 513 514 static void noinstr el0_fpac(struct pt_regs *regs, unsigned long esr) 515 { 516 enter_from_user_mode(); 517 local_daif_restore(DAIF_PROCCTX); 518 do_ptrauth_fault(regs, esr); 519 } 520 521 asmlinkage void noinstr el0t_64_sync_handler(struct pt_regs *regs) 522 { 523 unsigned long esr = read_sysreg(esr_el1); 524 525 switch (ESR_ELx_EC(esr)) { 526 case ESR_ELx_EC_SVC64: 527 el0_svc(regs); 528 break; 529 case ESR_ELx_EC_DABT_LOW: 530 el0_da(regs, esr); 531 break; 532 case ESR_ELx_EC_IABT_LOW: 533 el0_ia(regs, esr); 534 break; 535 case ESR_ELx_EC_FP_ASIMD: 536 el0_fpsimd_acc(regs, esr); 537 break; 538 case ESR_ELx_EC_SVE: 539 el0_sve_acc(regs, esr); 540 break; 541 case ESR_ELx_EC_FP_EXC64: 542 el0_fpsimd_exc(regs, esr); 543 break; 544 case ESR_ELx_EC_SYS64: 545 case ESR_ELx_EC_WFx: 546 el0_sys(regs, esr); 547 break; 548 case ESR_ELx_EC_SP_ALIGN: 549 el0_sp(regs, esr); 550 break; 551 case ESR_ELx_EC_PC_ALIGN: 552 el0_pc(regs, esr); 553 break; 554 case ESR_ELx_EC_UNKNOWN: 555 el0_undef(regs); 556 break; 557 case ESR_ELx_EC_BTI: 558 el0_bti(regs); 559 break; 560 case ESR_ELx_EC_BREAKPT_LOW: 561 case ESR_ELx_EC_SOFTSTP_LOW: 562 case ESR_ELx_EC_WATCHPT_LOW: 563 case ESR_ELx_EC_BRK64: 564 el0_dbg(regs, esr); 565 break; 566 case ESR_ELx_EC_FPAC: 567 el0_fpac(regs, esr); 568 break; 569 default: 570 el0_inv(regs, esr); 571 } 572 } 573 574 static void noinstr el0_interrupt(struct pt_regs *regs, 575 void (*handler)(struct pt_regs *)) 576 { 577 enter_from_user_mode(); 578 579 write_sysreg(DAIF_PROCCTX_NOIRQ, daif); 580 581 if (regs->pc & BIT(55)) 582 arm64_apply_bp_hardening(); 583 584 do_interrupt_handler(regs, handler); 585 } 586 587 static void noinstr __el0_irq_handler_common(struct pt_regs *regs) 588 { 589 el0_interrupt(regs, handle_arch_irq); 590 } 591 592 asmlinkage void noinstr el0t_64_irq_handler(struct pt_regs *regs) 593 { 594 __el0_irq_handler_common(regs); 595 } 596 597 static void noinstr __el0_fiq_handler_common(struct pt_regs *regs) 598 { 599 el0_interrupt(regs, handle_arch_fiq); 600 } 601 602 asmlinkage void noinstr el0t_64_fiq_handler(struct pt_regs *regs) 603 { 604 __el0_fiq_handler_common(regs); 605 } 606 607 static void __el0_error_handler_common(struct pt_regs *regs) 608 { 609 unsigned long esr = read_sysreg(esr_el1); 610 611 enter_from_user_mode(); 612 local_daif_restore(DAIF_ERRCTX); 613 arm64_enter_nmi(regs); 614 do_serror(regs, esr); 615 arm64_exit_nmi(regs); 616 local_daif_restore(DAIF_PROCCTX); 617 } 618 619 asmlinkage void noinstr el0t_64_error_handler(struct pt_regs *regs) 620 { 621 __el0_error_handler_common(regs); 622 } 623 624 #ifdef CONFIG_COMPAT 625 static void noinstr el0_cp15(struct pt_regs *regs, unsigned long esr) 626 { 627 enter_from_user_mode(); 628 local_daif_restore(DAIF_PROCCTX); 629 do_cp15instr(esr, regs); 630 } 631 632 static void noinstr el0_svc_compat(struct pt_regs *regs) 633 { 634 enter_from_user_mode(); 635 cortex_a76_erratum_1463225_svc_handler(); 636 do_el0_svc_compat(regs); 637 } 638 639 asmlinkage void noinstr el0t_32_sync_handler(struct pt_regs *regs) 640 { 641 unsigned long esr = read_sysreg(esr_el1); 642 643 switch (ESR_ELx_EC(esr)) { 644 case ESR_ELx_EC_SVC32: 645 el0_svc_compat(regs); 646 break; 647 case ESR_ELx_EC_DABT_LOW: 648 el0_da(regs, esr); 649 break; 650 case ESR_ELx_EC_IABT_LOW: 651 el0_ia(regs, esr); 652 break; 653 case ESR_ELx_EC_FP_ASIMD: 654 el0_fpsimd_acc(regs, esr); 655 break; 656 case ESR_ELx_EC_FP_EXC32: 657 el0_fpsimd_exc(regs, esr); 658 break; 659 case ESR_ELx_EC_PC_ALIGN: 660 el0_pc(regs, esr); 661 break; 662 case ESR_ELx_EC_UNKNOWN: 663 case ESR_ELx_EC_CP14_MR: 664 case ESR_ELx_EC_CP14_LS: 665 case ESR_ELx_EC_CP14_64: 666 el0_undef(regs); 667 break; 668 case ESR_ELx_EC_CP15_32: 669 case ESR_ELx_EC_CP15_64: 670 el0_cp15(regs, esr); 671 break; 672 case ESR_ELx_EC_BREAKPT_LOW: 673 case ESR_ELx_EC_SOFTSTP_LOW: 674 case ESR_ELx_EC_WATCHPT_LOW: 675 case ESR_ELx_EC_BKPT32: 676 el0_dbg(regs, esr); 677 break; 678 default: 679 el0_inv(regs, esr); 680 } 681 } 682 683 asmlinkage void noinstr el0t_32_irq_handler(struct pt_regs *regs) 684 { 685 __el0_irq_handler_common(regs); 686 } 687 688 asmlinkage void noinstr el0t_32_fiq_handler(struct pt_regs *regs) 689 { 690 __el0_fiq_handler_common(regs); 691 } 692 693 asmlinkage void noinstr el0t_32_error_handler(struct pt_regs *regs) 694 { 695 __el0_error_handler_common(regs); 696 } 697 #else /* CONFIG_COMPAT */ 698 UNHANDLED(el0t, 32, sync) 699 UNHANDLED(el0t, 32, irq) 700 UNHANDLED(el0t, 32, fiq) 701 UNHANDLED(el0t, 32, error) 702 #endif /* CONFIG_COMPAT */ 703 704 #ifdef CONFIG_VMAP_STACK 705 asmlinkage void noinstr handle_bad_stack(struct pt_regs *regs) 706 { 707 unsigned int esr = read_sysreg(esr_el1); 708 unsigned long far = read_sysreg(far_el1); 709 710 arm64_enter_nmi(regs); 711 panic_bad_stack(regs, esr, far); 712 } 713 #endif /* CONFIG_VMAP_STACK */ 714 715 #ifdef CONFIG_ARM_SDE_INTERFACE 716 asmlinkage noinstr unsigned long 717 __sdei_handler(struct pt_regs *regs, struct sdei_registered_event *arg) 718 { 719 unsigned long ret; 720 721 /* 722 * We didn't take an exception to get here, so the HW hasn't 723 * set/cleared bits in PSTATE that we may rely on. 724 * 725 * The original SDEI spec (ARM DEN 0054A) can be read ambiguously as to 726 * whether PSTATE bits are inherited unchanged or generated from 727 * scratch, and the TF-A implementation always clears PAN and always 728 * clears UAO. There are no other known implementations. 729 * 730 * Subsequent revisions (ARM DEN 0054B) follow the usual rules for how 731 * PSTATE is modified upon architectural exceptions, and so PAN is 732 * either inherited or set per SCTLR_ELx.SPAN, and UAO is always 733 * cleared. 734 * 735 * We must explicitly reset PAN to the expected state, including 736 * clearing it when the host isn't using it, in case a VM had it set. 737 */ 738 if (system_uses_hw_pan()) 739 set_pstate_pan(1); 740 else if (cpu_has_pan()) 741 set_pstate_pan(0); 742 743 arm64_enter_nmi(regs); 744 ret = do_sdei_event(regs, arg); 745 arm64_exit_nmi(regs); 746 747 return ret; 748 } 749 #endif /* CONFIG_ARM_SDE_INTERFACE */ 750