about summary refs log tree commit diff
path: root/arch/s390x/syscall_arch.h
diff options
context:
space:
mode:
authorBobby Bingham <koorogi@koorogi.info>2016-11-11 21:52:05 -0600
committerRich Felker <dalias@aerifal.cx>2016-11-11 23:06:21 -0500
commit15094943050eb9a564f409323070e50b40f78816 (patch)
treef9af42d3369ee9a6ebd08bf416a99159193217a8 /arch/s390x/syscall_arch.h
parent54482898abe8d6d937ee67ea5974cd8eae859c37 (diff)
downloadmusl-15094943050eb9a564f409323070e50b40f78816.tar.gz
musl-15094943050eb9a564f409323070e50b40f78816.tar.xz
musl-15094943050eb9a564f409323070e50b40f78816.zip
add s390x port
Diffstat (limited to 'arch/s390x/syscall_arch.h')
-rw-r--r--arch/s390x/syscall_arch.h76
1 files changed, 76 insertions, 0 deletions
diff --git a/arch/s390x/syscall_arch.h b/arch/s390x/syscall_arch.h
new file mode 100644
index 00000000..afb99852
--- /dev/null
+++ b/arch/s390x/syscall_arch.h
@@ -0,0 +1,76 @@
+#define __SYSCALL_LL_E(x) (x)
+#define __SYSCALL_LL_O(x) (x)
+
+#define __asm_syscall(ret, ...) do { \
+	__asm__ __volatile__ ("svc 0\n" \
+	: ret : __VA_ARGS__ : "memory"); \
+	return r2; \
+	} while (0)
+
+static inline long __syscall0(long n)
+{
+	register long r1 __asm__("r1") = n;
+	register long r2 __asm__("r2");
+	__asm_syscall("=r"(r2), "r"(r1));
+}
+
+static inline long __syscall1(long n, long a)
+{
+	register long r1 __asm__("r1") = n;
+	register long r2 __asm__("r2") = a;
+	__asm_syscall("+r"(r2), "r"(r1));
+}
+
+static inline long __syscall2(long n, long a, long b)
+{
+	register long r1 __asm__("r1") = n;
+	register long r2 __asm__("r2") = a;
+	register long r3 __asm__("r3") = b;
+	__asm_syscall("+r"(r2), "r"(r1), "r"(r3));
+}
+
+static inline long __syscall3(long n, long a, long b, long c)
+{
+	register long r1 __asm__("r1") = n;
+	register long r2 __asm__("r2") = a;
+	register long r3 __asm__("r3") = b;
+	register long r4 __asm__("r4") = c;
+	__asm_syscall("+r"(r2), "r"(r1), "r"(r3), "r"(r4));
+}
+
+static inline long __syscall4(long n, long a, long b, long c, long d)
+{
+	register long r1 __asm__("r1") = n;
+	register long r2 __asm__("r2") = a;
+	register long r3 __asm__("r3") = b;
+	register long r4 __asm__("r4") = c;
+	register long r5 __asm__("r5") = d;
+	__asm_syscall("+r"(r2), "r"(r1), "r"(r3), "r"(r4), "r"(r5));
+}
+
+static inline long __syscall5(long n, long a, long b, long c, long d, long e)
+{
+	register long r1 __asm__("r1") = n;
+	register long r2 __asm__("r2") = a;
+	register long r3 __asm__("r3") = b;
+	register long r4 __asm__("r4") = c;
+	register long r5 __asm__("r5") = d;
+	register long r6 __asm__("r6") = e;
+	__asm_syscall("+r"(r2), "r"(r1), "r"(r3), "r"(r4), "r"(r5), "r"(r6));
+}
+
+static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
+{
+	if (n == SYS_mmap) return __syscall1(n, (long)(long[]){a,b,c,d,e,f});
+
+	register long r1 __asm__("r1") = n;
+	register long r2 __asm__("r2") = a;
+	register long r3 __asm__("r3") = b;
+	register long r4 __asm__("r4") = c;
+	register long r5 __asm__("r5") = d;
+	register long r6 __asm__("r6") = e;
+	register long r7 __asm__("r7") = f;
+	__asm_syscall("+r"(r2), "r"(r1), "r"(r3), "r"(r4), "r"(r5), "r"(r6), "r"(r7));
+}
+
+#define SYSCALL_USE_SOCKETCALL