| From a4b673e2694c7083a617370d9a097fafa07ef439 Mon Sep 17 00:00:00 2001 |
| From: Andy Lutomirski <luto@kernel.org> |
| Date: Tue, 8 Oct 2019 15:40:46 -0700 |
| Subject: [PATCH] syscalls/x86: Wire up COMPAT_SYSCALL_DEFINE0 |
| |
| commit cf3b83e19d7c928e05a5d193c375463182c6029a upstream. |
| |
| x86 has special handling for COMPAT_SYSCALL_DEFINEx, but there was |
| no override for COMPAT_SYSCALL_DEFINE0. Wire it up so that we can |
| use it for rt_sigreturn. |
| |
| Signed-off-by: Andy Lutomirski <luto@kernel.org> |
| Signed-off-by: Sami Tolvanen <samitolvanen@google.com> |
| Cc: Borislav Petkov <bp@alien8.de> |
| Cc: H . Peter Anvin <hpa@zytor.com> |
| Cc: Kees Cook <keescook@chromium.org> |
| Cc: Linus Torvalds <torvalds@linux-foundation.org> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Link: https://lkml.kernel.org/r/20191008224049.115427-3-samitolvanen@google.com |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/x86/include/asm/syscall_wrapper.h b/arch/x86/include/asm/syscall_wrapper.h |
| index 90eb70df0b18..3dab04841494 100644 |
| --- a/arch/x86/include/asm/syscall_wrapper.h |
| +++ b/arch/x86/include/asm/syscall_wrapper.h |
| @@ -28,13 +28,21 @@ |
| * kernel/sys_ni.c and SYS_NI in kernel/time/posix-stubs.c to cover this |
| * case as well. |
| */ |
| +#define __IA32_COMPAT_SYS_STUB0(x, name) \ |
| + asmlinkage long __ia32_compat_sys_##name(const struct pt_regs *regs);\ |
| + ALLOW_ERROR_INJECTION(__ia32_compat_sys_##name, ERRNO); \ |
| + asmlinkage long __ia32_compat_sys_##name(const struct pt_regs *regs)\ |
| + { \ |
| + return __se_compat_sys_##name(); \ |
| + } |
| + |
| #define __IA32_COMPAT_SYS_STUBx(x, name, ...) \ |
| asmlinkage long __ia32_compat_sys##name(const struct pt_regs *regs);\ |
| ALLOW_ERROR_INJECTION(__ia32_compat_sys##name, ERRNO); \ |
| asmlinkage long __ia32_compat_sys##name(const struct pt_regs *regs)\ |
| { \ |
| return __se_compat_sys##name(SC_IA32_REGS_TO_ARGS(x,__VA_ARGS__));\ |
| - } \ |
| + } |
| |
| #define __IA32_SYS_STUBx(x, name, ...) \ |
| asmlinkage long __ia32_sys##name(const struct pt_regs *regs); \ |
| @@ -76,15 +84,24 @@ |
| * of the x86-64-style parameter ordering of x32 syscalls. The syscalls common |
| * with x86_64 obviously do not need such care. |
| */ |
| +#define __X32_COMPAT_SYS_STUB0(x, name, ...) \ |
| + asmlinkage long __x32_compat_sys_##name(const struct pt_regs *regs);\ |
| + ALLOW_ERROR_INJECTION(__x32_compat_sys_##name, ERRNO); \ |
| + asmlinkage long __x32_compat_sys_##name(const struct pt_regs *regs)\ |
| + { \ |
| + return __se_compat_sys_##name();\ |
| + } |
| + |
| #define __X32_COMPAT_SYS_STUBx(x, name, ...) \ |
| asmlinkage long __x32_compat_sys##name(const struct pt_regs *regs);\ |
| ALLOW_ERROR_INJECTION(__x32_compat_sys##name, ERRNO); \ |
| asmlinkage long __x32_compat_sys##name(const struct pt_regs *regs)\ |
| { \ |
| return __se_compat_sys##name(SC_X86_64_REGS_TO_ARGS(x,__VA_ARGS__));\ |
| - } \ |
| + } |
| |
| #else /* CONFIG_X86_X32 */ |
| +#define __X32_COMPAT_SYS_STUB0(x, name) |
| #define __X32_COMPAT_SYS_STUBx(x, name, ...) |
| #endif /* CONFIG_X86_X32 */ |
| |
| @@ -95,6 +112,17 @@ |
| * mapping of registers to parameters, we need to generate stubs for each |
| * of them. |
| */ |
| +#define COMPAT_SYSCALL_DEFINE0(name) \ |
| + static long __se_compat_sys_##name(void); \ |
| + static inline long __do_compat_sys_##name(void); \ |
| + __IA32_COMPAT_SYS_STUB0(x, name) \ |
| + __X32_COMPAT_SYS_STUB0(x, name) \ |
| + static long __se_compat_sys_##name(void) \ |
| + { \ |
| + return __do_compat_sys_##name(); \ |
| + } \ |
| + static inline long __do_compat_sys_##name(void) |
| + |
| #define COMPAT_SYSCALL_DEFINEx(x, name, ...) \ |
| static long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \ |
| static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));\ |
| -- |
| 2.7.4 |
| |