x86/entry: Refactor SYSCALL_DEFINEx macros
authorBrian Gerst <brgerst@gmail.com>
Fri, 13 Mar 2020 19:51:27 +0000 (15:51 -0400)
committerThomas Gleixner <tglx@linutronix.de>
Sat, 21 Mar 2020 15:03:18 +0000 (16:03 +0100)
Pull the common code out from the SYSCALL_DEFINEx macros into a new
__SYS_STUBx macro.  Also conditionalize the X64 version in preparation for
enabling syscall wrappers on 32-bit native kernels.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Dominik Brodowski <linux@dominikbrodowski.net>
Reviewed-by: Andy Lutomirski <luto@kernel.org>
Link: https://lkml.kernel.org/r/20200313195144.164260-2-brgerst@gmail.com
arch/x86/include/asm/syscall_wrapper.h

index e2389ce9bf58af6b326580fac718ba782d44ce6c..a1c090bde0632bd3fd6556a826dc623c028761bf 100644 (file)
@@ -21,6 +21,22 @@ struct pt_regs;
              ,,(unsigned int)regs->dx,,(unsigned int)regs->si          \
              ,,(unsigned int)regs->di,,(unsigned int)regs->bp)
 
+#define __SYS_STUBx(abi, name, ...)                                    \
+       asmlinkage long __##abi##_##name(const struct pt_regs *regs);   \
+       ALLOW_ERROR_INJECTION(__##abi##_##name, ERRNO);                 \
+       asmlinkage long __##abi##_##name(const struct pt_regs *regs)    \
+       {                                                               \
+               return __se_##name(__VA_ARGS__);                        \
+       }
+
+#ifdef CONFIG_X86_64
+#define __X64_SYS_STUBx(x, name, ...)                                  \
+       __SYS_STUBx(x64, sys##name,                                     \
+                   SC_X86_64_REGS_TO_ARGS(x, __VA_ARGS__))
+#else /* CONFIG_X86_64 */
+#define __X64_SYS_STUBx(x, name, ...)
+#endif /* CONFIG_X86_64 */
+
 #ifdef CONFIG_IA32_EMULATION
 /*
  * For IA32 emulation, we need to handle "compat" syscalls *and* create
@@ -39,20 +55,12 @@ struct pt_regs;
        }
 
 #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__));\
-       }
+       __SYS_STUBx(ia32, 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);   \
-       ALLOW_ERROR_INJECTION(__ia32_sys##name, ERRNO);                 \
-       asmlinkage long __ia32_sys##name(const struct pt_regs *regs)    \
-       {                                                               \
-               return __se_sys##name(SC_IA32_REGS_TO_ARGS(x,__VA_ARGS__));\
-       }
+       __SYS_STUBx(ia32, sys##name,                                    \
+                   SC_IA32_REGS_TO_ARGS(x, __VA_ARGS__))
 
 /*
  * To keep the naming coherent, re-define SYSCALL_DEFINE0 to create an alias
@@ -82,7 +90,7 @@ struct pt_regs;
 
 #else /* CONFIG_IA32_EMULATION */
 #define __IA32_COMPAT_SYS_STUBx(x, name, ...)
-#define __IA32_SYS_STUBx(x, fullname, name, ...)
+#define __IA32_SYS_STUBx(x, name, ...)
 #endif /* CONFIG_IA32_EMULATION */
 
 
@@ -101,12 +109,8 @@ struct pt_regs;
        }
 
 #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__));\
-       }
+       __SYS_STUBx(x32, compat_sys##name,                              \
+                   SC_X86_64_REGS_TO_ARGS(x, __VA_ARGS__))
 
 #else /* CONFIG_X86_X32 */
 #define __X32_COMPAT_SYS_STUB0(x, name)
@@ -192,14 +196,9 @@ struct pt_regs;
  * to the i386 calling convention (bx, cx, dx, si, di, bp).
  */
 #define __SYSCALL_DEFINEx(x, name, ...)                                        \
-       asmlinkage long __x64_sys##name(const struct pt_regs *regs);    \
-       ALLOW_ERROR_INJECTION(__x64_sys##name, ERRNO);                  \
        static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__));     \
        static inline long __do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));\
-       asmlinkage long __x64_sys##name(const struct pt_regs *regs)     \
-       {                                                               \
-               return __se_sys##name(SC_X86_64_REGS_TO_ARGS(x,__VA_ARGS__));\
-       }                                                               \
+       __X64_SYS_STUBx(x, name, __VA_ARGS__)                           \
        __IA32_SYS_STUBx(x, name, __VA_ARGS__)                          \
        static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__))      \
        {                                                               \