]> www.infradead.org Git - users/hch/configfs.git/commitdiff
arm64: Introduce esr_brk_comment, esr_is_cfi_brk
authorPierre-Clément Tosi <ptosi@google.com>
Mon, 10 Jun 2024 06:32:35 +0000 (07:32 +0100)
committerOliver Upton <oliver.upton@linux.dev>
Thu, 20 Jun 2024 17:40:54 +0000 (17:40 +0000)
As it is already used in two places, move esr_comment() to a header for
re-use, with a clearer name.

Introduce esr_is_cfi_brk() to detect kCFI BRK syndromes, currently used
by early_brk64() but soon to also be used by hypervisor code.

Signed-off-by: Pierre-Clément Tosi <ptosi@google.com>
Acked-by: Will Deacon <will@kernel.org>
Link: https://lore.kernel.org/r/20240610063244.2828978-7-ptosi@google.com
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/include/asm/esr.h
arch/arm64/kernel/debug-monitors.c
arch/arm64/kernel/traps.c
arch/arm64/kvm/handle_exit.c

index 7abf09df70331ca7d33f085639895012d42ddbbb..77569d207ecfd56557a9cdc59195eb2111ee539f 100644 (file)
 #ifndef __ASSEMBLY__
 #include <asm/types.h>
 
+static inline unsigned long esr_brk_comment(unsigned long esr)
+{
+       return esr & ESR_ELx_BRK64_ISS_COMMENT_MASK;
+}
+
 static inline bool esr_is_data_abort(unsigned long esr)
 {
        const unsigned long ec = ESR_ELx_EC(esr);
@@ -386,6 +391,12 @@ static inline bool esr_is_data_abort(unsigned long esr)
        return ec == ESR_ELx_EC_DABT_LOW || ec == ESR_ELx_EC_DABT_CUR;
 }
 
+static inline bool esr_is_cfi_brk(unsigned long esr)
+{
+       return ESR_ELx_EC(esr) == ESR_ELx_EC_BRK64 &&
+              (esr_brk_comment(esr) & ~CFI_BRK_IMM_MASK) == CFI_BRK_IMM_BASE;
+}
+
 static inline bool esr_fsc_is_translation_fault(unsigned long esr)
 {
        /* Translation fault, level -1 */
index 64f2ecbdfe5c27b9a3dcb669359793502e2b2241..024a7b245056a8e159ec5df14047daca10cf06c3 100644 (file)
@@ -312,9 +312,7 @@ static int call_break_hook(struct pt_regs *regs, unsigned long esr)
         * entirely not preemptible, and we can use rcu list safely here.
         */
        list_for_each_entry_rcu(hook, list, node) {
-               unsigned long comment = esr & ESR_ELx_BRK64_ISS_COMMENT_MASK;
-
-               if ((comment & ~hook->mask) == hook->imm)
+               if ((esr_brk_comment(esr) & ~hook->mask) == hook->imm)
                        fn = hook->fn;
        }
 
index 215e6d7f2df8c606a45e5d4523e201ecfe83ffdc..9e22683aa9214dfa17d4cabdb12aa91b9d2a677e 100644 (file)
@@ -1105,8 +1105,6 @@ static struct break_hook ubsan_break_hook = {
 };
 #endif
 
-#define esr_comment(esr) ((esr) & ESR_ELx_BRK64_ISS_COMMENT_MASK)
-
 /*
  * Initial handler for AArch64 BRK exceptions
  * This handler only used until debug_traps_init().
@@ -1115,15 +1113,15 @@ int __init early_brk64(unsigned long addr, unsigned long esr,
                struct pt_regs *regs)
 {
 #ifdef CONFIG_CFI_CLANG
-       if ((esr_comment(esr) & ~CFI_BRK_IMM_MASK) == CFI_BRK_IMM_BASE)
+       if (esr_is_cfi_brk(esr))
                return cfi_handler(regs, esr) != DBG_HOOK_HANDLED;
 #endif
 #ifdef CONFIG_KASAN_SW_TAGS
-       if ((esr_comment(esr) & ~KASAN_BRK_MASK) == KASAN_BRK_IMM)
+       if ((esr_brk_comment(esr) & ~KASAN_BRK_MASK) == KASAN_BRK_IMM)
                return kasan_handler(regs, esr) != DBG_HOOK_HANDLED;
 #endif
 #ifdef CONFIG_UBSAN_TRAP
-       if ((esr_comment(esr) & ~UBSAN_BRK_MASK) == UBSAN_BRK_IMM)
+       if ((esr_brk_comment(esr) & ~UBSAN_BRK_MASK) == UBSAN_BRK_IMM)
                return ubsan_handler(regs, esr) != DBG_HOOK_HANDLED;
 #endif
        return bug_handler(regs, esr) != DBG_HOOK_HANDLED;
index b037f0a0e27e3ea1db3f11ee1db1aa20188a33ec..d41447193e136815ec3cbb6c51417d3ee495bf13 100644 (file)
@@ -423,7 +423,7 @@ void __noreturn __cold nvhe_hyp_panic_handler(u64 esr, u64 spsr,
        if (mode != PSR_MODE_EL2t && mode != PSR_MODE_EL2h) {
                kvm_err("Invalid host exception to nVHE hyp!\n");
        } else if (ESR_ELx_EC(esr) == ESR_ELx_EC_BRK64 &&
-                  (esr & ESR_ELx_BRK64_ISS_COMMENT_MASK) == BUG_BRK_IMM) {
+                  esr_brk_comment(esr) == BUG_BRK_IMM) {
                const char *file = NULL;
                unsigned int line = 0;