From: Andy Lutomirski <l...@kernel.org>

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 <l...@kernel.org>
Signed-off-by: Sami Tolvanen <samitolva...@google.com>
---
 arch/x86/include/asm/syscall_wrapper.h | 32 ++++++++++++++++++++++++--
 1 file changed, 30 insertions(+), 2 deletions(-)

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.23.0.351.gc4317032e6-goog

Reply via email to