Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

s390: enable HAVE_FUNCTION_ERROR_INJECTION

This kernel feature is required for enabling BPF_KPROBE_OVERRIDE.

Define override_function_with_return() and regs_set_return_value()
functions, and fix compile errors in syscall_wrapper.h.

Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>

authored by

Ilya Leoshkevich and committed by
Heiko Carstens
73d6eb48 4631f3ca

+25 -3
+1
arch/s390/Kconfig
··· 145 145 select HAVE_EFFICIENT_UNALIGNED_ACCESS 146 146 select HAVE_FENTRY 147 147 select HAVE_FTRACE_MCOUNT_RECORD 148 + select HAVE_FUNCTION_ERROR_INJECTION 148 149 select HAVE_FUNCTION_GRAPH_TRACER 149 150 select HAVE_FUNCTION_TRACER 150 151 select HAVE_FUTEX_CMPXCHG if FUTEX
+5
arch/s390/include/asm/ptrace.h
··· 184 184 return regs->gprs[15]; 185 185 } 186 186 187 + static inline void regs_set_return_value(struct pt_regs *regs, unsigned long rc) 188 + { 189 + regs->gprs[2] = rc; 190 + } 191 + 187 192 #endif /* __ASSEMBLY__ */ 188 193 #endif /* _S390_PTRACE_H */
+3 -3
arch/s390/include/asm/syscall_wrapper.h
··· 30 30 }) 31 31 32 32 #define __S390_SYS_STUBx(x, name, ...) \ 33 - asmlinkage long __s390_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__))\ 33 + asmlinkage long __s390_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__));\ 34 34 ALLOW_ERROR_INJECTION(__s390_sys##name, ERRNO); \ 35 35 asmlinkage long __s390_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__))\ 36 36 { \ ··· 46 46 #define COMPAT_SYSCALL_DEFINE0(sname) \ 47 47 SYSCALL_METADATA(_##sname, 0); \ 48 48 asmlinkage long __s390_compat_sys_##sname(void); \ 49 - ALLOW_ERROR_INJECTION(__s390_compat__sys_##sname, ERRNO); \ 49 + ALLOW_ERROR_INJECTION(__s390_compat_sys_##sname, ERRNO); \ 50 50 asmlinkage long __s390_compat_sys_##sname(void) 51 51 52 52 #define SYSCALL_DEFINE0(sname) \ ··· 72 72 asmlinkage long __s390_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \ 73 73 asmlinkage long __s390_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)) \ 74 74 __attribute__((alias(__stringify(__se_compat_sys##name)))); \ 75 - ALLOW_ERROR_INJECTION(compat_sys##name, ERRNO); \ 75 + ALLOW_ERROR_INJECTION(__s390_compat_sys##name, ERRNO); \ 76 76 static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));\ 77 77 asmlinkage long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \ 78 78 asmlinkage long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \
+2
arch/s390/lib/Makefile
··· 14 14 15 15 obj-$(CONFIG_S390_UNWIND_SELFTEST) += test_unwind.o 16 16 CFLAGS_test_unwind.o += -fno-optimize-sibling-calls 17 + 18 + lib-$(CONFIG_FUNCTION_ERROR_INJECTION) += error-inject.o
+14
arch/s390/lib/error-inject.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + #include <asm/ptrace.h> 3 + #include <linux/error-injection.h> 4 + #include <linux/kprobes.h> 5 + 6 + void override_function_with_return(struct pt_regs *regs) 7 + { 8 + /* 9 + * Emulate 'br 14'. 'regs' is captured by kprobes on entry to some 10 + * kernel function. 11 + */ 12 + regs->psw.addr = regs->gprs[14]; 13 + } 14 + NOKPROBE_SYMBOL(override_function_with_return);