| #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; |
| }; |
| |
| void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset) |
| { |
| struct mmap_arg_struct args = { |
| (unsigned long)addr, |
| (unsigned long)len, |
| (unsigned long)prot, |
| (unsigned long)flags, |
| (unsigned long)fd, |
| (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_mmap), "0"(__arg1) |
| : "1", "cc", "memory"); |
| __res = __svcres; |
| if (__res >= (unsigned long)-125) { |
| errno = -__res; |
| __res = -1; |
| } |
| return (void *)__res; |
| } |