x86/entry: Refactor SYSCALL_DEFINE0 macros
[linux-2.6-microblaze.git] / arch / x86 / include / asm / syscall_wrapper.h
index a1c090b..45ad605 100644 (file)
@@ -21,6 +21,12 @@ struct pt_regs;
              ,,(unsigned int)regs->dx,,(unsigned int)regs->si          \
              ,,(unsigned int)regs->di,,(unsigned int)regs->bp)
 
+#define __SYS_STUB0(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)    \
+               __alias(__do_##name);
+
 #define __SYS_STUBx(abi, name, ...)                                    \
        asmlinkage long __##abi##_##name(const struct pt_regs *regs);   \
        ALLOW_ERROR_INJECTION(__##abi##_##name, ERRNO);                 \
@@ -30,10 +36,14 @@ struct pt_regs;
        }
 
 #ifdef CONFIG_X86_64
+#define __X64_SYS_STUB0(name)                                          \
+       __SYS_STUB0(x64, sys_##name)
+
 #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_STUB0(name)
 #define __X64_SYS_STUBx(x, name, ...)
 #endif /* CONFIG_X86_64 */
 
@@ -46,34 +56,20 @@ struct pt_regs;
  * 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_STUB0(name)                                  \
+       __SYS_STUB0(ia32, compat_sys_##name)
 
 #define __IA32_COMPAT_SYS_STUBx(x, name, ...)                          \
        __SYS_STUBx(ia32, compat_sys##name,                             \
                    SC_IA32_REGS_TO_ARGS(x, __VA_ARGS__))
 
+#define __IA32_SYS_STUB0(name)                                         \
+       __SYS_STUB0(ia32, sys_##name)
+
 #define __IA32_SYS_STUBx(x, name, ...)                                 \
        __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
- * named __ia32_sys_*()
- */
-
-#define SYSCALL_DEFINE0(sname)                                         \
-       SYSCALL_METADATA(_##sname, 0);                                  \
-       asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused);\
-       ALLOW_ERROR_INJECTION(__x64_sys_##sname, ERRNO);                \
-       SYSCALL_ALIAS(__ia32_sys_##sname, __x64_sys_##sname);           \
-       asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused)
-
 #define COND_SYSCALL(name)                                                     \
        asmlinkage __weak long __x64_sys_##name(const struct pt_regs *__unused) \
        {                                                                       \
@@ -89,7 +85,9 @@ struct pt_regs;
        SYSCALL_ALIAS(__ia32_sys_##name, sys_ni_posix_timers)
 
 #else /* CONFIG_IA32_EMULATION */
+#define __IA32_COMPAT_SYS_STUB0(name)
 #define __IA32_COMPAT_SYS_STUBx(x, name, ...)
+#define __IA32_SYS_STUB0(name)
 #define __IA32_SYS_STUBx(x, name, ...)
 #endif /* CONFIG_IA32_EMULATION */
 
@@ -100,20 +98,15 @@ struct pt_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_STUB0(name)                                   \
+       __SYS_STUB0(x32, compat_sys_##name)
 
 #define __X32_COMPAT_SYS_STUBx(x, name, ...)                           \
        __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)
+#define __X32_COMPAT_SYS_STUB0(name)
 #define __X32_COMPAT_SYS_STUBx(x, name, ...)
 #endif /* CONFIG_X86_X32 */
 
@@ -125,15 +118,12 @@ struct pt_regs;
  * 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)
+       static asmlinkage long                                          \
+       __do_compat_sys_##name(const struct pt_regs *__unused);         \
+       __IA32_COMPAT_SYS_STUB0(name)                                   \
+       __X32_COMPAT_SYS_STUB0(name)                                    \
+       static asmlinkage long                                          \
+       __do_compat_sys_##name(const struct pt_regs *__unused)
 
 #define COMPAT_SYSCALL_DEFINEx(x, name, ...)                                   \
        static long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__));      \
@@ -216,13 +206,14 @@ struct pt_regs;
  * SYSCALL_DEFINEx() -- which is essential for the COND_SYSCALL() and SYS_NI()
  * macros to work correctly.
  */
-#ifndef SYSCALL_DEFINE0
 #define SYSCALL_DEFINE0(sname)                                         \
        SYSCALL_METADATA(_##sname, 0);                                  \
-       asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused);\
-       ALLOW_ERROR_INJECTION(__x64_sys_##sname, ERRNO);                \
-       asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused)
-#endif
+       static asmlinkage long                                          \
+       __do_sys_##sname(const struct pt_regs *__unused);               \
+       __X64_SYS_STUB0(sname)                                          \
+       __IA32_SYS_STUB0(sname)                                         \
+       static asmlinkage long                                          \
+       __do_sys_##sname(const struct pt_regs *__unused)
 
 #ifndef COND_SYSCALL
 #define COND_SYSCALL(name)                                                     \