summaryrefslogtreecommitdiffstats
path: root/usr/klibc/arch/s390/mmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/klibc/arch/s390/mmap.c')
-rw-r--r--usr/klibc/arch/s390/mmap.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/usr/klibc/arch/s390/mmap.c b/usr/klibc/arch/s390/mmap.c
new file mode 100644
index 0000000..dfc5a84
--- /dev/null
+++ b/usr/klibc/arch/s390/mmap.c
@@ -0,0 +1,74 @@
+#include <errno.h>
+#include <sys/types.h>
+#include <linux/unistd.h>
+
+struct mmap_arg_struct {
+ unsigned long addr;
+ unsigned long len;
+ unsigned long prot;
+ unsigned long flags;
+ unsigned long fd;
+ unsigned long offset;
+};
+
+#ifndef __s390x__
+
+void *__mmap2(void *addr, size_t len, int prot, int flags, int fd, long offset)
+{
+ struct mmap_arg_struct args = {
+ .addr = (unsigned long)addr,
+ .len = (unsigned long)len,
+ .prot = (unsigned long)prot,
+ .flags = (unsigned long)flags,
+ .fd = (unsigned long)fd,
+ .offset = (unsigned long)offset,
+ };
+
+ register struct mmap_arg_struct *__arg1 asm("2") = &args;
+ register long __svcres asm("2");
+ unsigned long __res;
+
+ __asm__ __volatile__(" svc %b1\n"
+ : "=d"(__svcres)
+ : "i"(__NR_mmap2), "0"(__arg1)
+ : "1", "cc", "memory");
+ __res = __svcres;
+ if (__res >= (unsigned long)-4095) {
+ errno = -__res;
+ __res = -1;
+ }
+ return (void *)__res;
+}
+
+#else /* __s390x__ */
+
+void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset)
+{
+ struct mmap_arg_struct args = {
+ .addr = (unsigned long)addr,
+ .len = (unsigned long)len,
+ .prot = (unsigned long)prot,
+ .flags = (unsigned long)flags,
+ .fd = (unsigned long)fd,
+ .offset = (unsigned long)offset,
+ };
+
+ register struct mmap_arg_struct *__arg1 asm("2") = &args;
+ register long __svcres asm("2");
+ unsigned long __res;
+
+ __asm__ __volatile__ (
+ " svc %1\n"
+ : "=d" (__svcres)
+ : "i" (__NR_mmap),
+ "0" (__arg1)
+ : "1", "cc", "memory");
+ __res = __svcres;
+ if (__res >= (unsigned long)-4095) {
+ errno = -__res;
+ __res = -1;
+ }
+ return (void *)__res;
+}
+
+#endif /* __s390x__ */