syscalls/x86: Wire up COMPAT_SYSCALL_DEFINE0
authorAndy Lutomirski <luto@kernel.org>
Tue, 8 Oct 2019 22:40:46 +0000 (15:40 -0700)
committerIngo Molnar <mingo@kernel.org>
Fri, 11 Oct 2019 10:49:18 +0000 (12:49 +0200)
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>
arch/x86/include/asm/syscall_wrapper.h

index 90eb70d..3dab048 100644 (file)
  * 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);   \
  * 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 */
 
  * 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__));\