0001
0002
0003
0004
0005
0006
0007
0008 #ifndef __ASM_SYSCALL_WRAPPER_H
0009 #define __ASM_SYSCALL_WRAPPER_H
0010
0011 struct pt_regs;
0012
0013 #define SC_ARM64_REGS_TO_ARGS(x, ...) \
0014 __MAP(x,__SC_ARGS \
0015 ,,regs->regs[0],,regs->regs[1],,regs->regs[2] \
0016 ,,regs->regs[3],,regs->regs[4],,regs->regs[5])
0017
0018 #ifdef CONFIG_COMPAT
0019
0020 #define COMPAT_SYSCALL_DEFINEx(x, name, ...) \
0021 asmlinkage long __arm64_compat_sys##name(const struct pt_regs *regs); \
0022 ALLOW_ERROR_INJECTION(__arm64_compat_sys##name, ERRNO); \
0023 static long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \
0024 static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \
0025 asmlinkage long __arm64_compat_sys##name(const struct pt_regs *regs) \
0026 { \
0027 return __se_compat_sys##name(SC_ARM64_REGS_TO_ARGS(x,__VA_ARGS__)); \
0028 } \
0029 static long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \
0030 { \
0031 return __do_compat_sys##name(__MAP(x,__SC_DELOUSE,__VA_ARGS__)); \
0032 } \
0033 static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))
0034
0035 #define COMPAT_SYSCALL_DEFINE0(sname) \
0036 asmlinkage long __arm64_compat_sys_##sname(const struct pt_regs *__unused); \
0037 ALLOW_ERROR_INJECTION(__arm64_compat_sys_##sname, ERRNO); \
0038 asmlinkage long __arm64_compat_sys_##sname(const struct pt_regs *__unused)
0039
0040 #define COND_SYSCALL_COMPAT(name) \
0041 asmlinkage long __weak __arm64_compat_sys_##name(const struct pt_regs *regs) \
0042 { \
0043 return sys_ni_syscall(); \
0044 }
0045
0046 #define COMPAT_SYS_NI(name) \
0047 SYSCALL_ALIAS(__arm64_compat_sys_##name, sys_ni_posix_timers);
0048
0049 #endif
0050
0051 #define __SYSCALL_DEFINEx(x, name, ...) \
0052 asmlinkage long __arm64_sys##name(const struct pt_regs *regs); \
0053 ALLOW_ERROR_INJECTION(__arm64_sys##name, ERRNO); \
0054 static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \
0055 static inline long __do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \
0056 asmlinkage long __arm64_sys##name(const struct pt_regs *regs) \
0057 { \
0058 return __se_sys##name(SC_ARM64_REGS_TO_ARGS(x,__VA_ARGS__)); \
0059 } \
0060 static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \
0061 { \
0062 long ret = __do_sys##name(__MAP(x,__SC_CAST,__VA_ARGS__)); \
0063 __MAP(x,__SC_TEST,__VA_ARGS__); \
0064 __PROTECT(x, ret,__MAP(x,__SC_ARGS,__VA_ARGS__)); \
0065 return ret; \
0066 } \
0067 static inline long __do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))
0068
0069 #define SYSCALL_DEFINE0(sname) \
0070 SYSCALL_METADATA(_##sname, 0); \
0071 asmlinkage long __arm64_sys_##sname(const struct pt_regs *__unused); \
0072 ALLOW_ERROR_INJECTION(__arm64_sys_##sname, ERRNO); \
0073 asmlinkage long __arm64_sys_##sname(const struct pt_regs *__unused)
0074
0075 #define COND_SYSCALL(name) \
0076 asmlinkage long __weak __arm64_sys_##name(const struct pt_regs *regs) \
0077 { \
0078 return sys_ni_syscall(); \
0079 }
0080
0081 #define SYS_NI(name) SYSCALL_ALIAS(__arm64_sys_##name, sys_ni_posix_timers);
0082
0083 #endif