| 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)
|
|
|