blob: d1506028c245488c5d781b79523054a7a21071ad [file] [log] [blame]
cerion85665ca2005-06-20 15:51:07 +00001
2/*--------------------------------------------------------------------*/
3/*--- Platform-specific syscalls stuff. syswrap-ppc32-linux.c ---*/
4/*--------------------------------------------------------------------*/
5
6/*
7 This file is part of Valgrind, a dynamic binary instrumentation
8 framework.
9
Elliott Hughesed398002017-06-21 14:41:24 -070010 Copyright (C) 2005-2017 Nicholas Nethercote <njn@valgrind.org>
11 Copyright (C) 2005-2017 Cerion Armour-Brown <cerion@open-works.co.uk>
cerion85665ca2005-06-20 15:51:07 +000012
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.
17
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.
22
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
26 02111-1307, USA.
27
28 The GNU General Public License is contained in the file COPYING.
29*/
30
njn8b68b642009-06-24 00:37:09 +000031#if defined(VGP_ppc32_linux)
32
cerion85665ca2005-06-20 15:51:07 +000033#include "pub_core_basics.h"
sewardjc95257a2006-10-14 19:51:19 +000034#include "pub_core_vki.h"
35#include "pub_core_vkiscnums.h"
cerion85665ca2005-06-20 15:51:07 +000036#include "pub_core_threadstate.h"
cerion85665ca2005-06-20 15:51:07 +000037#include "pub_core_aspacemgr.h"
njn899ce732005-06-21 00:28:11 +000038#include "pub_core_debuglog.h"
cerion85665ca2005-06-20 15:51:07 +000039#include "pub_core_libcbase.h"
40#include "pub_core_libcassert.h"
cerion85665ca2005-06-20 15:51:07 +000041#include "pub_core_libcprint.h"
42#include "pub_core_libcproc.h"
sewardje00659d2005-11-10 13:15:31 +000043#include "pub_core_libcsignal.h"
cerion85665ca2005-06-20 15:51:07 +000044#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"
51
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"
56
cerion85665ca2005-06-20 15:51:07 +000057
58/* ---------------------------------------------------------------------
njne1486662005-11-10 02:48:04 +000059 clone() handling
cerion85665ca2005-06-20 15:51:07 +000060 ------------------------------------------------------------------ */
61
cerion85665ca2005-06-20 15:51:07 +000062/* Call f(arg1), but first switch stacks, using 'stack' as the new
njna3afdfb2005-11-09 04:49:28 +000063 stack, and use 'retaddr' as f's return-to address. Also, clear all
cerion85665ca2005-06-20 15:51:07 +000064 the integer registers before entering f.*/
65__attribute__((noreturn))
njna3afdfb2005-11-09 04:49:28 +000066void ML_(call_on_new_stack_0_1) ( Addr stack,
67 Addr retaddr,
68 void (*f)(Word),
69 Word arg1 );
cerion85665ca2005-06-20 15:51:07 +000070// r3 = stack
71// r4 = retaddr
72// r5 = f
73// r6 = arg1
74asm(
sewardjd9fc3822005-11-18 23:50:43 +000075".text\n"
njna3afdfb2005-11-09 04:49:28 +000076".globl vgModuleLocal_call_on_new_stack_0_1\n"
77"vgModuleLocal_call_on_new_stack_0_1:\n"
cerion85665ca2005-06-20 15:51:07 +000078" 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
83" li 4,0\n\t"
84" li 5,0\n\t"
85" li 6,0\n\t"
86" li 7,0\n\t"
87" li 8,0\n\t"
88" li 9,0\n\t"
89" li 10,0\n\t"
90" li 11,0\n\t"
91" li 12,0\n\t"
92" li 13,0\n\t"
93" li 14,0\n\t"
94" li 15,0\n\t"
95" li 16,0\n\t"
96" li 17,0\n\t"
97" li 18,0\n\t"
98" li 19,0\n\t"
99" li 20,0\n\t"
100" li 21,0\n\t"
101" li 22,0\n\t"
102" li 23,0\n\t"
103" li 24,0\n\t"
104" li 25,0\n\t"
105" li 26,0\n\t"
106" li 27,0\n\t"
107" li 28,0\n\t"
108" li 29,0\n\t"
109" li 30,0\n\t"
110" li 31,0\n\t"
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
sewardj2fedc642005-11-19 02:02:57 +0000115".previous\n"
cerion85665ca2005-06-20 15:51:07 +0000116);
117
118
cerion85665ca2005-06-20 15:51:07 +0000119/*
120 Perform a clone system call. clone is strange because it has
121 fork()-like return-twice semantics, so it needs special
122 handling here.
123
124 Upon entry, we have:
125
126 int (fn)(void*) in r3
127 void* child_stack in r4
128 int flags in r5
129 void* arg in r6
130 pid_t* child_tid in r7
131 pid_t* parent_tid in r8
sewardje21058c2005-08-05 02:15:18 +0000132 void* ??? in r9
cerion85665ca2005-06-20 15:51:07 +0000133
134 System call requires:
135
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)
sewardje21058c2005-08-05 02:15:18 +0000140 ?? child_tls in r6 (sc arg4)
141 pid_t* child_tid in r7 (sc arg5)
142 void* ??? in r8 (sc arg6)
cerion85665ca2005-06-20 15:51:07 +0000143
144 Returns an Int encoded in the linux-ppc32 way, not a SysRes.
145 */
sewardj7d15e512005-09-30 01:20:47 +0000146#define __NR_CLONE VG_STRINGIFY(__NR_clone)
147#define __NR_EXIT VG_STRINGIFY(__NR_exit)
cerion85665ca2005-06-20 15:51:07 +0000148
Elliott Hughesed398002017-06-21 14:41:24 -0700149// See priv_syswrap-linux.h for arg profile.
cerion85665ca2005-06-20 15:51:07 +0000150asm(
sewardjd9fc3822005-11-18 23:50:43 +0000151".text\n"
philippe9fdca562012-04-16 22:06:47 +0000152".globl do_syscall_clone_ppc32_linux\n"
cerion85665ca2005-06-20 15:51:07 +0000153"do_syscall_clone_ppc32_linux:\n"
154" stwu 1,-32(1)\n"
155" stw 29,20(1)\n"
156" stw 30,24(1)\n"
157" stw 31,28(1)\n"
158" mr 30,3\n" // preserve fn
159" mr 31,6\n" // preserve arg
160
161 // setup child stack
162" rlwinm 4,4,0,~0xf\n" // trim sp to multiple of 16 bytes
163" li 0,0\n"
164" stwu 0,-16(4)\n" // make initial stack frame
165" mr 29,4\n" // preserve sp
166
167 // setup syscall
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
sewardje21058c2005-08-05 02:15:18 +0000172" 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: ????
cerion85665ca2005-06-20 15:51:07 +0000176
177" sc\n" // clone()
178
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
182
183 /* CHILD - call thread function */
184 /* Note: 2.4 kernel doesn't set the child stack pointer,
185 so we do it here.
186 That does leave a small window for a signal to be delivered
187 on the wrong stack, unfortunately. */
188" mr 1,29\n"
189" mtctr 30\n" // ctr reg = fn
190" mr 3,31\n" // r3 = arg
191" bctrl\n" // call fn()
192
193 // exit with result
194" li 0,"__NR_EXIT"\n"
195" sc\n"
196
197 // Exit returned?!
198" .long 0\n"
199
200 // PARENT or ERROR - return
201"1: lwz 29,20(1)\n"
202" lwz 30,24(1)\n"
203" lwz 31,28(1)\n"
204" addi 1,1,32\n"
205" blr\n"
sewardj2fedc642005-11-19 02:02:57 +0000206".previous\n"
cerion85665ca2005-06-20 15:51:07 +0000207);
208
209#undef __NR_CLONE
210#undef __NR_EXIT
cerion85665ca2005-06-20 15:51:07 +0000211
cerion85665ca2005-06-20 15:51:07 +0000212
213/* ---------------------------------------------------------------------
cerion85665ca2005-06-20 15:51:07 +0000214 More thread stuff
215 ------------------------------------------------------------------ */
216
njnaf839f52005-06-23 03:27:57 +0000217void VG_(cleanup_thread) ( ThreadArchState* arch )
cerion85665ca2005-06-20 15:51:07 +0000218{
cerion85665ca2005-06-20 15:51:07 +0000219}
220
cerion85665ca2005-06-20 15:51:07 +0000221/* ---------------------------------------------------------------------
222 PRE/POST wrappers for ppc32/Linux-specific syscalls
223 ------------------------------------------------------------------ */
224
225#define PRE(name) DEFN_PRE_TEMPLATE(ppc32_linux, name)
226#define POST(name) DEFN_POST_TEMPLATE(ppc32_linux, name)
227
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
232 magic. */
233
tom9548a162005-09-30 08:07:53 +0000234DECL_TEMPLATE(ppc32_linux, sys_mmap);
235DECL_TEMPLATE(ppc32_linux, sys_mmap2);
cerion85665ca2005-06-20 15:51:07 +0000236DECL_TEMPLATE(ppc32_linux, sys_stat64);
cerion508aef52005-06-24 15:26:49 +0000237DECL_TEMPLATE(ppc32_linux, sys_lstat64);
sewardj5b91c402006-07-24 10:06:09 +0000238DECL_TEMPLATE(ppc32_linux, sys_fstatat64);
cerion85665ca2005-06-20 15:51:07 +0000239DECL_TEMPLATE(ppc32_linux, sys_fstat64);
sewardjb865b162005-07-08 18:26:37 +0000240DECL_TEMPLATE(ppc32_linux, sys_sigreturn);
sewardj4ce89e12005-11-16 19:15:33 +0000241DECL_TEMPLATE(ppc32_linux, sys_rt_sigreturn);
tom313639f2006-04-03 16:38:33 +0000242DECL_TEMPLATE(ppc32_linux, sys_sigsuspend);
sewardjec3869f2008-11-05 11:36:59 +0000243DECL_TEMPLATE(ppc32_linux, sys_spu_create);
244DECL_TEMPLATE(ppc32_linux, sys_spu_run);
cerion508aef52005-06-24 15:26:49 +0000245
tom9548a162005-09-30 08:07:53 +0000246PRE(sys_mmap)
247{
248 SysRes r;
249
florianb26101c2015-08-08 21:45:33 +0000250 PRINT("sys_mmap ( %#lx, %lu, %lu, %lu, %lu, %lu )",
251 ARG1, ARG2, ARG3, ARG4, ARG5, ARG6 );
tom9548a162005-09-30 08:07:53 +0000252 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);
256
sewardj274461d2005-10-02 17:01:41 +0000257 r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
258 (Off64T)ARG6 );
tom9548a162005-09-30 08:07:53 +0000259 SET_STATUS_from_SysRes(r);
260}
261
262PRE(sys_mmap2)
263{
264 SysRes r;
265
266 // Exactly like old_mmap() except:
sewardje66f2e02006-12-30 17:45:08 +0000267 // - the file offset is specified in 4K units rather than bytes,
tom9548a162005-09-30 08:07:53 +0000268 // so that it can be used for files bigger than 2^32 bytes.
florianb26101c2015-08-08 21:45:33 +0000269 PRINT("sys_mmap2 ( %#lx, %lu, %lu, %lu, %lu, %lu )",
270 ARG1, ARG2, ARG3, ARG4, ARG5, ARG6 );
tom9548a162005-09-30 08:07:53 +0000271 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);
275
sewardj274461d2005-10-02 17:01:41 +0000276 r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
sewardje66f2e02006-12-30 17:45:08 +0000277 4096 * (Off64T)ARG6 );
tom9548a162005-09-30 08:07:53 +0000278 SET_STATUS_from_SysRes(r);
279}
280
cerion85665ca2005-06-20 15:51:07 +0000281// 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
285PRE(sys_stat64)
286{
barta0b6b2c2008-07-07 06:49:24 +0000287 PRINT("sys_stat64 ( %#lx, %#lx )",ARG1,ARG2);
cerion85665ca2005-06-20 15:51:07 +0000288 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) );
291}
292
293POST(sys_stat64)
294{
295 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
296}
297
cerion508aef52005-06-24 15:26:49 +0000298PRE(sys_lstat64)
299{
florianb26101c2015-08-08 21:45:33 +0000300 PRINT("sys_lstat64 ( %#lx(%s), %#lx )", ARG1, (HChar*)ARG1, ARG2);
cerion508aef52005-06-24 15:26:49 +0000301 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) );
304}
305
306POST(sys_lstat64)
307{
308 vg_assert(SUCCESS);
309 if (RES == 0) {
310 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
311 }
312}
313
sewardj5b91c402006-07-24 10:06:09 +0000314PRE(sys_fstatat64)
315{
florianb26101c2015-08-08 21:45:33 +0000316 PRINT("sys_fstatat64 ( %ld, %#lx(%s), %#lx )", SARG1, ARG2, (HChar*)ARG2,
317 ARG3);
sewardj5b91c402006-07-24 10:06:09 +0000318 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) );
322}
323
324POST(sys_fstatat64)
325{
326 POST_MEM_WRITE( ARG3, sizeof(struct vki_stat64) );
327}
328
cerion85665ca2005-06-20 15:51:07 +0000329PRE(sys_fstat64)
330{
florianb26101c2015-08-08 21:45:33 +0000331 PRINT("sys_fstat64 ( %lu, %#lx )", ARG1, ARG2);
cerion85665ca2005-06-20 15:51:07 +0000332 PRE_REG_READ2(long, "fstat64", unsigned long, fd, struct stat64 *, buf);
333 PRE_MEM_WRITE( "fstat64(buf)", ARG2, sizeof(struct vki_stat64) );
334}
cerion508aef52005-06-24 15:26:49 +0000335
cerion85665ca2005-06-20 15:51:07 +0000336POST(sys_fstat64)
337{
338 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
339}
340
341
342
343//.. PRE(old_select, MayBlock)
344//.. {
345//.. /* struct sel_arg_struct {
346//.. unsigned long n;
347//.. fd_set *inp, *outp, *exp;
348//.. struct timeval *tvp;
349//.. };
350//.. */
351//.. PRE_REG_READ1(long, "old_select", struct sel_arg_struct *, args);
352//.. PRE_MEM_READ( "old_select(args)", ARG1, 5*sizeof(UWord) );
353//..
354//.. {
355//.. UInt* arg_struct = (UInt*)ARG1;
356//.. UInt a1, a2, a3, a4, a5;
357//..
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];
363//..
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) );
373//.. }
374//.. }
375
sewardjb865b162005-07-08 18:26:37 +0000376PRE(sys_sigreturn)
377{
sewardjcba8f432007-03-19 14:34:08 +0000378 /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
379 an explanation of what follows. */
380
sewardjd2be8cc2011-03-28 20:33:52 +0000381 //ThreadState* tst;
sewardjcba8f432007-03-19 14:34:08 +0000382 PRINT("sys_sigreturn ( )");
sewardjb865b162005-07-08 18:26:37 +0000383
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));
387
388 ///* Adjust esp to point to start of frame; skip back up over
389 // sigreturn sequence's "popl %eax" and handler ret addr */
sewardjd2be8cc2011-03-28 20:33:52 +0000390 //tst = VG_(get_ThreadState)(tid);
sewardjb865b162005-07-08 18:26:37 +0000391 //tst->arch.vex.guest_ESP -= sizeof(Addr)+sizeof(Word);
sewardj4ce89e12005-11-16 19:15:33 +0000392 // Should we do something equivalent on ppc32? Who knows.
sewardjb865b162005-07-08 18:26:37 +0000393
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);
sewardj4ce89e12005-11-16 19:15:33 +0000397 // Should we do something equivalent on ppc32? Who knows.
sewardjb865b162005-07-08 18:26:37 +0000398
sewardjcba8f432007-03-19 14:34:08 +0000399 /* Restore register state from frame and remove it */
sewardjb865b162005-07-08 18:26:37 +0000400 VG_(sigframe_destroy)(tid, False);
401
sewardjcba8f432007-03-19 14:34:08 +0000402 /* 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);
sewardjb865b162005-07-08 18:26:37 +0000406
sewardjcba8f432007-03-19 14:34:08 +0000407 /* Check to see if any signals arose as a result of this. */
sewardjb865b162005-07-08 18:26:37 +0000408 *flags |= SfPollAfter;
409}
410
sewardj4ce89e12005-11-16 19:15:33 +0000411PRE(sys_rt_sigreturn)
412{
sewardjcba8f432007-03-19 14:34:08 +0000413 /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
414 an explanation of what follows. */
415
sewardjd2be8cc2011-03-28 20:33:52 +0000416 //ThreadState* tst;
sewardj4ce89e12005-11-16 19:15:33 +0000417 PRINT("rt_sigreturn ( )");
cerion85665ca2005-06-20 15:51:07 +0000418
sewardj4ce89e12005-11-16 19:15:33 +0000419 vg_assert(VG_(is_valid_tid)(tid));
420 vg_assert(tid >= 1 && tid < VG_N_THREADS);
421 vg_assert(VG_(is_running_thread)(tid));
422
423 ///* Adjust esp to point to start of frame; skip back up over handler
424 // ret addr */
sewardjd2be8cc2011-03-28 20:33:52 +0000425 //tst = VG_(get_ThreadState)(tid);
sewardj4ce89e12005-11-16 19:15:33 +0000426 //tst->arch.vex.guest_ESP -= sizeof(Addr);
427 // Should we do something equivalent on ppc32? Who knows.
428
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.
433
sewardjcba8f432007-03-19 14:34:08 +0000434 /* Restore register state from frame and remove it */
sewardj4ce89e12005-11-16 19:15:33 +0000435 VG_(sigframe_destroy)(tid, True);
436
sewardjcba8f432007-03-19 14:34:08 +0000437 /* 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);
sewardj4ce89e12005-11-16 19:15:33 +0000441
sewardjcba8f432007-03-19 14:34:08 +0000442 /* Check to see if any signals arose as a result of this. */
sewardj4ce89e12005-11-16 19:15:33 +0000443 *flags |= SfPollAfter;
444}
445
cerion85665ca2005-06-20 15:51:07 +0000446
447//.. PRE(sys_modify_ldt, Special)
448//.. {
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);
452//..
453//.. if (ARG1 == 0) {
454//.. /* read the LDT into ptr */
455//.. PRE_MEM_WRITE( "modify_ldt(ptr)", ARG2, ARG3 );
456//.. }
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) );
460//.. }
461//.. /* "do" the syscall ourselves; the kernel never sees it */
462//.. SET_RESULT( VG_(sys_modify_ldt)( tid, ARG1, (void*)ARG2, ARG3 ) );
463//..
464//.. if (ARG1 == 0 && !VG_(is_kerror)(RES) && RES > 0) {
465//.. POST_MEM_WRITE( ARG2, RES );
466//.. }
467//.. }
468
469//.. PRE(sys_set_thread_area, Special)
470//.. {
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) );
474//..
475//.. /* "do" the syscall ourselves; the kernel never sees it */
476//.. SET_RESULT( VG_(sys_set_thread_area)( tid, (void *)ARG1 ) );
477//.. }
478
479//.. PRE(sys_get_thread_area, Special)
480//.. {
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) );
484//..
485//.. /* "do" the syscall ourselves; the kernel never sees it */
486//.. SET_RESULT( VG_(sys_get_thread_area)( tid, (void *)ARG1 ) );
487//..
488//.. if (!VG_(is_kerror)(RES)) {
489//.. POST_MEM_WRITE( ARG1, sizeof(vki_modify_ldt_t) );
490//.. }
491//.. }
492
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)
496//.. {
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);
500//.. switch (ARG1) {
501//.. case VKI_PTRACE_PEEKTEXT:
502//.. case VKI_PTRACE_PEEKDATA:
503//.. case VKI_PTRACE_PEEKUSR:
504//.. PRE_MEM_WRITE( "ptrace(peek)", ARG4,
505//.. sizeof (long));
506//.. break;
507//.. case VKI_PTRACE_GETREGS:
508//.. PRE_MEM_WRITE( "ptrace(getregs)", ARG4,
509//.. sizeof (struct vki_user_regs_struct));
510//.. break;
511//.. case VKI_PTRACE_GETFPREGS:
512//.. PRE_MEM_WRITE( "ptrace(getfpregs)", ARG4,
513//.. sizeof (struct vki_user_i387_struct));
514//.. break;
515//.. case VKI_PTRACE_GETFPXREGS:
516//.. PRE_MEM_WRITE( "ptrace(getfpxregs)", ARG4,
517//.. sizeof(struct vki_user_fxsr_struct) );
518//.. break;
519//.. case VKI_PTRACE_SETREGS:
520//.. PRE_MEM_READ( "ptrace(setregs)", ARG4,
521//.. sizeof (struct vki_user_regs_struct));
522//.. break;
523//.. case VKI_PTRACE_SETFPREGS:
524//.. PRE_MEM_READ( "ptrace(setfpregs)", ARG4,
525//.. sizeof (struct vki_user_i387_struct));
526//.. break;
527//.. case VKI_PTRACE_SETFPXREGS:
528//.. PRE_MEM_READ( "ptrace(setfpxregs)", ARG4,
529//.. sizeof(struct vki_user_fxsr_struct) );
530//.. break;
531//.. default:
532//.. break;
533//.. }
534//.. }
535
536//.. POST(sys_ptrace)
537//.. {
538//.. switch (ARG1) {
539//.. case VKI_PTRACE_PEEKTEXT:
540//.. case VKI_PTRACE_PEEKDATA:
541//.. case VKI_PTRACE_PEEKUSR:
542//.. POST_MEM_WRITE( ARG4, sizeof (long));
543//.. break;
544//.. case VKI_PTRACE_GETREGS:
545//.. POST_MEM_WRITE( ARG4, sizeof (struct vki_user_regs_struct));
546//.. break;
547//.. case VKI_PTRACE_GETFPREGS:
548//.. POST_MEM_WRITE( ARG4, sizeof (struct vki_user_i387_struct));
549//.. break;
550//.. case VKI_PTRACE_GETFPXREGS:
551//.. POST_MEM_WRITE( ARG4, sizeof(struct vki_user_fxsr_struct) );
552//.. break;
553//.. default:
554//.. break;
555//.. }
556//.. }
557
sewardj5f7a1a22011-07-11 18:23:09 +0000558/* NB: This is an almost identical clone of versions for x86-linux and
559 arm-linux, which are themselves literally identical. */
tom313639f2006-04-03 16:38:33 +0000560PRE(sys_sigsuspend)
561{
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.
565
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.
568 */
569 *flags |= SfMayBlock;
florianb26101c2015-08-08 21:45:33 +0000570 PRINT("sys_sigsuspend ( %lu )", ARG1 );
tom313639f2006-04-03 16:38:33 +0000571 PRE_REG_READ1(int, "sigsuspend", vki_old_sigset_t, mask);
572}
573
sewardjec3869f2008-11-05 11:36:59 +0000574PRE(sys_spu_create)
575{
576 PRE_MEM_RASCIIZ("stat64(filename)", ARG1);
577}
578POST(sys_spu_create)
579{
580 vg_assert(SUCCESS);
581}
582
583PRE(sys_spu_run)
584{
585 *flags |= SfMayBlock;
sewardj557c8502008-11-06 09:22:50 +0000586 if (ARG2 != 0)
587 PRE_MEM_WRITE("npc", ARG2, sizeof(unsigned int));
sewardjec3869f2008-11-05 11:36:59 +0000588 PRE_MEM_READ("event", ARG3, sizeof(unsigned int));
589}
590POST(sys_spu_run)
591{
sewardj557c8502008-11-06 09:22:50 +0000592 if (ARG2 != 0)
sewardjec3869f2008-11-05 11:36:59 +0000593 POST_MEM_WRITE(ARG2, sizeof(unsigned int));
594}
cerion85665ca2005-06-20 15:51:07 +0000595
596#undef PRE
597#undef POST
598
cerion85665ca2005-06-20 15:51:07 +0000599/* ---------------------------------------------------------------------
600 The ppc32/Linux syscall table
601 ------------------------------------------------------------------ */
602
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)
606
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).
610//
611// For those syscalls not handled by Valgrind, the annotation indicate its
612// arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/?
613// (unknown).
614
sewardjf5f1e122010-01-02 13:24:58 +0000615static SyscallTableEntry syscall_table[] = {
cerion85665ca2005-06-20 15:51:07 +0000616//.. (restart_syscall) // 0
sewardja932d292005-07-08 00:18:25 +0000617 GENX_(__NR_exit, sys_exit), // 1
sewardjfbba3712005-11-13 02:41:58 +0000618 GENX_(__NR_fork, sys_fork), // 2
sewardja932d292005-07-08 00:18:25 +0000619 GENXY(__NR_read, sys_read), // 3
620 GENX_(__NR_write, sys_write), // 4
cerion85665ca2005-06-20 15:51:07 +0000621
sewardja932d292005-07-08 00:18:25 +0000622 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
sewardjb865b162005-07-08 18:26:37 +0000626 GENX_(__NR_link, sys_link), // 9
627
sewardja932d292005-07-08 00:18:25 +0000628 GENX_(__NR_unlink, sys_unlink), // 10
629 GENX_(__NR_execve, sys_execve), // 11
sewardjb865b162005-07-08 18:26:37 +0000630 GENX_(__NR_chdir, sys_chdir), // 12
sewardja932d292005-07-08 00:18:25 +0000631 GENXY(__NR_time, sys_time), // 13
tom313639f2006-04-03 16:38:33 +0000632 GENX_(__NR_mknod, sys_mknod), // 14
cerion85665ca2005-06-20 15:51:07 +0000633//..
sewardja932d292005-07-08 00:18:25 +0000634 GENX_(__NR_chmod, sys_chmod), // 15
sewardja58bbbc2006-04-14 01:04:04 +0000635 GENX_(__NR_lchown, sys_lchown), // 16 ## P
cerion85665ca2005-06-20 15:51:07 +0000636//.. GENX_(__NR_break, sys_ni_syscall), // 17
637//.. // (__NR_oldstat, sys_stat), // 18 (obsolete)
njncd405ea2005-08-31 02:44:31 +0000638 LINX_(__NR_lseek, sys_lseek), // 19
cerion85665ca2005-06-20 15:51:07 +0000639//..
sewardja932d292005-07-08 00:18:25 +0000640 GENX_(__NR_getpid, sys_getpid), // 20
sewardja58bbbc2006-04-14 01:04:04 +0000641 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
cerion85665ca2005-06-20 15:51:07 +0000645//..
646//.. // (__NR_stime, sys_stime), // 25 * (SVr4,SVID,X/OPEN)
647//.. PLAXY(__NR_ptrace, sys_ptrace), // 26
sewardja9fff9b2005-08-19 10:07:29 +0000648 GENX_(__NR_alarm, sys_alarm), // 27
cerion85665ca2005-06-20 15:51:07 +0000649//.. // (__NR_oldfstat, sys_fstat), // 28 * L -- obsolete
sewardja932d292005-07-08 00:18:25 +0000650 GENX_(__NR_pause, sys_pause), // 29
cerion85665ca2005-06-20 15:51:07 +0000651//..
njncd405ea2005-08-31 02:44:31 +0000652 LINX_(__NR_utime, sys_utime), // 30
cerion85665ca2005-06-20 15:51:07 +0000653//.. GENX_(__NR_stty, sys_ni_syscall), // 31
654//.. GENX_(__NR_gtty, sys_ni_syscall), // 32
sewardja932d292005-07-08 00:18:25 +0000655 GENX_(__NR_access, sys_access), // 33
cerion85665ca2005-06-20 15:51:07 +0000656//.. GENX_(__NR_nice, sys_nice), // 34
657//..
658//.. GENX_(__NR_ftime, sys_ni_syscall), // 35
sewardjdfd53342014-09-04 10:51:49 +0000659 GENX_(__NR_sync, sys_sync), // 36
sewardjb865b162005-07-08 18:26:37 +0000660 GENX_(__NR_kill, sys_kill), // 37
661 GENX_(__NR_rename, sys_rename), // 38
662 GENX_(__NR_mkdir, sys_mkdir), // 39
663
sewardj6a324492005-08-05 00:10:11 +0000664 GENX_(__NR_rmdir, sys_rmdir), // 40
sewardja932d292005-07-08 00:18:25 +0000665 GENXY(__NR_dup, sys_dup), // 41
njncd405ea2005-08-31 02:44:31 +0000666 LINXY(__NR_pipe, sys_pipe), // 42
sewardj6a324492005-08-05 00:10:11 +0000667 GENXY(__NR_times, sys_times), // 43
cerion85665ca2005-06-20 15:51:07 +0000668//.. GENX_(__NR_prof, sys_ni_syscall), // 44
669//..
sewardja932d292005-07-08 00:18:25 +0000670 GENX_(__NR_brk, sys_brk), // 45
sewardja58bbbc2006-04-14 01:04:04 +0000671 GENX_(__NR_setgid, sys_setgid), // 46
672 GENX_(__NR_getgid, sys_getgid), // 47
cerion85665ca2005-06-20 15:51:07 +0000673//.. // (__NR_signal, sys_signal), // 48 */* (ANSI C)
sewardja58bbbc2006-04-14 01:04:04 +0000674 GENX_(__NR_geteuid, sys_geteuid), // 49
cerion508aef52005-06-24 15:26:49 +0000675
sewardja58bbbc2006-04-14 01:04:04 +0000676 GENX_(__NR_getegid, sys_getegid), // 50
cerion85665ca2005-06-20 15:51:07 +0000677//.. GENX_(__NR_acct, sys_acct), // 51
sewardja58bbbc2006-04-14 01:04:04 +0000678 LINX_(__NR_umount2, sys_umount), // 52
cerion85665ca2005-06-20 15:51:07 +0000679//.. GENX_(__NR_lock, sys_ni_syscall), // 53
njn096ccdd2009-02-22 23:00:30 +0000680 LINXY(__NR_ioctl, sys_ioctl), // 54
cerion85665ca2005-06-20 15:51:07 +0000681//..
njn096ccdd2009-02-22 23:00:30 +0000682 LINXY(__NR_fcntl, sys_fcntl), // 55
cerion85665ca2005-06-20 15:51:07 +0000683//.. GENX_(__NR_mpx, sys_ni_syscall), // 56
sewardja932d292005-07-08 00:18:25 +0000684 GENX_(__NR_setpgid, sys_setpgid), // 57
cerion85665ca2005-06-20 15:51:07 +0000685//.. GENX_(__NR_ulimit, sys_ni_syscall), // 58
686//.. // (__NR_oldolduname, sys_olduname), // 59 Linux -- obsolete
sewardjb865b162005-07-08 18:26:37 +0000687
688 GENX_(__NR_umask, sys_umask), // 60
sewardja58bbbc2006-04-14 01:04:04 +0000689 GENX_(__NR_chroot, sys_chroot), // 61
cerion85665ca2005-06-20 15:51:07 +0000690//.. // (__NR_ustat, sys_ustat) // 62 SVr4 -- deprecated
sewardja932d292005-07-08 00:18:25 +0000691 GENXY(__NR_dup2, sys_dup2), // 63
sewardjb865b162005-07-08 18:26:37 +0000692 GENX_(__NR_getppid, sys_getppid), // 64
693
694 GENX_(__NR_getpgrp, sys_getpgrp), // 65
695 GENX_(__NR_setsid, sys_setsid), // 66
sewardjde9264c2011-07-11 17:48:24 +0000696 LINXY(__NR_sigaction, sys_sigaction), // 67
cerion85665ca2005-06-20 15:51:07 +0000697//.. // (__NR_sgetmask, sys_sgetmask), // 68 */* (ANSI C)
698//.. // (__NR_ssetmask, sys_ssetmask), // 69 */* (ANSI C)
699//..
sewardja58bbbc2006-04-14 01:04:04 +0000700 GENX_(__NR_setreuid, sys_setreuid), // 70
701 GENX_(__NR_setregid, sys_setregid), // 71
tom313639f2006-04-03 16:38:33 +0000702 PLAX_(__NR_sigsuspend, sys_sigsuspend), // 72
sewardja58bbbc2006-04-14 01:04:04 +0000703 LINXY(__NR_sigpending, sys_sigpending), // 73
cerion85665ca2005-06-20 15:51:07 +0000704//.. // (__NR_sethostname, sys_sethostname), // 74 */*
705//..
cerion508aef52005-06-24 15:26:49 +0000706 GENX_(__NR_setrlimit, sys_setrlimit), // 75
cerion85665ca2005-06-20 15:51:07 +0000707//.. GENXY(__NR_getrlimit, sys_old_getrlimit), // 76
sewardj33d17fa2005-08-21 00:49:41 +0000708 GENXY(__NR_getrusage, sys_getrusage), // 77
cerion508aef52005-06-24 15:26:49 +0000709 GENXY(__NR_gettimeofday, sys_gettimeofday), // 78
cerion85665ca2005-06-20 15:51:07 +0000710//.. GENX_(__NR_settimeofday, sys_settimeofday), // 79
711//..
sewardja58bbbc2006-04-14 01:04:04 +0000712 GENXY(__NR_getgroups, sys_getgroups), // 80
713 GENX_(__NR_setgroups, sys_setgroups), // 81
cerion85665ca2005-06-20 15:51:07 +0000714//.. PLAX_(__NR_select, old_select), // 82
sewardjb865b162005-07-08 18:26:37 +0000715 GENX_(__NR_symlink, sys_symlink), // 83
cerion85665ca2005-06-20 15:51:07 +0000716//.. // (__NR_oldlstat, sys_lstat), // 84 -- obsolete
717//..
sewardja932d292005-07-08 00:18:25 +0000718 GENX_(__NR_readlink, sys_readlink), // 85
cerion85665ca2005-06-20 15:51:07 +0000719//.. // (__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
723
tom9548a162005-09-30 08:07:53 +0000724 PLAX_(__NR_mmap, sys_mmap), // 90
cerion508aef52005-06-24 15:26:49 +0000725 GENXY(__NR_munmap, sys_munmap), // 91
sewardja58bbbc2006-04-14 01:04:04 +0000726 GENX_(__NR_truncate, sys_truncate), // 92
sewardj6a324492005-08-05 00:10:11 +0000727 GENX_(__NR_ftruncate, sys_ftruncate), // 93
sewardj2d7c3962005-07-29 22:01:19 +0000728 GENX_(__NR_fchmod, sys_fchmod), // 94
729
sewardja58bbbc2006-04-14 01:04:04 +0000730 GENX_(__NR_fchown, sys_fchown), // 95
sewardjdc1750a2005-12-02 16:45:28 +0000731 GENX_(__NR_getpriority, sys_getpriority), // 96
732 GENX_(__NR_setpriority, sys_setpriority), // 97
cerion85665ca2005-06-20 15:51:07 +0000733//.. GENX_(__NR_profil, sys_ni_syscall), // 98
sewardj17689552006-01-26 14:25:51 +0000734 GENXY(__NR_statfs, sys_statfs), // 99
cerion85665ca2005-06-20 15:51:07 +0000735//..
sewardja58bbbc2006-04-14 01:04:04 +0000736 GENXY(__NR_fstatfs, sys_fstatfs), // 100
cerion85665ca2005-06-20 15:51:07 +0000737//.. LINX_(__NR_ioperm, sys_ioperm), // 101
philippef2a7bbe2012-11-04 20:40:33 +0000738 LINXY(__NR_socketcall, sys_socketcall), // 102
sewardj3d45fac2006-07-24 10:14:37 +0000739 LINXY(__NR_syslog, sys_syslog), // 103
sewardja932d292005-07-08 00:18:25 +0000740 GENXY(__NR_setitimer, sys_setitimer), // 104
sewardje0036f72007-11-20 19:59:51 +0000741
742 GENXY(__NR_getitimer, sys_getitimer), // 105
sewardja932d292005-07-08 00:18:25 +0000743 GENXY(__NR_stat, sys_newstat), // 106
sewardj82022042005-11-17 11:01:55 +0000744 GENXY(__NR_lstat, sys_newlstat), // 107
sewardjfe0ffd42005-10-19 01:14:22 +0000745 GENXY(__NR_fstat, sys_newfstat), // 108
cerion85665ca2005-06-20 15:51:07 +0000746//.. // (__NR_olduname, sys_uname), // 109 -- obsolete
747//..
748//.. GENX_(__NR_iopl, sys_iopl), // 110
tomacb7c342009-11-25 11:54:56 +0000749 LINX_(__NR_vhangup, sys_vhangup), // 111
cerion85665ca2005-06-20 15:51:07 +0000750//.. GENX_(__NR_idle, sys_ni_syscall), // 112
751//.. // (__NR_vm86old, sys_vm86old), // 113 x86/Linux-only
sewardjfbba3712005-11-13 02:41:58 +0000752 GENXY(__NR_wait4, sys_wait4), // 114
cerion85665ca2005-06-20 15:51:07 +0000753//..
754//.. // (__NR_swapoff, sys_swapoff), // 115 */Linux
sewardj3d45fac2006-07-24 10:14:37 +0000755 LINXY(__NR_sysinfo, sys_sysinfo), // 116
philippe4eefc8c2012-10-21 20:21:17 +0000756 LINXY(__NR_ipc, sys_ipc), // 117
sewardjd84f4672005-10-07 23:06:13 +0000757 GENX_(__NR_fsync, sys_fsync), // 118
sewardjb865b162005-07-08 18:26:37 +0000758 PLAX_(__NR_sigreturn, sys_sigreturn), // 119 ?/Linux
cerion85665ca2005-06-20 15:51:07 +0000759//..
Elliott Hughesed398002017-06-21 14:41:24 -0700760 LINX_(__NR_clone, sys_clone), // 120
cerion85665ca2005-06-20 15:51:07 +0000761//.. // (__NR_setdomainname, sys_setdomainname), // 121 */*(?)
sewardja932d292005-07-08 00:18:25 +0000762 GENXY(__NR_uname, sys_newuname), // 122
cerion85665ca2005-06-20 15:51:07 +0000763//.. PLAX_(__NR_modify_ldt, sys_modify_ldt), // 123
tom9ceaa972009-11-24 16:38:21 +0000764 LINXY(__NR_adjtimex, sys_adjtimex), // 124
765
sewardja932d292005-07-08 00:18:25 +0000766 GENXY(__NR_mprotect, sys_mprotect), // 125
njncd405ea2005-08-31 02:44:31 +0000767 LINXY(__NR_sigprocmask, sys_sigprocmask), // 126
bart65bfd212008-04-26 10:57:07 +0000768 GENX_(__NR_create_module, sys_ni_syscall), // 127
bart10ac1442008-06-21 16:28:24 +0000769 LINX_(__NR_init_module, sys_init_module), // 128
770 LINX_(__NR_delete_module, sys_delete_module), // 129
cerion85665ca2005-06-20 15:51:07 +0000771//..
772//.. // Nb: get_kernel_syms() was removed 2.4-->2.6
773//.. GENX_(__NR_get_kernel_syms, sys_ni_syscall), // 130
njncd405ea2005-08-31 02:44:31 +0000774//.. LINX_(__NR_quotactl, sys_quotactl), // 131
sewardja932d292005-07-08 00:18:25 +0000775 GENX_(__NR_getpgid, sys_getpgid), // 132
sewardj3774f862006-03-21 02:23:27 +0000776 GENX_(__NR_fchdir, sys_fchdir), // 133
cerion85665ca2005-06-20 15:51:07 +0000777//.. // (__NR_bdflush, sys_bdflush), // 134 */Linux
778//..
779//.. // (__NR_sysfs, sys_sysfs), // 135 SVr4
sewardja58bbbc2006-04-14 01:04:04 +0000780 LINX_(__NR_personality, sys_personality), // 136
cerion85665ca2005-06-20 15:51:07 +0000781//.. GENX_(__NR_afs_syscall, sys_ni_syscall), // 137
sewardja58bbbc2006-04-14 01:04:04 +0000782 LINX_(__NR_setfsuid, sys_setfsuid), // 138
783 LINX_(__NR_setfsgid, sys_setfsgid), // 139
sewardj31d83422005-10-15 02:00:41 +0000784
sewardja932d292005-07-08 00:18:25 +0000785 LINXY(__NR__llseek, sys_llseek), // 140
sewardj31d83422005-10-15 02:00:41 +0000786 GENXY(__NR_getdents, sys_getdents), // 141
sewardja932d292005-07-08 00:18:25 +0000787 GENX_(__NR__newselect, sys_select), // 142
sewardj6a324492005-08-05 00:10:11 +0000788 GENX_(__NR_flock, sys_flock), // 143
sewardja58bbbc2006-04-14 01:04:04 +0000789 GENX_(__NR_msync, sys_msync), // 144
cerion85665ca2005-06-20 15:51:07 +0000790//..
sewardja932d292005-07-08 00:18:25 +0000791 GENXY(__NR_readv, sys_readv), // 145
792 GENX_(__NR_writev, sys_writev), // 146
sewardja58bbbc2006-04-14 01:04:04 +0000793 GENX_(__NR_getsid, sys_getsid), // 147
sewardj5addd6c2005-08-18 23:44:13 +0000794 GENX_(__NR_fdatasync, sys_fdatasync), // 148
sewardja932d292005-07-08 00:18:25 +0000795 LINXY(__NR__sysctl, sys_sysctl), // 149
cerion85665ca2005-06-20 15:51:07 +0000796//..
sewardja58bbbc2006-04-14 01:04:04 +0000797 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
bart2819f142008-07-09 07:39:09 +0000801 LINXY(__NR_sched_setparam, sys_sched_setparam), // 154
cerion85665ca2005-06-20 15:51:07 +0000802//..
njnb2480c92005-08-30 02:17:23 +0000803 LINXY(__NR_sched_getparam, sys_sched_getparam), // 155
sewardjd84f4672005-10-07 23:06:13 +0000804 LINX_(__NR_sched_setscheduler, sys_sched_setscheduler), // 156
njnb2480c92005-08-30 02:17:23 +0000805 LINX_(__NR_sched_getscheduler, sys_sched_getscheduler), // 157
dirk331e5762005-12-05 22:11:02 +0000806 LINX_(__NR_sched_yield, sys_sched_yield), // 158
njnb2480c92005-08-30 02:17:23 +0000807 LINX_(__NR_sched_get_priority_max, sys_sched_get_priority_max),// 159
sewardj5addd6c2005-08-18 23:44:13 +0000808
njnb2480c92005-08-30 02:17:23 +0000809 LINX_(__NR_sched_get_priority_min, sys_sched_get_priority_min),// 160
tomb8b48482009-11-24 16:03:19 +0000810 LINXY(__NR_sched_rr_get_interval, sys_sched_rr_get_interval), // 161
sewardja932d292005-07-08 00:18:25 +0000811 GENXY(__NR_nanosleep, sys_nanosleep), // 162
812 GENX_(__NR_mremap, sys_mremap), // 163
sewardja58bbbc2006-04-14 01:04:04 +0000813 LINX_(__NR_setresuid, sys_setresuid), // 164
sewardj33d17fa2005-08-21 00:49:41 +0000814
sewardja58bbbc2006-04-14 01:04:04 +0000815 LINXY(__NR_getresuid, sys_getresuid), // 165
cerion85665ca2005-06-20 15:51:07 +0000816
817//.. GENX_(__NR_query_module, sys_ni_syscall), // 166
sewardjca334052005-07-24 06:30:37 +0000818 GENXY(__NR_poll, sys_poll), // 167
cerion85665ca2005-06-20 15:51:07 +0000819//.. // (__NR_nfsservctl, sys_nfsservctl), // 168 */Linux
820//..
sewardja58bbbc2006-04-14 01:04:04 +0000821 LINX_(__NR_setresgid, sys_setresgid), // 169
822 LINXY(__NR_getresgid, sys_getresgid), // 170
toma39ebc82006-12-18 15:22:46 +0000823 LINXY(__NR_prctl, sys_prctl), // 171
sewardj4ce89e12005-11-16 19:15:33 +0000824 PLAX_(__NR_rt_sigreturn, sys_rt_sigreturn), // 172
njncd405ea2005-08-31 02:44:31 +0000825 LINXY(__NR_rt_sigaction, sys_rt_sigaction), // 173
cerion85665ca2005-06-20 15:51:07 +0000826
njncd405ea2005-08-31 02:44:31 +0000827 LINXY(__NR_rt_sigprocmask, sys_rt_sigprocmask), // 174
sewardja58bbbc2006-04-14 01:04:04 +0000828 LINXY(__NR_rt_sigpending, sys_rt_sigpending), // 175
njncd405ea2005-08-31 02:44:31 +0000829 LINXY(__NR_rt_sigtimedwait, sys_rt_sigtimedwait), // 176
sewardja58bbbc2006-04-14 01:04:04 +0000830 LINXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo), // 177
sewardj1ea00a12005-11-16 12:51:34 +0000831 LINX_(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 178
832
njn7b1edbd2009-05-19 06:50:37 +0000833 GENXY(__NR_pread64, sys_pread64), // 179
834 GENX_(__NR_pwrite64, sys_pwrite64), // 180
sewardja58bbbc2006-04-14 01:04:04 +0000835 GENX_(__NR_chown, sys_chown), // 181
sewardjb865b162005-07-08 18:26:37 +0000836 GENXY(__NR_getcwd, sys_getcwd), // 182
bart744f9ea2008-08-27 17:41:56 +0000837 LINXY(__NR_capget, sys_capget), // 183
838 LINX_(__NR_capset, sys_capset), // 184
sewardja9fff9b2005-08-19 10:07:29 +0000839 GENXY(__NR_sigaltstack, sys_sigaltstack), // 185
sewardja58bbbc2006-04-14 01:04:04 +0000840 LINXY(__NR_sendfile, sys_sendfile), // 186
cerion85665ca2005-06-20 15:51:07 +0000841//.. GENXY(__NR_getpmsg, sys_getpmsg), // 187
842//.. GENX_(__NR_putpmsg, sys_putpmsg), // 188
sewardja932d292005-07-08 00:18:25 +0000843
844 // Nb: we treat vfork as fork
845 GENX_(__NR_vfork, sys_fork), // 189
846 GENXY(__NR_ugetrlimit, sys_getrlimit), // 190
sewardj792e00a2010-10-04 20:03:27 +0000847 LINX_(__NR_readahead, sys_readahead), // 191 */Linux
tom9548a162005-09-30 08:07:53 +0000848 PLAX_(__NR_mmap2, sys_mmap2), // 192
sewardja58bbbc2006-04-14 01:04:04 +0000849 GENX_(__NR_truncate64, sys_truncate64), // 193
sewardj48db0f02005-10-07 13:30:48 +0000850 GENX_(__NR_ftruncate64, sys_ftruncate64), // 194
cerion85665ca2005-06-20 15:51:07 +0000851//..
852
sewardja932d292005-07-08 00:18:25 +0000853 PLAXY(__NR_stat64, sys_stat64), // 195
854 PLAXY(__NR_lstat64, sys_lstat64), // 196
855 PLAXY(__NR_fstat64, sys_fstat64), // 197
cerion85665ca2005-06-20 15:51:07 +0000856
857// __NR_pciconfig_read // 198
858// __NR_pciconfig_write // 199
859// __NR_pciconfig_iobase // 200
860// __NR_multiplexer // 201
861
sewardja932d292005-07-08 00:18:25 +0000862 GENXY(__NR_getdents64, sys_getdents64), // 202
sewardj8a3377f2014-09-08 11:19:48 +0000863 LINX_(__NR_pivot_root, sys_pivot_root), // 203
njn096ccdd2009-02-22 23:00:30 +0000864 LINXY(__NR_fcntl64, sys_fcntl64), // 204
sewardj249ebd72005-10-07 19:12:18 +0000865 GENX_(__NR_madvise, sys_madvise), // 205
dirka07c7402006-02-22 12:54:44 +0000866 GENXY(__NR_mincore, sys_mincore), // 206
sewardja9fff9b2005-08-19 10:07:29 +0000867 LINX_(__NR_gettid, sys_gettid), // 207
cerion85665ca2005-06-20 15:51:07 +0000868//.. LINX_(__NR_tkill, sys_tkill), // 208 */Linux
mjwe746a122013-07-05 09:50:26 +0000869 LINX_(__NR_setxattr, sys_setxattr), // 209
870 LINX_(__NR_lsetxattr, sys_lsetxattr), // 210
871 LINX_(__NR_fsetxattr, sys_fsetxattr), // 211
njnef0da672005-08-30 03:02:00 +0000872 LINXY(__NR_getxattr, sys_getxattr), // 212
sewardja58bbbc2006-04-14 01:04:04 +0000873 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
cerion85665ca2005-06-20 15:51:07 +0000881
cerion508aef52005-06-24 15:26:49 +0000882 LINXY(__NR_futex, sys_futex), // 221
sewardja58bbbc2006-04-14 01:04:04 +0000883 LINX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 222
884 LINXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 223
cerion85665ca2005-06-20 15:51:07 +0000885/* 224 currently unused */
886
887// __NR_tuxcall // 225
888
sewardja58bbbc2006-04-14 01:04:04 +0000889 LINXY(__NR_sendfile64, sys_sendfile64), // 226
cerion85665ca2005-06-20 15:51:07 +0000890//..
sewardja58bbbc2006-04-14 01:04:04 +0000891 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
cerion85665ca2005-06-20 15:51:07 +0000896//..
sewardja932d292005-07-08 00:18:25 +0000897 LINX_(__NR_set_tid_address, sys_set_tid_address), // 232
cerion85665ca2005-06-20 15:51:07 +0000898
sewardj79820562006-09-11 20:33:55 +0000899 LINX_(__NR_fadvise64, sys_fadvise64), // 233 */(Linux?)
sewardja932d292005-07-08 00:18:25 +0000900 LINX_(__NR_exit_group, sys_exit_group), // 234
cerion85665ca2005-06-20 15:51:07 +0000901//.. GENXY(__NR_lookup_dcookie, sys_lookup_dcookie), // 235
sewardja58bbbc2006-04-14 01:04:04 +0000902 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
cerion85665ca2005-06-20 15:51:07 +0000905
906//.. // (__NR_remap_file_pages, sys_remap_file_pages), // 239 */Linux
sewardja58bbbc2006-04-14 01:04:04 +0000907 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
njn1588bc02005-08-26 03:49:43 +0000913 LINXY(__NR_clock_gettime, sys_clock_gettime), // 246
dirk331e5762005-12-05 22:11:02 +0000914 LINXY(__NR_clock_getres, sys_clock_getres), // 247
sewardja58bbbc2006-04-14 01:04:04 +0000915 LINXY(__NR_clock_nanosleep, sys_clock_nanosleep), // 248
cerion85665ca2005-06-20 15:51:07 +0000916
917// __NR_swapcontext // 249
918
sewardj7f4bd102005-11-17 14:22:22 +0000919 LINXY(__NR_tgkill, sys_tgkill), // 250 */Linux
cerion85665ca2005-06-20 15:51:07 +0000920//.. GENX_(__NR_utimes, sys_utimes), // 251
sewardja58bbbc2006-04-14 01:04:04 +0000921 GENXY(__NR_statfs64, sys_statfs64), // 252
922 GENXY(__NR_fstatfs64, sys_fstatfs64), // 253
923 LINX_(__NR_fadvise64_64, sys_fadvise64_64), // 254 */(Linux?)
cerion85665ca2005-06-20 15:51:07 +0000924
925// __NR_rtas // 255
926
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 */
carll521cebb2013-05-07 15:47:35 +0000930 LINX_(__NR_mbind, sys_mbind), // 259
dirka07c7402006-02-22 12:54:44 +0000931 LINXY(__NR_get_mempolicy, sys_get_mempolicy), // 260
932 LINX_(__NR_set_mempolicy, sys_set_mempolicy), // 261
cerion85665ca2005-06-20 15:51:07 +0000933
sewardj54e095f2005-11-17 19:09:02 +0000934 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
cerion85665ca2005-06-20 15:51:07 +0000940// __NR_kexec_load // 268
dirka07c7402006-02-22 12:54:44 +0000941
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 */
tom16dfea42008-12-15 08:58:29 +0000946 LINX_(__NR_ioprio_set, sys_ioprio_set), // 273
947 LINX_(__NR_ioprio_get, sys_ioprio_get), // 274
dirka07c7402006-02-22 12:54:44 +0000948
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
sewardjec3869f2008-11-05 11:36:59 +0000952 PLAXY(__NR_spu_run, sys_spu_run), // 278
953 PLAX_(__NR_spu_create, sys_spu_create), // 279
sewardj5b91c402006-07-24 10:06:09 +0000954
Elliott Hughesa0664b92017-04-18 17:46:52 -0700955 LINXY(__NR_pselect6, sys_pselect6), // 280
bart14fcbc12011-03-18 17:47:38 +0000956 LINXY(__NR_ppoll, sys_ppoll), // 281
957
sewardj5b91c402006-07-24 10:06:09 +0000958 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
tomd5fb58e2012-04-03 10:51:27 +0000973 LINXY(__NR_move_pages, sys_move_pages), // 301
tom472a34b2010-02-23 10:02:55 +0000974 LINXY(__NR_getcpu, sys_getcpu), // 302
bartf5ceec82008-04-26 07:45:10 +0000975 LINXY(__NR_epoll_pwait, sys_epoll_pwait), // 303
976 LINX_(__NR_utimensat, sys_utimensat), // 304
977 LINXY(__NR_signalfd, sys_signalfd), // 305
bart8c4a0232008-05-12 18:16:14 +0000978 LINXY(__NR_timerfd_create, sys_timerfd_create), // 306
tom4f5be8c2014-01-30 21:47:30 +0000979 LINXY(__NR_eventfd, sys_eventfd), // 307
tomc0fe32a2009-11-25 11:29:14 +0000980 LINX_(__NR_sync_file_range2, sys_sync_file_range2), // 308
tomd709b1d2009-11-25 11:51:05 +0000981 LINX_(__NR_fallocate, sys_fallocate), // 309
bart5fc7da22008-04-27 12:56:06 +0000982// 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
tom6c67ef52009-01-09 16:42:51 +0000985 LINXY(__NR_signalfd4, sys_signalfd4), // 313
tom4f5be8c2014-01-30 21:47:30 +0000986 LINXY(__NR_eventfd2, sys_eventfd2), // 314
njn72715882009-07-10 12:02:03 +0000987 LINXY(__NR_epoll_create1, sys_epoll_create1), // 315
tomf43793a2009-11-23 08:19:20 +0000988 LINXY(__NR_dup3, sys_dup3), // 316
tom3fbccee2009-10-27 09:19:26 +0000989 LINXY(__NR_pipe2, sys_pipe2), // 317
tom77002862009-10-27 21:42:46 +0000990 LINXY(__NR_inotify_init1, sys_inotify_init1), // 318
tomc8232f92011-06-08 09:10:40 +0000991 LINXY(__NR_perf_event_open, sys_perf_event_open), // 319
tomd8feb702009-10-28 10:04:11 +0000992 LINXY(__NR_preadv, sys_preadv), // 320
993 LINX_(__NR_pwritev, sys_pwritev), // 321
tom9e4b6362012-02-10 09:39:37 +0000994 LINXY(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo),// 322
995
sewardjdfd53342014-09-04 10:51:49 +0000996 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
1003
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
1010
mjwc53a5342015-02-17 19:50:45 +00001011 LINXY(__NR_recvmmsg, sys_recvmmsg), // 343
sewardjdfd53342014-09-04 10:51:49 +00001012 LINXY(__NR_accept4, sys_accept4), // 344
1013
tome6366712014-11-10 09:55:59 +00001014 LINX_(__NR_clock_adjtime, sys_clock_adjtime), // 347
tom9e2645c2015-05-07 18:54:31 +00001015 LINX_(__NR_syncfs, sys_syncfs), // 348
mjw13af2412015-02-17 16:04:09 +00001016 LINXY(__NR_sendmmsg, sys_sendmmsg), // 349
1017
tom9e4b6362012-02-10 09:39:37 +00001018 LINXY(__NR_process_vm_readv, sys_process_vm_readv), // 351
tome6366712014-11-10 09:55:59 +00001019 LINX_(__NR_process_vm_writev, sys_process_vm_writev),// 352
1020
tom9d7592e2015-01-19 21:52:44 +00001021 LINXY(__NR_getrandom, sys_getrandom), // 359
1022 LINXY(__NR_memfd_create, sys_memfd_create) // 360
cerion85665ca2005-06-20 15:51:07 +00001023};
1024
sewardjf5f1e122010-01-02 13:24:58 +00001025SyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno )
1026{
1027 const UInt syscall_table_size
1028 = sizeof(syscall_table) / sizeof(syscall_table[0]);
1029
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 */
1035 else
1036 return sys;
1037 }
1038
1039 /* Can't find a wrapper */
1040 return NULL;
1041}
cerion85665ca2005-06-20 15:51:07 +00001042
njn8b68b642009-06-24 00:37:09 +00001043#endif // defined(VGP_ppc32_linux)
1044
cerion85665ca2005-06-20 15:51:07 +00001045/*--------------------------------------------------------------------*/
1046/*--- end ---*/
1047/*--------------------------------------------------------------------*/