14378a7d4SMark Rutland /* SPDX-License-Identifier: GPL-2.0 */ 24378a7d4SMark Rutland /* 34378a7d4SMark Rutland * syscall_wrapper.h - arm64 specific wrappers to syscall definitions 44378a7d4SMark Rutland * 54378a7d4SMark Rutland * Based on arch/x86/include/asm_syscall_wrapper.h 64378a7d4SMark Rutland */ 74378a7d4SMark Rutland 84378a7d4SMark Rutland #ifndef __ASM_SYSCALL_WRAPPER_H 94378a7d4SMark Rutland #define __ASM_SYSCALL_WRAPPER_H 104378a7d4SMark Rutland 11acfc35cfSKuniyuki Iwashima #include <asm/ptrace.h> 12c27eccfeSSami Tolvanen 134378a7d4SMark Rutland #define SC_ARM64_REGS_TO_ARGS(x, ...) \ 144378a7d4SMark Rutland __MAP(x,__SC_ARGS \ 154378a7d4SMark Rutland ,,regs->regs[0],,regs->regs[1],,regs->regs[2] \ 164378a7d4SMark Rutland ,,regs->regs[3],,regs->regs[4],,regs->regs[5]) 174378a7d4SMark Rutland 184378a7d4SMark Rutland #ifdef CONFIG_COMPAT 194378a7d4SMark Rutland 204378a7d4SMark Rutland #define COMPAT_SYSCALL_DEFINEx(x, name, ...) \ 214378a7d4SMark Rutland asmlinkage long __arm64_compat_sys##name(const struct pt_regs *regs); \ 224378a7d4SMark Rutland ALLOW_ERROR_INJECTION(__arm64_compat_sys##name, ERRNO); \ 234378a7d4SMark Rutland static long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \ 244378a7d4SMark Rutland static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \ 254378a7d4SMark Rutland asmlinkage long __arm64_compat_sys##name(const struct pt_regs *regs) \ 264378a7d4SMark Rutland { \ 274378a7d4SMark Rutland return __se_compat_sys##name(SC_ARM64_REGS_TO_ARGS(x,__VA_ARGS__)); \ 284378a7d4SMark Rutland } \ 294378a7d4SMark Rutland static long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \ 304378a7d4SMark Rutland { \ 314378a7d4SMark Rutland return __do_compat_sys##name(__MAP(x,__SC_DELOUSE,__VA_ARGS__)); \ 324378a7d4SMark Rutland } \ 334378a7d4SMark Rutland static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)) 344378a7d4SMark Rutland 354378a7d4SMark Rutland #define COMPAT_SYSCALL_DEFINE0(sname) \ 360e358bd7SSami Tolvanen asmlinkage long __arm64_compat_sys_##sname(const struct pt_regs *__unused); \ 374378a7d4SMark Rutland ALLOW_ERROR_INJECTION(__arm64_compat_sys_##sname, ERRNO); \ 380e358bd7SSami Tolvanen asmlinkage long __arm64_compat_sys_##sname(const struct pt_regs *__unused) 394378a7d4SMark Rutland 404378a7d4SMark Rutland #define COND_SYSCALL_COMPAT(name) \ 41*6ac19f96SArnd Bergmann asmlinkage long __arm64_compat_sys_##name(const struct pt_regs *regs); \ 42c27eccfeSSami Tolvanen asmlinkage long __weak __arm64_compat_sys_##name(const struct pt_regs *regs) \ 43c27eccfeSSami Tolvanen { \ 44c27eccfeSSami Tolvanen return sys_ni_syscall(); \ 45c27eccfeSSami Tolvanen } 464378a7d4SMark Rutland 474378a7d4SMark Rutland #endif /* CONFIG_COMPAT */ 484378a7d4SMark Rutland 494378a7d4SMark Rutland #define __SYSCALL_DEFINEx(x, name, ...) \ 504378a7d4SMark Rutland asmlinkage long __arm64_sys##name(const struct pt_regs *regs); \ 514378a7d4SMark Rutland ALLOW_ERROR_INJECTION(__arm64_sys##name, ERRNO); \ 524378a7d4SMark Rutland static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \ 534378a7d4SMark Rutland static inline long __do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \ 54*6ac19f96SArnd Bergmann asmlinkage long __arm64_sys##name(const struct pt_regs *regs); \ 554378a7d4SMark Rutland asmlinkage long __arm64_sys##name(const struct pt_regs *regs) \ 564378a7d4SMark Rutland { \ 574378a7d4SMark Rutland return __se_sys##name(SC_ARM64_REGS_TO_ARGS(x,__VA_ARGS__)); \ 584378a7d4SMark Rutland } \ 594378a7d4SMark Rutland static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \ 604378a7d4SMark Rutland { \ 614378a7d4SMark Rutland long ret = __do_sys##name(__MAP(x,__SC_CAST,__VA_ARGS__)); \ 624378a7d4SMark Rutland __MAP(x,__SC_TEST,__VA_ARGS__); \ 634378a7d4SMark Rutland __PROTECT(x, ret,__MAP(x,__SC_ARGS,__VA_ARGS__)); \ 644378a7d4SMark Rutland return ret; \ 654378a7d4SMark Rutland } \ 664378a7d4SMark Rutland static inline long __do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)) 674378a7d4SMark Rutland 684378a7d4SMark Rutland #define SYSCALL_DEFINE0(sname) \ 694378a7d4SMark Rutland SYSCALL_METADATA(_##sname, 0); \ 700e358bd7SSami Tolvanen asmlinkage long __arm64_sys_##sname(const struct pt_regs *__unused); \ 714378a7d4SMark Rutland ALLOW_ERROR_INJECTION(__arm64_sys_##sname, ERRNO); \ 720e358bd7SSami Tolvanen asmlinkage long __arm64_sys_##sname(const struct pt_regs *__unused) 734378a7d4SMark Rutland 74c27eccfeSSami Tolvanen #define COND_SYSCALL(name) \ 75*6ac19f96SArnd Bergmann asmlinkage long __arm64_sys_##name(const struct pt_regs *regs); \ 76c27eccfeSSami Tolvanen asmlinkage long __weak __arm64_sys_##name(const struct pt_regs *regs) \ 77c27eccfeSSami Tolvanen { \ 78c27eccfeSSami Tolvanen return sys_ni_syscall(); \ 79c27eccfeSSami Tolvanen } 804378a7d4SMark Rutland 81*6ac19f96SArnd Bergmann asmlinkage long __arm64_sys_ni_syscall(const struct pt_regs *__unused); 824378a7d4SMark Rutland 834378a7d4SMark Rutland #endif /* __ASM_SYSCALL_WRAPPER_H */ 84