Index: linux_syscall_support.h |
diff --git a/linux_syscall_support.h b/linux_syscall_support.h |
index 8a42c1c8687b2af252811c28581cabfd89a3a3ae..9dbd2391b2e3825731833714a81feb896ddfef46 100644 |
--- a/linux_syscall_support.h |
+++ b/linux_syscall_support.h |
@@ -82,12 +82,13 @@ |
#ifndef SYS_LINUX_SYSCALL_SUPPORT_H |
#define SYS_LINUX_SYSCALL_SUPPORT_H |
-/* We currently only support x86-32, x86-64, ARM, MIPS, and PPC on Linux. |
+/* We currently only support x86-32, x86-64, ARM, MIPS, PPC, s390 and s390x |
+ * on Linux. |
* Porting to other related platforms should not be difficult. |
*/ |
#if (defined(__i386__) || defined(__x86_64__) || defined(__ARM_ARCH_3__) || \ |
defined(__mips__) || defined(__PPC__) || defined(__ARM_EABI__) || \ |
- defined(__aarch64__)) \ |
+ defined(__aarch64__) || defined(__s390__)) \ |
&& (defined(__linux) || defined(__ANDROID__)) |
#ifndef SYS_CPLUSPLUS |
@@ -256,7 +257,7 @@ struct kernel_rusage { |
}; |
#if defined(__i386__) || defined(__ARM_EABI__) || defined(__ARM_ARCH_3__) \ |
- || defined(__PPC__) |
+ || defined(__PPC__) || (defined(__s390__) && !defined(__s390x__)) |
/* include/asm-{arm,i386,mips,ppc}/signal.h */ |
struct kernel_old_sigaction { |
@@ -321,7 +322,7 @@ struct kernel_sockaddr { |
char sa_data[14]; |
}; |
-/* include/asm-{arm,aarch64,i386,mips,ppc}/stat.h */ |
+/* include/asm-{arm,aarch64,i386,mips,ppc,s390}/stat.h */ |
#ifdef __mips__ |
#if _MIPS_SIM == _MIPS_SIM_ABI64 |
struct kernel_stat { |
@@ -394,7 +395,7 @@ struct kernel_stat64 { |
}; |
#endif |
-/* include/asm-{arm,aarch64,i386,mips,x86_64,ppc}/stat.h */ |
+/* include/asm-{arm,aarch64,i386,mips,x86_64,ppc,s390}/stat.h */ |
#if defined(__i386__) || defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) |
struct kernel_stat { |
/* The kernel headers suggest that st_dev and st_rdev should be 32bit |
@@ -511,9 +512,53 @@ struct kernel_stat { |
unsigned int __unused4; |
unsigned int __unused5; |
}; |
+#elif defined(__s390x__) |
+struct kernel_stat { |
+ unsigned long st_dev; |
+ unsigned long st_ino; |
+ unsigned long st_nlink; |
+ unsigned int st_mode; |
+ unsigned int st_uid; |
+ unsigned int st_gid; |
+ unsigned int __pad1; |
+ unsigned long st_rdev; |
+ unsigned long st_size; |
+ unsigned long st_atime_; |
+ unsigned long st_atime_nsec_; |
+ unsigned long st_mtime_; |
+ unsigned long st_mtime_nsec_; |
+ unsigned long st_ctime_; |
+ unsigned long st_ctime_nsec_; |
+ unsigned long st_blksize; |
+ long st_blocks; |
+ unsigned long __unused[3]; |
+}; |
+#elif defined(__s390__) |
+struct kernel_stat { |
+ unsigned short st_dev; |
+ unsigned short __pad1; |
+ unsigned long st_ino; |
+ unsigned short st_mode; |
+ unsigned short st_nlink; |
+ unsigned short st_uid; |
+ unsigned short st_gid; |
+ unsigned short st_rdev; |
+ unsigned short __pad2; |
+ unsigned long st_size; |
+ unsigned long st_blksize; |
+ unsigned long st_blocks; |
+ unsigned long st_atime_; |
+ unsigned long st_atime_nsec_; |
+ unsigned long st_mtime_; |
+ unsigned long st_mtime_nsec_; |
+ unsigned long st_ctime_; |
+ unsigned long st_ctime_nsec_; |
+ unsigned long __unused4; |
+ unsigned long __unused5; |
+}; |
#endif |
-/* include/asm-{arm,aarch64,i386,mips,x86_64,ppc}/statfs.h */ |
+/* include/asm-{arm,aarch64,i386,mips,x86_64,ppc,s390}/statfs.h */ |
#ifdef __mips__ |
#if _MIPS_SIM != _MIPS_SIM_ABI64 |
struct kernel_statfs64 { |
@@ -531,6 +576,22 @@ struct kernel_statfs64 { |
unsigned long f_spare[6]; |
}; |
#endif |
+#elif defined(__s390__) |
+/* See also arch/s390/include/asm/compat.h */ |
+struct kernel_statfs64 { |
+ unsigned int f_type; |
+ unsigned int f_bsize; |
+ unsigned long long f_blocks; |
+ unsigned long long f_bfree; |
+ unsigned long long f_bavail; |
+ unsigned long long f_files; |
+ unsigned long long f_ffree; |
+ struct { int val[2]; } f_fsid; |
+ unsigned int f_namelen; |
+ unsigned int f_frsize; |
+ unsigned int f_flags; |
+ unsigned int f_spare[4]; |
+}; |
#elif !defined(__x86_64__) |
struct kernel_statfs64 { |
unsigned long f_type; |
@@ -547,7 +608,7 @@ struct kernel_statfs64 { |
}; |
#endif |
-/* include/asm-{arm,i386,mips,x86_64,ppc,generic}/statfs.h */ |
+/* include/asm-{arm,i386,mips,x86_64,ppc,generic,s390}/statfs.h */ |
#ifdef __mips__ |
struct kernel_statfs { |
long f_type; |
@@ -579,6 +640,21 @@ struct kernel_statfs { |
uint64_t f_frsize; |
uint64_t f_spare[5]; |
}; |
+#elif defined(__s390__) |
+struct kernel_statfs { |
+ unsigned int f_type; |
+ unsigned int f_bsize; |
+ unsigned long f_blocks; |
+ unsigned long f_bfree; |
+ unsigned long f_bavail; |
+ unsigned long f_files; |
+ unsigned long f_ffree; |
+ struct { int val[2]; } f_fsid; |
+ unsigned int f_namelen; |
+ unsigned int f_frsize; |
+ unsigned int f_flags; |
+ unsigned int f_spare[4]; |
+}; |
#else |
struct kernel_statfs { |
unsigned long f_type; |
@@ -951,7 +1027,7 @@ struct kernel_statfs { |
#ifndef __NR_getcpu |
#define __NR_getcpu (__NR_SYSCALL_BASE + 345) |
#endif |
-/* End of ARM 3/EABI definitions */ |
+/* End of ARM 3/EABI definitions */ |
#elif defined(__aarch64__) |
#ifndef __NR_setxattr |
#define __NR_setxattr 5 |
@@ -1504,6 +1580,189 @@ struct kernel_statfs { |
#define __NR_getcpu 302 |
#endif |
/* End of powerpc defininitions */ |
+#elif defined(__s390__) |
+#ifndef __NR_quotactl |
+#define __NR_quotactl 131 |
+#endif |
+#ifndef __NR_rt_sigreturn |
+#define __NR_rt_sigreturn 173 |
+#endif |
+#ifndef __NR_rt_sigaction |
+#define __NR_rt_sigaction 174 |
+#endif |
+#ifndef __NR_rt_sigprocmask |
+#define __NR_rt_sigprocmask 175 |
+#endif |
+#ifndef __NR_rt_sigpending |
+#define __NR_rt_sigpending 176 |
+#endif |
+#ifndef __NR_rt_sigsuspend |
+#define __NR_rt_sigsuspend 179 |
+#endif |
+#ifndef __NR_pread64 |
+#define __NR_pread64 180 |
+#endif |
+#ifndef __NR_pwrite64 |
+#define __NR_pwrite64 181 |
+#endif |
+#ifndef __NR_getdents64 |
+#define __NR_getdents64 220 |
+#endif |
+#ifndef __NR_readahead |
+#define __NR_readahead 222 |
+#endif |
+#ifndef __NR_setxattr |
+#define __NR_setxattr 224 |
+#endif |
+#ifndef __NR_lsetxattr |
+#define __NR_lsetxattr 225 |
+#endif |
+#ifndef __NR_getxattr |
+#define __NR_getxattr 227 |
+#endif |
+#ifndef __NR_lgetxattr |
+#define __NR_lgetxattr 228 |
+#endif |
+#ifndef __NR_listxattr |
+#define __NR_listxattr 230 |
+#endif |
+#ifndef __NR_llistxattr |
+#define __NR_llistxattr 231 |
+#endif |
+#ifndef __NR_gettid |
+#define __NR_gettid 236 |
+#endif |
+#ifndef __NR_tkill |
+#define __NR_tkill 237 |
+#endif |
+#ifndef __NR_futex |
+#define __NR_futex 238 |
+#endif |
+#ifndef __NR_sched_setaffinity |
+#define __NR_sched_setaffinity 239 |
+#endif |
+#ifndef __NR_sched_getaffinity |
+#define __NR_sched_getaffinity 240 |
+#endif |
+#ifndef __NR_set_tid_address |
+#define __NR_set_tid_address 252 |
+#endif |
+#ifndef __NR_clock_gettime |
+#define __NR_clock_gettime 260 |
+#endif |
+#ifndef __NR_clock_getres |
+#define __NR_clock_getres 261 |
+#endif |
+#ifndef __NR_statfs64 |
+#define __NR_statfs64 265 |
+#endif |
+#ifndef __NR_fstatfs64 |
+#define __NR_fstatfs64 266 |
+#endif |
+#ifndef __NR_ioprio_set |
+#define __NR_ioprio_set 282 |
+#endif |
+#ifndef __NR_ioprio_get |
+#define __NR_ioprio_get 283 |
+#endif |
+#ifndef __NR_openat |
+#define __NR_openat 288 |
+#endif |
+#ifndef __NR_unlinkat |
+#define __NR_unlinkat 294 |
+#endif |
+#ifndef __NR_move_pages |
+#define __NR_move_pages 310 |
+#endif |
+#ifndef __NR_getcpu |
+#define __NR_getcpu 311 |
+#endif |
+#ifndef __NR_fallocate |
+#define __NR_fallocate 314 |
+#endif |
+/* Some syscalls are named/numbered differently between s390 and s390x. */ |
+#ifdef __s390x__ |
+# ifndef __NR_getrlimit |
+# define __NR_getrlimit 191 |
+# endif |
+# ifndef __NR_setresuid |
+# define __NR_setresuid 208 |
+# endif |
+# ifndef __NR_getresuid |
+# define __NR_getresuid 209 |
+# endif |
+# ifndef __NR_setresgid |
+# define __NR_setresgid 210 |
+# endif |
+# ifndef __NR_getresgid |
+# define __NR_getresgid 211 |
+# endif |
+# ifndef __NR_setfsuid |
+# define __NR_setfsuid 215 |
+# endif |
+# ifndef __NR_setfsgid |
+# define __NR_setfsgid 216 |
+# endif |
+# ifndef __NR_fadvise64 |
+# define __NR_fadvise64 253 |
+# endif |
+# ifndef __NR_newfstatat |
+# define __NR_newfstatat 293 |
+# endif |
+#else /* __s390x__ */ |
+# ifndef __NR_getrlimit |
+# define __NR_getrlimit 76 |
+# endif |
+# ifndef __NR_setfsuid |
+# define __NR_setfsuid 138 |
+# endif |
+# ifndef __NR_setfsgid |
+# define __NR_setfsgid 139 |
+# endif |
+# ifndef __NR_setresuid |
+# define __NR_setresuid 164 |
+# endif |
+# ifndef __NR_getresuid |
+# define __NR_getresuid 165 |
+# endif |
+# ifndef __NR_setresgid |
+# define __NR_setresgid 170 |
+# endif |
+# ifndef __NR_getresgid |
+# define __NR_getresgid 171 |
+# endif |
+# ifndef __NR_ugetrlimit |
+# define __NR_ugetrlimit 191 |
+# endif |
+# ifndef __NR_mmap2 |
+# define __NR_mmap2 192 |
+# endif |
+# ifndef __NR_setresuid32 |
+# define __NR_setresuid32 208 |
+# endif |
+# ifndef __NR_getresuid32 |
+# define __NR_getresuid32 209 |
+# endif |
+# ifndef __NR_setresgid32 |
+# define __NR_setresgid32 210 |
+# endif |
+# ifndef __NR_getresgid32 |
+# define __NR_getresgid32 211 |
+# endif |
+# ifndef __NR_setfsuid32 |
+# define __NR_setfsuid32 215 |
+# endif |
+# ifndef __NR_setfsgid32 |
+# define __NR_setfsgid32 216 |
+# endif |
+# ifndef __NR_fadvise64_64 |
+# define __NR_fadvise64_64 264 |
+# endif |
+# ifndef __NR_fstatat64 |
+# define __NR_fstatat64 293 |
+# endif |
+#endif /* __s390__ */ |
+/* End of s390/s390x definitions */ |
#endif |
@@ -1567,7 +1826,7 @@ struct kernel_statfs { |
#undef LSS_RETURN |
#if (defined(__i386__) || defined(__x86_64__) || defined(__ARM_ARCH_3__) \ |
- || defined(__ARM_EABI__) || defined(__aarch64__)) |
+ || defined(__ARM_EABI__) || defined(__aarch64__) || defined(__s390__)) |
/* Failing system calls return a negative result in the range of |
* -1..-4095. These are "errno" values with the sign inverted. |
*/ |
@@ -1836,32 +2095,6 @@ struct kernel_statfs { |
LSS_RETURN(int, __res); |
} |
- #define __NR__fadvise64_64 __NR_fadvise64_64 |
- LSS_INLINE _syscall6(int, _fadvise64_64, int, fd, |
- unsigned, offset_lo, unsigned, offset_hi, |
- unsigned, len_lo, unsigned, len_hi, |
- int, advice) |
- |
- LSS_INLINE int LSS_NAME(fadvise64)(int fd, loff_t offset, |
- loff_t len, int advice) { |
- return LSS_NAME(_fadvise64_64)(fd, |
- (unsigned)offset, (unsigned)(offset >>32), |
- (unsigned)len, (unsigned)(len >> 32), |
- advice); |
- } |
- |
- #define __NR__fallocate __NR_fallocate |
- LSS_INLINE _syscall6(int, _fallocate, int, fd, |
- int, mode, |
- unsigned, offset_lo, unsigned, offset_hi, |
- unsigned, len_lo, unsigned, len_hi) |
- |
- LSS_INLINE int LSS_NAME(fallocate)(int fd, int mode, |
- loff_t offset, loff_t len) { |
- union { loff_t off; unsigned w[2]; } o = { offset }, l = { len }; |
- return LSS_NAME(_fallocate)(fd, mode, o.w[0], o.w[1], l.w[0], l.w[1]); |
- } |
- |
LSS_INLINE _syscall1(int, set_thread_area, void *, u) |
LSS_INLINE _syscall1(int, get_thread_area, void *, u) |
@@ -2149,13 +2382,6 @@ struct kernel_statfs { |
} |
LSS_INLINE _syscall2(int, arch_prctl, int, c, void *, a) |
- /* Need to make sure loff_t isn't truncated to 32-bits under x32. */ |
- LSS_INLINE int LSS_NAME(fadvise64)(int fd, loff_t offset, loff_t len, |
- int advice) { |
- LSS_BODY(4, int, fadvise64, LSS_SYSCALL_ARG(fd), (uint64_t)(offset), |
- (uint64_t)(len), LSS_SYSCALL_ARG(advice)); |
- } |
- |
LSS_INLINE void (*LSS_NAME(restore_rt)(void))(void) { |
/* On x86-64, the kernel does not know how to return from |
* a signal handler. Instead, it relies on user space to provide a |
@@ -2976,6 +3202,138 @@ struct kernel_statfs { |
} |
LSS_RETURN(int, __ret, __err); |
} |
+ #elif defined(__s390__) |
+ #undef LSS_REG |
+ #define LSS_REG(r, a) register unsigned long __r##r __asm__("r"#r) = (unsigned long) a |
+ #undef LSS_BODY |
+ #define LSS_BODY(type, name, args...) \ |
+ register unsigned long __nr __asm__("r1") \ |
+ = (unsigned long)(__NR_##name); \ |
+ register long __res_r2 __asm__("r2"); \ |
+ long __res; \ |
+ __asm__ __volatile__ \ |
+ ("svc 0\n\t" \ |
+ : "=d"(__res_r2) \ |
+ : "d"(__nr), ## args \ |
+ : "memory"); \ |
+ __res = __res_r2; \ |
+ LSS_RETURN(type, __res) |
+ #undef _syscall0 |
+ #define _syscall0(type, name) \ |
+ type LSS_NAME(name)(void) { \ |
+ LSS_BODY(type, name); \ |
+ } |
+ #undef _syscall1 |
+ #define _syscall1(type, name, type1, arg1) \ |
+ type LSS_NAME(name)(type1 arg1) { \ |
+ LSS_REG(2, arg1); \ |
+ LSS_BODY(type, name, "0"(__r2)); \ |
+ } |
+ #undef _syscall2 |
+ #define _syscall2(type, name, type1, arg1, type2, arg2) \ |
+ type LSS_NAME(name)(type1 arg1, type2 arg2) { \ |
+ LSS_REG(2, arg1); LSS_REG(3, arg2); \ |
+ LSS_BODY(type, name, "0"(__r2), "d"(__r3)); \ |
+ } |
+ #undef _syscall3 |
+ #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ |
+ type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ |
+ LSS_REG(2, arg1); LSS_REG(3, arg2); LSS_REG(4, arg3); \ |
+ LSS_BODY(type, name, "0"(__r2), "d"(__r3), "d"(__r4)); \ |
+ } |
+ #undef _syscall4 |
+ #define _syscall4(type, name, type1, arg1, type2, arg2, type3, arg3, \ |
+ type4, arg4) \ |
+ type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, \ |
+ type4 arg4) { \ |
+ LSS_REG(2, arg1); LSS_REG(3, arg2); LSS_REG(4, arg3); \ |
+ LSS_REG(5, arg4); \ |
+ LSS_BODY(type, name, "0"(__r2), "d"(__r3), "d"(__r4), \ |
+ "d"(__r5)); \ |
+ } |
+ #undef _syscall5 |
+ #define _syscall5(type, name, type1, arg1, type2, arg2, type3, arg3, \ |
+ type4, arg4, type5, arg5) \ |
+ type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, \ |
+ type4 arg4, type5 arg5) { \ |
+ LSS_REG(2, arg1); LSS_REG(3, arg2); LSS_REG(4, arg3); \ |
+ LSS_REG(5, arg4); LSS_REG(6, arg5); \ |
+ LSS_BODY(type, name, "0"(__r2), "d"(__r3), "d"(__r4), \ |
+ "d"(__r5), "d"(__r6)); \ |
+ } |
+ #undef _syscall6 |
+ #define _syscall6(type, name, type1, arg1, type2, arg2, type3, arg3, \ |
+ type4, arg4, type5, arg5, type6, arg6) \ |
+ type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, \ |
+ type4 arg4, type5 arg5, type6 arg6) { \ |
+ LSS_REG(2, arg1); LSS_REG(3, arg2); LSS_REG(4, arg3); \ |
+ LSS_REG(5, arg4); LSS_REG(6, arg5); LSS_REG(7, arg6); \ |
+ LSS_BODY(type, name, "0"(__r2), "d"(__r3), "d"(__r4), \ |
+ "d"(__r5), "d"(__r6), "d"(__r7)); \ |
+ } |
+ LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, |
+ int flags, void *arg, int *parent_tidptr, |
+ void *newtls, int *child_tidptr) { |
+ long __ret; |
+ { |
+ register int (*__fn)(void *) __asm__ ("r1") = fn; |
+ register void *__cstack __asm__ ("r2") = child_stack; |
+ register int __flags __asm__ ("r3") = flags; |
+ register void *__arg __asm__ ("r0") = arg; |
+ register int *__ptidptr __asm__ ("r4") = parent_tidptr; |
+ register void *__newtls __asm__ ("r6") = newtls; |
+ register int *__ctidptr __asm__ ("r5") = child_tidptr; |
+ __asm__ __volatile__ ( |
+ #ifndef __s390x__ |
+ /* arg already in r0 */ |
+ "ltr %4, %4\n\t" /* check fn, which is already in r1 */ |
+ "jz 1f\n\t" /* NULL function pointer, return -EINVAL */ |
+ "ltr %5, %5\n\t" /* check child_stack, which is already in r2 */ |
+ "jz 1f\n\t" /* NULL stack pointer, return -EINVAL */ |
+ /* flags already in r3 */ |
+ /* parent_tidptr already in r4 */ |
+ /* child_tidptr already in r5 */ |
+ /* newtls already in r6 */ |
+ "svc %2\n\t" /* invoke clone syscall */ |
+ "ltr %0,%%r2\n\t" /* load return code into __ret and test */ |
+ "jnz 1f\n\t" /* return to parent if non-zero */ |
+ /* start child thread */ |
+ "lr %%r2, %7\n\t" /* set first parameter to void *arg */ |
+ "ahi %%r15, -96\n\t" /* make room on the stack for the save area */ |
+ "xc 0(4,%%r15), 0(%%r15)\n\t" |
+ "basr %%r14, %4\n\t" /* jump to fn */ |
+ "svc %3\n" /* invoke exit syscall */ |
+ "1:\n" |
+ #else |
+ /* arg already in r0 */ |
+ "ltgr %4, %4\n\t" /* check fn, which is already in r1 */ |
+ "jz 1f\n\t" /* NULL function pointer, return -EINVAL */ |
+ "ltgr %5, %5\n\t" /* check child_stack, which is already in r2 */ |
+ "jz 1f\n\t" /* NULL stack pointer, return -EINVAL */ |
+ /* flags already in r3 */ |
+ /* parent_tidptr already in r4 */ |
+ /* child_tidptr already in r5 */ |
+ /* newtls already in r6 */ |
+ "svc %2\n\t" /* invoke clone syscall */ |
+ "ltgr %0, %%r2\n\t" /* load return code into __ret and test */ |
+ "jnz 1f\n\t" /* return to parent if non-zero */ |
+ /* start child thread */ |
+ "lgr %%r2, %7\n\t" /* set first parameter to void *arg */ |
+ "aghi %%r15, -160\n\t" /* make room on the stack for the save area */ |
+ "xc 0(8,%%r15), 0(%%r15)\n\t" |
+ "basr %%r14, %4\n\t" /* jump to fn */ |
+ "svc %3\n" /* invoke exit syscall */ |
+ "1:\n" |
+ #endif |
+ : "=r" (__ret) |
+ : "0" (-EINVAL), "i" (__NR_clone), "i" (__NR_exit), |
+ "d" (__fn), "d" (__cstack), "d" (__flags), "d" (__arg), |
+ "d" (__ptidptr), "d" (__newtls), "d" (__ctidptr) |
+ : "cc", "r14", "memory" |
+ ); |
+ } |
+ LSS_RETURN(int, __ret); |
+ } |
#endif |
#define __NR__exit __NR_exit |
#define __NR__gettid __NR_gettid |
@@ -3190,14 +3548,77 @@ struct kernel_statfs { |
LSS_INLINE _syscall4(int, socketpair, int, d, |
int, t, int, p, int*, s) |
#endif |
- #if defined(__x86_64__) |
+ #if defined(__NR_fadvise64) |
+ #if defined(__x86_64__) |
+ /* Need to make sure loff_t isn't truncated to 32-bits under x32. */ |
+ LSS_INLINE int LSS_NAME(fadvise64)(int fd, loff_t offset, loff_t len, |
+ int advice) { |
+ LSS_BODY(4, int, fadvise64, LSS_SYSCALL_ARG(fd), (uint64_t)(offset), |
+ (uint64_t)(len), LSS_SYSCALL_ARG(advice)); |
+ } |
+ #else |
+ LSS_INLINE _syscall4(int, fadvise64, |
+ int, fd, loff_t, offset, loff_t, len, int, advice) |
+ #endif |
+ #elif defined(__i386__) |
+ #define __NR__fadvise64_64 __NR_fadvise64_64 |
+ LSS_INLINE _syscall6(int, _fadvise64_64, int, fd, |
+ unsigned, offset_lo, unsigned, offset_hi, |
+ unsigned, len_lo, unsigned, len_hi, |
+ int, advice) |
+ |
+ LSS_INLINE int LSS_NAME(fadvise64)(int fd, loff_t offset, |
+ loff_t len, int advice) { |
+ return LSS_NAME(_fadvise64_64)(fd, |
+ (unsigned)offset, (unsigned)(offset >>32), |
+ (unsigned)len, (unsigned)(len >> 32), |
+ advice); |
+ } |
+ |
+ #elif defined(__s390__) && !defined(__s390x__) |
+ #define __NR__fadvise64_64 __NR_fadvise64_64 |
+ struct kernel_fadvise64_64_args { |
+ int fd; |
+ long long offset; |
+ long long len; |
+ int advice; |
+ }; |
+ |
+ LSS_INLINE _syscall1(int, _fadvise64_64, |
+ struct kernel_fadvise64_64_args *args) |
+ |
+ LSS_INLINE int LSS_NAME(fadvise64)(int fd, loff_t offset, |
+ loff_t len, int advice) { |
+ struct kernel_fadvise64_64_args args = { fd, offset, len, advice }; |
+ return LSS_NAME(_fadvise64_64)(&args); |
+ } |
+ #endif |
+ #if defined(__NR_fallocate) |
+ #if defined(__x86_64__) |
/* Need to make sure loff_t isn't truncated to 32-bits under x32. */ |
LSS_INLINE int LSS_NAME(fallocate)(int f, int mode, loff_t offset, |
loff_t len) { |
LSS_BODY(4, int, fallocate, LSS_SYSCALL_ARG(f), LSS_SYSCALL_ARG(mode), |
(uint64_t)(offset), (uint64_t)(len)); |
} |
+ #elif defined(__i386__) || (defined(__s390__) && !defined(__s390x__)) |
+ #define __NR__fallocate __NR_fallocate |
+ LSS_INLINE _syscall6(int, _fallocate, int, fd, |
+ int, mode, |
+ unsigned, offset_lo, unsigned, offset_hi, |
+ unsigned, len_lo, unsigned, len_hi) |
+ LSS_INLINE int LSS_NAME(fallocate)(int fd, int mode, |
+ loff_t offset, loff_t len) { |
+ union { loff_t off; unsigned w[2]; } o = { offset }, l = { len }; |
+ return LSS_NAME(_fallocate)(fd, mode, o.w[0], o.w[1], l.w[0], l.w[1]); |
+ } |
+ #else |
+ LSS_INLINE _syscall4(int, fallocate, |
+ int, f, int, mode, loff_t, offset, loff_t, len) |
+ #endif |
+ #endif |
+ #if defined(__x86_64__) || defined(__s390x__) |
LSS_INLINE int LSS_NAME(getresgid32)(gid_t *rgid, |
gid_t *egid, |
gid_t *sgid) { |
@@ -3209,15 +3630,6 @@ struct kernel_statfs { |
uid_t *suid) { |
return LSS_NAME(getresuid)(ruid, euid, suid); |
} |
- |
- /* Need to make sure __off64_t isn't truncated to 32-bits under x32. */ |
- LSS_INLINE void* LSS_NAME(mmap)(void *s, size_t l, int p, int f, int d, |
- int64_t o) { |
- LSS_BODY(6, void*, mmap, LSS_SYSCALL_ARG(s), LSS_SYSCALL_ARG(l), |
- LSS_SYSCALL_ARG(p), LSS_SYSCALL_ARG(f), |
- LSS_SYSCALL_ARG(d), (uint64_t)(o)); |
- } |
- |
LSS_INLINE _syscall4(int, newfstatat, int, d, |
const char *, p, |
struct kernel_stat*, b, int, f) |
@@ -3241,6 +3653,7 @@ struct kernel_statfs { |
LSS_INLINE int LSS_NAME(sigaction)(int signum, |
const struct kernel_sigaction *act, |
struct kernel_sigaction *oldact) { |
+ #if defined(__x86_64__) |
/* On x86_64, the kernel requires us to always set our own |
* SA_RESTORER in order to be able to return from a signal handler. |
* This function must have a "magic" signature that the "gdb" |
@@ -3252,10 +3665,10 @@ struct kernel_statfs { |
a.sa_restorer = LSS_NAME(restore_rt)(); |
return LSS_NAME(rt_sigaction)(signum, &a, oldact, |
(KERNEL_NSIG+7)/8); |
- } else { |
+ } else |
+ #endif |
return LSS_NAME(rt_sigaction)(signum, act, oldact, |
(KERNEL_NSIG+7)/8); |
- } |
} |
LSS_INLINE int LSS_NAME(sigpending)(struct kernel_sigset_t *set) { |
@@ -3274,7 +3687,8 @@ struct kernel_statfs { |
#endif |
#if defined(__x86_64__) || defined(__ARM_ARCH_3__) || \ |
defined(__ARM_EABI__) || defined(__aarch64__) || \ |
- (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI32) |
+ (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI32) || \ |
+ defined(__s390__) |
LSS_INLINE _syscall4(pid_t, wait4, pid_t, p, |
int*, s, int, o, |
struct kernel_rusage*, r) |
@@ -3283,11 +3697,14 @@ struct kernel_statfs { |
return LSS_NAME(wait4)(pid, status, options, 0); |
} |
#endif |
- #if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) |
+ #if defined(__NR_openat) |
LSS_INLINE _syscall4(int, openat, int, d, const char *, p, int, f, int, m) |
+ #endif |
+ #if defined(__NR_unlinkat) |
LSS_INLINE _syscall3(int, unlinkat, int, d, const char *, p, int, f) |
#endif |
- #if defined(__i386__) || defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) |
+ #if defined(__i386__) || defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) || \ |
+ (defined(__s390__) && !defined(__s390x__)) |
#define __NR__getresgid32 __NR_getresgid32 |
#define __NR__getresuid32 __NR_getresuid32 |
#define __NR__setfsgid32 __NR_setfsgid32 |
@@ -3441,9 +3858,11 @@ struct kernel_statfs { |
(1UL << ((signum - 1) % (8*sizeof(set->sig[0]))))); |
} |
} |
- #if defined(__i386__) || defined(__ARM_ARCH_3__) || \ |
- defined(__ARM_EABI__) || \ |
- (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) || defined(__PPC__) |
+ #if defined(__i386__) || \ |
+ defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) || \ |
+ (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) || \ |
+ defined(__PPC__) || \ |
+ (defined(__s390__) && !defined(__s390x__)) |
#define __NR__sigaction __NR_sigaction |
#define __NR__sigpending __NR_sigpending |
#define __NR__sigprocmask __NR_sigprocmask |
@@ -3454,13 +3873,23 @@ struct kernel_statfs { |
LSS_INLINE _syscall5(int, _llseek, uint, fd, |
unsigned long, hi, unsigned long, lo, |
loff_t *, res, uint, wh) |
-#if !defined(__ARM_EABI__) |
- LSS_INLINE _syscall1(void*, mmap, void*, a) |
-#endif |
- LSS_INLINE _syscall6(void*, mmap2, void*, s, |
+#if defined(__s390__) && !defined(__s390x__) |
+ /* On s390, mmap2() arguments are passed in memory. */ |
+ LSS_INLINE void* LSS_NAME(_mmap2)(void *s, size_t l, int p, int f, int d, |
+ off_t o) { |
+ unsigned long buf[6] = { (unsigned long) s, (unsigned long) l, |
+ (unsigned long) p, (unsigned long) f, |
+ (unsigned long) d, (unsigned long) o }; |
+ LSS_REG(2, buf); |
+ LSS_BODY(void*, mmap2, "0"(__r2)); |
+ } |
+#else |
+ #define __NR__mmap2 __NR_mmap2 |
+ LSS_INLINE _syscall6(void*, _mmap2, void*, s, |
size_t, l, int, p, |
int, f, int, d, |
- off_t, o) |
+ off_t, o) |
+#endif |
LSS_INLINE _syscall3(int, _sigaction, int, s, |
const struct kernel_old_sigaction*, a, |
struct kernel_old_sigaction*, o) |
@@ -3582,6 +4011,43 @@ struct kernel_statfs { |
return rc; |
} |
#endif |
+ #if defined(__i386__) || \ |
+ defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) || \ |
+ (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) || \ |
+ defined(__PPC__) || \ |
+ (defined(__s390__) && !defined(__s390x__)) |
+ /* On these architectures, implement mmap() with mmap2(). */ |
+ LSS_INLINE void* LSS_NAME(mmap)(void *s, size_t l, int p, int f, int d, |
+ int64_t o) { |
+ if (o % 4096) { |
+ LSS_ERRNO = EINVAL; |
+ return (void *) -1; |
+ } |
+ return LSS_NAME(_mmap2)(s, l, p, f, d, (o / 4096)); |
+ } |
+ #elif defined(__s390x__) |
+ /* On s390x, mmap() arguments are passed in memory. */ |
+ LSS_INLINE void* LSS_NAME(mmap)(void *s, size_t l, int p, int f, int d, |
+ int64_t o) { |
+ unsigned long buf[6] = { (unsigned long) s, (unsigned long) l, |
+ (unsigned long) p, (unsigned long) f, |
+ (unsigned long) d, (unsigned long) o }; |
+ LSS_REG(2, buf); |
+ LSS_BODY(void*, mmap, "0"(__r2)); |
+ } |
+ #elif defined(__x86_64__) |
+ /* Need to make sure __off64_t isn't truncated to 32-bits under x32. */ |
+ LSS_INLINE void* LSS_NAME(mmap)(void *s, size_t l, int p, int f, int d, |
+ int64_t o) { |
+ LSS_BODY(6, void*, mmap, LSS_SYSCALL_ARG(s), LSS_SYSCALL_ARG(l), |
+ LSS_SYSCALL_ARG(p), LSS_SYSCALL_ARG(f), |
+ LSS_SYSCALL_ARG(d), (uint64_t)(o)); |
+ } |
+ #else |
+ /* Remaining 64-bit architectures. */ |
+ LSS_INLINE _syscall6(void*, mmap, void*, addr, size_t, length, int, prot, |
+ int, flags, int, fd, int64_t, offset) |
+ #endif |
#if defined(__PPC__) |
#undef LSS_SC_LOADARGS_0 |
#define LSS_SC_LOADARGS_0(dummy...) |
@@ -3685,7 +4151,8 @@ struct kernel_statfs { |
int*, sv) |
#endif |
#if defined(__i386__) || defined(__ARM_ARCH_3__) || \ |
- (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) |
+ (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) || \ |
+ defined(__s390__) |
#define __NR__socketcall __NR_socketcall |
LSS_INLINE _syscall2(int, _socketcall, int, c, |
va_list, a) |
@@ -3729,7 +4196,7 @@ struct kernel_statfs { |
return LSS_NAME(socketcall)(8, d, type, protocol, sv); |
} |
#endif |
- #if defined(__i386__) || defined(__PPC__) |
+ #if defined(__NR_fstatat64) |
LSS_INLINE _syscall4(int, fstatat64, int, d, |
const char *, p, |
struct kernel_stat64 *, b, int, f) |
@@ -3768,8 +4235,9 @@ struct kernel_statfs { |
#endif |
/* TODO(csilvers): see if ppc can/should support this as well */ |
#if defined(__i386__) || defined(__ARM_ARCH_3__) || \ |
- defined(__ARM_EABI__) || \ |
- (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI64) |
+ defined(__ARM_EABI__) || \ |
+ (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI64) || \ |
+ (defined(__s390__) && !defined(__s390x__)) |
#define __NR__statfs64 __NR_statfs64 |
#define __NR__fstatfs64 __NR_fstatfs64 |
LSS_INLINE _syscall3(int, _statfs64, const char*, p, |
@@ -3887,8 +4355,6 @@ struct kernel_statfs { |
loff_t, o) |
LSS_INLINE _syscall3(int, readahead, int, f, |
loff_t, o, unsigned, c) |
- LSS_INLINE _syscall6(void *, mmap, void *, addr, size_t, length, int, prot, |
- int, flags, int, fd, int64_t, offset) |
#else |
#define __NR__pread64 __NR_pread64 |
#define __NR__pwrite64 __NR_pwrite64 |
@@ -3945,8 +4411,6 @@ struct kernel_statfs { |
#if defined(__aarch64__) |
LSS_INLINE _syscall3(int, dup3, int, s, int, d, int, f) |
- LSS_INLINE _syscall6(void *, mmap, void *, addr, size_t, length, int, prot, |
- int, flags, int, fd, int64_t, offset) |
LSS_INLINE _syscall4(int, newfstatat, int, dirfd, const char *, pathname, |
struct kernel_stat *, buf, int, flags) |
LSS_INLINE _syscall2(int, pipe2, int *, pipefd, int, flags) |