diff options
Diffstat (limited to 'arch/powerpc/include/asm/interrupt.h')
-rw-r--r-- | arch/powerpc/include/asm/interrupt.h | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/arch/powerpc/include/asm/interrupt.h b/arch/powerpc/include/asm/interrupt.h index 4badb3e51c19..5c285592d9b6 100644 --- a/arch/powerpc/include/asm/interrupt.h +++ b/arch/powerpc/include/asm/interrupt.h @@ -6,6 +6,7 @@ #include <linux/hardirq.h> #include <asm/cputime.h> #include <asm/ftrace.h> +#include <asm/kprobes.h> #include <asm/runlatch.h> struct interrupt_state { @@ -164,6 +165,15 @@ static inline void interrupt_nmi_exit_prepare(struct pt_regs *regs, struct inter #endif } +/* + * Don't use noinstr here like x86, but rather add NOKPROBE_SYMBOL to each + * function definition. The reason for this is the noinstr section is placed + * after the main text section, i.e., very far away from the interrupt entry + * asm. That creates problems with fitting linker stubs when building large + * kernels. + */ +#define interrupt_handler __visible noinline notrace __no_kcsan __no_sanitize_address + /** * DECLARE_INTERRUPT_HANDLER_RAW - Declare raw interrupt handler function * @func: Function name of the entry point @@ -198,7 +208,7 @@ static inline void interrupt_nmi_exit_prepare(struct pt_regs *regs, struct inter #define DEFINE_INTERRUPT_HANDLER_RAW(func) \ static __always_inline long ____##func(struct pt_regs *regs); \ \ -__visible noinstr long func(struct pt_regs *regs) \ +interrupt_handler long func(struct pt_regs *regs) \ { \ long ret; \ \ @@ -206,6 +216,7 @@ __visible noinstr long func(struct pt_regs *regs) \ \ return ret; \ } \ +NOKPROBE_SYMBOL(func); \ \ static __always_inline long ____##func(struct pt_regs *regs) @@ -228,7 +239,7 @@ static __always_inline long ____##func(struct pt_regs *regs) #define DEFINE_INTERRUPT_HANDLER(func) \ static __always_inline void ____##func(struct pt_regs *regs); \ \ -__visible noinstr void func(struct pt_regs *regs) \ +interrupt_handler void func(struct pt_regs *regs) \ { \ struct interrupt_state state; \ \ @@ -238,6 +249,7 @@ __visible noinstr void func(struct pt_regs *regs) \ \ interrupt_exit_prepare(regs, &state); \ } \ +NOKPROBE_SYMBOL(func); \ \ static __always_inline void ____##func(struct pt_regs *regs) @@ -262,7 +274,7 @@ static __always_inline void ____##func(struct pt_regs *regs) #define DEFINE_INTERRUPT_HANDLER_RET(func) \ static __always_inline long ____##func(struct pt_regs *regs); \ \ -__visible noinstr long func(struct pt_regs *regs) \ +interrupt_handler long func(struct pt_regs *regs) \ { \ struct interrupt_state state; \ long ret; \ @@ -275,6 +287,7 @@ __visible noinstr long func(struct pt_regs *regs) \ \ return ret; \ } \ +NOKPROBE_SYMBOL(func); \ \ static __always_inline long ____##func(struct pt_regs *regs) @@ -297,7 +310,7 @@ static __always_inline long ____##func(struct pt_regs *regs) #define DEFINE_INTERRUPT_HANDLER_ASYNC(func) \ static __always_inline void ____##func(struct pt_regs *regs); \ \ -__visible noinstr void func(struct pt_regs *regs) \ +interrupt_handler void func(struct pt_regs *regs) \ { \ struct interrupt_state state; \ \ @@ -307,6 +320,7 @@ __visible noinstr void func(struct pt_regs *regs) \ \ interrupt_async_exit_prepare(regs, &state); \ } \ +NOKPROBE_SYMBOL(func); \ \ static __always_inline void ____##func(struct pt_regs *regs) @@ -331,7 +345,7 @@ static __always_inline void ____##func(struct pt_regs *regs) #define DEFINE_INTERRUPT_HANDLER_NMI(func) \ static __always_inline long ____##func(struct pt_regs *regs); \ \ -__visible noinstr long func(struct pt_regs *regs) \ +interrupt_handler long func(struct pt_regs *regs) \ { \ struct interrupt_nmi_state state; \ long ret; \ @@ -344,6 +358,7 @@ __visible noinstr long func(struct pt_regs *regs) \ \ return ret; \ } \ +NOKPROBE_SYMBOL(func); \ \ static __always_inline long ____##func(struct pt_regs *regs) |