Home | History | Annotate | Download | only in base
      1 /* Copyright (c) 2005-2008, Google Inc.
      2  * All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are
      6  * met:
      7  *
      8  *     * Redistributions of source code must retain the above copyright
      9  * notice, this list of conditions and the following disclaimer.
     10  *     * Redistributions in binary form must reproduce the above
     11  * copyright notice, this list of conditions and the following disclaimer
     12  * in the documentation and/or other materials provided with the
     13  * distribution.
     14  *     * Neither the name of Google Inc. nor the names of its
     15  * contributors may be used to endorse or promote products derived from
     16  * this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  *
     30  * ---
     31  * Author: Markus Gutschke
     32  */
     33 
     34 /* This file includes Linux-specific support functions common to the
     35  * coredumper and the thread lister; primarily, this is a collection
     36  * of direct system calls, and a couple of symbols missing from
     37  * standard header files.
     38  * There are a few options that the including file can set to control
     39  * the behavior of this file:
     40  *
     41  * SYS_CPLUSPLUS:
     42  *   The entire header file will normally be wrapped in 'extern "C" { }",
     43  *   making it suitable for compilation as both C and C++ source. If you
     44  *   do not want to do this, you can set the SYS_CPLUSPLUS macro to inhibit
     45  *   the wrapping. N.B. doing so will suppress inclusion of all prerequisite
     46  *   system header files, too. It is the caller's responsibility to provide
     47  *   the necessary definitions.
     48  *
     49  * SYS_ERRNO:
     50  *   All system calls will update "errno" unless overriden by setting the
     51  *   SYS_ERRNO macro prior to including this file. SYS_ERRNO should be
     52  *   an l-value.
     53  *
     54  * SYS_INLINE:
     55  *   New symbols will be defined "static inline", unless overridden by
     56  *   the SYS_INLINE macro.
     57  *
     58  * SYS_LINUX_SYSCALL_SUPPORT_H
     59  *   This macro is used to avoid multiple inclusions of this header file.
     60  *   If you need to include this file more than once, make sure to
     61  *   unset SYS_LINUX_SYSCALL_SUPPORT_H before each inclusion.
     62  *
     63  * SYS_PREFIX:
     64  *   New system calls will have a prefix of "sys_" unless overridden by
     65  *   the SYS_PREFIX macro. Valid values for this macro are [0..9] which
     66  *   results in prefixes "sys[0..9]_". It is also possible to set this
     67  *   macro to -1, which avoids all prefixes.
     68  *
     69  * This file defines a few internal symbols that all start with "LSS_".
     70  * Do not access these symbols from outside this file. They are not part
     71  * of the supported API.
     72  *
     73  * NOTE: This is a stripped down version of the official opensource
     74  * version of linux_syscall_support.h, which lives at
     75  *    http://code.google.com/p/linux-syscall-support/
     76  * It includes only the syscalls that are used in perftools, plus a
     77  * few extra.  Here's the breakdown:
     78  * 1) Perftools uses these: grep -rho 'sys_[a-z0-9_A-Z]* *(' src | sort -u
     79  *      sys__exit(
     80  *      sys_clone(
     81  *      sys_close(
     82  *      sys_fcntl(
     83  *      sys_fstat(
     84  *      sys_futex(
     85  *      sys_futex1(
     86  *      sys_getcpu(
     87  *      sys_getdents(
     88  *      sys_getppid(
     89  *      sys_gettid(
     90  *      sys_lseek(
     91  *      sys_mmap(
     92  *      sys_mremap(
     93  *      sys_munmap(
     94  *      sys_open(
     95  *      sys_pipe(
     96  *      sys_prctl(
     97  *      sys_ptrace(
     98  *      sys_ptrace_detach(
     99  *      sys_read(
    100  *      sys_sched_yield(
    101  *      sys_sigaction(
    102  *      sys_sigaltstack(
    103  *      sys_sigdelset(
    104  *      sys_sigfillset(
    105  *      sys_sigprocmask(
    106  *      sys_socket(
    107  *      sys_stat(
    108  *      sys_waitpid(
    109  * 2) These are used as subroutines of the above:
    110  *      sys_getpid       -- gettid
    111  *      sys_kill         -- ptrace_detach
    112  *      sys_restore      -- sigaction
    113  *      sys_restore_rt   -- sigaction
    114  *      sys_socketcall   -- socket
    115  *      sys_wait4        -- waitpid
    116  * 3) I left these in even though they're not used.  They either
    117  * complement the above (write vs read) or are variants (rt_sigaction):
    118  *      sys_fstat64
    119  *      sys_getdents64
    120  *      sys_llseek
    121  *      sys_mmap2
    122  *      sys_openat
    123  *      sys_rt_sigaction
    124  *      sys_rt_sigprocmask
    125  *      sys_sigaddset
    126  *      sys_sigemptyset
    127  *      sys_stat64
    128  *      sys_write
    129  */
    130 #ifndef SYS_LINUX_SYSCALL_SUPPORT_H
    131 #define SYS_LINUX_SYSCALL_SUPPORT_H
    132 
    133 /* We currently only support x86-32, x86-64, ARM, MIPS, and PPC on Linux.
    134  * Porting to other related platforms should not be difficult.
    135  */
    136 #if (defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
    137      defined(__mips__) || defined(__PPC__)) && defined(__linux)
    138 
    139 #ifndef SYS_CPLUSPLUS
    140 #ifdef __cplusplus
    141 /* Some system header files in older versions of gcc neglect to properly
    142  * handle being included from C++. As it appears to be harmless to have
    143  * multiple nested 'extern "C"' blocks, just add another one here.
    144  */
    145 extern "C" {
    146 #endif
    147 
    148 #include <errno.h>
    149 #include <signal.h>
    150 #include <stdarg.h>
    151 #include <string.h>
    152 #include <sys/ptrace.h>
    153 #include <sys/resource.h>
    154 #include <sys/time.h>
    155 #include <sys/types.h>
    156 #include <syscall.h>
    157 #include <unistd.h>
    158 #include <linux/unistd.h>
    159 #include <endian.h>
    160 
    161 #ifdef __mips__
    162 /* Include definitions of the ABI currently in use.                          */
    163 #include <sgidefs.h>
    164 #endif
    165 
    166 #endif
    167 
    168 /* As glibc often provides subtly incompatible data structures (and implicit
    169  * wrapper functions that convert them), we provide our own kernel data
    170  * structures for use by the system calls.
    171  * These structures have been developed by using Linux 2.6.23 headers for
    172  * reference. Note though, we do not care about exact API compatibility
    173  * with the kernel, and in fact the kernel often does not have a single
    174  * API that works across architectures. Instead, we try to mimic the glibc
    175  * API where reasonable, and only guarantee ABI compatibility with the
    176  * kernel headers.
    177  * Most notably, here are a few changes that were made to the structures
    178  * defined by kernel headers:
    179  *
    180  * - we only define structures, but not symbolic names for kernel data
    181  *   types. For the latter, we directly use the native C datatype
    182  *   (i.e. "unsigned" instead of "mode_t").
    183  * - in a few cases, it is possible to define identical structures for
    184  *   both 32bit (e.g. i386) and 64bit (e.g. x86-64) platforms by
    185  *   standardizing on the 64bit version of the data types. In particular,
    186  *   this means that we use "unsigned" where the 32bit headers say
    187  *   "unsigned long".
    188  * - overall, we try to minimize the number of cases where we need to
    189  *   conditionally define different structures.
    190  * - the "struct kernel_sigaction" class of structures have been
    191  *   modified to more closely mimic glibc's API by introducing an
    192  *   anonymous union for the function pointer.
    193  * - a small number of field names had to have an underscore appended to
    194  *   them, because glibc defines a global macro by the same name.
    195  */
    196 
    197 /* include/linux/dirent.h                                                    */
    198 struct kernel_dirent64 {
    199   unsigned long long d_ino;
    200   long long          d_off;
    201   unsigned short     d_reclen;
    202   unsigned char      d_type;
    203   char               d_name[256];
    204 };
    205 
    206 /* include/linux/dirent.h                                                    */
    207 struct kernel_dirent {
    208   long               d_ino;
    209   long               d_off;
    210   unsigned short     d_reclen;
    211   char               d_name[256];
    212 };
    213 
    214 /* include/linux/time.h                                                      */
    215 struct kernel_timespec {
    216   long               tv_sec;
    217   long               tv_nsec;
    218 };
    219 
    220 /* include/linux/time.h                                                      */
    221 struct kernel_timeval {
    222   long               tv_sec;
    223   long               tv_usec;
    224 };
    225 
    226 /* include/linux/resource.h                                                  */
    227 struct kernel_rusage {
    228   struct kernel_timeval ru_utime;
    229   struct kernel_timeval ru_stime;
    230   long               ru_maxrss;
    231   long               ru_ixrss;
    232   long               ru_idrss;
    233   long               ru_isrss;
    234   long               ru_minflt;
    235   long               ru_majflt;
    236   long               ru_nswap;
    237   long               ru_inblock;
    238   long               ru_oublock;
    239   long               ru_msgsnd;
    240   long               ru_msgrcv;
    241   long               ru_nsignals;
    242   long               ru_nvcsw;
    243   long               ru_nivcsw;
    244 };
    245 
    246 #if defined(__i386__) || defined(__arm__) || defined(__PPC__)
    247 
    248 /* include/asm-{arm,i386,mips,ppc}/signal.h                                  */
    249 struct kernel_old_sigaction {
    250   union {
    251     void             (*sa_handler_)(int);
    252     void             (*sa_sigaction_)(int, siginfo_t *, void *);
    253   };
    254   unsigned long      sa_mask;
    255   unsigned long      sa_flags;
    256   void               (*sa_restorer)(void);
    257 } __attribute__((packed,aligned(4)));
    258 #elif (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32)
    259   #define kernel_old_sigaction kernel_sigaction
    260 #endif
    261 
    262 /* Some kernel functions (e.g. sigaction() in 2.6.23) require that the
    263  * exactly match the size of the signal set, even though the API was
    264  * intended to be extensible. We define our own KERNEL_NSIG to deal with
    265  * this.
    266  * Please note that glibc provides signals [1.._NSIG-1], whereas the
    267  * kernel (and this header) provides the range [1..KERNEL_NSIG]. The
    268  * actual number of signals is obviously the same, but the constants
    269  * differ by one.
    270  */
    271 #ifdef __mips__
    272 #define KERNEL_NSIG 128
    273 #else
    274 #define KERNEL_NSIG  64
    275 #endif
    276 
    277 /* include/asm-{arm,i386,mips,x86_64}/signal.h                               */
    278 struct kernel_sigset_t {
    279   unsigned long sig[(KERNEL_NSIG + 8*sizeof(unsigned long) - 1)/
    280                     (8*sizeof(unsigned long))];
    281 };
    282 
    283 /* include/asm-{arm,i386,mips,x86_64,ppc}/signal.h                           */
    284 struct kernel_sigaction {
    285 #ifdef __mips__
    286   unsigned long      sa_flags;
    287   union {
    288     void             (*sa_handler_)(int);
    289     void             (*sa_sigaction_)(int, siginfo_t *, void *);
    290   };
    291   struct kernel_sigset_t sa_mask;
    292 #else
    293   union {
    294     void             (*sa_handler_)(int);
    295     void             (*sa_sigaction_)(int, siginfo_t *, void *);
    296   };
    297   unsigned long      sa_flags;
    298   void               (*sa_restorer)(void);
    299   struct kernel_sigset_t sa_mask;
    300 #endif
    301 };
    302 
    303 /* include/asm-{arm,i386,mips,ppc}/stat.h                                    */
    304 #ifdef __mips__
    305 #if _MIPS_SIM == _MIPS_SIM_ABI64
    306 struct kernel_stat {
    307 #else
    308 struct kernel_stat64 {
    309 #endif
    310   unsigned           st_dev;
    311   unsigned           __pad0[3];
    312   unsigned long long st_ino;
    313   unsigned           st_mode;
    314   unsigned           st_nlink;
    315   unsigned           st_uid;
    316   unsigned           st_gid;
    317   unsigned           st_rdev;
    318   unsigned           __pad1[3];
    319   long long          st_size;
    320   unsigned           st_atime_;
    321   unsigned           st_atime_nsec_;
    322   unsigned           st_mtime_;
    323   unsigned           st_mtime_nsec_;
    324   unsigned           st_ctime_;
    325   unsigned           st_ctime_nsec_;
    326   unsigned           st_blksize;
    327   unsigned           __pad2;
    328   unsigned long long st_blocks;
    329 };
    330 #elif defined __PPC__
    331 struct kernel_stat64 {
    332   unsigned long long st_dev;
    333   unsigned long long st_ino;
    334   unsigned           st_mode;
    335   unsigned           st_nlink;
    336   unsigned           st_uid;
    337   unsigned           st_gid;
    338   unsigned long long st_rdev;
    339   unsigned short int __pad2;
    340   long long          st_size;
    341   long               st_blksize;
    342   long long          st_blocks;
    343   long               st_atime_;
    344   unsigned long      st_atime_nsec_;
    345   long               st_mtime_;
    346   unsigned long      st_mtime_nsec_;
    347   long               st_ctime_;
    348   unsigned long      st_ctime_nsec_;
    349   unsigned long      __unused4;
    350   unsigned long      __unused5;
    351 };
    352 #else
    353 struct kernel_stat64 {
    354   unsigned long long st_dev;
    355   unsigned char      __pad0[4];
    356   unsigned           __st_ino;
    357   unsigned           st_mode;
    358   unsigned           st_nlink;
    359   unsigned           st_uid;
    360   unsigned           st_gid;
    361   unsigned long long st_rdev;
    362   unsigned char      __pad3[4];
    363   long long          st_size;
    364   unsigned           st_blksize;
    365   unsigned long long st_blocks;
    366   unsigned           st_atime_;
    367   unsigned           st_atime_nsec_;
    368   unsigned           st_mtime_;
    369   unsigned           st_mtime_nsec_;
    370   unsigned           st_ctime_;
    371   unsigned           st_ctime_nsec_;
    372   unsigned long long st_ino;
    373 };
    374 #endif
    375 
    376 /* include/asm-{arm,i386,mips,x86_64,ppc}/stat.h                             */
    377 #if defined(__i386__) || defined(__arm__)
    378 struct kernel_stat {
    379   /* The kernel headers suggest that st_dev and st_rdev should be 32bit
    380    * quantities encoding 12bit major and 20bit minor numbers in an interleaved
    381    * format. In reality, we do not see useful data in the top bits. So,
    382    * we'll leave the padding in here, until we find a better solution.
    383    */
    384   unsigned short     st_dev;
    385   short              pad1;
    386   unsigned           st_ino;
    387   unsigned short     st_mode;
    388   unsigned short     st_nlink;
    389   unsigned short     st_uid;
    390   unsigned short     st_gid;
    391   unsigned short     st_rdev;
    392   short              pad2;
    393   unsigned           st_size;
    394   unsigned           st_blksize;
    395   unsigned           st_blocks;
    396   unsigned           st_atime_;
    397   unsigned           st_atime_nsec_;
    398   unsigned           st_mtime_;
    399   unsigned           st_mtime_nsec_;
    400   unsigned           st_ctime_;
    401   unsigned           st_ctime_nsec_;
    402   unsigned           __unused4;
    403   unsigned           __unused5;
    404 };
    405 #elif defined(__x86_64__)
    406 struct kernel_stat {
    407   unsigned long      st_dev;
    408   unsigned long      st_ino;
    409   unsigned long      st_nlink;
    410   unsigned           st_mode;
    411   unsigned           st_uid;
    412   unsigned           st_gid;
    413   unsigned           __pad0;
    414   unsigned long      st_rdev;
    415   long               st_size;
    416   long               st_blksize;
    417   long               st_blocks;
    418   unsigned long      st_atime_;
    419   unsigned long      st_atime_nsec_;
    420   unsigned long      st_mtime_;
    421   unsigned long      st_mtime_nsec_;
    422   unsigned long      st_ctime_;
    423   unsigned long      st_ctime_nsec_;
    424   long               __unused[3];
    425 };
    426 #elif defined(__PPC__)
    427 struct kernel_stat {
    428   unsigned           st_dev;
    429   unsigned long      st_ino;      // ino_t
    430   unsigned long      st_mode;     // mode_t
    431   unsigned short     st_nlink;    // nlink_t
    432   unsigned           st_uid;      // uid_t
    433   unsigned           st_gid;      // gid_t
    434   unsigned           st_rdev;
    435   long               st_size;     // off_t
    436   unsigned long      st_blksize;
    437   unsigned long      st_blocks;
    438   unsigned long      st_atime_;
    439   unsigned long      st_atime_nsec_;
    440   unsigned long      st_mtime_;
    441   unsigned long      st_mtime_nsec_;
    442   unsigned long      st_ctime_;
    443   unsigned long      st_ctime_nsec_;
    444   unsigned long      __unused4;
    445   unsigned long      __unused5;
    446 };
    447 #elif (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI64)
    448 struct kernel_stat {
    449   unsigned           st_dev;
    450   int                st_pad1[3];
    451   unsigned           st_ino;
    452   unsigned           st_mode;
    453   unsigned           st_nlink;
    454   unsigned           st_uid;
    455   unsigned           st_gid;
    456   unsigned           st_rdev;
    457   int                st_pad2[2];
    458   long               st_size;
    459   int                st_pad3;
    460   long               st_atime_;
    461   long               st_atime_nsec_;
    462   long               st_mtime_;
    463   long               st_mtime_nsec_;
    464   long               st_ctime_;
    465   long               st_ctime_nsec_;
    466   int                st_blksize;
    467   int                st_blocks;
    468   int                st_pad4[14];
    469 };
    470 #endif
    471 
    472 
    473 /* Definitions missing from the standard header files                        */
    474 #ifndef O_DIRECTORY
    475 #if defined(__arm__)
    476 #define O_DIRECTORY             0040000
    477 #else
    478 #define O_DIRECTORY             0200000
    479 #endif
    480 #endif
    481 #ifndef PR_GET_DUMPABLE
    482 #define PR_GET_DUMPABLE         3
    483 #endif
    484 #ifndef PR_SET_DUMPABLE
    485 #define PR_SET_DUMPABLE         4
    486 #endif
    487 #ifndef AT_FDCWD
    488 #define AT_FDCWD                (-100)
    489 #endif
    490 #ifndef AT_SYMLINK_NOFOLLOW
    491 #define AT_SYMLINK_NOFOLLOW     0x100
    492 #endif
    493 #ifndef AT_REMOVEDIR
    494 #define AT_REMOVEDIR            0x200
    495 #endif
    496 #ifndef MREMAP_FIXED
    497 #define MREMAP_FIXED            2
    498 #endif
    499 #ifndef SA_RESTORER
    500 #define SA_RESTORER             0x04000000
    501 #endif
    502 
    503 #if defined(__i386__)
    504 #ifndef __NR_rt_sigaction
    505 #define __NR_rt_sigaction       174
    506 #define __NR_rt_sigprocmask     175
    507 #endif
    508 #ifndef __NR_stat64
    509 #define __NR_stat64             195
    510 #endif
    511 #ifndef __NR_fstat64
    512 #define __NR_fstat64            197
    513 #endif
    514 #ifndef __NR_getdents64
    515 #define __NR_getdents64         220
    516 #endif
    517 #ifndef __NR_gettid
    518 #define __NR_gettid             224
    519 #endif
    520 #ifndef __NR_futex
    521 #define __NR_futex              240
    522 #endif
    523 #ifndef __NR_openat
    524 #define __NR_openat             295
    525 #endif
    526 #ifndef __NR_getcpu
    527 #define __NR_getcpu             318
    528 #endif
    529 /* End of i386 definitions                                                   */
    530 #elif defined(__arm__)
    531 #ifndef __syscall
    532 #if defined(__thumb__) || defined(__ARM_EABI__)
    533 #define __SYS_REG(name) register long __sysreg __asm__("r6") = __NR_##name;
    534 #define __SYS_REG_LIST(regs...) [sysreg] "r" (__sysreg) , ##regs
    535 #define __syscall(name) "swi\t0"
    536 #define __syscall_safe(name)                     \
    537   "push  {r7}\n"                                 \
    538   "mov   r7,%[sysreg]\n"                         \
    539   __syscall(name)"\n"                            \
    540   "pop   {r7}"
    541 #else
    542 #define __SYS_REG(name)
    543 #define __SYS_REG_LIST(regs...) regs
    544 #define __syscall(name) "swi\t" __sys1(__NR_##name) ""
    545 #define __syscall_safe(name) __syscall(name)
    546 #endif
    547 #endif
    548 #ifndef __NR_rt_sigaction
    549 #define __NR_rt_sigaction       (__NR_SYSCALL_BASE + 174)
    550 #define __NR_rt_sigprocmask     (__NR_SYSCALL_BASE + 175)
    551 #endif
    552 #ifndef __NR_stat64
    553 #define __NR_stat64             (__NR_SYSCALL_BASE + 195)
    554 #endif
    555 #ifndef __NR_fstat64
    556 #define __NR_fstat64            (__NR_SYSCALL_BASE + 197)
    557 #endif
    558 #ifndef __NR_getdents64
    559 #define __NR_getdents64         (__NR_SYSCALL_BASE + 217)
    560 #endif
    561 #ifndef __NR_gettid
    562 #define __NR_gettid             (__NR_SYSCALL_BASE + 224)
    563 #endif
    564 #ifndef __NR_futex
    565 #define __NR_futex              (__NR_SYSCALL_BASE + 240)
    566 #endif
    567 /* End of ARM definitions                                                  */
    568 #elif defined(__x86_64__)
    569 #ifndef __NR_gettid
    570 #define __NR_gettid             186
    571 #endif
    572 #ifndef __NR_futex
    573 #define __NR_futex              202
    574 #endif
    575 #ifndef __NR_getdents64
    576 #define __NR_getdents64         217
    577 #endif
    578 #ifndef __NR_openat
    579 #define __NR_openat             257
    580 #endif
    581 /* End of x86-64 definitions                                                 */
    582 #elif defined(__mips__)
    583 #if _MIPS_SIM == _MIPS_SIM_ABI32
    584 #ifndef __NR_rt_sigaction
    585 #define __NR_rt_sigaction       (__NR_Linux + 194)
    586 #define __NR_rt_sigprocmask     (__NR_Linux + 195)
    587 #endif
    588 #ifndef __NR_stat64
    589 #define __NR_stat64             (__NR_Linux + 213)
    590 #endif
    591 #ifndef __NR_fstat64
    592 #define __NR_fstat64            (__NR_Linux + 215)
    593 #endif
    594 #ifndef __NR_getdents64
    595 #define __NR_getdents64         (__NR_Linux + 219)
    596 #endif
    597 #ifndef __NR_gettid
    598 #define __NR_gettid             (__NR_Linux + 222)
    599 #endif
    600 #ifndef __NR_futex
    601 #define __NR_futex              (__NR_Linux + 238)
    602 #endif
    603 #ifndef __NR_openat
    604 #define __NR_openat             (__NR_Linux + 288)
    605 #endif
    606 #ifndef __NR_fstatat
    607 #define __NR_fstatat            (__NR_Linux + 293)
    608 #endif
    609 #ifndef __NR_getcpu
    610 #define __NR_getcpu             (__NR_Linux + 312)
    611 #endif
    612 /* End of MIPS (old 32bit API) definitions */
    613 #elif  _MIPS_SIM == _MIPS_SIM_ABI64
    614 #ifndef __NR_gettid
    615 #define __NR_gettid             (__NR_Linux + 178)
    616 #endif
    617 #ifndef __NR_futex
    618 #define __NR_futex              (__NR_Linux + 194)
    619 #endif
    620 #ifndef __NR_openat
    621 #define __NR_openat             (__NR_Linux + 247)
    622 #endif
    623 #ifndef __NR_fstatat
    624 #define __NR_fstatat            (__NR_Linux + 252)
    625 #endif
    626 #ifndef __NR_getcpu
    627 #define __NR_getcpu             (__NR_Linux + 271)
    628 #endif
    629 /* End of MIPS (64bit API) definitions */
    630 #else
    631 #ifndef __NR_gettid
    632 #define __NR_gettid             (__NR_Linux + 178)
    633 #endif
    634 #ifndef __NR_futex
    635 #define __NR_futex              (__NR_Linux + 194)
    636 #endif
    637 #ifndef __NR_openat
    638 #define __NR_openat             (__NR_Linux + 251)
    639 #endif
    640 #ifndef __NR_fstatat
    641 #define __NR_fstatat            (__NR_Linux + 256)
    642 #endif
    643 #ifndef __NR_getcpu
    644 #define __NR_getcpu             (__NR_Linux + 275)
    645 #endif
    646 /* End of MIPS (new 32bit API) definitions                                   */
    647 #endif
    648 /* End of MIPS definitions                                                   */
    649 #elif defined(__PPC__)
    650 #ifndef __NR_rt_sigaction
    651 #define __NR_rt_sigaction       173
    652 #define __NR_rt_sigprocmask     174
    653 #endif
    654 #ifndef __NR_stat64
    655 #define __NR_stat64             195
    656 #endif
    657 #ifndef __NR_fstat64
    658 #define __NR_fstat64            197
    659 #endif
    660 #ifndef __NR_getdents64
    661 #define __NR_getdents64         202
    662 #endif
    663 #ifndef __NR_gettid
    664 #define __NR_gettid             207
    665 #endif
    666 #ifndef __NR_futex
    667 #define __NR_futex              221
    668 #endif
    669 #ifndef __NR_openat
    670 #define __NR_openat             286
    671 #endif
    672 #ifndef __NR_getcpu
    673 #define __NR_getcpu             302
    674 #endif
    675 /* End of powerpc defininitions                                              */
    676 #endif
    677 
    678 
    679 /* After forking, we must make sure to only call system calls.               */
    680 #if __BOUNDED_POINTERS__
    681   #error "Need to port invocations of syscalls for bounded ptrs"
    682 #else
    683   /* The core dumper and the thread lister get executed after threads
    684    * have been suspended. As a consequence, we cannot call any functions
    685    * that acquire locks. Unfortunately, libc wraps most system calls
    686    * (e.g. in order to implement pthread_atfork, and to make calls
    687    * cancellable), which means we cannot call these functions. Instead,
    688    * we have to call syscall() directly.
    689    */
    690   #undef LSS_ERRNO
    691   #ifdef SYS_ERRNO
    692     /* Allow the including file to override the location of errno. This can
    693      * be useful when using clone() with the CLONE_VM option.
    694      */
    695     #define LSS_ERRNO SYS_ERRNO
    696   #else
    697     #define LSS_ERRNO errno
    698   #endif
    699 
    700   #undef LSS_INLINE
    701   #ifdef SYS_INLINE
    702     #define LSS_INLINE SYS_INLINE
    703   #else
    704     #define LSS_INLINE static inline
    705   #endif
    706 
    707   /* Allow the including file to override the prefix used for all new
    708    * system calls. By default, it will be set to "sys_".
    709    */
    710   #undef LSS_NAME
    711   #ifndef SYS_PREFIX
    712     #define LSS_NAME(name) sys_##name
    713   #elif SYS_PREFIX < 0
    714     #define LSS_NAME(name) name
    715   #elif SYS_PREFIX == 0
    716     #define LSS_NAME(name) sys0_##name
    717   #elif SYS_PREFIX == 1
    718     #define LSS_NAME(name) sys1_##name
    719   #elif SYS_PREFIX == 2
    720     #define LSS_NAME(name) sys2_##name
    721   #elif SYS_PREFIX == 3
    722     #define LSS_NAME(name) sys3_##name
    723   #elif SYS_PREFIX == 4
    724     #define LSS_NAME(name) sys4_##name
    725   #elif SYS_PREFIX == 5
    726     #define LSS_NAME(name) sys5_##name
    727   #elif SYS_PREFIX == 6
    728     #define LSS_NAME(name) sys6_##name
    729   #elif SYS_PREFIX == 7
    730     #define LSS_NAME(name) sys7_##name
    731   #elif SYS_PREFIX == 8
    732     #define LSS_NAME(name) sys8_##name
    733   #elif SYS_PREFIX == 9
    734     #define LSS_NAME(name) sys9_##name
    735   #endif
    736 
    737   #undef  LSS_RETURN
    738   #if (defined(__i386__) || defined(__x86_64__) || defined(__arm__))
    739   /* Failing system calls return a negative result in the range of
    740    * -1..-4095. These are "errno" values with the sign inverted.
    741    */
    742   #define LSS_RETURN(type, res)                                               \
    743     do {                                                                      \
    744       if ((unsigned long)(res) >= (unsigned long)(-4095)) {                   \
    745         LSS_ERRNO = -(res);                                                   \
    746         res = -1;                                                             \
    747       }                                                                       \
    748       return (type) (res);                                                    \
    749     } while (0)
    750   #elif defined(__mips__)
    751   /* On MIPS, failing system calls return -1, and set errno in a
    752    * separate CPU register.
    753    */
    754   #define LSS_RETURN(type, res, err)                                          \
    755     do {                                                                      \
    756       if (err) {                                                              \
    757         LSS_ERRNO = (res);                                                    \
    758         res = -1;                                                             \
    759       }                                                                       \
    760       return (type) (res);                                                    \
    761     } while (0)
    762   #elif defined(__PPC__)
    763   /* On PPC, failing system calls return -1, and set errno in a
    764    * separate CPU register. See linux/unistd.h.
    765    */
    766   #define LSS_RETURN(type, res, err)                                          \
    767    do {                                                                       \
    768      if (err & 0x10000000 ) {                                                 \
    769        LSS_ERRNO = (res);                                                     \
    770        res = -1;                                                              \
    771      }                                                                        \
    772      return (type) (res);                                                     \
    773    } while (0)
    774   #endif
    775   #if defined(__i386__)
    776     #if defined(NO_FRAME_POINTER) && (100 * __GNUC__ + __GNUC_MINOR__ >= 404)
    777       /* This only works for GCC-4.4 and above -- the first version to use
    778          .cfi directives for dwarf unwind info.  */
    779       #define CFI_ADJUST_CFA_OFFSET(adjust)                                   \
    780                   ".cfi_adjust_cfa_offset " #adjust "\n"
    781     #else
    782       #define CFI_ADJUST_CFA_OFFSET(adjust) /**/
    783     #endif
    784 
    785     /* In PIC mode (e.g. when building shared libraries), gcc for i386
    786      * reserves ebx. Unfortunately, most distribution ship with implementations
    787      * of _syscallX() which clobber ebx.
    788      * Also, most definitions of _syscallX() neglect to mark "memory" as being
    789      * clobbered. This causes problems with compilers, that do a better job
    790      * at optimizing across __asm__ calls.
    791      * So, we just have to redefine all of the _syscallX() macros.
    792      */
    793     #undef  LSS_BODY
    794     #define LSS_BODY(type,args...)                                            \
    795       long __res;                                                             \
    796       __asm__ __volatile__("push %%ebx\n"                                     \
    797                            CFI_ADJUST_CFA_OFFSET(4)                           \
    798                            "movl %2,%%ebx\n"                                  \
    799                            "int $0x80\n"                                      \
    800                            "pop %%ebx\n"                                      \
    801                            CFI_ADJUST_CFA_OFFSET(-4)                          \
    802                            args                                               \
    803                            : "esp", "memory");                                \
    804       LSS_RETURN(type,__res)
    805     #undef  _syscall0
    806     #define _syscall0(type,name)                                              \
    807       type LSS_NAME(name)(void) {                                             \
    808         long __res;                                                           \
    809         __asm__ volatile("int $0x80"                                          \
    810                          : "=a" (__res)                                       \
    811                          : "0" (__NR_##name)                                  \
    812                          : "memory");                                         \
    813         LSS_RETURN(type,__res);                                               \
    814       }
    815     #undef  _syscall1
    816     #define _syscall1(type,name,type1,arg1)                                   \
    817       type LSS_NAME(name)(type1 arg1) {                                       \
    818         LSS_BODY(type,                                                        \
    819              : "=a" (__res)                                                   \
    820              : "0" (__NR_##name), "ri" ((long)(arg1)));                       \
    821       }
    822     #undef  _syscall2
    823     #define _syscall2(type,name,type1,arg1,type2,arg2)                        \
    824       type LSS_NAME(name)(type1 arg1,type2 arg2) {                            \
    825         LSS_BODY(type,                                                        \
    826              : "=a" (__res)                                                   \
    827              : "0" (__NR_##name),"ri" ((long)(arg1)), "c" ((long)(arg2)));    \
    828       }
    829     #undef  _syscall3
    830     #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)             \
    831       type LSS_NAME(name)(type1 arg1,type2 arg2,type3 arg3) {                 \
    832         LSS_BODY(type,                                                        \
    833              : "=a" (__res)                                                   \
    834              : "0" (__NR_##name), "ri" ((long)(arg1)), "c" ((long)(arg2)),    \
    835                "d" ((long)(arg3)));                                           \
    836       }
    837     #undef  _syscall4
    838     #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)  \
    839       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) {   \
    840         LSS_BODY(type,                                                        \
    841              : "=a" (__res)                                                   \
    842              : "0" (__NR_##name), "ri" ((long)(arg1)), "c" ((long)(arg2)),    \
    843                "d" ((long)(arg3)),"S" ((long)(arg4)));                        \
    844       }
    845     #undef  _syscall5
    846     #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \
    847                       type5,arg5)                                             \
    848       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \
    849                           type5 arg5) {                                       \
    850         long __res;                                                           \
    851         __asm__ __volatile__("push %%ebx\n"                                   \
    852                              "movl %2,%%ebx\n"                                \
    853                              "movl %1,%%eax\n"                                \
    854                              "int  $0x80\n"                                   \
    855                              "pop  %%ebx"                                     \
    856                              : "=a" (__res)                                   \
    857                              : "i" (__NR_##name), "ri" ((long)(arg1)),        \
    858                                "c" ((long)(arg2)), "d" ((long)(arg3)),        \
    859                                "S" ((long)(arg4)), "D" ((long)(arg5))         \
    860                              : "esp", "memory");                              \
    861         LSS_RETURN(type,__res);                                               \
    862       }
    863     #undef  _syscall6
    864     #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \
    865                       type5,arg5,type6,arg6)                                  \
    866       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \
    867                           type5 arg5, type6 arg6) {                           \
    868         long __res;                                                           \
    869         struct { long __a1; long __a6; } __s = { (long)arg1, (long) arg6 };   \
    870         __asm__ __volatile__("push %%ebp\n"                                   \
    871                              "push %%ebx\n"                                   \
    872                              "movl 4(%2),%%ebp\n"                             \
    873                              "movl 0(%2), %%ebx\n"                            \
    874                              "movl %1,%%eax\n"                                \
    875                              "int  $0x80\n"                                   \
    876                              "pop  %%ebx\n"                                   \
    877                              "pop  %%ebp"                                     \
    878                              : "=a" (__res)                                   \
    879                              : "i" (__NR_##name),  "0" ((long)(&__s)),        \
    880                                "c" ((long)(arg2)), "d" ((long)(arg3)),        \
    881                                "S" ((long)(arg4)), "D" ((long)(arg5))         \
    882                              : "esp", "memory");                              \
    883         LSS_RETURN(type,__res);                                               \
    884       }
    885     LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack,
    886                                    int flags, void *arg, int *parent_tidptr,
    887                                    void *newtls, int *child_tidptr) {
    888       long __res;
    889       __asm__ __volatile__(/* if (fn == NULL)
    890                             *   return -EINVAL;
    891                             */
    892                            "movl   %3,%%ecx\n"
    893                            "jecxz  1f\n"
    894 
    895                            /* if (child_stack == NULL)
    896                             *   return -EINVAL;
    897                             */
    898                            "movl   %4,%%ecx\n"
    899                            "jecxz  1f\n"
    900 
    901                            /* Set up alignment of the child stack:
    902                             * child_stack = (child_stack & ~0xF) - 20;
    903                             */
    904                            "andl   $-16,%%ecx\n"
    905                            "subl   $20,%%ecx\n"
    906 
    907                            /* Push "arg" and "fn" onto the stack that will be
    908                             * used by the child.
    909                             */
    910                            "movl   %6,%%eax\n"
    911                            "movl   %%eax,4(%%ecx)\n"
    912                            "movl   %3,%%eax\n"
    913                            "movl   %%eax,(%%ecx)\n"
    914 
    915                            /* %eax = syscall(%eax = __NR_clone,
    916                             *                %ebx = flags,
    917                             *                %ecx = child_stack,
    918                             *                %edx = parent_tidptr,
    919                             *                %esi = newtls,
    920                             *                %edi = child_tidptr)
    921                             * Also, make sure that %ebx gets preserved as it is
    922                             * used in PIC mode.
    923                             */
    924                            "movl   %8,%%esi\n"
    925                            "movl   %7,%%edx\n"
    926                            "movl   %5,%%eax\n"
    927                            "movl   %9,%%edi\n"
    928                            "pushl  %%ebx\n"
    929                            "movl   %%eax,%%ebx\n"
    930                            "movl   %2,%%eax\n"
    931                            "int    $0x80\n"
    932 
    933                            /* In the parent: restore %ebx
    934                             * In the child:  move "fn" into %ebx
    935                             */
    936                            "popl   %%ebx\n"
    937 
    938                            /* if (%eax != 0)
    939                             *   return %eax;
    940                             */
    941                            "test   %%eax,%%eax\n"
    942                            "jnz    1f\n"
    943 
    944                            /* In the child, now. Terminate frame pointer chain.
    945                             */
    946                            "movl   $0,%%ebp\n"
    947 
    948                            /* Call "fn". "arg" is already on the stack.
    949                             */
    950                            "call   *%%ebx\n"
    951 
    952                            /* Call _exit(%ebx). Unfortunately older versions
    953                             * of gcc restrict the number of arguments that can
    954                             * be passed to asm(). So, we need to hard-code the
    955                             * system call number.
    956                             */
    957                            "movl   %%eax,%%ebx\n"
    958                            "movl   $1,%%eax\n"
    959                            "int    $0x80\n"
    960 
    961                            /* Return to parent.
    962                             */
    963                          "1:\n"
    964                            : "=a" (__res)
    965                            : "0"(-EINVAL), "i"(__NR_clone),
    966                              "m"(fn), "m"(child_stack), "m"(flags), "m"(arg),
    967                              "m"(parent_tidptr), "m"(newtls), "m"(child_tidptr)
    968                            : "esp", "memory", "ecx", "edx", "esi", "edi");
    969       LSS_RETURN(int, __res);
    970     }
    971 
    972     LSS_INLINE void (*LSS_NAME(restore_rt)(void))(void) {
    973       /* On i386, the kernel does not know how to return from a signal
    974        * handler. Instead, it relies on user space to provide a
    975        * restorer function that calls the {rt_,}sigreturn() system call.
    976        * Unfortunately, we cannot just reference the glibc version of this
    977        * function, as glibc goes out of its way to make it inaccessible.
    978        */
    979       void (*res)(void);
    980       __asm__ __volatile__("call   2f\n"
    981                          "0:.align 16\n"
    982                          "1:movl   %1,%%eax\n"
    983                            "int    $0x80\n"
    984                          "2:popl   %0\n"
    985                            "addl   $(1b-0b),%0\n"
    986                            : "=a" (res)
    987                            : "i"  (__NR_rt_sigreturn));
    988       return res;
    989     }
    990     LSS_INLINE void (*LSS_NAME(restore)(void))(void) {
    991       /* On i386, the kernel does not know how to return from a signal
    992        * handler. Instead, it relies on user space to provide a
    993        * restorer function that calls the {rt_,}sigreturn() system call.
    994        * Unfortunately, we cannot just reference the glibc version of this
    995        * function, as glibc goes out of its way to make it inaccessible.
    996        */
    997       void (*res)(void);
    998       __asm__ __volatile__("call   2f\n"
    999                          "0:.align 16\n"
   1000                          "1:pop    %%eax\n"
   1001                            "movl   %1,%%eax\n"
   1002                            "int    $0x80\n"
   1003                          "2:popl   %0\n"
   1004                            "addl   $(1b-0b),%0\n"
   1005                            : "=a" (res)
   1006                            : "i"  (__NR_sigreturn));
   1007       return res;
   1008     }
   1009   #elif defined(__x86_64__)
   1010     /* There are no known problems with any of the _syscallX() macros
   1011      * currently shipping for x86_64, but we still need to be able to define
   1012      * our own version so that we can override the location of the errno
   1013      * location (e.g. when using the clone() system call with the CLONE_VM
   1014      * option).
   1015      */
   1016     #undef  LSS_BODY
   1017     #define LSS_BODY(type,name, ...)                                          \
   1018           long __res;                                                         \
   1019           __asm__ __volatile__("syscall" : "=a" (__res) : "0" (__NR_##name),  \
   1020             ##__VA_ARGS__ : "r11", "rcx", "memory");                          \
   1021           LSS_RETURN(type, __res)
   1022     #undef _syscall0
   1023     #define _syscall0(type,name)                                              \
   1024       type LSS_NAME(name)() {                                                 \
   1025         LSS_BODY(type, name);                                                 \
   1026       }
   1027     #undef _syscall1
   1028     #define _syscall1(type,name,type1,arg1)                                   \
   1029       type LSS_NAME(name)(type1 arg1) {                                       \
   1030         LSS_BODY(type, name, "D" ((long)(arg1)));                             \
   1031       }
   1032     #undef _syscall2
   1033     #define _syscall2(type,name,type1,arg1,type2,arg2)                        \
   1034       type LSS_NAME(name)(type1 arg1, type2 arg2) {                           \
   1035         LSS_BODY(type, name, "D" ((long)(arg1)), "S" ((long)(arg2)));         \
   1036       }
   1037     #undef _syscall3
   1038     #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)             \
   1039       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) {               \
   1040         LSS_BODY(type, name, "D" ((long)(arg1)), "S" ((long)(arg2)),          \
   1041                              "d" ((long)(arg3)));                             \
   1042       }
   1043     #undef _syscall4
   1044     #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)  \
   1045       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) {   \
   1046           long __res;                                                         \
   1047           __asm__ __volatile__("movq %5,%%r10; syscall" :                     \
   1048             "=a" (__res) : "0" (__NR_##name),                                 \
   1049             "D" ((long)(arg1)), "S" ((long)(arg2)), "d" ((long)(arg3)),       \
   1050             "r" ((long)(arg4)) : "r10", "r11", "rcx", "memory");              \
   1051           LSS_RETURN(type, __res);                                            \
   1052       }
   1053     #undef _syscall5
   1054     #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \
   1055                       type5,arg5)                                             \
   1056       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \
   1057                           type5 arg5) {                                       \
   1058           long __res;                                                         \
   1059           __asm__ __volatile__("movq %5,%%r10; movq %6,%%r8; syscall" :       \
   1060             "=a" (__res) : "0" (__NR_##name),                                 \
   1061             "D" ((long)(arg1)), "S" ((long)(arg2)), "d" ((long)(arg3)),       \
   1062             "r" ((long)(arg4)), "r" ((long)(arg5)) :                          \
   1063             "r8", "r10", "r11", "rcx", "memory");                             \
   1064           LSS_RETURN(type, __res);                                            \
   1065       }
   1066     #undef _syscall6
   1067     #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \
   1068                       type5,arg5,type6,arg6)                                  \
   1069       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \
   1070                           type5 arg5, type6 arg6) {                           \
   1071           long __res;                                                         \
   1072           __asm__ __volatile__("movq %5,%%r10; movq %6,%%r8; movq %7,%%r9;"   \
   1073                                "syscall" :                                    \
   1074             "=a" (__res) : "0" (__NR_##name),                                 \
   1075             "D" ((long)(arg1)), "S" ((long)(arg2)), "d" ((long)(arg3)),       \
   1076             "r" ((long)(arg4)), "r" ((long)(arg5)), "r" ((long)(arg6)) :      \
   1077             "r8", "r9", "r10", "r11", "rcx", "memory");                       \
   1078           LSS_RETURN(type, __res);                                            \
   1079       }
   1080     LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack,
   1081                                    int flags, void *arg, int *parent_tidptr,
   1082                                    void *newtls, int *child_tidptr) {
   1083       long __res;
   1084       {
   1085         __asm__ __volatile__(/* if (fn == NULL)
   1086                               *   return -EINVAL;
   1087                               */
   1088                              "testq  %4,%4\n"
   1089                              "jz     1f\n"
   1090 
   1091                              /* if (child_stack == NULL)
   1092                               *   return -EINVAL;
   1093                               */
   1094                              "testq  %5,%5\n"
   1095                              "jz     1f\n"
   1096 
   1097                              /* Set up alignment of the child stack:
   1098                               * child_stack = (child_stack & ~0xF) - 16;
   1099                               */
   1100                              "andq   $-16,%5\n"
   1101                              "subq   $16,%5\n"
   1102 
   1103                              /* Push "arg" and "fn" onto the stack that will be
   1104                               * used by the child.
   1105                               */
   1106                              "movq   %7,8(%5)\n"
   1107                              "movq   %4,0(%5)\n"
   1108 
   1109                              /* %rax = syscall(%rax = __NR_clone,
   1110                               *                %rdi = flags,
   1111                               *                %rsi = child_stack,
   1112                               *                %rdx = parent_tidptr,
   1113                               *                %r8  = new_tls,
   1114                               *                %r10 = child_tidptr)
   1115                               */
   1116                              "movq   %2,%%rax\n"
   1117                              "movq   %9,%%r8\n"
   1118                              "movq   %10,%%r10\n"
   1119                              "syscall\n"
   1120 
   1121                              /* if (%rax != 0)
   1122                               *   return;
   1123                               */
   1124                              "testq  %%rax,%%rax\n"
   1125                              "jnz    1f\n"
   1126 
   1127                              /* In the child. Terminate frame pointer chain.
   1128                               */
   1129                              "xorq   %%rbp,%%rbp\n"
   1130 
   1131                              /* Call "fn(arg)".
   1132                               */
   1133                              "popq   %%rax\n"
   1134                              "popq   %%rdi\n"
   1135                              "call   *%%rax\n"
   1136 
   1137                              /* Call _exit(%ebx).
   1138                               */
   1139                              "movq   %%rax,%%rdi\n"
   1140                              "movq   %3,%%rax\n"
   1141                              "syscall\n"
   1142 
   1143                              /* Return to parent.
   1144                               */
   1145                            "1:\n"
   1146                              : "=a" (__res)
   1147                              : "0"(-EINVAL), "i"(__NR_clone), "i"(__NR_exit),
   1148                                "r"(fn), "S"(child_stack), "D"(flags), "r"(arg),
   1149                                "d"(parent_tidptr), "g"(newtls), "g"(child_tidptr)
   1150                              : "rsp", "memory", "r8", "r10", "r11", "rcx");
   1151       }
   1152       LSS_RETURN(int, __res);
   1153     }
   1154 
   1155     LSS_INLINE void (*LSS_NAME(restore_rt)(void))(void) {
   1156       /* On x86-64, the kernel does not know how to return from
   1157        * a signal handler. Instead, it relies on user space to provide a
   1158        * restorer function that calls the rt_sigreturn() system call.
   1159        * Unfortunately, we cannot just reference the glibc version of this
   1160        * function, as glibc goes out of its way to make it inaccessible.
   1161        */
   1162       void (*res)(void);
   1163       __asm__ __volatile__("call   2f\n"
   1164                          "0:.align 16\n"
   1165                          "1:movq   %1,%%rax\n"
   1166                            "syscall\n"
   1167                          "2:popq   %0\n"
   1168                            "addq   $(1b-0b),%0\n"
   1169                            : "=a" (res)
   1170                            : "i"  (__NR_rt_sigreturn));
   1171       return res;
   1172     }
   1173   #elif defined(__arm__)
   1174     /* Most definitions of _syscallX() neglect to mark "memory" as being
   1175      * clobbered. This causes problems with compilers, that do a better job
   1176      * at optimizing across __asm__ calls.
   1177      * So, we just have to redefine all fo the _syscallX() macros.
   1178      */
   1179     #undef LSS_REG
   1180     #define LSS_REG(r,a) register long __r##r __asm__("r"#r) = (long)a
   1181 
   1182     /* r0..r3 are scratch registers and not preserved across function
   1183      * calls.  We need to first evaluate the first 4 syscall arguments
   1184      * and store them on stack.  They must be loaded into r0..r3 after
   1185      * all function calls to avoid r0..r3 being clobbered.
   1186      */
   1187     #undef LSS_SAVE_ARG
   1188     #define LSS_SAVE_ARG(r,a) long __tmp##r = (long)a
   1189     #undef LSS_LOAD_ARG
   1190     #define LSS_LOAD_ARG(r) register long __r##r __asm__("r"#r) = __tmp##r
   1191 
   1192     #undef  LSS_BODY
   1193     #define LSS_BODY(type, name, args...)                                     \
   1194           register long __res_r0 __asm__("r0");                               \
   1195           long __res;                                                         \
   1196           __SYS_REG(name)                                                     \
   1197           __asm__ __volatile__ (__syscall_safe(name)                          \
   1198                                 : "=r"(__res_r0)                              \
   1199                                 : __SYS_REG_LIST(args)                        \
   1200                                 : "lr", "memory");                            \
   1201           __res = __res_r0;                                                   \
   1202           LSS_RETURN(type, __res)
   1203     #undef _syscall0
   1204     #define _syscall0(type, name)                                             \
   1205       type LSS_NAME(name)() {                                                 \
   1206         LSS_BODY(type, name);                                                 \
   1207       }
   1208     #undef _syscall1
   1209     #define _syscall1(type, name, type1, arg1)                                \
   1210       type LSS_NAME(name)(type1 arg1) {                                       \
   1211         /* There is no need for using a volatile temp.  */                    \
   1212         LSS_REG(0, arg1);                                                     \
   1213         LSS_BODY(type, name, "r"(__r0));                                      \
   1214       }
   1215     #undef _syscall2
   1216     #define _syscall2(type, name, type1, arg1, type2, arg2)                   \
   1217       type LSS_NAME(name)(type1 arg1, type2 arg2) {                           \
   1218         LSS_SAVE_ARG(0, arg1);                                                \
   1219         LSS_SAVE_ARG(1, arg2);                                                \
   1220         LSS_LOAD_ARG(0);                                                      \
   1221         LSS_LOAD_ARG(1);                                                      \
   1222         LSS_BODY(type, name, "r"(__r0), "r"(__r1));                           \
   1223       }
   1224     #undef _syscall3
   1225     #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3)      \
   1226       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) {               \
   1227         LSS_SAVE_ARG(0, arg1);                                                \
   1228         LSS_SAVE_ARG(1, arg2);                                                \
   1229         LSS_SAVE_ARG(2, arg3);                                                \
   1230         LSS_LOAD_ARG(0);                                                      \
   1231         LSS_LOAD_ARG(1);                                                      \
   1232         LSS_LOAD_ARG(2);                                                      \
   1233         LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2));                \
   1234       }
   1235     #undef _syscall4
   1236     #define _syscall4(type, name, type1, arg1, type2, arg2, type3, arg3,      \
   1237                       type4, arg4)                                            \
   1238       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) {   \
   1239         LSS_SAVE_ARG(0, arg1);                                                \
   1240         LSS_SAVE_ARG(1, arg2);                                                \
   1241         LSS_SAVE_ARG(2, arg3);                                                \
   1242         LSS_SAVE_ARG(3, arg4);                                                \
   1243         LSS_LOAD_ARG(0);                                                      \
   1244         LSS_LOAD_ARG(1);                                                      \
   1245         LSS_LOAD_ARG(2);                                                      \
   1246         LSS_LOAD_ARG(3);                                                      \
   1247         LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3));     \
   1248       }
   1249     #undef _syscall5
   1250     #define _syscall5(type, name, type1, arg1, type2, arg2, type3, arg3,      \
   1251                       type4, arg4, type5, arg5)                               \
   1252       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \
   1253                           type5 arg5) {                                       \
   1254         LSS_SAVE_ARG(0, arg1);                                                \
   1255         LSS_SAVE_ARG(1, arg2);                                                \
   1256         LSS_SAVE_ARG(2, arg3);                                                \
   1257         LSS_SAVE_ARG(3, arg4);                                                \
   1258         LSS_REG(4, arg5);                                                     \
   1259         LSS_LOAD_ARG(0);                                                      \
   1260         LSS_LOAD_ARG(1);                                                      \
   1261         LSS_LOAD_ARG(2);                                                      \
   1262         LSS_LOAD_ARG(3);                                                      \
   1263         LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3),      \
   1264                              "r"(__r4));                                      \
   1265       }
   1266     #undef _syscall6
   1267     #define _syscall6(type, name, type1, arg1, type2, arg2, type3, arg3,      \
   1268                       type4, arg4, type5, arg5, type6, arg6)                  \
   1269       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \
   1270                           type5 arg5, type6 arg6) {                           \
   1271         LSS_SAVE_ARG(0, arg1);                                                \
   1272         LSS_SAVE_ARG(1, arg2);                                                \
   1273         LSS_SAVE_ARG(2, arg3);                                                \
   1274         LSS_SAVE_ARG(3, arg4);                                                \
   1275         LSS_REG(4, arg5);                                                     \
   1276         LSS_REG(5, arg6);                                                     \
   1277         LSS_LOAD_ARG(0);                                                      \
   1278         LSS_LOAD_ARG(1);                                                      \
   1279         LSS_LOAD_ARG(2);                                                      \
   1280         LSS_LOAD_ARG(3);                                                      \
   1281         LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3),      \
   1282                              "r"(__r4), "r"(__r5));                           \
   1283       }
   1284     LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack,
   1285                                    int flags, void *arg, int *parent_tidptr,
   1286                                    void *newtls, int *child_tidptr) {
   1287       register long __res __asm__("r5");
   1288       {
   1289         if (fn == NULL || child_stack == NULL) {
   1290             __res = -EINVAL;
   1291             goto clone_exit;
   1292         }
   1293 
   1294         /* stash first 4 arguments on stack first because we can only load
   1295          * them after all function calls.
   1296          */
   1297         int    tmp_flags = flags;
   1298         int  * tmp_stack = (int*) child_stack;
   1299         void * tmp_ptid  = parent_tidptr;
   1300         void * tmp_tls   = newtls;
   1301 
   1302         register int  *__ctid  __asm__("r4") = child_tidptr;
   1303 
   1304         /* Push "arg" and "fn" onto the stack that will be
   1305          * used by the child.
   1306          */
   1307         *(--tmp_stack) = (int) arg;
   1308         *(--tmp_stack) = (int) fn;
   1309 
   1310         /* We must load r0..r3 last after all possible function calls.  */
   1311         register int   __flags __asm__("r0") = tmp_flags;
   1312         register void *__stack __asm__("r1") = tmp_stack;
   1313         register void *__ptid  __asm__("r2") = tmp_ptid;
   1314         register void *__tls   __asm__("r3") = tmp_tls;
   1315 
   1316         /* %r0 = syscall(%r0 = flags,
   1317          *               %r1 = child_stack,
   1318          *               %r2 = parent_tidptr,
   1319          *               %r3 = newtls,
   1320          *               %r4 = child_tidptr)
   1321          */
   1322         __SYS_REG(clone)
   1323         __asm__ __volatile__(/* %r0 = syscall(%r0 = flags,
   1324                               *               %r1 = child_stack,
   1325                               *               %r2 = parent_tidptr,
   1326                               *               %r3 = newtls,
   1327                               *               %r4 = child_tidptr)
   1328                               */
   1329                              "push  {r7}\n"
   1330                              "mov   r7,%1\n"
   1331                              __syscall(clone)"\n"
   1332 
   1333                              /* if (%r0 != 0)
   1334                               *   return %r0;
   1335                               */
   1336                              "movs  %0,r0\n"
   1337                              "bne   1f\n"
   1338 
   1339                              /* In the child, now. Call "fn(arg)".
   1340                               */
   1341                              "ldr   r0,[sp, #4]\n"
   1342                              "mov   lr,pc\n"
   1343                              "ldr   pc,[sp]\n"
   1344 
   1345                              /* Call _exit(%r0), which never returns.  We only
   1346                               * need to set r7 for EABI syscall ABI but we do
   1347                               * this always to simplify code sharing between
   1348                               * old and new syscall ABIs.
   1349                               */
   1350                              "mov   r7,%2\n"
   1351                              __syscall(exit)"\n"
   1352 
   1353                              /* Pop r7 from the stack only in the parent.
   1354                               */
   1355                            "1: pop {r7}\n"
   1356                              : "=r" (__res)
   1357                              : "r"(__sysreg),
   1358                                "i"(__NR_exit), "r"(__stack), "r"(__flags),
   1359                                "r"(__ptid), "r"(__tls), "r"(__ctid)
   1360                              : "cc", "lr", "memory");
   1361       }
   1362       clone_exit:
   1363       LSS_RETURN(int, __res);
   1364     }
   1365   #elif defined(__mips__)
   1366     #undef LSS_REG
   1367     #define LSS_REG(r,a) register unsigned long __r##r __asm__("$"#r) =       \
   1368                                  (unsigned long)(a)
   1369 
   1370     #if _MIPS_SIM == _MIPS_SIM_ABI32
   1371     // See http://sources.redhat.com/ml/libc-alpha/2004-10/msg00050.html
   1372     // or http://www.linux-mips.org/archives/linux-mips/2004-10/msg00142.html
   1373     #define MIPS_SYSCALL_CLOBBERS "$1", "$3", "$8", "$9", "$10", "$11", "$12",\
   1374                                 "$13", "$14", "$15", "$24", "$25", "memory"
   1375     #else
   1376     #define MIPS_SYSCALL_CLOBBERS "$1", "$3", "$10", "$11", "$12", "$13",     \
   1377                                 "$14", "$15", "$24", "$25", "memory"
   1378     #endif
   1379 
   1380     #undef  LSS_BODY
   1381     #define LSS_BODY(type,name,r7,...)                                        \
   1382           register unsigned long __v0 __asm__("$2") = __NR_##name;            \
   1383           __asm__ __volatile__ ("syscall\n"                                   \
   1384                                 : "=&r"(__v0), r7 (__r7)                      \
   1385                                 : "0"(__v0), ##__VA_ARGS__                    \
   1386                                 : MIPS_SYSCALL_CLOBBERS);                     \
   1387           LSS_RETURN(type, __v0, __r7)
   1388     #undef _syscall0
   1389     #define _syscall0(type, name)                                             \
   1390       type LSS_NAME(name)() {                                                 \
   1391         register unsigned long __r7 __asm__("$7");                            \
   1392         LSS_BODY(type, name, "=r");                                           \
   1393       }
   1394     #undef _syscall1
   1395     #define _syscall1(type, name, type1, arg1)                                \
   1396       type LSS_NAME(name)(type1 arg1) {                                       \
   1397         register unsigned long __r7 __asm__("$7");                            \
   1398         LSS_REG(4, arg1); LSS_BODY(type, name, "=r", "r"(__r4));              \
   1399       }
   1400     #undef _syscall2
   1401     #define _syscall2(type, name, type1, arg1, type2, arg2)                   \
   1402       type LSS_NAME(name)(type1 arg1, type2 arg2) {                           \
   1403         register unsigned long __r7 __asm__("$7");                            \
   1404         LSS_REG(4, arg1); LSS_REG(5, arg2);                                   \
   1405         LSS_BODY(type, name, "=r", "r"(__r4), "r"(__r5));                     \
   1406       }
   1407     #undef _syscall3
   1408     #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3)      \
   1409       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) {               \
   1410         register unsigned long __r7 __asm__("$7");                            \
   1411         LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3);                 \
   1412         LSS_BODY(type, name, "=r", "r"(__r4), "r"(__r5), "r"(__r6));          \
   1413       }
   1414     #undef _syscall4
   1415     #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)  \
   1416       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) {   \
   1417         LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3);                 \
   1418         LSS_REG(7, arg4);                                                     \
   1419         LSS_BODY(type, name, "+r", "r"(__r4), "r"(__r5), "r"(__r6));          \
   1420       }
   1421     #undef _syscall5
   1422     #if _MIPS_SIM == _MIPS_SIM_ABI32
   1423     /* The old 32bit MIPS system call API passes the fifth and sixth argument
   1424      * on the stack, whereas the new APIs use registers "r8" and "r9".
   1425      */
   1426     #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \
   1427                       type5,arg5)                                             \
   1428       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \
   1429                           type5 arg5) {                                       \
   1430         LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3);                 \
   1431         LSS_REG(7, arg4);                                                     \
   1432         register unsigned long __v0 __asm__("$2");                            \
   1433         __asm__ __volatile__ (".set noreorder\n"                              \
   1434                               "lw    $2, %6\n"                                \
   1435                               "subu  $29, 32\n"                               \
   1436                               "sw    $2, 16($29)\n"                           \
   1437                               "li    $2, %2\n"                                \
   1438                               "syscall\n"                                     \
   1439                               "addiu $29, 32\n"                               \
   1440                               ".set reorder\n"                                \
   1441                               : "=&r"(__v0), "+r" (__r7)                      \
   1442                               : "i" (__NR_##name), "r"(__r4), "r"(__r5),      \
   1443                                 "r"(__r6), "m" ((unsigned long)arg5)          \
   1444                               : MIPS_SYSCALL_CLOBBERS);                       \
   1445         LSS_RETURN(type, __v0, __r7);                                         \
   1446       }
   1447     #else
   1448     #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \
   1449                       type5,arg5)                                             \
   1450       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \
   1451                           type5 arg5) {                                       \
   1452         LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3);                 \
   1453         LSS_REG(7, arg4); LSS_REG(8, arg5);                                   \
   1454         LSS_BODY(type, name, "+r", "r"(__r4), "r"(__r5), "r"(__r6),           \
   1455                  "r"(__r8));                                                  \
   1456       }
   1457     #endif
   1458     #undef _syscall6
   1459     #if _MIPS_SIM == _MIPS_SIM_ABI32
   1460     /* The old 32bit MIPS system call API passes the fifth and sixth argument
   1461      * on the stack, whereas the new APIs use registers "r8" and "r9".
   1462      */
   1463     #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \
   1464                       type5,arg5,type6,arg6)                                  \
   1465       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \
   1466                           type5 arg5, type6 arg6) {                           \
   1467         LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3);                 \
   1468         LSS_REG(7, arg4);                                                     \
   1469         register unsigned long __v0 __asm__("$2");                            \
   1470         __asm__ __volatile__ (".set noreorder\n"                              \
   1471                               "lw    $2, %6\n"                                \
   1472                               "lw    $8, %7\n"                                \
   1473                               "subu  $29, 32\n"                               \
   1474                               "sw    $2, 16($29)\n"                           \
   1475                               "sw    $8, 20($29)\n"                           \
   1476                               "li    $2, %2\n"                                \
   1477                               "syscall\n"                                     \
   1478                               "addiu $29, 32\n"                               \
   1479                               ".set reorder\n"                                \
   1480                               : "=&r"(__v0), "+r" (__r7)                      \
   1481                               : "i" (__NR_##name), "r"(__r4), "r"(__r5),      \
   1482                                 "r"(__r6), "r" ((unsigned long)arg5),         \
   1483                                 "r" ((unsigned long)arg6)                     \
   1484                               : MIPS_SYSCALL_CLOBBERS);                       \
   1485         LSS_RETURN(type, __v0, __r7);                                         \
   1486       }
   1487     #else
   1488     #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \
   1489                       type5,arg5,type6,arg6)                                  \
   1490       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \
   1491                           type5 arg5,type6 arg6) {                            \
   1492         LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3);                 \
   1493         LSS_REG(7, arg4); LSS_REG(8, arg5); LSS_REG(9, arg6);                 \
   1494         LSS_BODY(type, name, "+r", "r"(__r4), "r"(__r5), "r"(__r6),           \
   1495                  "r"(__r8), "r"(__r9));                                       \
   1496       }
   1497     #endif
   1498     LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack,
   1499                                    int flags, void *arg, int *parent_tidptr,
   1500                                    void *newtls, int *child_tidptr) {
   1501       register unsigned long __v0 __asm__("$2");
   1502       register unsigned long __r7 __asm__("$7") = (unsigned long)newtls;
   1503       {
   1504         register int   __flags __asm__("$4") = flags;
   1505         register void *__stack __asm__("$5") = child_stack;
   1506         register void *__ptid  __asm__("$6") = parent_tidptr;
   1507         register int  *__ctid  __asm__("$8") = child_tidptr;
   1508         __asm__ __volatile__(
   1509           #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32
   1510                              "subu  $29,24\n"
   1511           #elif _MIPS_SIM == _MIPS_SIM_NABI32
   1512                              "sub   $29,16\n"
   1513           #else
   1514                              "dsubu $29,16\n"
   1515           #endif
   1516 
   1517                              /* if (fn == NULL || child_stack == NULL)
   1518                               *   return -EINVAL;
   1519                               */
   1520                              "li    %0,%2\n"
   1521                              "beqz  %5,1f\n"
   1522                              "beqz  %6,1f\n"
   1523 
   1524                              /* Push "arg" and "fn" onto the stack that will be
   1525                               * used by the child.
   1526                               */
   1527           #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32
   1528                              "subu  %6,32\n"
   1529                              "sw    %5,0(%6)\n"
   1530                              "sw    %8,4(%6)\n"
   1531           #elif _MIPS_SIM == _MIPS_SIM_NABI32
   1532                              "sub   %6,32\n"
   1533                              "sw    %5,0(%6)\n"
   1534                              "sw    %8,8(%6)\n"
   1535           #else
   1536                              "dsubu %6,32\n"
   1537                              "sd    %5,0(%6)\n"
   1538                              "sd    %8,8(%6)\n"
   1539           #endif
   1540 
   1541                              /* $7 = syscall($4 = flags,
   1542                               *              $5 = child_stack,
   1543                               *              $6 = parent_tidptr,
   1544                               *              $7 = newtls,
   1545                               *              $8 = child_tidptr)
   1546                               */
   1547                              "li    $2,%3\n"
   1548                              "syscall\n"
   1549 
   1550                              /* if ($7 != 0)
   1551                               *   return $2;
   1552                               */
   1553                              "bnez  $7,1f\n"
   1554                              "bnez  $2,1f\n"
   1555 
   1556                              /* In the child, now. Call "fn(arg)".
   1557                               */
   1558           #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32
   1559                             "lw    $25,0($29)\n"
   1560                             "lw    $4,4($29)\n"
   1561           #elif _MIPS_SIM == _MIPS_SIM_NABI32
   1562                             "lw    $25,0($29)\n"
   1563                             "lw    $4,8($29)\n"
   1564           #else
   1565                             "ld    $25,0($29)\n"
   1566                             "ld    $4,8($29)\n"
   1567           #endif
   1568                             "jalr  $25\n"
   1569 
   1570                              /* Call _exit($2)
   1571                               */
   1572                             "move  $4,$2\n"
   1573                             "li    $2,%4\n"
   1574                             "syscall\n"
   1575 
   1576                            "1:\n"
   1577           #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32
   1578                              "addu  $29, 24\n"
   1579           #elif _MIPS_SIM == _MIPS_SIM_NABI32
   1580                              "add   $29, 16\n"
   1581           #else
   1582                              "daddu $29,16\n"
   1583           #endif
   1584                              : "=&r" (__v0), "=r" (__r7)
   1585                              : "i"(-EINVAL), "i"(__NR_clone), "i"(__NR_exit),
   1586                                "r"(fn), "r"(__stack), "r"(__flags), "r"(arg),
   1587                                "r"(__ptid), "r"(__r7), "r"(__ctid)
   1588                              : "$9", "$10", "$11", "$12", "$13", "$14", "$15",
   1589                                "$24", "memory");
   1590       }
   1591       LSS_RETURN(int, __v0, __r7);
   1592     }
   1593   #elif defined (__PPC__)
   1594     #undef  LSS_LOADARGS_0
   1595     #define LSS_LOADARGS_0(name, dummy...)                                    \
   1596         __sc_0 = __NR_##name
   1597     #undef  LSS_LOADARGS_1
   1598     #define LSS_LOADARGS_1(name, arg1)                                        \
   1599             LSS_LOADARGS_0(name);                                             \
   1600             __sc_3 = (unsigned long) (arg1)
   1601     #undef  LSS_LOADARGS_2
   1602     #define LSS_LOADARGS_2(name, arg1, arg2)                                  \
   1603             LSS_LOADARGS_1(name, arg1);                                       \
   1604             __sc_4 = (unsigned long) (arg2)
   1605     #undef  LSS_LOADARGS_3
   1606     #define LSS_LOADARGS_3(name, arg1, arg2, arg3)                            \
   1607             LSS_LOADARGS_2(name, arg1, arg2);                                 \
   1608             __sc_5 = (unsigned long) (arg3)
   1609     #undef  LSS_LOADARGS_4
   1610     #define LSS_LOADARGS_4(name, arg1, arg2, arg3, arg4)                      \
   1611             LSS_LOADARGS_3(name, arg1, arg2, arg3);                           \
   1612             __sc_6 = (unsigned long) (arg4)
   1613     #undef  LSS_LOADARGS_5
   1614     #define LSS_LOADARGS_5(name, arg1, arg2, arg3, arg4, arg5)                \
   1615             LSS_LOADARGS_4(name, arg1, arg2, arg3, arg4);                     \
   1616             __sc_7 = (unsigned long) (arg5)
   1617     #undef  LSS_LOADARGS_6
   1618     #define LSS_LOADARGS_6(name, arg1, arg2, arg3, arg4, arg5, arg6)          \
   1619             LSS_LOADARGS_5(name, arg1, arg2, arg3, arg4, arg5);               \
   1620             __sc_8 = (unsigned long) (arg6)
   1621     #undef  LSS_ASMINPUT_0
   1622     #define LSS_ASMINPUT_0 "0" (__sc_0)
   1623     #undef  LSS_ASMINPUT_1
   1624     #define LSS_ASMINPUT_1 LSS_ASMINPUT_0, "1" (__sc_3)
   1625     #undef  LSS_ASMINPUT_2
   1626     #define LSS_ASMINPUT_2 LSS_ASMINPUT_1, "2" (__sc_4)
   1627     #undef  LSS_ASMINPUT_3
   1628     #define LSS_ASMINPUT_3 LSS_ASMINPUT_2, "3" (__sc_5)
   1629     #undef  LSS_ASMINPUT_4
   1630     #define LSS_ASMINPUT_4 LSS_ASMINPUT_3, "4" (__sc_6)
   1631     #undef  LSS_ASMINPUT_5
   1632     #define LSS_ASMINPUT_5 LSS_ASMINPUT_4, "5" (__sc_7)
   1633     #undef  LSS_ASMINPUT_6
   1634     #define LSS_ASMINPUT_6 LSS_ASMINPUT_5, "6" (__sc_8)
   1635     #undef  LSS_BODY
   1636     #define LSS_BODY(nr, type, name, args...)                                 \
   1637         long __sc_ret, __sc_err;                                              \
   1638         {                                                                     \
   1639                         register unsigned long __sc_0 __asm__ ("r0");         \
   1640                         register unsigned long __sc_3 __asm__ ("r3");         \
   1641                         register unsigned long __sc_4 __asm__ ("r4");         \
   1642                         register unsigned long __sc_5 __asm__ ("r5");         \
   1643                         register unsigned long __sc_6 __asm__ ("r6");         \
   1644                         register unsigned long __sc_7 __asm__ ("r7");         \
   1645                         register unsigned long __sc_8 __asm__ ("r8");         \
   1646                                                                               \
   1647             LSS_LOADARGS_##nr(name, args);                                    \
   1648             __asm__ __volatile__                                              \
   1649                 ("sc\n\t"                                                     \
   1650                  "mfcr %0"                                                    \
   1651                  : "=&r" (__sc_0),                                            \
   1652                    "=&r" (__sc_3), "=&r" (__sc_4),                            \
   1653                    "=&r" (__sc_5), "=&r" (__sc_6),                            \
   1654                    "=&r" (__sc_7), "=&r" (__sc_8)                             \
   1655                  : LSS_ASMINPUT_##nr                                          \
   1656                  : "cr0", "ctr", "memory",                                    \
   1657                    "r9", "r10", "r11", "r12");                                \
   1658             __sc_ret = __sc_3;                                                \
   1659             __sc_err = __sc_0;                                                \
   1660         }                                                                     \
   1661         LSS_RETURN(type, __sc_ret, __sc_err)
   1662     #undef _syscall0
   1663     #define _syscall0(type, name)                                             \
   1664        type LSS_NAME(name)(void) {                                            \
   1665           LSS_BODY(0, type, name);                                            \
   1666        }
   1667     #undef _syscall1
   1668     #define _syscall1(type, name, type1, arg1)                                \
   1669        type LSS_NAME(name)(type1 arg1) {                                      \
   1670           LSS_BODY(1, type, name, arg1);                                      \
   1671        }
   1672     #undef _syscall2
   1673     #define _syscall2(type, name, type1, arg1, type2, arg2)                   \
   1674        type LSS_NAME(name)(type1 arg1, type2 arg2) {                          \
   1675           LSS_BODY(2, type, name, arg1, arg2);                                \
   1676        }
   1677     #undef _syscall3
   1678     #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3)      \
   1679        type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) {              \
   1680           LSS_BODY(3, type, name, arg1, arg2, arg3);                          \
   1681        }
   1682     #undef _syscall4
   1683     #define _syscall4(type, name, type1, arg1, type2, arg2, type3, arg3,      \
   1684                                   type4, arg4)                                \
   1685        type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) {  \
   1686           LSS_BODY(4, type, name, arg1, arg2, arg3, arg4);                    \
   1687        }
   1688     #undef _syscall5
   1689     #define _syscall5(type, name, type1, arg1, type2, arg2, type3, arg3,      \
   1690                                   type4, arg4, type5, arg5)                   \
   1691        type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,    \
   1692                                                type5 arg5) {                  \
   1693           LSS_BODY(5, type, name, arg1, arg2, arg3, arg4, arg5);              \
   1694        }
   1695     #undef _syscall6
   1696     #define _syscall6(type, name, type1, arg1, type2, arg2, type3, arg3,      \
   1697                                   type4, arg4, type5, arg5, type6, arg6)      \
   1698        type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,    \
   1699                                                type5 arg5, type6 arg6) {      \
   1700           LSS_BODY(6, type, name, arg1, arg2, arg3, arg4, arg5, arg6);        \
   1701        }
   1702     /* clone function adapted from glibc 2.3.6 clone.S                       */
   1703     /* TODO(csilvers): consider wrapping some args up in a struct, like we
   1704      * do for i386's _syscall6, so we can compile successfully on gcc 2.95
   1705      */
   1706     LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack,
   1707                                    int flags, void *arg, int *parent_tidptr,
   1708                                    void *newtls, int *child_tidptr) {
   1709       long __ret, __err;
   1710       {
   1711         register int (*__fn)(void *)    __asm__ ("r8")  = fn;
   1712         register void *__cstack                 __asm__ ("r4")  = child_stack;
   1713         register int __flags                    __asm__ ("r3")  = flags;
   1714         register void * __arg                   __asm__ ("r9")  = arg;
   1715         register int * __ptidptr                __asm__ ("r5")  = parent_tidptr;
   1716         register void * __newtls                __asm__ ("r6")  = newtls;
   1717         register int * __ctidptr                __asm__ ("r7")  = child_tidptr;
   1718         __asm__ __volatile__(
   1719             /* check for fn == NULL
   1720              * and child_stack == NULL
   1721              */
   1722             "cmpwi cr0, %6, 0\n\t"
   1723             "cmpwi cr1, %7, 0\n\t"
   1724             "cror cr0*4+eq, cr1*4+eq, cr0*4+eq\n\t"
   1725             "beq- cr0, 1f\n\t"
   1726 
   1727             /* set up stack frame for child                                  */
   1728             "clrrwi %7, %7, 4\n\t"
   1729             "li 0, 0\n\t"
   1730             "stwu 0, -16(%7)\n\t"
   1731 
   1732             /* fn, arg, child_stack are saved across the syscall: r28-30     */
   1733             "mr 28, %6\n\t"
   1734             "mr 29, %7\n\t"
   1735             "mr 27, %9\n\t"
   1736 
   1737             /* syscall                                                       */
   1738             "li 0, %4\n\t"
   1739             /* flags already in r3
   1740              * child_stack already in r4
   1741              * ptidptr already in r5
   1742              * newtls already in r6
   1743              * ctidptr already in r7
   1744              */
   1745             "sc\n\t"
   1746 
   1747             /* Test if syscall was successful                                */
   1748             "cmpwi cr1, 3, 0\n\t"
   1749             "crandc cr1*4+eq, cr1*4+eq, cr0*4+so\n\t"
   1750             "bne- cr1, 1f\n\t"
   1751 
   1752             /* Do the function call                                          */
   1753             "mtctr 28\n\t"
   1754             "mr 3, 27\n\t"
   1755             "bctrl\n\t"
   1756 
   1757             /* Call _exit(r3)                                                */
   1758             "li 0, %5\n\t"
   1759             "sc\n\t"
   1760 
   1761             /* Return to parent                                              */
   1762             "1:\n"
   1763             "mfcr %1\n\t"
   1764             "mr %0, 3\n\t"
   1765               : "=r" (__ret), "=r" (__err)
   1766               : "0" (-1), "1" (EINVAL),
   1767                 "i" (__NR_clone), "i" (__NR_exit),
   1768                 "r" (__fn), "r" (__cstack), "r" (__flags),
   1769                 "r" (__arg), "r" (__ptidptr), "r" (__newtls),
   1770                 "r" (__ctidptr)
   1771               : "cr0", "cr1", "memory", "ctr",
   1772                 "r0", "r29", "r27", "r28");
   1773       }
   1774       LSS_RETURN(int, __ret, __err);
   1775     }
   1776   #endif
   1777   #define __NR__exit   __NR_exit
   1778   #define __NR__gettid __NR_gettid
   1779   #define __NR__mremap __NR_mremap
   1780   LSS_INLINE _syscall1(int,     close,           int,         f)
   1781   LSS_INLINE _syscall1(int,     _exit,           int,         e)
   1782   LSS_INLINE _syscall3(int,     fcntl,           int,         f,
   1783                        int,            c, long,   a)
   1784   LSS_INLINE _syscall2(int,     fstat,           int,         f,
   1785                       struct kernel_stat*,   b)
   1786   LSS_INLINE _syscall4(int,     futex,           int*,        a,
   1787                        int,            o, int,    v,
   1788                       struct kernel_timespec*, t)
   1789   LSS_INLINE _syscall3(int,     getdents,        int,         f,
   1790                       struct kernel_dirent*, d, int,    c)
   1791 #ifdef __NR_getdents64
   1792   LSS_INLINE _syscall3(int,     getdents64,      int,         f,
   1793                       struct kernel_dirent64*, d, int,    c)
   1794 #endif
   1795   LSS_INLINE _syscall0(pid_t,   getpid)
   1796   LSS_INLINE _syscall0(pid_t,   getppid)
   1797   LSS_INLINE _syscall0(pid_t,   _gettid)
   1798   LSS_INLINE _syscall2(int,     kill,            pid_t,       p,
   1799                        int,            s)
   1800   LSS_INLINE _syscall3(off_t,   lseek,           int,         f,
   1801                        off_t,          o, int,    w)
   1802   LSS_INLINE _syscall2(int,     munmap,          void*,       s,
   1803                        size_t,         l)
   1804   LSS_INLINE _syscall5(void*,   _mremap,         void*,       o,
   1805                        size_t,         os,       size_t,      ns,
   1806                        unsigned long,  f, void *, a)
   1807   LSS_INLINE _syscall3(int,     open,            const char*, p,
   1808                        int,            f, int,    m)
   1809   LSS_INLINE _syscall2(int,     prctl,           int,         o,
   1810                        long,           a)
   1811   LSS_INLINE _syscall4(long,    ptrace,          int,         r,
   1812                        pid_t,          p, void *, a, void *, d)
   1813   LSS_INLINE _syscall3(ssize_t, read,            int,         f,
   1814                        void *,         b, size_t, c)
   1815   LSS_INLINE _syscall4(int,     rt_sigaction,    int,         s,
   1816                        const struct kernel_sigaction*, a,
   1817                        struct kernel_sigaction*, o, size_t,   c)
   1818   LSS_INLINE _syscall4(int, rt_sigprocmask,      int,         h,
   1819                        const struct kernel_sigset_t*,  s,
   1820                        struct kernel_sigset_t*,        o, size_t, c);
   1821   LSS_INLINE _syscall0(int,     sched_yield)
   1822   LSS_INLINE _syscall2(int,     sigaltstack,     const stack_t*, s,
   1823                        const stack_t*, o)
   1824   LSS_INLINE _syscall2(int,     stat,            const char*, f,
   1825                       struct kernel_stat*,   b)
   1826   LSS_INLINE _syscall3(ssize_t, write,            int,        f,
   1827                        const void *,   b, size_t, c)
   1828   #if defined(__NR_getcpu)
   1829     LSS_INLINE _syscall3(long, getcpu, unsigned *, cpu,
   1830                          unsigned *, node, void *, unused);
   1831   #endif
   1832   #if defined(__x86_64__) ||                                                  \
   1833      (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI32)
   1834     LSS_INLINE _syscall3(int, socket,             int,   d,
   1835                          int,                     t, int,       p)
   1836   #endif
   1837   #if defined(__x86_64__)
   1838     LSS_INLINE _syscall6(void*, mmap,              void*, s,
   1839                          size_t,                   l, int,               p,
   1840                          int,                      f, int,               d,
   1841                          __off64_t,                o)
   1842 
   1843     LSS_INLINE int LSS_NAME(sigaction)(int signum,
   1844                                        const struct kernel_sigaction *act,
   1845                                        struct kernel_sigaction *oldact) {
   1846       /* On x86_64, the kernel requires us to always set our own
   1847        * SA_RESTORER in order to be able to return from a signal handler.
   1848        * This function must have a "magic" signature that the "gdb"
   1849        * (and maybe the kernel?) can recognize.
   1850        */
   1851       if (act != NULL && !(act->sa_flags & SA_RESTORER)) {
   1852         struct kernel_sigaction a = *act;
   1853         a.sa_flags   |= SA_RESTORER;
   1854         a.sa_restorer = LSS_NAME(restore_rt)();
   1855         return LSS_NAME(rt_sigaction)(signum, &a, oldact,
   1856                                       (KERNEL_NSIG+7)/8);
   1857       } else {
   1858         return LSS_NAME(rt_sigaction)(signum, act, oldact,
   1859                                       (KERNEL_NSIG+7)/8);
   1860       }
   1861     }
   1862 
   1863     LSS_INLINE int LSS_NAME(sigprocmask)(int how,
   1864                                          const struct kernel_sigset_t *set,
   1865                                          struct kernel_sigset_t *oldset) {
   1866       return LSS_NAME(rt_sigprocmask)(how, set, oldset, (KERNEL_NSIG+7)/8);
   1867     }
   1868   #endif
   1869   #if defined(__x86_64__) || \
   1870       defined(__arm__) || \
   1871      (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI32)
   1872     LSS_INLINE _syscall4(pid_t, wait4,            pid_t, p,
   1873                          int*,                    s, int,       o,
   1874                          struct kernel_rusage*,   r)
   1875     LSS_INLINE pid_t LSS_NAME(waitpid)(pid_t pid, int *status, int options){
   1876       return LSS_NAME(wait4)(pid, status, options, 0);
   1877     }
   1878    #endif
   1879   #if defined(__i386__) || defined(__x86_64__) || defined(__arm__)
   1880     LSS_INLINE _syscall4(int, openat, int, d, const char *, p, int, f, int, m)
   1881   #endif
   1882   LSS_INLINE int LSS_NAME(sigemptyset)(struct kernel_sigset_t *set) {
   1883     memset(&set->sig, 0, sizeof(set->sig));
   1884     return 0;
   1885   }
   1886 
   1887   LSS_INLINE int LSS_NAME(sigfillset)(struct kernel_sigset_t *set) {
   1888     memset(&set->sig, -1, sizeof(set->sig));
   1889     return 0;
   1890   }
   1891 
   1892   LSS_INLINE int LSS_NAME(sigaddset)(struct kernel_sigset_t *set,
   1893                                      int signum) {
   1894     if (signum < 1 || signum > (int)(8*sizeof(set->sig))) {
   1895       LSS_ERRNO = EINVAL;
   1896       return -1;
   1897     } else {
   1898       set->sig[(signum - 1)/(8*sizeof(set->sig[0]))]
   1899           |= 1UL << ((signum - 1) % (8*sizeof(set->sig[0])));
   1900       return 0;
   1901     }
   1902   }
   1903 
   1904   LSS_INLINE int LSS_NAME(sigdelset)(struct kernel_sigset_t *set,
   1905                                         int signum) {
   1906     if (signum < 1 || signum > (int)(8*sizeof(set->sig))) {
   1907       LSS_ERRNO = EINVAL;
   1908       return -1;
   1909     } else {
   1910       set->sig[(signum - 1)/(8*sizeof(set->sig[0]))]
   1911           &= ~(1UL << ((signum - 1) % (8*sizeof(set->sig[0]))));
   1912       return 0;
   1913     }
   1914   }
   1915 
   1916   #if defined(__i386__) || \
   1917       defined(__arm__) || \
   1918      (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) || defined(__PPC__)
   1919     #define __NR__sigaction   __NR_sigaction
   1920     #define __NR__sigprocmask __NR_sigprocmask
   1921     LSS_INLINE _syscall2(int, fstat64,             int, f,
   1922                          struct kernel_stat64 *, b)
   1923     LSS_INLINE _syscall5(int, _llseek,     uint, fd, ulong, hi, ulong, lo,
   1924                          loff_t *, res, uint, wh)
   1925 #ifdef __PPC64__
   1926     LSS_INLINE _syscall6(void*, mmap,              void*, s,
   1927                          size_t,                   l, int,               p,
   1928                          int,                      f, int,               d,
   1929                          off_t,                    o)
   1930 #else
   1931     #ifndef __ARM_EABI__
   1932     /* Not available on ARM EABI Linux.  */
   1933     LSS_INLINE _syscall1(void*, mmap,              void*, a)
   1934     #endif
   1935     LSS_INLINE _syscall6(void*, mmap2,             void*, s,
   1936                          size_t,                   l, int,               p,
   1937                          int,                      f, int,               d,
   1938                          off_t,                    o)
   1939 #endif
   1940     LSS_INLINE _syscall3(int,   _sigaction,        int,   s,
   1941                          const struct kernel_old_sigaction*,  a,
   1942                          struct kernel_old_sigaction*,        o)
   1943     LSS_INLINE _syscall3(int,   _sigprocmask,      int,   h,
   1944                          const unsigned long*,     s,
   1945                          unsigned long*,           o)
   1946     LSS_INLINE _syscall2(int, stat64,              const char *, p,
   1947                          struct kernel_stat64 *, b)
   1948 
   1949     LSS_INLINE int LSS_NAME(sigaction)(int signum,
   1950                                        const struct kernel_sigaction *act,
   1951                                        struct kernel_sigaction *oldact) {
   1952       int old_errno = LSS_ERRNO;
   1953       int rc;
   1954       struct kernel_sigaction a;
   1955       if (act != NULL) {
   1956         a             = *act;
   1957         #ifdef __i386__
   1958         /* On i386, the kernel requires us to always set our own
   1959          * SA_RESTORER when using realtime signals. Otherwise, it does not
   1960          * know how to return from a signal handler. This function must have
   1961          * a "magic" signature that the "gdb" (and maybe the kernel?) can
   1962          * recognize.
   1963          * Apparently, a SA_RESTORER is implicitly set by the kernel, when
   1964          * using non-realtime signals.
   1965          *
   1966          * TODO: Test whether ARM needs a restorer
   1967          */
   1968         if (!(a.sa_flags & SA_RESTORER)) {
   1969           a.sa_flags   |= SA_RESTORER;
   1970           a.sa_restorer = (a.sa_flags & SA_SIGINFO)
   1971                           ? LSS_NAME(restore_rt)() : LSS_NAME(restore)();
   1972         }
   1973         #endif
   1974       }
   1975       rc = LSS_NAME(rt_sigaction)(signum, act ? &a : act, oldact,
   1976                                   (KERNEL_NSIG+7)/8);
   1977       if (rc < 0 && LSS_ERRNO == ENOSYS) {
   1978         struct kernel_old_sigaction oa, ooa, *ptr_a = &oa, *ptr_oa = &ooa;
   1979         if (!act) {
   1980           ptr_a            = NULL;
   1981         } else {
   1982           oa.sa_handler_   = act->sa_handler_;
   1983           memcpy(&oa.sa_mask, &act->sa_mask, sizeof(oa.sa_mask));
   1984           #ifndef __mips__
   1985           oa.sa_restorer   = act->sa_restorer;
   1986           #endif
   1987           oa.sa_flags      = act->sa_flags;
   1988         }
   1989         if (!oldact) {
   1990           ptr_oa           = NULL;
   1991         }
   1992         LSS_ERRNO = old_errno;
   1993         rc = LSS_NAME(_sigaction)(signum, ptr_a, ptr_oa);
   1994         if (rc == 0 && oldact) {
   1995           if (act) {
   1996             memcpy(oldact, act, sizeof(*act));
   1997           } else {
   1998             memset(oldact, 0, sizeof(*oldact));
   1999           }
   2000           oldact->sa_handler_    = ptr_oa->sa_handler_;
   2001           oldact->sa_flags       = ptr_oa->sa_flags;
   2002           memcpy(&oldact->sa_mask, &ptr_oa->sa_mask, sizeof(ptr_oa->sa_mask));
   2003           #ifndef __mips__
   2004           oldact->sa_restorer    = ptr_oa->sa_restorer;
   2005           #endif
   2006         }
   2007       }
   2008       return rc;
   2009     }
   2010 
   2011     LSS_INLINE int LSS_NAME(sigprocmask)(int how,
   2012                                          const struct kernel_sigset_t *set,
   2013                                          struct kernel_sigset_t *oldset) {
   2014       int olderrno = LSS_ERRNO;
   2015       int rc = LSS_NAME(rt_sigprocmask)(how, set, oldset, (KERNEL_NSIG+7)/8);
   2016       if (rc < 0 && LSS_ERRNO == ENOSYS) {
   2017         LSS_ERRNO = olderrno;
   2018         if (oldset) {
   2019           LSS_NAME(sigemptyset)(oldset);
   2020         }
   2021         rc = LSS_NAME(_sigprocmask)(how,
   2022                                     set ? &set->sig[0] : NULL,
   2023                                     oldset ? &oldset->sig[0] : NULL);
   2024       }
   2025       return rc;
   2026     }
   2027   #endif
   2028   #if defined(__PPC__)
   2029     #undef LSS_SC_LOADARGS_0
   2030     #define LSS_SC_LOADARGS_0(dummy...)
   2031     #undef LSS_SC_LOADARGS_1
   2032     #define LSS_SC_LOADARGS_1(arg1)                                           \
   2033         __sc_4  = (unsigned long) (arg1)
   2034     #undef LSS_SC_LOADARGS_2
   2035     #define LSS_SC_LOADARGS_2(arg1, arg2)                                     \
   2036         LSS_SC_LOADARGS_1(arg1);                                              \
   2037         __sc_5  = (unsigned long) (arg2)
   2038     #undef LSS_SC_LOADARGS_3
   2039     #define LSS_SC_LOADARGS_3(arg1, arg2, arg3)                               \
   2040         LSS_SC_LOADARGS_2(arg1, arg2);                                        \
   2041         __sc_6  = (unsigned long) (arg3)
   2042     #undef LSS_SC_LOADARGS_4
   2043     #define LSS_SC_LOADARGS_4(arg1, arg2, arg3, arg4)                         \
   2044         LSS_SC_LOADARGS_3(arg1, arg2, arg3);                                  \
   2045         __sc_7  = (unsigned long) (arg4)
   2046     #undef LSS_SC_LOADARGS_5
   2047     #define LSS_SC_LOADARGS_5(arg1, arg2, arg3, arg4, arg5)                   \
   2048         LSS_SC_LOADARGS_4(arg1, arg2, arg3, arg4);                            \
   2049         __sc_8  = (unsigned long) (arg5)
   2050     #undef LSS_SC_BODY
   2051     #define LSS_SC_BODY(nr, type, opt, args...)                               \
   2052         long __sc_ret, __sc_err;                                              \
   2053         {                                                                     \
   2054           register unsigned long __sc_0 __asm__ ("r0") = __NR_socketcall;     \
   2055           register unsigned long __sc_3 __asm__ ("r3") = opt;                 \
   2056           register unsigned long __sc_4 __asm__ ("r4");                       \
   2057           register unsigned long __sc_5 __asm__ ("r5");                       \
   2058           register unsigned long __sc_6 __asm__ ("r6");                       \
   2059           register unsigned long __sc_7 __asm__ ("r7");                       \
   2060           register unsigned long __sc_8 __asm__ ("r8");                       \
   2061           LSS_SC_LOADARGS_##nr(args);                                         \
   2062           __asm__ __volatile__                                                \
   2063               ("stwu 1, -48(1)\n\t"                                           \
   2064                "stw 4, 20(1)\n\t"                                             \
   2065                "stw 5, 24(1)\n\t"                                             \
   2066                "stw 6, 28(1)\n\t"                                             \
   2067                "stw 7, 32(1)\n\t"                                             \
   2068                "stw 8, 36(1)\n\t"                                             \
   2069                "addi 4, 1, 20\n\t"                                            \
   2070                "sc\n\t"                                                       \
   2071                "mfcr %0"                                                      \
   2072                  : "=&r" (__sc_0),                                            \
   2073                    "=&r" (__sc_3), "=&r" (__sc_4),                            \
   2074                    "=&r" (__sc_5), "=&r" (__sc_6),                            \
   2075                    "=&r" (__sc_7), "=&r" (__sc_8)                             \
   2076                  : LSS_ASMINPUT_##nr                                          \
   2077                  : "cr0", "ctr", "memory");                                   \
   2078           __sc_ret = __sc_3;                                                  \
   2079           __sc_err = __sc_0;                                                  \
   2080         }                                                                     \
   2081         LSS_RETURN(type, __sc_ret, __sc_err)
   2082 
   2083     LSS_INLINE int LSS_NAME(socket)(int domain, int type, int protocol) {
   2084       LSS_SC_BODY(3, int, 1, domain, type, protocol);
   2085     }
   2086   #endif
   2087   #if defined(__i386__) || \
   2088       (defined(__arm__) && !defined(__ARM_EABI__)) || \
   2089       (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32)
   2090 
   2091     /* See sys_socketcall in net/socket.c in kernel source.
   2092      * It de-multiplexes on its first arg and unpacks the arglist
   2093      * array in its second arg.
   2094      */
   2095     LSS_INLINE _syscall2(long, socketcall, int, c, unsigned long*, a)
   2096 
   2097     LSS_INLINE int LSS_NAME(socket)(int domain, int type, int protocol) {
   2098       unsigned long args[3] = {
   2099         (unsigned long) domain,
   2100         (unsigned long) type,
   2101         (unsigned long) protocol
   2102       };
   2103       return LSS_NAME(socketcall)(1, args);
   2104     }
   2105   #elif defined(__ARM_EABI__)
   2106     LSS_INLINE _syscall3(int, socket,             int,   d,
   2107                          int,                     t, int,       p)
   2108   #endif
   2109   #if defined(__i386__) || defined(__PPC__) ||                                \
   2110      (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32)
   2111     LSS_INLINE _syscall3(pid_t, waitpid,          pid_t, p,
   2112                          int*,              s,    int,   o)
   2113   #endif
   2114   #if defined(__mips__)
   2115     /* sys_pipe() on MIPS has non-standard calling conventions, as it returns
   2116      * both file handles through CPU registers.
   2117      */
   2118     LSS_INLINE int LSS_NAME(pipe)(int *p) {
   2119       register unsigned long __v0 __asm__("$2") = __NR_pipe;
   2120       register unsigned long __v1 __asm__("$3");
   2121       register unsigned long __r7 __asm__("$7");
   2122       __asm__ __volatile__ ("syscall\n"
   2123                             : "=&r"(__v0), "=&r"(__v1), "+r" (__r7)
   2124                             : "0"(__v0)
   2125                             : "$8", "$9", "$10", "$11", "$12",
   2126                               "$13", "$14", "$15", "$24", "memory");
   2127       if (__r7) {
   2128         LSS_ERRNO = __v0;
   2129         return -1;
   2130       } else {
   2131         p[0] = __v0;
   2132         p[1] = __v1;
   2133         return 0;
   2134       }
   2135     }
   2136   #else
   2137     LSS_INLINE _syscall1(int,     pipe,           int *, p)
   2138   #endif
   2139 
   2140   LSS_INLINE pid_t LSS_NAME(gettid)() {
   2141     pid_t tid = LSS_NAME(_gettid)();
   2142     if (tid != -1) {
   2143       return tid;
   2144     }
   2145     return LSS_NAME(getpid)();
   2146   }
   2147 
   2148   LSS_INLINE void *LSS_NAME(mremap)(void *old_address, size_t old_size,
   2149                                     size_t new_size, int flags, ...) {
   2150     va_list ap;
   2151     void *new_address, *rc;
   2152     va_start(ap, flags);
   2153     new_address = va_arg(ap, void *);
   2154     rc = LSS_NAME(_mremap)(old_address, old_size, new_size,
   2155                            flags, new_address);
   2156     va_end(ap);
   2157     return rc;
   2158   }
   2159 
   2160   LSS_INLINE int LSS_NAME(ptrace_detach)(pid_t pid) {
   2161     /* PTRACE_DETACH can sometimes forget to wake up the tracee and it
   2162      * then sends job control signals to the real parent, rather than to
   2163      * the tracer. We reduce the risk of this happening by starting a
   2164      * whole new time slice, and then quickly sending a SIGCONT signal
   2165      * right after detaching from the tracee.
   2166      */
   2167     int rc, err;
   2168     LSS_NAME(sched_yield)();
   2169     rc = LSS_NAME(ptrace)(PTRACE_DETACH, pid, (void *)0, (void *)0);
   2170     err = LSS_ERRNO;
   2171     LSS_NAME(kill)(pid, SIGCONT);
   2172     LSS_ERRNO = err;
   2173     return rc;
   2174   }
   2175 #endif
   2176 
   2177 #if defined(__cplusplus) && !defined(SYS_CPLUSPLUS)
   2178 }
   2179 #endif
   2180 
   2181 #endif
   2182 #endif
   2183