2 /*--------------------------------------------------------------------*/
3 /*--- Platform-specific syscalls stuff. syswrap-ppc32-linux.c ---*/
4 /*--------------------------------------------------------------------*/
7 This file is part of Valgrind, a dynamic binary instrumentation
10 Copyright (C) 2005-2017 Nicholas Nethercote <njn@valgrind.org>
11 Copyright (C) 2005-2017 Cerion Armour-Brown <cerion@open-works.co.uk>
13 This program is free software; you can redistribute it and/or
14 modify it under the terms of the GNU General Public License as
15 published by the Free Software Foundation; either version 2 of the
16 License, or (at your option) any later version.
18 This program is distributed in the hope that it will be useful, but
19 WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
28 The GNU General Public License is contained in the file COPYING.
31 #if defined(VGP_ppc32_linux)
33 #include "pub_core_basics.h"
34 #include "pub_core_vki.h"
35 #include "pub_core_vkiscnums.h"
36 #include "pub_core_threadstate.h"
37 #include "pub_core_aspacemgr.h"
38 #include "pub_core_debuglog.h"
39 #include "pub_core_libcbase.h"
40 #include "pub_core_libcassert.h"
41 #include "pub_core_libcprint.h"
42 #include "pub_core_libcproc.h"
43 #include "pub_core_libcsignal.h"
44 #include "pub_core_options.h"
45 #include "pub_core_scheduler.h"
46 #include "pub_core_sigframe.h" // For VG_(sigframe_destroy)()
47 #include "pub_core_signals.h"
48 #include "pub_core_syscall.h"
49 #include "pub_core_syswrap.h"
50 #include "pub_core_tooliface.h"
52 #include "priv_types_n_macros.h"
53 #include "priv_syswrap-generic.h" /* for decls of generic wrappers */
54 #include "priv_syswrap-linux.h" /* for decls of linux-ish wrappers */
55 #include "priv_syswrap-main.h"
58 /* ---------------------------------------------------------------------
60 ------------------------------------------------------------------ */
62 /* Call f(arg1), but first switch stacks, using 'stack' as the new
63 stack, and use 'retaddr' as f's return-to address. Also, clear all
64 the integer registers before entering f.*/
65 __attribute__((noreturn
))
66 void ML_(call_on_new_stack_0_1
) ( Addr stack
,
76 ".globl vgModuleLocal_call_on_new_stack_0_1\n"
77 "vgModuleLocal_call_on_new_stack_0_1:\n"
78 " mr %r1,%r3\n\t" // stack to %sp
79 " mtlr %r4\n\t" // retaddr to %lr
80 " mtctr %r5\n\t" // f to count reg
81 " mr %r3,%r6\n\t" // arg1 to %r3
82 " li 0,0\n\t" // zero all GP regs
111 " mtxer 0\n\t" // CAB: Need this?
112 " mtcr 0\n\t" // CAB: Need this?
113 " bctr\n\t" // jump to dst
114 " trap\n" // should never get here
120 Perform a clone system call. clone is strange because it has
121 fork()-like return-twice semantics, so it needs special
126 int (fn)(void*) in r3
127 void* child_stack in r4
130 pid_t* child_tid in r7
131 pid_t* parent_tid in r8
134 System call requires:
136 int $__NR_clone in r0 (sc number)
137 int flags in r3 (sc arg1)
138 void* child_stack in r4 (sc arg2)
139 pid_t* parent_tid in r5 (sc arg3)
140 ?? child_tls in r6 (sc arg4)
141 pid_t* child_tid in r7 (sc arg5)
142 void* ??? in r8 (sc arg6)
144 Returns an Int encoded in the linux-ppc32 way, not a SysRes.
146 #define __NR_CLONE VG_STRINGIFY(__NR_clone)
147 #define __NR_EXIT VG_STRINGIFY(__NR_exit)
149 // See priv_syswrap-linux.h for arg profile.
152 ".globl do_syscall_clone_ppc32_linux\n"
153 "do_syscall_clone_ppc32_linux:\n"
158 " mr 30,3\n" // preserve fn
159 " mr 31,6\n" // preserve arg
162 " rlwinm 4,4,0,~0xf\n" // trim sp to multiple of 16 bytes
164 " stwu 0,-16(4)\n" // make initial stack frame
165 " mr 29,4\n" // preserve sp
168 " li 0,"__NR_CLONE
"\n" // syscall number
169 " mr 3,5\n" // syscall arg1: flags
170 // r4 already setup // syscall arg2: child_stack
171 " mr 5,8\n" // syscall arg3: parent_tid
172 " mr 6,2\n" // syscall arg4: REAL THREAD tls
173 " mr 7,7\n" // syscall arg5: child_tid
174 " mr 8,8\n" // syscall arg6: ????
175 " mr 9,9\n" // syscall arg7: ????
179 " mfcr 4\n" // return CR in r4 (low word of ULong)
180 " cmpwi 3,0\n" // child if retval == 0
181 " bne 1f\n" // jump if !child
183 /* CHILD - call thread function */
184 /* Note: 2.4 kernel doesn't set the child stack pointer,
186 That does leave a small window for a signal to be delivered
187 on the wrong stack, unfortunately. */
189 " mtctr 30\n" // ctr reg = fn
190 " mr 3,31\n" // r3 = arg
191 " bctrl\n" // call fn()
194 " li 0,"__NR_EXIT
"\n"
200 // PARENT or ERROR - return
213 /* ---------------------------------------------------------------------
215 ------------------------------------------------------------------ */
217 void VG_(cleanup_thread
) ( ThreadArchState
* arch
)
221 /* ---------------------------------------------------------------------
222 PRE/POST wrappers for ppc32/Linux-specific syscalls
223 ------------------------------------------------------------------ */
225 #define PRE(name) DEFN_PRE_TEMPLATE(ppc32_linux, name)
226 #define POST(name) DEFN_POST_TEMPLATE(ppc32_linux, name)
228 /* Add prototypes for the wrappers declared here, so that gcc doesn't
229 harass us for not having prototypes. Really this is a kludge --
230 the right thing to do is to make these wrappers 'static' since they
231 aren't visible outside this file, but that requires even more macro
234 DECL_TEMPLATE(ppc32_linux
, sys_mmap
);
235 DECL_TEMPLATE(ppc32_linux
, sys_mmap2
);
236 DECL_TEMPLATE(ppc32_linux
, sys_stat64
);
237 DECL_TEMPLATE(ppc32_linux
, sys_lstat64
);
238 DECL_TEMPLATE(ppc32_linux
, sys_fstatat64
);
239 DECL_TEMPLATE(ppc32_linux
, sys_fstat64
);
240 DECL_TEMPLATE(ppc32_linux
, sys_sigreturn
);
241 DECL_TEMPLATE(ppc32_linux
, sys_rt_sigreturn
);
242 DECL_TEMPLATE(ppc32_linux
, sys_sigsuspend
);
243 DECL_TEMPLATE(ppc32_linux
, sys_spu_create
);
244 DECL_TEMPLATE(ppc32_linux
, sys_spu_run
);
250 PRINT("sys_mmap ( %#lx, %lu, %lu, %lu, %lu, %lu )",
251 ARG1
, ARG2
, ARG3
, ARG4
, ARG5
, ARG6
);
252 PRE_REG_READ6(long, "mmap",
253 unsigned long, start
, unsigned long, length
,
254 unsigned long, prot
, unsigned long, flags
,
255 unsigned long, fd
, unsigned long, offset
);
257 r
= ML_(generic_PRE_sys_mmap
)( tid
, ARG1
, ARG2
, ARG3
, ARG4
, ARG5
,
259 SET_STATUS_from_SysRes(r
);
266 // Exactly like old_mmap() except:
267 // - the file offset is specified in 4K units rather than bytes,
268 // so that it can be used for files bigger than 2^32 bytes.
269 PRINT("sys_mmap2 ( %#lx, %lu, %lu, %lu, %lu, %lu )",
270 ARG1
, ARG2
, ARG3
, ARG4
, ARG5
, ARG6
);
271 PRE_REG_READ6(long, "mmap2",
272 unsigned long, start
, unsigned long, length
,
273 unsigned long, prot
, unsigned long, flags
,
274 unsigned long, fd
, unsigned long, offset
);
276 r
= ML_(generic_PRE_sys_mmap
)( tid
, ARG1
, ARG2
, ARG3
, ARG4
, ARG5
,
277 4096 * (Off64T
)ARG6
);
278 SET_STATUS_from_SysRes(r
);
281 // XXX: lstat64/fstat64/stat64 are generic, but not necessarily
282 // applicable to every architecture -- I think only to 32-bit archs.
283 // We're going to need something like linux/core_os32.h for such
284 // things, eventually, I think. --njn
287 PRINT("sys_stat64 ( %#lx, %#lx )",ARG1
,ARG2
);
288 PRE_REG_READ2(long, "stat64", char *, file_name
, struct stat64
*, buf
);
289 PRE_MEM_RASCIIZ( "stat64(file_name)", ARG1
);
290 PRE_MEM_WRITE( "stat64(buf)", ARG2
, sizeof(struct vki_stat64
) );
295 POST_MEM_WRITE( ARG2
, sizeof(struct vki_stat64
) );
300 PRINT("sys_lstat64 ( %#lx(%s), %#lx )", ARG1
, (HChar
*)ARG1
, ARG2
);
301 PRE_REG_READ2(long, "lstat64", char *, file_name
, struct stat64
*, buf
);
302 PRE_MEM_RASCIIZ( "lstat64(file_name)", ARG1
);
303 PRE_MEM_WRITE( "lstat64(buf)", ARG2
, sizeof(struct vki_stat64
) );
310 POST_MEM_WRITE( ARG2
, sizeof(struct vki_stat64
) );
316 PRINT("sys_fstatat64 ( %ld, %#lx(%s), %#lx )", SARG1
, ARG2
, (HChar
*)ARG2
,
318 PRE_REG_READ3(long, "fstatat64",
319 int, dfd
, char *, file_name
, struct stat64
*, buf
);
320 PRE_MEM_RASCIIZ( "fstatat64(file_name)", ARG2
);
321 PRE_MEM_WRITE( "fstatat64(buf)", ARG3
, sizeof(struct vki_stat64
) );
326 POST_MEM_WRITE( ARG3
, sizeof(struct vki_stat64
) );
331 PRINT("sys_fstat64 ( %lu, %#lx )", ARG1
, ARG2
);
332 PRE_REG_READ2(long, "fstat64", unsigned long, fd
, struct stat64
*, buf
);
333 PRE_MEM_WRITE( "fstat64(buf)", ARG2
, sizeof(struct vki_stat64
) );
338 POST_MEM_WRITE( ARG2
, sizeof(struct vki_stat64
) );
343 //.. PRE(old_select, MayBlock)
345 //.. /* struct sel_arg_struct {
346 //.. unsigned long n;
347 //.. fd_set *inp, *outp, *exp;
348 //.. struct timeval *tvp;
351 //.. PRE_REG_READ1(long, "old_select", struct sel_arg_struct *, args);
352 //.. PRE_MEM_READ( "old_select(args)", ARG1, 5*sizeof(UWord) );
355 //.. UInt* arg_struct = (UInt*)ARG1;
356 //.. UInt a1, a2, a3, a4, a5;
358 //.. a1 = arg_struct[0];
359 //.. a2 = arg_struct[1];
360 //.. a3 = arg_struct[2];
361 //.. a4 = arg_struct[3];
362 //.. a5 = arg_struct[4];
364 //.. PRINT("old_select ( %d, %p, %p, %p, %p )", a1,a2,a3,a4,a5);
365 //.. if (a2 != (Addr)NULL)
366 //.. PRE_MEM_READ( "old_select(readfds)", a2, a1/8 /* __FD_SETSIZE/8 */ );
367 //.. if (a3 != (Addr)NULL)
368 //.. PRE_MEM_READ( "old_select(writefds)", a3, a1/8 /* __FD_SETSIZE/8 */ );
369 //.. if (a4 != (Addr)NULL)
370 //.. PRE_MEM_READ( "old_select(exceptfds)", a4, a1/8 /* __FD_SETSIZE/8 */ );
371 //.. if (a5 != (Addr)NULL)
372 //.. PRE_MEM_READ( "old_select(timeout)", a5, sizeof(struct vki_timeval) );
378 /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
379 an explanation of what follows. */
382 PRINT("sys_sigreturn ( )");
384 vg_assert(VG_(is_valid_tid
)(tid
));
385 vg_assert(tid
>= 1 && tid
< VG_N_THREADS
);
386 vg_assert(VG_(is_running_thread
)(tid
));
388 ///* Adjust esp to point to start of frame; skip back up over
389 // sigreturn sequence's "popl %eax" and handler ret addr */
390 //tst = VG_(get_ThreadState)(tid);
391 //tst->arch.vex.guest_ESP -= sizeof(Addr)+sizeof(Word);
392 // Should we do something equivalent on ppc32? Who knows.
394 ///* This is only so that the EIP is (might be) useful to report if
395 // something goes wrong in the sigreturn */
396 //ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
397 // Should we do something equivalent on ppc32? Who knows.
399 /* Restore register state from frame and remove it */
400 VG_(sigframe_destroy
)(tid
, False
);
402 /* Tell the driver not to update the guest state with the "result",
403 and set a bogus result to keep it happy. */
404 *flags
|= SfNoWriteResult
;
405 SET_STATUS_Success(0);
407 /* Check to see if any signals arose as a result of this. */
408 *flags
|= SfPollAfter
;
411 PRE(sys_rt_sigreturn
)
413 /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
414 an explanation of what follows. */
417 PRINT("rt_sigreturn ( )");
419 vg_assert(VG_(is_valid_tid
)(tid
));
420 vg_assert(tid
>= 1 && tid
< VG_N_THREADS
);
421 vg_assert(VG_(is_running_thread
)(tid
));
423 ///* Adjust esp to point to start of frame; skip back up over handler
425 //tst = VG_(get_ThreadState)(tid);
426 //tst->arch.vex.guest_ESP -= sizeof(Addr);
427 // Should we do something equivalent on ppc32? Who knows.
429 ///* This is only so that the EIP is (might be) useful to report if
430 // something goes wrong in the sigreturn */
431 //ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
432 // Should we do something equivalent on ppc32? Who knows.
434 /* Restore register state from frame and remove it */
435 VG_(sigframe_destroy
)(tid
, True
);
437 /* Tell the driver not to update the guest state with the "result",
438 and set a bogus result to keep it happy. */
439 *flags
|= SfNoWriteResult
;
440 SET_STATUS_Success(0);
442 /* Check to see if any signals arose as a result of this. */
443 *flags
|= SfPollAfter
;
447 //.. PRE(sys_modify_ldt, Special)
449 //.. PRINT("sys_modify_ldt ( %d, %p, %d )", ARG1,ARG2,ARG3);
450 //.. PRE_REG_READ3(int, "modify_ldt", int, func, void *, ptr,
451 //.. unsigned long, bytecount);
453 //.. if (ARG1 == 0) {
454 //.. /* read the LDT into ptr */
455 //.. PRE_MEM_WRITE( "modify_ldt(ptr)", ARG2, ARG3 );
457 //.. if (ARG1 == 1 || ARG1 == 0x11) {
458 //.. /* write the LDT with the entry pointed at by ptr */
459 //.. PRE_MEM_READ( "modify_ldt(ptr)", ARG2, sizeof(vki_modify_ldt_t) );
461 //.. /* "do" the syscall ourselves; the kernel never sees it */
462 //.. SET_RESULT( VG_(sys_modify_ldt)( tid, ARG1, (void*)ARG2, ARG3 ) );
464 //.. if (ARG1 == 0 && !VG_(is_kerror)(RES) && RES > 0) {
465 //.. POST_MEM_WRITE( ARG2, RES );
469 //.. PRE(sys_set_thread_area, Special)
471 //.. PRINT("sys_set_thread_area ( %p )", ARG1);
472 //.. PRE_REG_READ1(int, "set_thread_area", struct user_desc *, u_info)
473 //.. PRE_MEM_READ( "set_thread_area(u_info)", ARG1, sizeof(vki_modify_ldt_t) );
475 //.. /* "do" the syscall ourselves; the kernel never sees it */
476 //.. SET_RESULT( VG_(sys_set_thread_area)( tid, (void *)ARG1 ) );
479 //.. PRE(sys_get_thread_area, Special)
481 //.. PRINT("sys_get_thread_area ( %p )", ARG1);
482 //.. PRE_REG_READ1(int, "get_thread_area", struct user_desc *, u_info)
483 //.. PRE_MEM_WRITE( "get_thread_area(u_info)", ARG1, sizeof(vki_modify_ldt_t) );
485 //.. /* "do" the syscall ourselves; the kernel never sees it */
486 //.. SET_RESULT( VG_(sys_get_thread_area)( tid, (void *)ARG1 ) );
488 //.. if (!VG_(is_kerror)(RES)) {
489 //.. POST_MEM_WRITE( ARG1, sizeof(vki_modify_ldt_t) );
493 //.. // Parts of this are ppc32-specific, but the *PEEK* cases are generic.
494 //.. // XXX: Why is the memory pointed to by ARG3 never checked?
495 //.. PRE(sys_ptrace, 0)
497 //.. PRINT("sys_ptrace ( %d, %d, %p, %p )", ARG1,ARG2,ARG3,ARG4);
498 //.. PRE_REG_READ4(int, "ptrace",
499 //.. long, request, long, pid, long, addr, long, data);
501 //.. case VKI_PTRACE_PEEKTEXT:
502 //.. case VKI_PTRACE_PEEKDATA:
503 //.. case VKI_PTRACE_PEEKUSR:
504 //.. PRE_MEM_WRITE( "ptrace(peek)", ARG4,
507 //.. case VKI_PTRACE_GETREGS:
508 //.. PRE_MEM_WRITE( "ptrace(getregs)", ARG4,
509 //.. sizeof (struct vki_user_regs_struct));
511 //.. case VKI_PTRACE_GETFPREGS:
512 //.. PRE_MEM_WRITE( "ptrace(getfpregs)", ARG4,
513 //.. sizeof (struct vki_user_i387_struct));
515 //.. case VKI_PTRACE_GETFPXREGS:
516 //.. PRE_MEM_WRITE( "ptrace(getfpxregs)", ARG4,
517 //.. sizeof(struct vki_user_fxsr_struct) );
519 //.. case VKI_PTRACE_SETREGS:
520 //.. PRE_MEM_READ( "ptrace(setregs)", ARG4,
521 //.. sizeof (struct vki_user_regs_struct));
523 //.. case VKI_PTRACE_SETFPREGS:
524 //.. PRE_MEM_READ( "ptrace(setfpregs)", ARG4,
525 //.. sizeof (struct vki_user_i387_struct));
527 //.. case VKI_PTRACE_SETFPXREGS:
528 //.. PRE_MEM_READ( "ptrace(setfpxregs)", ARG4,
529 //.. sizeof(struct vki_user_fxsr_struct) );
536 //.. POST(sys_ptrace)
539 //.. case VKI_PTRACE_PEEKTEXT:
540 //.. case VKI_PTRACE_PEEKDATA:
541 //.. case VKI_PTRACE_PEEKUSR:
542 //.. POST_MEM_WRITE( ARG4, sizeof (long));
544 //.. case VKI_PTRACE_GETREGS:
545 //.. POST_MEM_WRITE( ARG4, sizeof (struct vki_user_regs_struct));
547 //.. case VKI_PTRACE_GETFPREGS:
548 //.. POST_MEM_WRITE( ARG4, sizeof (struct vki_user_i387_struct));
550 //.. case VKI_PTRACE_GETFPXREGS:
551 //.. POST_MEM_WRITE( ARG4, sizeof(struct vki_user_fxsr_struct) );
558 /* NB: This is an almost identical clone of versions for x86-linux and
559 arm-linux, which are themselves literally identical. */
562 /* The C library interface to sigsuspend just takes a pointer to
563 a signal mask but this system call only takes the first word of
564 the signal mask as an argument so only 32 signals are supported.
566 In fact glibc normally uses rt_sigsuspend if it is available as
567 that takes a pointer to the signal mask so supports more signals.
569 *flags
|= SfMayBlock
;
570 PRINT("sys_sigsuspend ( %lu )", ARG1
);
571 PRE_REG_READ1(int, "sigsuspend", vki_old_sigset_t
, mask
);
576 PRE_MEM_RASCIIZ("stat64(filename)", ARG1
);
585 *flags
|= SfMayBlock
;
587 PRE_MEM_WRITE("npc", ARG2
, sizeof(unsigned int));
588 PRE_MEM_READ("event", ARG3
, sizeof(unsigned int));
593 POST_MEM_WRITE(ARG2
, sizeof(unsigned int));
599 /* ---------------------------------------------------------------------
600 The ppc32/Linux syscall table
601 ------------------------------------------------------------------ */
603 /* Add an ppc32-linux specific wrapper to a syscall table. */
604 #define PLAX_(sysno, name) WRAPPER_ENTRY_X_(ppc32_linux, sysno, name)
605 #define PLAXY(sysno, name) WRAPPER_ENTRY_XY(ppc32_linux, sysno, name)
607 // This table maps from __NR_xxx syscall numbers (from
608 // linux/include/asm-ppc/unistd.h) to the appropriate PRE/POST sys_foo()
609 // wrappers on ppc32 (as per sys_call_table in linux/arch/ppc/kernel/entry.S).
611 // For those syscalls not handled by Valgrind, the annotation indicate its
612 // arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/?
615 static SyscallTableEntry syscall_table
[] = {
616 //.. (restart_syscall) // 0
617 GENX_(__NR_exit
, sys_exit
), // 1
618 GENX_(__NR_fork
, sys_fork
), // 2
619 GENXY(__NR_read
, sys_read
), // 3
620 GENX_(__NR_write
, sys_write
), // 4
622 GENXY(__NR_open
, sys_open
), // 5
623 GENXY(__NR_close
, sys_close
), // 6
624 GENXY(__NR_waitpid
, sys_waitpid
), // 7
625 GENXY(__NR_creat
, sys_creat
), // 8
626 GENX_(__NR_link
, sys_link
), // 9
628 GENX_(__NR_unlink
, sys_unlink
), // 10
629 GENX_(__NR_execve
, sys_execve
), // 11
630 GENX_(__NR_chdir
, sys_chdir
), // 12
631 GENXY(__NR_time
, sys_time
), // 13
632 GENX_(__NR_mknod
, sys_mknod
), // 14
634 GENX_(__NR_chmod
, sys_chmod
), // 15
635 GENX_(__NR_lchown
, sys_lchown
), // 16 ## P
636 //.. GENX_(__NR_break, sys_ni_syscall), // 17
637 //.. // (__NR_oldstat, sys_stat), // 18 (obsolete)
638 LINX_(__NR_lseek
, sys_lseek
), // 19
640 GENX_(__NR_getpid
, sys_getpid
), // 20
641 LINX_(__NR_mount
, sys_mount
), // 21
642 LINX_(__NR_umount
, sys_oldumount
), // 22
643 GENX_(__NR_setuid
, sys_setuid
), // 23 ## P
644 GENX_(__NR_getuid
, sys_getuid
), // 24 ## P
646 //.. // (__NR_stime, sys_stime), // 25 * (SVr4,SVID,X/OPEN)
647 //.. PLAXY(__NR_ptrace, sys_ptrace), // 26
648 GENX_(__NR_alarm
, sys_alarm
), // 27
649 //.. // (__NR_oldfstat, sys_fstat), // 28 * L -- obsolete
650 GENX_(__NR_pause
, sys_pause
), // 29
652 LINX_(__NR_utime
, sys_utime
), // 30
653 //.. GENX_(__NR_stty, sys_ni_syscall), // 31
654 //.. GENX_(__NR_gtty, sys_ni_syscall), // 32
655 GENX_(__NR_access
, sys_access
), // 33
656 //.. GENX_(__NR_nice, sys_nice), // 34
658 //.. GENX_(__NR_ftime, sys_ni_syscall), // 35
659 GENX_(__NR_sync
, sys_sync
), // 36
660 GENX_(__NR_kill
, sys_kill
), // 37
661 GENX_(__NR_rename
, sys_rename
), // 38
662 GENX_(__NR_mkdir
, sys_mkdir
), // 39
664 GENX_(__NR_rmdir
, sys_rmdir
), // 40
665 GENXY(__NR_dup
, sys_dup
), // 41
666 LINXY(__NR_pipe
, sys_pipe
), // 42
667 GENXY(__NR_times
, sys_times
), // 43
668 //.. GENX_(__NR_prof, sys_ni_syscall), // 44
670 GENX_(__NR_brk
, sys_brk
), // 45
671 GENX_(__NR_setgid
, sys_setgid
), // 46
672 GENX_(__NR_getgid
, sys_getgid
), // 47
673 //.. // (__NR_signal, sys_signal), // 48 */* (ANSI C)
674 GENX_(__NR_geteuid
, sys_geteuid
), // 49
676 GENX_(__NR_getegid
, sys_getegid
), // 50
677 //.. GENX_(__NR_acct, sys_acct), // 51
678 LINX_(__NR_umount2
, sys_umount
), // 52
679 //.. GENX_(__NR_lock, sys_ni_syscall), // 53
680 LINXY(__NR_ioctl
, sys_ioctl
), // 54
682 LINXY(__NR_fcntl
, sys_fcntl
), // 55
683 //.. GENX_(__NR_mpx, sys_ni_syscall), // 56
684 GENX_(__NR_setpgid
, sys_setpgid
), // 57
685 //.. GENX_(__NR_ulimit, sys_ni_syscall), // 58
686 //.. // (__NR_oldolduname, sys_olduname), // 59 Linux -- obsolete
688 GENX_(__NR_umask
, sys_umask
), // 60
689 GENX_(__NR_chroot
, sys_chroot
), // 61
690 //.. // (__NR_ustat, sys_ustat) // 62 SVr4 -- deprecated
691 GENXY(__NR_dup2
, sys_dup2
), // 63
692 GENX_(__NR_getppid
, sys_getppid
), // 64
694 GENX_(__NR_getpgrp
, sys_getpgrp
), // 65
695 GENX_(__NR_setsid
, sys_setsid
), // 66
696 LINXY(__NR_sigaction
, sys_sigaction
), // 67
697 //.. // (__NR_sgetmask, sys_sgetmask), // 68 */* (ANSI C)
698 //.. // (__NR_ssetmask, sys_ssetmask), // 69 */* (ANSI C)
700 GENX_(__NR_setreuid
, sys_setreuid
), // 70
701 GENX_(__NR_setregid
, sys_setregid
), // 71
702 PLAX_(__NR_sigsuspend
, sys_sigsuspend
), // 72
703 LINXY(__NR_sigpending
, sys_sigpending
), // 73
704 //.. // (__NR_sethostname, sys_sethostname), // 74 */*
706 GENX_(__NR_setrlimit
, sys_setrlimit
), // 75
707 //.. GENXY(__NR_getrlimit, sys_old_getrlimit), // 76
708 GENXY(__NR_getrusage
, sys_getrusage
), // 77
709 GENXY(__NR_gettimeofday
, sys_gettimeofday
), // 78
710 //.. GENX_(__NR_settimeofday, sys_settimeofday), // 79
712 GENXY(__NR_getgroups
, sys_getgroups
), // 80
713 GENX_(__NR_setgroups
, sys_setgroups
), // 81
714 //.. PLAX_(__NR_select, old_select), // 82
715 GENX_(__NR_symlink
, sys_symlink
), // 83
716 //.. // (__NR_oldlstat, sys_lstat), // 84 -- obsolete
718 GENX_(__NR_readlink
, sys_readlink
), // 85
719 //.. // (__NR_uselib, sys_uselib), // 86 */Linux
720 //.. // (__NR_swapon, sys_swapon), // 87 */Linux
721 //.. // (__NR_reboot, sys_reboot), // 88 */Linux
722 //.. // (__NR_readdir, old_readdir), // 89 -- superseded
724 PLAX_(__NR_mmap
, sys_mmap
), // 90
725 GENXY(__NR_munmap
, sys_munmap
), // 91
726 GENX_(__NR_truncate
, sys_truncate
), // 92
727 GENX_(__NR_ftruncate
, sys_ftruncate
), // 93
728 GENX_(__NR_fchmod
, sys_fchmod
), // 94
730 GENX_(__NR_fchown
, sys_fchown
), // 95
731 GENX_(__NR_getpriority
, sys_getpriority
), // 96
732 GENX_(__NR_setpriority
, sys_setpriority
), // 97
733 //.. GENX_(__NR_profil, sys_ni_syscall), // 98
734 GENXY(__NR_statfs
, sys_statfs
), // 99
736 GENXY(__NR_fstatfs
, sys_fstatfs
), // 100
737 //.. LINX_(__NR_ioperm, sys_ioperm), // 101
738 LINXY(__NR_socketcall
, sys_socketcall
), // 102
739 LINXY(__NR_syslog
, sys_syslog
), // 103
740 GENXY(__NR_setitimer
, sys_setitimer
), // 104
742 GENXY(__NR_getitimer
, sys_getitimer
), // 105
743 GENXY(__NR_stat
, sys_newstat
), // 106
744 GENXY(__NR_lstat
, sys_newlstat
), // 107
745 GENXY(__NR_fstat
, sys_newfstat
), // 108
746 //.. // (__NR_olduname, sys_uname), // 109 -- obsolete
748 //.. GENX_(__NR_iopl, sys_iopl), // 110
749 LINX_(__NR_vhangup
, sys_vhangup
), // 111
750 //.. GENX_(__NR_idle, sys_ni_syscall), // 112
751 //.. // (__NR_vm86old, sys_vm86old), // 113 x86/Linux-only
752 GENXY(__NR_wait4
, sys_wait4
), // 114
754 //.. // (__NR_swapoff, sys_swapoff), // 115 */Linux
755 LINXY(__NR_sysinfo
, sys_sysinfo
), // 116
756 LINXY(__NR_ipc
, sys_ipc
), // 117
757 GENX_(__NR_fsync
, sys_fsync
), // 118
758 PLAX_(__NR_sigreturn
, sys_sigreturn
), // 119 ?/Linux
760 LINX_(__NR_clone
, sys_clone
), // 120
761 //.. // (__NR_setdomainname, sys_setdomainname), // 121 */*(?)
762 GENXY(__NR_uname
, sys_newuname
), // 122
763 //.. PLAX_(__NR_modify_ldt, sys_modify_ldt), // 123
764 LINXY(__NR_adjtimex
, sys_adjtimex
), // 124
766 GENXY(__NR_mprotect
, sys_mprotect
), // 125
767 LINXY(__NR_sigprocmask
, sys_sigprocmask
), // 126
768 GENX_(__NR_create_module
, sys_ni_syscall
), // 127
769 LINX_(__NR_init_module
, sys_init_module
), // 128
770 LINX_(__NR_delete_module
, sys_delete_module
), // 129
772 //.. // Nb: get_kernel_syms() was removed 2.4-->2.6
773 //.. GENX_(__NR_get_kernel_syms, sys_ni_syscall), // 130
774 //.. LINX_(__NR_quotactl, sys_quotactl), // 131
775 GENX_(__NR_getpgid
, sys_getpgid
), // 132
776 GENX_(__NR_fchdir
, sys_fchdir
), // 133
777 //.. // (__NR_bdflush, sys_bdflush), // 134 */Linux
779 //.. // (__NR_sysfs, sys_sysfs), // 135 SVr4
780 LINX_(__NR_personality
, sys_personality
), // 136
781 //.. GENX_(__NR_afs_syscall, sys_ni_syscall), // 137
782 LINX_(__NR_setfsuid
, sys_setfsuid
), // 138
783 LINX_(__NR_setfsgid
, sys_setfsgid
), // 139
785 LINXY(__NR__llseek
, sys_llseek
), // 140
786 GENXY(__NR_getdents
, sys_getdents
), // 141
787 GENX_(__NR__newselect
, sys_select
), // 142
788 GENX_(__NR_flock
, sys_flock
), // 143
789 GENX_(__NR_msync
, sys_msync
), // 144
791 GENXY(__NR_readv
, sys_readv
), // 145
792 GENX_(__NR_writev
, sys_writev
), // 146
793 GENX_(__NR_getsid
, sys_getsid
), // 147
794 GENX_(__NR_fdatasync
, sys_fdatasync
), // 148
795 LINXY(__NR__sysctl
, sys_sysctl
), // 149
797 GENX_(__NR_mlock
, sys_mlock
), // 150
798 GENX_(__NR_munlock
, sys_munlock
), // 151
799 GENX_(__NR_mlockall
, sys_mlockall
), // 152
800 LINX_(__NR_munlockall
, sys_munlockall
), // 153
801 LINXY(__NR_sched_setparam
, sys_sched_setparam
), // 154
803 LINXY(__NR_sched_getparam
, sys_sched_getparam
), // 155
804 LINX_(__NR_sched_setscheduler
, sys_sched_setscheduler
), // 156
805 LINX_(__NR_sched_getscheduler
, sys_sched_getscheduler
), // 157
806 LINX_(__NR_sched_yield
, sys_sched_yield
), // 158
807 LINX_(__NR_sched_get_priority_max
, sys_sched_get_priority_max
),// 159
809 LINX_(__NR_sched_get_priority_min
, sys_sched_get_priority_min
),// 160
810 LINXY(__NR_sched_rr_get_interval
, sys_sched_rr_get_interval
), // 161
811 GENXY(__NR_nanosleep
, sys_nanosleep
), // 162
812 GENX_(__NR_mremap
, sys_mremap
), // 163
813 LINX_(__NR_setresuid
, sys_setresuid
), // 164
815 LINXY(__NR_getresuid
, sys_getresuid
), // 165
817 //.. GENX_(__NR_query_module, sys_ni_syscall), // 166
818 GENXY(__NR_poll
, sys_poll
), // 167
819 //.. // (__NR_nfsservctl, sys_nfsservctl), // 168 */Linux
821 LINX_(__NR_setresgid
, sys_setresgid
), // 169
822 LINXY(__NR_getresgid
, sys_getresgid
), // 170
823 LINXY(__NR_prctl
, sys_prctl
), // 171
824 PLAX_(__NR_rt_sigreturn
, sys_rt_sigreturn
), // 172
825 LINXY(__NR_rt_sigaction
, sys_rt_sigaction
), // 173
827 LINXY(__NR_rt_sigprocmask
, sys_rt_sigprocmask
), // 174
828 LINXY(__NR_rt_sigpending
, sys_rt_sigpending
), // 175
829 LINXY(__NR_rt_sigtimedwait
, sys_rt_sigtimedwait
), // 176
830 LINXY(__NR_rt_sigqueueinfo
, sys_rt_sigqueueinfo
), // 177
831 LINX_(__NR_rt_sigsuspend
, sys_rt_sigsuspend
), // 178
833 GENXY(__NR_pread64
, sys_pread64
), // 179
834 GENX_(__NR_pwrite64
, sys_pwrite64
), // 180
835 GENX_(__NR_chown
, sys_chown
), // 181
836 GENXY(__NR_getcwd
, sys_getcwd
), // 182
837 LINXY(__NR_capget
, sys_capget
), // 183
838 LINX_(__NR_capset
, sys_capset
), // 184
839 GENXY(__NR_sigaltstack
, sys_sigaltstack
), // 185
840 LINXY(__NR_sendfile
, sys_sendfile
), // 186
841 //.. GENXY(__NR_getpmsg, sys_getpmsg), // 187
842 //.. GENX_(__NR_putpmsg, sys_putpmsg), // 188
844 // Nb: we treat vfork as fork
845 GENX_(__NR_vfork
, sys_fork
), // 189
846 GENXY(__NR_ugetrlimit
, sys_getrlimit
), // 190
847 LINX_(__NR_readahead
, sys_readahead
), // 191 */Linux
848 PLAX_(__NR_mmap2
, sys_mmap2
), // 192
849 GENX_(__NR_truncate64
, sys_truncate64
), // 193
850 GENX_(__NR_ftruncate64
, sys_ftruncate64
), // 194
853 PLAXY(__NR_stat64
, sys_stat64
), // 195
854 PLAXY(__NR_lstat64
, sys_lstat64
), // 196
855 PLAXY(__NR_fstat64
, sys_fstat64
), // 197
857 // __NR_pciconfig_read // 198
858 // __NR_pciconfig_write // 199
859 // __NR_pciconfig_iobase // 200
860 // __NR_multiplexer // 201
862 GENXY(__NR_getdents64
, sys_getdents64
), // 202
863 LINX_(__NR_pivot_root
, sys_pivot_root
), // 203
864 LINXY(__NR_fcntl64
, sys_fcntl64
), // 204
865 GENX_(__NR_madvise
, sys_madvise
), // 205
866 GENXY(__NR_mincore
, sys_mincore
), // 206
867 LINX_(__NR_gettid
, sys_gettid
), // 207
868 //.. LINX_(__NR_tkill, sys_tkill), // 208 */Linux
869 LINX_(__NR_setxattr
, sys_setxattr
), // 209
870 LINX_(__NR_lsetxattr
, sys_lsetxattr
), // 210
871 LINX_(__NR_fsetxattr
, sys_fsetxattr
), // 211
872 LINXY(__NR_getxattr
, sys_getxattr
), // 212
873 LINXY(__NR_lgetxattr
, sys_lgetxattr
), // 213
874 LINXY(__NR_fgetxattr
, sys_fgetxattr
), // 214
875 LINXY(__NR_listxattr
, sys_listxattr
), // 215
876 LINXY(__NR_llistxattr
, sys_llistxattr
), // 216
877 LINXY(__NR_flistxattr
, sys_flistxattr
), // 217
878 LINX_(__NR_removexattr
, sys_removexattr
), // 218
879 LINX_(__NR_lremovexattr
, sys_lremovexattr
), // 219
880 LINX_(__NR_fremovexattr
, sys_fremovexattr
), // 220
882 LINXY(__NR_futex
, sys_futex
), // 221
883 LINX_(__NR_sched_setaffinity
, sys_sched_setaffinity
), // 222
884 LINXY(__NR_sched_getaffinity
, sys_sched_getaffinity
), // 223
885 /* 224 currently unused */
887 // __NR_tuxcall // 225
889 LINXY(__NR_sendfile64
, sys_sendfile64
), // 226
891 LINX_(__NR_io_setup
, sys_io_setup
), // 227
892 LINX_(__NR_io_destroy
, sys_io_destroy
), // 228
893 LINXY(__NR_io_getevents
, sys_io_getevents
), // 229
894 LINX_(__NR_io_submit
, sys_io_submit
), // 230
895 LINXY(__NR_io_cancel
, sys_io_cancel
), // 231
897 LINX_(__NR_set_tid_address
, sys_set_tid_address
), // 232
899 LINX_(__NR_fadvise64
, sys_fadvise64
), // 233 */(Linux?)
900 LINX_(__NR_exit_group
, sys_exit_group
), // 234
901 //.. GENXY(__NR_lookup_dcookie, sys_lookup_dcookie), // 235
902 LINXY(__NR_epoll_create
, sys_epoll_create
), // 236
903 LINX_(__NR_epoll_ctl
, sys_epoll_ctl
), // 237
904 LINXY(__NR_epoll_wait
, sys_epoll_wait
), // 238
906 //.. // (__NR_remap_file_pages, sys_remap_file_pages), // 239 */Linux
907 LINXY(__NR_timer_create
, sys_timer_create
), // 240
908 LINXY(__NR_timer_settime
, sys_timer_settime
), // 241
909 LINXY(__NR_timer_gettime
, sys_timer_gettime
), // 242
910 LINX_(__NR_timer_getoverrun
, sys_timer_getoverrun
), // 243
911 LINX_(__NR_timer_delete
, sys_timer_delete
), // 244
912 LINX_(__NR_clock_settime
, sys_clock_settime
), // 245
913 LINXY(__NR_clock_gettime
, sys_clock_gettime
), // 246
914 LINXY(__NR_clock_getres
, sys_clock_getres
), // 247
915 LINXY(__NR_clock_nanosleep
, sys_clock_nanosleep
), // 248
917 // __NR_swapcontext // 249
919 LINXY(__NR_tgkill
, sys_tgkill
), // 250 */Linux
920 //.. GENX_(__NR_utimes, sys_utimes), // 251
921 GENXY(__NR_statfs64
, sys_statfs64
), // 252
922 GENXY(__NR_fstatfs64
, sys_fstatfs64
), // 253
923 LINX_(__NR_fadvise64_64
, sys_fadvise64_64
), // 254 */(Linux?)
927 /* Number 256 is reserved for sys_debug_setcontext */
928 /* Number 257 is reserved for vserver */
929 /* Number 258 is reserved for new sys_remap_file_pages */
930 LINX_(__NR_mbind
, sys_mbind
), // 259
931 LINXY(__NR_get_mempolicy
, sys_get_mempolicy
), // 260
932 LINX_(__NR_set_mempolicy
, sys_set_mempolicy
), // 261
934 LINXY(__NR_mq_open
, sys_mq_open
), // 262
935 LINX_(__NR_mq_unlink
, sys_mq_unlink
), // 263
936 LINX_(__NR_mq_timedsend
, sys_mq_timedsend
), // 264
937 LINXY(__NR_mq_timedreceive
, sys_mq_timedreceive
), // 265
938 LINX_(__NR_mq_notify
, sys_mq_notify
), // 266
939 LINXY(__NR_mq_getsetattr
, sys_mq_getsetattr
), // 267
940 // __NR_kexec_load // 268
942 /* Number 269 is reserved for sys_add_key */
943 /* Number 270 is reserved for sys_request_key */
944 /* Number 271 is reserved for sys_keyctl */
945 /* Number 272 is reserved for sys_waitid */
946 LINX_(__NR_ioprio_set
, sys_ioprio_set
), // 273
947 LINX_(__NR_ioprio_get
, sys_ioprio_get
), // 274
949 LINX_(__NR_inotify_init
, sys_inotify_init
), // 275
950 LINX_(__NR_inotify_add_watch
, sys_inotify_add_watch
), // 276
951 LINX_(__NR_inotify_rm_watch
, sys_inotify_rm_watch
), // 277
952 PLAXY(__NR_spu_run
, sys_spu_run
), // 278
953 PLAX_(__NR_spu_create
, sys_spu_create
), // 279
955 LINXY(__NR_pselect6
, sys_pselect6
), // 280
956 LINXY(__NR_ppoll
, sys_ppoll
), // 281
958 LINXY(__NR_openat
, sys_openat
), // 286
959 LINX_(__NR_mkdirat
, sys_mkdirat
), // 287
960 LINX_(__NR_mknodat
, sys_mknodat
), // 288
961 LINX_(__NR_fchownat
, sys_fchownat
), // 289
962 LINX_(__NR_futimesat
, sys_futimesat
), // 290
963 PLAXY(__NR_fstatat64
, sys_fstatat64
), // 291
964 LINX_(__NR_unlinkat
, sys_unlinkat
), // 292
965 LINX_(__NR_renameat
, sys_renameat
), // 293
966 LINX_(__NR_linkat
, sys_linkat
), // 294
967 LINX_(__NR_symlinkat
, sys_symlinkat
), // 295
968 LINX_(__NR_readlinkat
, sys_readlinkat
), // 296
969 LINX_(__NR_fchmodat
, sys_fchmodat
), // 297
970 LINX_(__NR_faccessat
, sys_faccessat
), // 298
971 LINX_(__NR_set_robust_list
, sys_set_robust_list
), // 299
972 LINXY(__NR_get_robust_list
, sys_get_robust_list
), // 300
973 LINXY(__NR_move_pages
, sys_move_pages
), // 301
974 LINXY(__NR_getcpu
, sys_getcpu
), // 302
975 LINXY(__NR_epoll_pwait
, sys_epoll_pwait
), // 303
976 LINX_(__NR_utimensat
, sys_utimensat
), // 304
977 LINXY(__NR_signalfd
, sys_signalfd
), // 305
978 LINXY(__NR_timerfd_create
, sys_timerfd_create
), // 306
979 LINXY(__NR_eventfd
, sys_eventfd
), // 307
980 LINX_(__NR_sync_file_range2
, sys_sync_file_range2
), // 308
981 LINX_(__NR_fallocate
, sys_fallocate
), // 309
982 // LINXY(__NR_subpage_prot, sys_ni_syscall), // 310
983 LINXY(__NR_timerfd_settime
, sys_timerfd_settime
), // 311
984 LINXY(__NR_timerfd_gettime
, sys_timerfd_gettime
), // 312
985 LINXY(__NR_signalfd4
, sys_signalfd4
), // 313
986 LINXY(__NR_eventfd2
, sys_eventfd2
), // 314
987 LINXY(__NR_epoll_create1
, sys_epoll_create1
), // 315
988 LINXY(__NR_dup3
, sys_dup3
), // 316
989 LINXY(__NR_pipe2
, sys_pipe2
), // 317
990 LINXY(__NR_inotify_init1
, sys_inotify_init1
), // 318
991 LINXY(__NR_perf_event_open
, sys_perf_event_open
), // 319
992 LINXY(__NR_preadv
, sys_preadv
), // 320
993 LINX_(__NR_pwritev
, sys_pwritev
), // 321
994 LINXY(__NR_rt_tgsigqueueinfo
, sys_rt_tgsigqueueinfo
),// 322
996 LINXY(__NR_socket
, sys_socket
), // 326
997 LINX_(__NR_bind
, sys_bind
), // 327
998 LINX_(__NR_connect
, sys_connect
), // 328
999 LINX_(__NR_listen
, sys_listen
), // 329
1000 LINXY(__NR_accept
, sys_accept
), // 330
1001 LINXY(__NR_getsockname
, sys_getsockname
), // 331
1002 LINXY(__NR_getpeername
, sys_getpeername
), // 332
1004 LINX_(__NR_send
, sys_send
), // 334
1005 LINX_(__NR_sendto
, sys_sendto
), // 335
1006 LINXY(__NR_recv
, sys_recv
), // 336
1007 LINXY(__NR_recvfrom
, sys_recvfrom
), // 337
1008 LINX_(__NR_shutdown
, sys_shutdown
), // 338
1009 LINX_(__NR_setsockopt
, sys_setsockopt
), // 339
1011 LINXY(__NR_recvmmsg
, sys_recvmmsg
), // 343
1012 LINXY(__NR_accept4
, sys_accept4
), // 344
1014 LINX_(__NR_clock_adjtime
, sys_clock_adjtime
), // 347
1015 LINX_(__NR_syncfs
, sys_syncfs
), // 348
1016 LINXY(__NR_sendmmsg
, sys_sendmmsg
), // 349
1018 LINXY(__NR_process_vm_readv
, sys_process_vm_readv
), // 351
1019 LINX_(__NR_process_vm_writev
, sys_process_vm_writev
),// 352
1021 LINXY(__NR_getrandom
, sys_getrandom
), // 359
1022 LINXY(__NR_memfd_create
, sys_memfd_create
) // 360
1025 SyscallTableEntry
* ML_(get_linux_syscall_entry
) ( UInt sysno
)
1027 const UInt syscall_table_size
1028 = sizeof(syscall_table
) / sizeof(syscall_table
[0]);
1030 /* Is it in the contiguous initial section of the table? */
1031 if (sysno
< syscall_table_size
) {
1032 SyscallTableEntry
* sys
= &syscall_table
[sysno
];
1033 if (sys
->before
== NULL
)
1034 return NULL
; /* no entry */
1039 /* Can't find a wrapper */
1043 #endif // defined(VGP_ppc32_linux)
1045 /*--------------------------------------------------------------------*/
1047 /*--------------------------------------------------------------------*/