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