• Mark Rutland's avatar
    arm64: ftrace: fix !CONFIG_ARM64_MODULE_PLTS kernels · 8486e54d
    Mark Rutland authored
    When a kernel is built without CONFIG_ARM64_MODULE_PLTS, we don't
    generate the expected branch instruction in ftrace_make_nop(). This
    means we pass zero (rather than a valid branch) to ftrace_modify_code()
    as the expected instruction to validate. This causes us to return
    -EINVAL to the core ftrace code for a valid case, resulting in a splat
    at boot time.
    
    This was an unintended effect of commit:
    
      68764420 ("arm64: ftrace: fix building without CONFIG_MODULES")
    
    ... which incorrectly moved the generation of the branch instruction
    into the ifdef for CONFIG_ARM64_MODULE_PLTS.
    
    This patch fixes the issue by moving the ifdef inside of the relevant
    if-else case, and always checking that the branch is in range,
    regardless of CONFIG_ARM64_MODULE_PLTS. This ensures that we generate
    the expected branch instruction, and also improves our sanity checks.
    
    For consistency, both ftrace_make_nop() and ftrace_make_call() are
    updated with this pattern.
    
    Fixes: 68764420 ("arm64: ftrace: fix building without CONFIG_MODULES")
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Reported-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
    Reviewed-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Will Deacon <will.deacon@arm.com>
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    8486e54d
ftrace.c 7.21 KB