summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/riscv32/bits/syscalls.h
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux/riscv32/bits/syscalls.h')
-rw-r--r--libc/sysdeps/linux/riscv32/bits/syscalls.h85
1 files changed, 85 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/riscv32/bits/syscalls.h b/libc/sysdeps/linux/riscv32/bits/syscalls.h
new file mode 100644
index 000000000..d1f1d9170
--- /dev/null
+++ b/libc/sysdeps/linux/riscv32/bits/syscalls.h
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2018 by Waldemar Brodkorb <wbx@uclibc-ng.org>
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ * ported from GNU C Library
+ */
+
+#ifndef _BITS_SYSCALLS_H
+#define _BITS_SYSCALLS_H
+#ifndef _SYSCALL_H
+# error "Never use <bits/syscalls.h> directly; include <sys/syscall.h> instead."
+#endif
+
+#define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
+ ({ long _sys_result; \
+ { \
+ register long int _a7 __asm__ ("a7"); \
+ LOAD_ARGS_##nr (args) \
+ _a7 = (name); \
+ \
+ __asm__ volatile ( \
+ "scall\n\t" \
+ : "=r" (_a0) \
+ : "r"(_a7) ASM_ARGS_##nr \
+ : "memory"); \
+ _sys_result = _a0; \
+ } \
+ _sys_result; \
+ })
+
+/* Macros for setting up inline __asm__ input regs */
+# define ASM_ARGS_0
+# define ASM_ARGS_1 , "r" (_a0)
+# define ASM_ARGS_2 ASM_ARGS_1, "r" (_a1)
+# define ASM_ARGS_3 ASM_ARGS_2, "r" (_a2)
+# define ASM_ARGS_4 ASM_ARGS_3, "r" (_a3)
+# define ASM_ARGS_5 ASM_ARGS_4, "r" (_a4)
+# define ASM_ARGS_6 ASM_ARGS_5, "r" (_a5)
+# define ASM_ARGS_7 ASM_ARGS_6, "r" (_a6)
+
+/* Macros for converting sys-call wrapper args into sys call args */
+# define LOAD_ARGS_0() \
+ register long _a0 __asm__ ("a0");
+# define LOAD_ARGS_1(a0) \
+ long _a0tmp; \
+ LOAD_ARGS_0 () \
+ _a0tmp = (long) (a0); \
+ _a0 = _a0tmp;
+# define LOAD_ARGS_2(a0, a1) \
+ register long _a1 __asm__ ("a1"); \
+ long _a1tmp; \
+ LOAD_ARGS_1 (a0) \
+ _a1tmp = (long) (a1); \
+ _a1 = _a1tmp;
+# define LOAD_ARGS_3(a0, a1, a2) \
+ register long _a2 __asm__ ("a2"); \
+ long _a2tmp; \
+ LOAD_ARGS_2 (a0, a1) \
+ _a2tmp = (long) (a2); \
+ _a2 = _a2tmp;
+# define LOAD_ARGS_4(a0, a1, a2, a3) \
+ register long _a3 __asm__ ("a3"); \
+ long _a3tmp; \
+ LOAD_ARGS_3 (a0, a1, a2) \
+ _a3tmp = (long) (a3); \
+ _a3 = _a3tmp;
+# define LOAD_ARGS_5(a0, a1, a2, a3, a4) \
+ register long _a4 __asm__ ("a4"); \
+ long _a4tmp; \
+ LOAD_ARGS_4 (a0, a1, a2, a3) \
+ _a4tmp = (long) (a4); \
+ _a4 = _a4tmp;
+# define LOAD_ARGS_6(a0, a1, a2, a3, a4, a5) \
+ register long _a5 __asm__ ("a5"); \
+ long _a5tmp; \
+ LOAD_ARGS_5 (a0, a1, a2, a3, a4) \
+ _a5tmp = (long) (a5); \
+ _a5 = _a5tmp;
+# define LOAD_ARGS_7(a0, a1, a2, a3, a4, a5, a6)\
+ register long _a6 __asm__ ("a6"); \
+ long _a6tmp; \
+ LOAD_ARGS_6 (a0, a1, a2, a3, a4, a5) \
+ _a6tmp = (long) (a6); \
+ _a6 = _a6tmp;
+
+#endif