arm64: remove __exception annotations
Since commit 732674980139 ("arm64: unwind: reference pt_regs via embedded stack frame") arm64 has not used the __exception annotation to dump the pt_regs during stack tracing. in_exception_text() has no callers. This annotation is only used to blacklist kprobes, it means the same as __kprobes. Section annotations like this require the functions to be grouped together between the start/end markers, and placed according to the linker script. For kprobes we also have NOKPROBE_SYMBOL() which logs the symbol address in a section that kprobes parses and blacklists at boot. Using NOKPROBE_SYMBOL() instead lets kprobes publish the list of blacklisted symbols, and saves us from having an arm64 specific spelling of __kprobes. do_debug_exception() already has a NOKPROBE_SYMBOL() annotation. Signed-off-by: James Morse <james.morse@arm.com> Acked-by: Mark Rutland <mark.rutland@arm.com> Acked-by: Masami Hiramatsu <mhiramat@kernel.org> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:
parent
4f5cafb5cb
commit
b6e43c0e31
@ -8,14 +8,14 @@
|
|||||||
#define __ASM_EXCEPTION_H
|
#define __ASM_EXCEPTION_H
|
||||||
|
|
||||||
#include <asm/esr.h>
|
#include <asm/esr.h>
|
||||||
|
#include <asm/kprobes.h>
|
||||||
|
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
|
|
||||||
#define __exception __attribute__((section(".exception.text")))
|
|
||||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||||
#define __exception_irq_entry __irq_entry
|
#define __exception_irq_entry __irq_entry
|
||||||
#else
|
#else
|
||||||
#define __exception_irq_entry __exception
|
#define __exception_irq_entry __kprobes
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline u32 disr_to_esr(u64 disr)
|
static inline u32 disr_to_esr(u64 disr)
|
||||||
|
@ -42,16 +42,6 @@ static inline int __in_irqentry_text(unsigned long ptr)
|
|||||||
ptr < (unsigned long)&__irqentry_text_end;
|
ptr < (unsigned long)&__irqentry_text_end;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int in_exception_text(unsigned long ptr)
|
|
||||||
{
|
|
||||||
int in;
|
|
||||||
|
|
||||||
in = ptr >= (unsigned long)&__exception_text_start &&
|
|
||||||
ptr < (unsigned long)&__exception_text_end;
|
|
||||||
|
|
||||||
return in ? : __in_irqentry_text(ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int in_entry_text(unsigned long ptr)
|
static inline int in_entry_text(unsigned long ptr)
|
||||||
{
|
{
|
||||||
return ptr >= (unsigned long)&__entry_text_start &&
|
return ptr >= (unsigned long)&__entry_text_start &&
|
||||||
|
@ -455,10 +455,6 @@ int __init arch_populate_kprobe_blacklist(void)
|
|||||||
(unsigned long)__irqentry_text_end);
|
(unsigned long)__irqentry_text_end);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
ret = kprobe_add_area_blacklist((unsigned long)__exception_text_start,
|
|
||||||
(unsigned long)__exception_text_end);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
ret = kprobe_add_area_blacklist((unsigned long)__idmap_text_start,
|
ret = kprobe_add_area_blacklist((unsigned long)__idmap_text_start,
|
||||||
(unsigned long)__idmap_text_end);
|
(unsigned long)__idmap_text_end);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
#include <asm/debug-monitors.h>
|
#include <asm/debug-monitors.h>
|
||||||
#include <asm/esr.h>
|
#include <asm/esr.h>
|
||||||
#include <asm/insn.h>
|
#include <asm/insn.h>
|
||||||
|
#include <asm/kprobes.h>
|
||||||
#include <asm/traps.h>
|
#include <asm/traps.h>
|
||||||
#include <asm/smp.h>
|
#include <asm/smp.h>
|
||||||
#include <asm/stack_pointer.h>
|
#include <asm/stack_pointer.h>
|
||||||
@ -393,7 +394,7 @@ void arm64_notify_segfault(unsigned long addr)
|
|||||||
force_signal_inject(SIGSEGV, code, addr);
|
force_signal_inject(SIGSEGV, code, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage void __exception do_undefinstr(struct pt_regs *regs)
|
asmlinkage void do_undefinstr(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
/* check for AArch32 breakpoint instructions */
|
/* check for AArch32 breakpoint instructions */
|
||||||
if (!aarch32_break_handler(regs))
|
if (!aarch32_break_handler(regs))
|
||||||
@ -405,6 +406,7 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs)
|
|||||||
BUG_ON(!user_mode(regs));
|
BUG_ON(!user_mode(regs));
|
||||||
force_signal_inject(SIGILL, ILL_ILLOPC, regs->pc);
|
force_signal_inject(SIGILL, ILL_ILLOPC, regs->pc);
|
||||||
}
|
}
|
||||||
|
NOKPROBE_SYMBOL(do_undefinstr);
|
||||||
|
|
||||||
#define __user_cache_maint(insn, address, res) \
|
#define __user_cache_maint(insn, address, res) \
|
||||||
if (address >= user_addr_max()) { \
|
if (address >= user_addr_max()) { \
|
||||||
@ -667,7 +669,7 @@ static const struct sys64_hook cp15_64_hooks[] = {
|
|||||||
{},
|
{},
|
||||||
};
|
};
|
||||||
|
|
||||||
asmlinkage void __exception do_cp15instr(unsigned int esr, struct pt_regs *regs)
|
asmlinkage void do_cp15instr(unsigned int esr, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
const struct sys64_hook *hook, *hook_base;
|
const struct sys64_hook *hook, *hook_base;
|
||||||
|
|
||||||
@ -705,9 +707,10 @@ asmlinkage void __exception do_cp15instr(unsigned int esr, struct pt_regs *regs)
|
|||||||
*/
|
*/
|
||||||
do_undefinstr(regs);
|
do_undefinstr(regs);
|
||||||
}
|
}
|
||||||
|
NOKPROBE_SYMBOL(do_cp15instr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
asmlinkage void __exception do_sysinstr(unsigned int esr, struct pt_regs *regs)
|
asmlinkage void do_sysinstr(unsigned int esr, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
const struct sys64_hook *hook;
|
const struct sys64_hook *hook;
|
||||||
|
|
||||||
@ -724,6 +727,7 @@ asmlinkage void __exception do_sysinstr(unsigned int esr, struct pt_regs *regs)
|
|||||||
*/
|
*/
|
||||||
do_undefinstr(regs);
|
do_undefinstr(regs);
|
||||||
}
|
}
|
||||||
|
NOKPROBE_SYMBOL(do_sysinstr);
|
||||||
|
|
||||||
static const char *esr_class_str[] = {
|
static const char *esr_class_str[] = {
|
||||||
[0 ... ESR_ELx_EC_MAX] = "UNRECOGNIZED EC",
|
[0 ... ESR_ELx_EC_MAX] = "UNRECOGNIZED EC",
|
||||||
|
@ -111,9 +111,6 @@ SECTIONS
|
|||||||
}
|
}
|
||||||
.text : { /* Real text segment */
|
.text : { /* Real text segment */
|
||||||
_stext = .; /* Text and read-only data */
|
_stext = .; /* Text and read-only data */
|
||||||
__exception_text_start = .;
|
|
||||||
*(.exception.text)
|
|
||||||
__exception_text_end = .;
|
|
||||||
IRQENTRY_TEXT
|
IRQENTRY_TEXT
|
||||||
SOFTIRQENTRY_TEXT
|
SOFTIRQENTRY_TEXT
|
||||||
ENTRY_TEXT
|
ENTRY_TEXT
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#include <asm/debug-monitors.h>
|
#include <asm/debug-monitors.h>
|
||||||
#include <asm/esr.h>
|
#include <asm/esr.h>
|
||||||
#include <asm/kasan.h>
|
#include <asm/kasan.h>
|
||||||
|
#include <asm/kprobes.h>
|
||||||
#include <asm/sysreg.h>
|
#include <asm/sysreg.h>
|
||||||
#include <asm/system_misc.h>
|
#include <asm/system_misc.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
@ -732,8 +733,8 @@ static const struct fault_info fault_info[] = {
|
|||||||
{ do_bad, SIGKILL, SI_KERNEL, "unknown 63" },
|
{ do_bad, SIGKILL, SI_KERNEL, "unknown 63" },
|
||||||
};
|
};
|
||||||
|
|
||||||
asmlinkage void __exception do_mem_abort(unsigned long addr, unsigned int esr,
|
asmlinkage void do_mem_abort(unsigned long addr, unsigned int esr,
|
||||||
struct pt_regs *regs)
|
struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
const struct fault_info *inf = esr_to_fault_info(esr);
|
const struct fault_info *inf = esr_to_fault_info(esr);
|
||||||
|
|
||||||
@ -749,16 +750,17 @@ asmlinkage void __exception do_mem_abort(unsigned long addr, unsigned int esr,
|
|||||||
arm64_notify_die(inf->name, regs,
|
arm64_notify_die(inf->name, regs,
|
||||||
inf->sig, inf->code, (void __user *)addr, esr);
|
inf->sig, inf->code, (void __user *)addr, esr);
|
||||||
}
|
}
|
||||||
|
NOKPROBE_SYMBOL(do_mem_abort);
|
||||||
|
|
||||||
asmlinkage void __exception do_el0_irq_bp_hardening(void)
|
asmlinkage void do_el0_irq_bp_hardening(void)
|
||||||
{
|
{
|
||||||
/* PC has already been checked in entry.S */
|
/* PC has already been checked in entry.S */
|
||||||
arm64_apply_bp_hardening();
|
arm64_apply_bp_hardening();
|
||||||
}
|
}
|
||||||
|
NOKPROBE_SYMBOL(do_el0_irq_bp_hardening);
|
||||||
|
|
||||||
asmlinkage void __exception do_el0_ia_bp_hardening(unsigned long addr,
|
asmlinkage void do_el0_ia_bp_hardening(unsigned long addr, unsigned int esr,
|
||||||
unsigned int esr,
|
struct pt_regs *regs)
|
||||||
struct pt_regs *regs)
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* We've taken an instruction abort from userspace and not yet
|
* We've taken an instruction abort from userspace and not yet
|
||||||
@ -771,11 +773,10 @@ asmlinkage void __exception do_el0_ia_bp_hardening(unsigned long addr,
|
|||||||
local_daif_restore(DAIF_PROCCTX);
|
local_daif_restore(DAIF_PROCCTX);
|
||||||
do_mem_abort(addr, esr, regs);
|
do_mem_abort(addr, esr, regs);
|
||||||
}
|
}
|
||||||
|
NOKPROBE_SYMBOL(do_el0_ia_bp_hardening);
|
||||||
|
|
||||||
|
asmlinkage void do_sp_pc_abort(unsigned long addr, unsigned int esr,
|
||||||
asmlinkage void __exception do_sp_pc_abort(unsigned long addr,
|
struct pt_regs *regs)
|
||||||
unsigned int esr,
|
|
||||||
struct pt_regs *regs)
|
|
||||||
{
|
{
|
||||||
if (user_mode(regs)) {
|
if (user_mode(regs)) {
|
||||||
if (!is_ttbr0_addr(instruction_pointer(regs)))
|
if (!is_ttbr0_addr(instruction_pointer(regs)))
|
||||||
@ -786,6 +787,7 @@ asmlinkage void __exception do_sp_pc_abort(unsigned long addr,
|
|||||||
arm64_notify_die("SP/PC alignment exception", regs,
|
arm64_notify_die("SP/PC alignment exception", regs,
|
||||||
SIGBUS, BUS_ADRALN, (void __user *)addr, esr);
|
SIGBUS, BUS_ADRALN, (void __user *)addr, esr);
|
||||||
}
|
}
|
||||||
|
NOKPROBE_SYMBOL(do_sp_pc_abort);
|
||||||
|
|
||||||
int __init early_brk64(unsigned long addr, unsigned int esr,
|
int __init early_brk64(unsigned long addr, unsigned int esr,
|
||||||
struct pt_regs *regs);
|
struct pt_regs *regs);
|
||||||
@ -868,8 +870,7 @@ NOKPROBE_SYMBOL(debug_exception_exit);
|
|||||||
#ifdef CONFIG_ARM64_ERRATUM_1463225
|
#ifdef CONFIG_ARM64_ERRATUM_1463225
|
||||||
DECLARE_PER_CPU(int, __in_cortex_a76_erratum_1463225_wa);
|
DECLARE_PER_CPU(int, __in_cortex_a76_erratum_1463225_wa);
|
||||||
|
|
||||||
static int __exception
|
static int cortex_a76_erratum_1463225_debug_handler(struct pt_regs *regs)
|
||||||
cortex_a76_erratum_1463225_debug_handler(struct pt_regs *regs)
|
|
||||||
{
|
{
|
||||||
if (user_mode(regs))
|
if (user_mode(regs))
|
||||||
return 0;
|
return 0;
|
||||||
@ -888,16 +889,15 @@ cortex_a76_erratum_1463225_debug_handler(struct pt_regs *regs)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static int __exception
|
static int cortex_a76_erratum_1463225_debug_handler(struct pt_regs *regs)
|
||||||
cortex_a76_erratum_1463225_debug_handler(struct pt_regs *regs)
|
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_ARM64_ERRATUM_1463225 */
|
#endif /* CONFIG_ARM64_ERRATUM_1463225 */
|
||||||
|
NOKPROBE_SYMBOL(cortex_a76_erratum_1463225_debug_handler);
|
||||||
|
|
||||||
asmlinkage void __exception do_debug_exception(unsigned long addr_if_watchpoint,
|
asmlinkage void do_debug_exception(unsigned long addr_if_watchpoint,
|
||||||
unsigned int esr,
|
unsigned int esr, struct pt_regs *regs)
|
||||||
struct pt_regs *regs)
|
|
||||||
{
|
{
|
||||||
const struct fault_info *inf = esr_to_debug_fault_info(esr);
|
const struct fault_info *inf = esr_to_debug_fault_info(esr);
|
||||||
unsigned long pc = instruction_pointer(regs);
|
unsigned long pc = instruction_pointer(regs);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user