lkml.org 
[lkml]   [2023]   [Oct]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5.10 03/15] arm64: consistently pass ESR_ELx to die()
    Date
    From: Mark Rutland <mark.rutland@arm.com>

    Currently, bug_handler() and kasan_handler() call die() with '0' as the
    'err' value, whereas die_kernel_fault() passes the ESR_ELx value.

    For consistency, this patch ensures we always pass the ESR_ELx value to
    die(). As this is only called for exceptions taken from kernel mode,
    there should be no user-visible change as a result of this patch.

    For UNDEFINED exceptions, I've had to modify do_undefinstr() and its
    callers to pass the ESR_ELx value. In all cases the ESR_ELx value had
    already been read and was available.

    Signed-off-by: Mark Rutland <mark.rutland@arm.com>
    Cc: Mark Brown <broonie@kernel.org>
    Cc: Alexandru Elisei <alexandru.elisei@arm.com>
    Cc: Amit Daniel Kachhap <amit.kachhap@arm.com>
    Cc: James Morse <james.morse@arm.com>
    Cc: Will Deacon <will@kernel.org>
    Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
    Reviewed-by: Mark Brown <broonie@kernel.org>
    Link: https://lore.kernel.org/r/20220913101732.3925290-4-mark.rutland@arm.com
    Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
    ---
    arch/arm64/include/asm/exception.h | 2 +-
    arch/arm64/kernel/entry-common.c | 14 +++++++-------
    arch/arm64/kernel/traps.c | 14 +++++++-------
    3 files changed, 15 insertions(+), 15 deletions(-)

    diff --git a/arch/arm64/include/asm/exception.h b/arch/arm64/include/asm/exception.h
    index 59c3facb8a56..18f7a095b91e 100644
    --- a/arch/arm64/include/asm/exception.h
    +++ b/arch/arm64/include/asm/exception.h
    @@ -33,7 +33,7 @@ asmlinkage void exit_to_user_mode(void);
    void arm64_enter_nmi(struct pt_regs *regs);
    void arm64_exit_nmi(struct pt_regs *regs);
    void do_mem_abort(unsigned long addr, unsigned int esr, struct pt_regs *regs);
    -void do_undefinstr(struct pt_regs *regs);
    +void do_undefinstr(struct pt_regs *regs, unsigned long esr);
    void do_bti(struct pt_regs *regs);
    asmlinkage void bad_mode(struct pt_regs *regs, int reason, unsigned int esr);
    void do_debug_exception(unsigned long addr_if_watchpoint, unsigned int esr,
    diff --git a/arch/arm64/kernel/entry-common.c b/arch/arm64/kernel/entry-common.c
    index ec120ed18faf..c1d6720ae397 100644
    --- a/arch/arm64/kernel/entry-common.c
    +++ b/arch/arm64/kernel/entry-common.c
    @@ -132,11 +132,11 @@ static void noinstr el1_pc(struct pt_regs *regs, unsigned long esr)
    exit_to_kernel_mode(regs);
    }

    -static void noinstr el1_undef(struct pt_regs *regs)
    +static void noinstr el1_undef(struct pt_regs *regs, unsigned long esr)
    {
    enter_from_kernel_mode(regs);
    local_daif_inherit(regs);
    - do_undefinstr(regs);
    + do_undefinstr(regs, esr);
    local_daif_mask();
    exit_to_kernel_mode(regs);
    }
    @@ -210,7 +210,7 @@ asmlinkage void noinstr el1_sync_handler(struct pt_regs *regs)
    break;
    case ESR_ELx_EC_SYS64:
    case ESR_ELx_EC_UNKNOWN:
    - el1_undef(regs);
    + el1_undef(regs, esr);
    break;
    case ESR_ELx_EC_BREAKPT_CUR:
    case ESR_ELx_EC_SOFTSTP_CUR:
    @@ -316,11 +316,11 @@ static void noinstr el0_sp(struct pt_regs *regs, unsigned long esr)
    do_sp_pc_abort(regs->sp, esr, regs);
    }

    -static void noinstr el0_undef(struct pt_regs *regs)
    +static void noinstr el0_undef(struct pt_regs *regs, unsigned long esr)
    {
    enter_from_user_mode();
    local_daif_restore(DAIF_PROCCTX);
    - do_undefinstr(regs);
    + do_undefinstr(regs, esr);
    }

    static void noinstr el0_bti(struct pt_regs *regs)
    @@ -394,7 +394,7 @@ asmlinkage void noinstr el0_sync_handler(struct pt_regs *regs)
    el0_pc(regs, esr);
    break;
    case ESR_ELx_EC_UNKNOWN:
    - el0_undef(regs);
    + el0_undef(regs, esr);
    break;
    case ESR_ELx_EC_BTI:
    el0_bti(regs);
    @@ -454,7 +454,7 @@ asmlinkage void noinstr el0_sync_compat_handler(struct pt_regs *regs)
    case ESR_ELx_EC_CP14_MR:
    case ESR_ELx_EC_CP14_LS:
    case ESR_ELx_EC_CP14_64:
    - el0_undef(regs);
    + el0_undef(regs, esr);
    break;
    case ESR_ELx_EC_CP15_32:
    case ESR_ELx_EC_CP15_64:
    diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c
    index 3a88bb1202ad..2060ba0ee6b4 100644
    --- a/arch/arm64/kernel/traps.c
    +++ b/arch/arm64/kernel/traps.c
    @@ -395,7 +395,7 @@ void arm64_notify_segfault(unsigned long addr)
    force_signal_inject(SIGSEGV, code, addr, 0);
    }

    -void do_undefinstr(struct pt_regs *regs)
    +void do_undefinstr(struct pt_regs *regs, unsigned long esr)
    {
    /* check for AArch32 breakpoint instructions */
    if (!aarch32_break_handler(regs))
    @@ -405,7 +405,7 @@ void do_undefinstr(struct pt_regs *regs)
    return;

    if (!user_mode(regs))
    - die("Oops - Undefined instruction", regs, 0);
    + die("Oops - Undefined instruction", regs, esr);

    force_signal_inject(SIGILL, ILL_ILLOPC, regs->pc, 0);
    }
    @@ -663,7 +663,7 @@ void do_cp15instr(unsigned int esr, struct pt_regs *regs)
    hook_base = cp15_64_hooks;
    break;
    default:
    - do_undefinstr(regs);
    + do_undefinstr(regs, esr);
    return;
    }

    @@ -678,7 +678,7 @@ void do_cp15instr(unsigned int esr, struct pt_regs *regs)
    * EL0. Fall back to our usual undefined instruction handler
    * so that we handle these consistently.
    */
    - do_undefinstr(regs);
    + do_undefinstr(regs, esr);
    }
    NOKPROBE_SYMBOL(do_cp15instr);
    #endif
    @@ -698,7 +698,7 @@ void do_sysinstr(unsigned int esr, struct pt_regs *regs)
    * back to our usual undefined instruction handler so that we handle
    * these consistently.
    */
    - do_undefinstr(regs);
    + do_undefinstr(regs, esr);
    }
    NOKPROBE_SYMBOL(do_sysinstr);

    @@ -901,7 +901,7 @@ static int bug_handler(struct pt_regs *regs, unsigned int esr)
    {
    switch (report_bug(regs->pc, regs)) {
    case BUG_TRAP_TYPE_BUG:
    - die("Oops - BUG", regs, 0);
    + die("Oops - BUG", regs, esr);
    break;

    case BUG_TRAP_TYPE_WARN:
    @@ -969,7 +969,7 @@ static int kasan_handler(struct pt_regs *regs, unsigned int esr)
    * This is something that might be fixed at some point in the future.
    */
    if (!recover)
    - die("Oops - KASAN", regs, 0);
    + die("Oops - KASAN", regs, esr);

    /* If thread survives, skip over the brk instruction and continue: */
    arm64_skip_faulting_instruction(regs, AARCH64_INSN_SIZE);
    --
    2.34.1
    \
     
     \ /
      Last update: 2023-10-11 09:29    [W:2.775 / U:1.324 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site