|
@@ -24,6 +24,17 @@
|
|
|
#include <asm/siginfo.h>
|
|
|
#include <asm/signal.h>
|
|
|
|
|
|
+#ifdef CONFIG_ARCH_HAS_SYSCALL_WRAPPER
|
|
|
+/*
|
|
|
+ * It may be useful for an architecture to override the definitions of the
|
|
|
+ * COMPAT_SYSCALL_DEFINE0 and COMPAT_SYSCALL_DEFINEx() macros, in particular
|
|
|
+ * to use a different calling convention for syscalls. To allow for that,
|
|
|
+ + the prototypes for the compat_sys_*() functions below will *not* be included
|
|
|
+ * if CONFIG_ARCH_HAS_SYSCALL_WRAPPER is enabled.
|
|
|
+ */
|
|
|
+#include <asm/syscall_wrapper.h>
|
|
|
+#endif /* CONFIG_ARCH_HAS_SYSCALL_WRAPPER */
|
|
|
+
|
|
|
#ifndef COMPAT_USE_64BIT_TIME
|
|
|
#define COMPAT_USE_64BIT_TIME 0
|
|
|
#endif
|
|
@@ -32,10 +43,12 @@
|
|
|
#define __SC_DELOUSE(t,v) ((__force t)(unsigned long)(v))
|
|
|
#endif
|
|
|
|
|
|
+#ifndef COMPAT_SYSCALL_DEFINE0
|
|
|
#define COMPAT_SYSCALL_DEFINE0(name) \
|
|
|
asmlinkage long compat_sys_##name(void); \
|
|
|
ALLOW_ERROR_INJECTION(compat_sys_##name, ERRNO); \
|
|
|
asmlinkage long compat_sys_##name(void)
|
|
|
+#endif /* COMPAT_SYSCALL_DEFINE0 */
|
|
|
|
|
|
#define COMPAT_SYSCALL_DEFINE1(name, ...) \
|
|
|
COMPAT_SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
|
|
@@ -50,6 +63,7 @@
|
|
|
#define COMPAT_SYSCALL_DEFINE6(name, ...) \
|
|
|
COMPAT_SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
|
|
|
|
|
|
+#ifndef COMPAT_SYSCALL_DEFINEx
|
|
|
#define COMPAT_SYSCALL_DEFINEx(x, name, ...) \
|
|
|
asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));\
|
|
|
asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))\
|
|
@@ -62,6 +76,7 @@
|
|
|
return C_SYSC##name(__MAP(x,__SC_DELOUSE,__VA_ARGS__)); \
|
|
|
} \
|
|
|
static inline long C_SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__))
|
|
|
+#endif /* COMPAT_SYSCALL_DEFINEx */
|
|
|
|
|
|
#ifndef compat_user_stack_pointer
|
|
|
#define compat_user_stack_pointer() current_user_stack_pointer()
|
|
@@ -517,7 +532,12 @@ int __compat_save_altstack(compat_stack_t __user *, unsigned long);
|
|
|
* Please note that these prototypes here are only provided for information
|
|
|
* purposes, for static analysis, and for linking from the syscall table.
|
|
|
* These functions should not be called elsewhere from kernel code.
|
|
|
+ *
|
|
|
+ * As the syscall calling convention may be different from the default
|
|
|
+ * for architectures overriding the syscall calling convention, do not
|
|
|
+ * include the prototypes if CONFIG_ARCH_HAS_SYSCALL_WRAPPER is enabled.
|
|
|
*/
|
|
|
+#ifndef CONFIG_ARCH_HAS_SYSCALL_WRAPPER
|
|
|
asmlinkage long compat_sys_io_setup(unsigned nr_reqs, u32 __user *ctx32p);
|
|
|
asmlinkage long compat_sys_io_submit(compat_aio_context_t ctx_id, int nr,
|
|
|
u32 __user *iocb);
|
|
@@ -955,6 +975,8 @@ asmlinkage long compat_sys_stime(compat_time_t __user *tptr);
|
|
|
/* obsolete: net/socket.c */
|
|
|
asmlinkage long compat_sys_socketcall(int call, u32 __user *args);
|
|
|
|
|
|
+#endif /* CONFIG_ARCH_HAS_SYSCALL_WRAPPER */
|
|
|
+
|
|
|
|
|
|
/*
|
|
|
* For most but not all architectures, "am I in a compat syscall?" and
|