blob: 518b7ac11e1177255bec1604832d7f7455a5861e [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
sewardj4d474d02008-02-11 11:34:59 +000010 Copyright (C) 2005-2008 Nicholas Nethercote <njn@valgrind.org>
11 Copyright (C) 2005-2008 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
31#include "pub_core_basics.h"
sewardjc95257a2006-10-14 19:51:19 +000032#include "pub_core_vki.h"
33#include "pub_core_vkiscnums.h"
cerion85665ca2005-06-20 15:51:07 +000034#include "pub_core_threadstate.h"
cerion85665ca2005-06-20 15:51:07 +000035#include "pub_core_aspacemgr.h"
njn899ce732005-06-21 00:28:11 +000036#include "pub_core_debuglog.h"
cerion85665ca2005-06-20 15:51:07 +000037#include "pub_core_libcbase.h"
38#include "pub_core_libcassert.h"
cerion85665ca2005-06-20 15:51:07 +000039#include "pub_core_libcprint.h"
40#include "pub_core_libcproc.h"
sewardje00659d2005-11-10 13:15:31 +000041#include "pub_core_libcsignal.h"
cerion85665ca2005-06-20 15:51:07 +000042#include "pub_core_options.h"
43#include "pub_core_scheduler.h"
44#include "pub_core_sigframe.h" // For VG_(sigframe_destroy)()
45#include "pub_core_signals.h"
46#include "pub_core_syscall.h"
47#include "pub_core_syswrap.h"
48#include "pub_core_tooliface.h"
sewardj9084de72008-02-11 11:23:12 +000049#include "pub_core_stacks.h" // VG_(register_stack)
cerion85665ca2005-06-20 15:51:07 +000050
51#include "priv_types_n_macros.h"
52#include "priv_syswrap-generic.h" /* for decls of generic wrappers */
53#include "priv_syswrap-linux.h" /* for decls of linux-ish wrappers */
54#include "priv_syswrap-main.h"
55
cerion85665ca2005-06-20 15:51:07 +000056
57/* ---------------------------------------------------------------------
njne1486662005-11-10 02:48:04 +000058 clone() handling
cerion85665ca2005-06-20 15:51:07 +000059 ------------------------------------------------------------------ */
60
cerion85665ca2005-06-20 15:51:07 +000061/* Call f(arg1), but first switch stacks, using 'stack' as the new
njna3afdfb2005-11-09 04:49:28 +000062 stack, and use 'retaddr' as f's return-to address. Also, clear all
cerion85665ca2005-06-20 15:51:07 +000063 the integer registers before entering f.*/
64__attribute__((noreturn))
njna3afdfb2005-11-09 04:49:28 +000065void ML_(call_on_new_stack_0_1) ( Addr stack,
66 Addr retaddr,
67 void (*f)(Word),
68 Word arg1 );
cerion85665ca2005-06-20 15:51:07 +000069// r3 = stack
70// r4 = retaddr
71// r5 = f
72// r6 = arg1
73asm(
sewardjd9fc3822005-11-18 23:50:43 +000074".text\n"
njna3afdfb2005-11-09 04:49:28 +000075".globl vgModuleLocal_call_on_new_stack_0_1\n"
76"vgModuleLocal_call_on_new_stack_0_1:\n"
cerion85665ca2005-06-20 15:51:07 +000077" mr %r1,%r3\n\t" // stack to %sp
78" mtlr %r4\n\t" // retaddr to %lr
79" mtctr %r5\n\t" // f to count reg
80" mr %r3,%r6\n\t" // arg1 to %r3
81" li 0,0\n\t" // zero all GP regs
82" li 4,0\n\t"
83" li 5,0\n\t"
84" li 6,0\n\t"
85" li 7,0\n\t"
86" li 8,0\n\t"
87" li 9,0\n\t"
88" li 10,0\n\t"
89" li 11,0\n\t"
90" li 12,0\n\t"
91" li 13,0\n\t"
92" li 14,0\n\t"
93" li 15,0\n\t"
94" li 16,0\n\t"
95" li 17,0\n\t"
96" li 18,0\n\t"
97" li 19,0\n\t"
98" li 20,0\n\t"
99" li 21,0\n\t"
100" li 22,0\n\t"
101" li 23,0\n\t"
102" li 24,0\n\t"
103" li 25,0\n\t"
104" li 26,0\n\t"
105" li 27,0\n\t"
106" li 28,0\n\t"
107" li 29,0\n\t"
108" li 30,0\n\t"
109" li 31,0\n\t"
110" mtxer 0\n\t" // CAB: Need this?
111" mtcr 0\n\t" // CAB: Need this?
112" bctr\n\t" // jump to dst
113" trap\n" // should never get here
sewardj2fedc642005-11-19 02:02:57 +0000114".previous\n"
cerion85665ca2005-06-20 15:51:07 +0000115);
116
117
cerion85665ca2005-06-20 15:51:07 +0000118/*
119 Perform a clone system call. clone is strange because it has
120 fork()-like return-twice semantics, so it needs special
121 handling here.
122
123 Upon entry, we have:
124
125 int (fn)(void*) in r3
126 void* child_stack in r4
127 int flags in r5
128 void* arg in r6
129 pid_t* child_tid in r7
130 pid_t* parent_tid in r8
sewardje21058c2005-08-05 02:15:18 +0000131 void* ??? in r9
cerion85665ca2005-06-20 15:51:07 +0000132
133 System call requires:
134
135 int $__NR_clone in r0 (sc number)
136 int flags in r3 (sc arg1)
137 void* child_stack in r4 (sc arg2)
138 pid_t* parent_tid in r5 (sc arg3)
sewardje21058c2005-08-05 02:15:18 +0000139 ?? child_tls in r6 (sc arg4)
140 pid_t* child_tid in r7 (sc arg5)
141 void* ??? in r8 (sc arg6)
cerion85665ca2005-06-20 15:51:07 +0000142
143 Returns an Int encoded in the linux-ppc32 way, not a SysRes.
144 */
sewardj7d15e512005-09-30 01:20:47 +0000145#define __NR_CLONE VG_STRINGIFY(__NR_clone)
146#define __NR_EXIT VG_STRINGIFY(__NR_exit)
cerion85665ca2005-06-20 15:51:07 +0000147
148extern
njnffd9c1d2005-11-10 04:02:19 +0000149ULong do_syscall_clone_ppc32_linux ( Word (*fn)(void *),
cerion85665ca2005-06-20 15:51:07 +0000150 void* stack,
151 Int flags,
152 void* arg,
153 Int* child_tid,
154 Int* parent_tid,
155 vki_modify_ldt_t * );
156asm(
sewardjd9fc3822005-11-18 23:50:43 +0000157".text\n"
cerion85665ca2005-06-20 15:51:07 +0000158"do_syscall_clone_ppc32_linux:\n"
159" stwu 1,-32(1)\n"
160" stw 29,20(1)\n"
161" stw 30,24(1)\n"
162" stw 31,28(1)\n"
163" mr 30,3\n" // preserve fn
164" mr 31,6\n" // preserve arg
165
166 // setup child stack
167" rlwinm 4,4,0,~0xf\n" // trim sp to multiple of 16 bytes
168" li 0,0\n"
169" stwu 0,-16(4)\n" // make initial stack frame
170" mr 29,4\n" // preserve sp
171
172 // setup syscall
173" li 0,"__NR_CLONE"\n" // syscall number
174" mr 3,5\n" // syscall arg1: flags
175 // r4 already setup // syscall arg2: child_stack
176" mr 5,8\n" // syscall arg3: parent_tid
sewardje21058c2005-08-05 02:15:18 +0000177" mr 6,2\n" // syscall arg4: REAL THREAD tls
178" mr 7,7\n" // syscall arg5: child_tid
179" mr 8,8\n" // syscall arg6: ????
180" mr 9,9\n" // syscall arg7: ????
cerion85665ca2005-06-20 15:51:07 +0000181
182" sc\n" // clone()
183
184" mfcr 4\n" // return CR in r4 (low word of ULong)
185" cmpwi 3,0\n" // child if retval == 0
186" bne 1f\n" // jump if !child
187
188 /* CHILD - call thread function */
189 /* Note: 2.4 kernel doesn't set the child stack pointer,
190 so we do it here.
191 That does leave a small window for a signal to be delivered
192 on the wrong stack, unfortunately. */
193" mr 1,29\n"
194" mtctr 30\n" // ctr reg = fn
195" mr 3,31\n" // r3 = arg
196" bctrl\n" // call fn()
197
198 // exit with result
199" li 0,"__NR_EXIT"\n"
200" sc\n"
201
202 // Exit returned?!
203" .long 0\n"
204
205 // PARENT or ERROR - return
206"1: lwz 29,20(1)\n"
207" lwz 30,24(1)\n"
208" lwz 31,28(1)\n"
209" addi 1,1,32\n"
210" blr\n"
sewardj2fedc642005-11-19 02:02:57 +0000211".previous\n"
cerion85665ca2005-06-20 15:51:07 +0000212);
213
214#undef __NR_CLONE
215#undef __NR_EXIT
cerion85665ca2005-06-20 15:51:07 +0000216
217// forward declarations
sewardje23772f2005-07-02 11:27:02 +0000218static void setup_child ( ThreadArchState*, ThreadArchState* );
cerion85665ca2005-06-20 15:51:07 +0000219
220/*
221 When a client clones, we need to keep track of the new thread. This means:
222 1. allocate a ThreadId+ThreadState+stack for the the thread
223
224 2. initialize the thread's new VCPU state
225
226 3. create the thread using the same args as the client requested,
227 but using the scheduler entrypoint for IP, and a separate stack
228 for SP.
229 */
sewardje23772f2005-07-02 11:27:02 +0000230static SysRes do_clone ( ThreadId ptid,
231 UInt flags, Addr sp,
232 Int *parent_tidptr,
233 Int *child_tidptr,
sewardj6a324492005-08-05 00:10:11 +0000234 Addr child_tls)
sewardje23772f2005-07-02 11:27:02 +0000235{
sewardj6a324492005-08-05 00:10:11 +0000236 const Bool debug = False;
sewardje23772f2005-07-02 11:27:02 +0000237
238 ThreadId ctid = VG_(alloc_ThreadState)();
239 ThreadState* ptst = VG_(get_ThreadState)(ptid);
240 ThreadState* ctst = VG_(get_ThreadState)(ctid);
241 ULong word64;
242 UWord* stack;
sewardjef1cf8b2006-10-17 01:47:30 +0000243 NSegment const* seg;
sewardje23772f2005-07-02 11:27:02 +0000244 SysRes res;
245 vki_sigset_t blockall, savedmask;
246
247 VG_(sigfillset)(&blockall);
248
249 vg_assert(VG_(is_running_thread)(ptid));
250 vg_assert(VG_(is_valid_tid)(ctid));
251
njna3afdfb2005-11-09 04:49:28 +0000252 stack = (UWord*)ML_(allocstack)(ctid);
sewardj45f4e7c2005-09-27 19:20:21 +0000253 if (stack == NULL) {
254 res = VG_(mk_SysRes_Error)( VKI_ENOMEM );
255 goto out;
256 }
cerion85665ca2005-06-20 15:51:07 +0000257
258//? /* make a stack frame */
259//? stack -= 16;
260//? *(UWord *)stack = 0;
261
sewardje23772f2005-07-02 11:27:02 +0000262
263 /* Copy register state
264
265 Both parent and child return to the same place, and the code
266 following the clone syscall works out which is which, so we
267 don't need to worry about it.
268
269 The parent gets the child's new tid returned from clone, but the
270 child gets 0.
271
272 If the clone call specifies a NULL SP for the new thread, then
273 it actually gets a copy of the parent's SP.
sewardj6a324492005-08-05 00:10:11 +0000274
275 The child's TLS register (r2) gets set to the tlsaddr argument
276 if the CLONE_SETTLS flag is set.
sewardje23772f2005-07-02 11:27:02 +0000277 */
278 setup_child( &ctst->arch, &ptst->arch );
279
280 /* Make sys_clone appear to have returned Success(0) in the
281 child. */
sewardj6a324492005-08-05 00:10:11 +0000282 { UInt old_cr = LibVEX_GuestPPC32_get_CR( &ctst->arch.vex );
283 /* %r3 = 0 */
284 ctst->arch.vex.guest_GPR3 = 0;
285 /* %cr0.so = 0 */
286 LibVEX_GuestPPC32_put_CR( old_cr & ~(1<<28), &ctst->arch.vex );
287 }
sewardje23772f2005-07-02 11:27:02 +0000288
289 if (sp != 0)
290 ctst->arch.vex.guest_GPR1 = sp;
291
292 ctst->os_state.parent = ptid;
293
294 /* inherit signal mask */
295 ctst->sig_mask = ptst->sig_mask;
296 ctst->tmp_sig_mask = ptst->sig_mask;
297
298 /* We don't really know where the client stack is, because its
299 allocated by the client. The best we can do is look at the
300 memory mappings and try to derive some useful information. We
301 assume that esp starts near its highest possible value, and can
302 only go down to the start of the mmaped segment. */
sewardja48a4932005-09-29 11:09:56 +0000303 seg = VG_(am_find_nsegment)(sp);
304 if (seg && seg->kind != SkResvn) {
sewardje23772f2005-07-02 11:27:02 +0000305 ctst->client_stack_highest_word = (Addr)VG_PGROUNDUP(sp);
sewardja48a4932005-09-29 11:09:56 +0000306 ctst->client_stack_szB = ctst->client_stack_highest_word - seg->start;
sewardje23772f2005-07-02 11:27:02 +0000307
tom690c3c82008-02-08 15:17:07 +0000308 VG_(register_stack)(seg->start, ctst->client_stack_highest_word);
309
sewardje23772f2005-07-02 11:27:02 +0000310 if (debug)
sewardje21058c2005-08-05 02:15:18 +0000311 VG_(printf)("\ntid %d: guessed client stack range %p-%p\n",
sewardja48a4932005-09-29 11:09:56 +0000312 ctid, seg->start, VG_PGROUNDUP(sp));
sewardje23772f2005-07-02 11:27:02 +0000313 } else {
314 VG_(message)(Vg_UserMsg, "!? New thread %d starts with R1(%p) unmapped\n",
315 ctid, sp);
316 ctst->client_stack_szB = 0;
317 }
318
sewardjadb102f2007-11-09 23:21:44 +0000319 /* Assume the clone will succeed, and tell any tool that wants to
320 know that this thread has come into existence. If the clone
321 fails, we'll send out a ll_exit notification for it at the out:
322 label below, to clean up. */
323 VG_TRACK ( pre_thread_ll_create, ptid, ctid );
324
sewardje23772f2005-07-02 11:27:02 +0000325 if (flags & VKI_CLONE_SETTLS) {
326 if (debug)
sewardj6a324492005-08-05 00:10:11 +0000327 VG_(printf)("clone child has SETTLS: tls at %p\n", child_tls);
328 ctst->arch.vex.guest_GPR2 = child_tls;
sewardje23772f2005-07-02 11:27:02 +0000329 }
330
331 flags &= ~VKI_CLONE_SETTLS;
332
333 /* start the thread with everything blocked */
334 VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask);
335
336 /* Create the new thread */
337 word64 = do_syscall_clone_ppc32_linux(
njna3afdfb2005-11-09 04:49:28 +0000338 ML_(start_thread_NORETURN), stack, flags, &VG_(threads)[ctid],
sewardje23772f2005-07-02 11:27:02 +0000339 child_tidptr, parent_tidptr, NULL
340 );
sewardj6a324492005-08-05 00:10:11 +0000341 /* High half word64 is syscall return value. Low half is
342 the entire CR, from which we need to extract CR0.SO. */
343 /* VG_(printf)("word64 = 0x%llx\n", word64); */
344 res = VG_(mk_SysRes_ppc32_linux)(
345 /*val*/(UInt)(word64 >> 32),
346 /*errflag*/ (((UInt)word64) >> 28) & 1
347 );
sewardje23772f2005-07-02 11:27:02 +0000348
349 VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL);
350
sewardja48a4932005-09-29 11:09:56 +0000351 out:
sewardje23772f2005-07-02 11:27:02 +0000352 if (res.isError) {
353 /* clone failed */
354 VG_(cleanup_thread)(&ctst->arch);
355 ctst->status = VgTs_Empty;
sewardjadb102f2007-11-09 23:21:44 +0000356 /* oops. Better tell the tool the thread exited in a hurry :-) */
357 VG_TRACK( pre_thread_ll_exit, ctid );
sewardje23772f2005-07-02 11:27:02 +0000358 }
359
360 return res;
361}
cerion85665ca2005-06-20 15:51:07 +0000362
363
cerion85665ca2005-06-20 15:51:07 +0000364
365/* ---------------------------------------------------------------------
cerion85665ca2005-06-20 15:51:07 +0000366 More thread stuff
367 ------------------------------------------------------------------ */
368
njnaf839f52005-06-23 03:27:57 +0000369void VG_(cleanup_thread) ( ThreadArchState* arch )
cerion85665ca2005-06-20 15:51:07 +0000370{
cerion85665ca2005-06-20 15:51:07 +0000371}
372
sewardje23772f2005-07-02 11:27:02 +0000373void setup_child ( /*OUT*/ ThreadArchState *child,
374 /*IN*/ ThreadArchState *parent )
375{
376 /* We inherit our parent's guest state. */
377 child->vex = parent->vex;
378 child->vex_shadow = parent->vex_shadow;
379}
cerion85665ca2005-06-20 15:51:07 +0000380
381
382/* ---------------------------------------------------------------------
383 PRE/POST wrappers for ppc32/Linux-specific syscalls
384 ------------------------------------------------------------------ */
385
386#define PRE(name) DEFN_PRE_TEMPLATE(ppc32_linux, name)
387#define POST(name) DEFN_POST_TEMPLATE(ppc32_linux, name)
388
389/* Add prototypes for the wrappers declared here, so that gcc doesn't
390 harass us for not having prototypes. Really this is a kludge --
391 the right thing to do is to make these wrappers 'static' since they
392 aren't visible outside this file, but that requires even more macro
393 magic. */
394
cerion508aef52005-06-24 15:26:49 +0000395DECL_TEMPLATE(ppc32_linux, sys_socketcall);
tom9548a162005-09-30 08:07:53 +0000396DECL_TEMPLATE(ppc32_linux, sys_mmap);
397DECL_TEMPLATE(ppc32_linux, sys_mmap2);
cerion85665ca2005-06-20 15:51:07 +0000398DECL_TEMPLATE(ppc32_linux, sys_stat64);
cerion508aef52005-06-24 15:26:49 +0000399DECL_TEMPLATE(ppc32_linux, sys_lstat64);
sewardj5b91c402006-07-24 10:06:09 +0000400DECL_TEMPLATE(ppc32_linux, sys_fstatat64);
cerion85665ca2005-06-20 15:51:07 +0000401DECL_TEMPLATE(ppc32_linux, sys_fstat64);
cerion508aef52005-06-24 15:26:49 +0000402DECL_TEMPLATE(ppc32_linux, sys_ipc);
sewardje23772f2005-07-02 11:27:02 +0000403DECL_TEMPLATE(ppc32_linux, sys_clone);
sewardjb865b162005-07-08 18:26:37 +0000404DECL_TEMPLATE(ppc32_linux, sys_sigreturn);
sewardj4ce89e12005-11-16 19:15:33 +0000405DECL_TEMPLATE(ppc32_linux, sys_rt_sigreturn);
sewardj3849cc52005-11-07 15:48:31 +0000406DECL_TEMPLATE(ppc32_linux, sys_sigaction);
tom313639f2006-04-03 16:38:33 +0000407DECL_TEMPLATE(ppc32_linux, sys_sigsuspend);
cerion508aef52005-06-24 15:26:49 +0000408
409PRE(sys_socketcall)
410{
411# define ARG2_0 (((UWord*)ARG2)[0])
412# define ARG2_1 (((UWord*)ARG2)[1])
413# define ARG2_2 (((UWord*)ARG2)[2])
414# define ARG2_3 (((UWord*)ARG2)[3])
415# define ARG2_4 (((UWord*)ARG2)[4])
416# define ARG2_5 (((UWord*)ARG2)[5])
417
418 *flags |= SfMayBlock;
419 PRINT("sys_socketcall ( %d, %p )",ARG1,ARG2);
420 PRE_REG_READ2(long, "socketcall", int, call, unsigned long *, args);
421
422 switch (ARG1 /* request */) {
423
424 case VKI_SYS_SOCKETPAIR:
425 /* int socketpair(int d, int type, int protocol, int sv[2]); */
426 PRE_MEM_READ( "socketcall.socketpair(args)", ARG2, 4*sizeof(Addr) );
427 ML_(generic_PRE_sys_socketpair)( tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3 );
428 break;
429
430 case VKI_SYS_SOCKET:
431 /* int socket(int domain, int type, int protocol); */
432 PRE_MEM_READ( "socketcall.socket(args)", ARG2, 3*sizeof(Addr) );
433 break;
434
435 case VKI_SYS_BIND:
436 /* int bind(int sockfd, struct sockaddr *my_addr,
437 int addrlen); */
438 PRE_MEM_READ( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) );
439 ML_(generic_PRE_sys_bind)( tid, ARG2_0, ARG2_1, ARG2_2 );
440 break;
441
442 case VKI_SYS_LISTEN:
443 /* int listen(int s, int backlog); */
444 PRE_MEM_READ( "socketcall.listen(args)", ARG2, 2*sizeof(Addr) );
445 break;
446
447 case VKI_SYS_ACCEPT: {
448 /* int accept(int s, struct sockaddr *addr, int *addrlen); */
449 PRE_MEM_READ( "socketcall.accept(args)", ARG2, 3*sizeof(Addr) );
450 ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
451 break;
452 }
453
454 case VKI_SYS_SENDTO:
455 /* int sendto(int s, const void *msg, int len,
456 unsigned int flags,
457 const struct sockaddr *to, int tolen); */
458 PRE_MEM_READ( "socketcall.sendto(args)", ARG2, 6*sizeof(Addr) );
459 ML_(generic_PRE_sys_sendto)( tid, ARG2_0, ARG2_1, ARG2_2,
460 ARG2_3, ARG2_4, ARG2_5 );
461 break;
462
463 case VKI_SYS_SEND:
464 /* int send(int s, const void *msg, size_t len, int flags); */
465 PRE_MEM_READ( "socketcall.send(args)", ARG2, 4*sizeof(Addr) );
466 ML_(generic_PRE_sys_send)( tid, ARG2_0, ARG2_1, ARG2_2 );
467 break;
468
469 case VKI_SYS_RECVFROM:
470 /* int recvfrom(int s, void *buf, int len, unsigned int flags,
471 struct sockaddr *from, int *fromlen); */
472 PRE_MEM_READ( "socketcall.recvfrom(args)", ARG2, 6*sizeof(Addr) );
473 ML_(generic_PRE_sys_recvfrom)( tid, ARG2_0, ARG2_1, ARG2_2,
474 ARG2_3, ARG2_4, ARG2_5 );
475 break;
476
477 case VKI_SYS_RECV:
478 /* int recv(int s, void *buf, int len, unsigned int flags); */
479 /* man 2 recv says:
480 The recv call is normally used only on a connected socket
481 (see connect(2)) and is identical to recvfrom with a NULL
482 from parameter.
483 */
484 PRE_MEM_READ( "socketcall.recv(args)", ARG2, 4*sizeof(Addr) );
485 ML_(generic_PRE_sys_recv)( tid, ARG2_0, ARG2_1, ARG2_2 );
486 break;
487
488 case VKI_SYS_CONNECT:
489 /* int connect(int sockfd,
490 struct sockaddr *serv_addr, int addrlen ); */
491 PRE_MEM_READ( "socketcall.connect(args)", ARG2, 3*sizeof(Addr) );
492 ML_(generic_PRE_sys_connect)( tid, ARG2_0, ARG2_1, ARG2_2 );
493 break;
494
495 case VKI_SYS_SETSOCKOPT:
496 /* int setsockopt(int s, int level, int optname,
497 const void *optval, int optlen); */
498 PRE_MEM_READ( "socketcall.setsockopt(args)", ARG2, 5*sizeof(Addr) );
499 ML_(generic_PRE_sys_setsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
500 ARG2_3, ARG2_4 );
501 break;
502
503 case VKI_SYS_GETSOCKOPT:
504 /* int getsockopt(int s, int level, int optname,
505 void *optval, socklen_t *optlen); */
506 PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) );
507 ML_(generic_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
508 ARG2_3, ARG2_4 );
509 break;
510
511 case VKI_SYS_GETSOCKNAME:
512 /* int getsockname(int s, struct sockaddr* name, int* namelen) */
513 PRE_MEM_READ( "socketcall.getsockname(args)", ARG2, 3*sizeof(Addr) );
514 ML_(generic_PRE_sys_getsockname)( tid, ARG2_0, ARG2_1, ARG2_2 );
515 break;
516
517 case VKI_SYS_GETPEERNAME:
518 /* int getpeername(int s, struct sockaddr* name, int* namelen) */
519 PRE_MEM_READ( "socketcall.getpeername(args)", ARG2, 3*sizeof(Addr) );
520 ML_(generic_PRE_sys_getpeername)( tid, ARG2_0, ARG2_1, ARG2_2 );
521 break;
522
523 case VKI_SYS_SHUTDOWN:
524 /* int shutdown(int s, int how); */
525 PRE_MEM_READ( "socketcall.shutdown(args)", ARG2, 2*sizeof(Addr) );
526 break;
527
528 case VKI_SYS_SENDMSG: {
529 /* int sendmsg(int s, const struct msghdr *msg, int flags); */
530
531 /* this causes warnings, and I don't get why. glibc bug?
532 * (after all it's glibc providing the arguments array)
533 PRE_MEM_READ( "socketcall.sendmsg(args)", ARG2, 3*sizeof(Addr) );
534 */
535 ML_(generic_PRE_sys_sendmsg)( tid, ARG2_0, ARG2_1 );
536 break;
537 }
538
539 case VKI_SYS_RECVMSG: {
540 /* int recvmsg(int s, struct msghdr *msg, int flags); */
541
542 /* this causes warnings, and I don't get why. glibc bug?
543 * (after all it's glibc providing the arguments array)
544 PRE_MEM_READ("socketcall.recvmsg(args)", ARG2, 3*sizeof(Addr) );
545 */
546 ML_(generic_PRE_sys_recvmsg)( tid, ARG2_0, ARG2_1 );
547 break;
548 }
549
550 default:
551 VG_(message)(Vg_DebugMsg,"Warning: unhandled socketcall 0x%x",ARG1);
552 SET_STATUS_Failure( VKI_EINVAL );
553 break;
554 }
555# undef ARG2_0
556# undef ARG2_1
557# undef ARG2_2
558# undef ARG2_3
559# undef ARG2_4
560# undef ARG2_5
561}
562
563POST(sys_socketcall)
564{
565# define ARG2_0 (((UWord*)ARG2)[0])
566# define ARG2_1 (((UWord*)ARG2)[1])
567# define ARG2_2 (((UWord*)ARG2)[2])
568# define ARG2_3 (((UWord*)ARG2)[3])
569# define ARG2_4 (((UWord*)ARG2)[4])
570# define ARG2_5 (((UWord*)ARG2)[5])
571
572 SysRes r;
573 vg_assert(SUCCESS);
574 switch (ARG1 /* request */) {
575
576 case VKI_SYS_SOCKETPAIR:
577 r = ML_(generic_POST_sys_socketpair)(
578 tid, VG_(mk_SysRes_Success)(RES),
579 ARG2_0, ARG2_1, ARG2_2, ARG2_3
580 );
581 SET_STATUS_from_SysRes(r);
582 break;
583
584 case VKI_SYS_SOCKET:
585 r = ML_(generic_POST_sys_socket)( tid, VG_(mk_SysRes_Success)(RES) );
586 SET_STATUS_from_SysRes(r);
587 break;
588
589 case VKI_SYS_BIND:
590 /* int bind(int sockfd, struct sockaddr *my_addr,
591 int addrlen); */
592 break;
593
594 case VKI_SYS_LISTEN:
595 /* int listen(int s, int backlog); */
596 break;
597
598 case VKI_SYS_ACCEPT:
599 /* int accept(int s, struct sockaddr *addr, int *addrlen); */
600 r = ML_(generic_POST_sys_accept)( tid, VG_(mk_SysRes_Success)(RES),
601 ARG2_0, ARG2_1, ARG2_2 );
602 SET_STATUS_from_SysRes(r);
603 break;
604
605 case VKI_SYS_SENDTO:
606 break;
607
608 case VKI_SYS_SEND:
609 break;
610
611 case VKI_SYS_RECVFROM:
612 ML_(generic_POST_sys_recvfrom)( tid, VG_(mk_SysRes_Success)(RES),
613 ARG2_0, ARG2_1, ARG2_2,
614 ARG2_3, ARG2_4, ARG2_5 );
615 break;
616
617 case VKI_SYS_RECV:
618 ML_(generic_POST_sys_recv)( tid, RES, ARG2_0, ARG2_1, ARG2_2 );
619 break;
620
621 case VKI_SYS_CONNECT:
622 break;
623
624 case VKI_SYS_SETSOCKOPT:
625 break;
626
627 case VKI_SYS_GETSOCKOPT:
628 ML_(generic_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
629 ARG2_0, ARG2_1,
630 ARG2_2, ARG2_3, ARG2_4 );
631 break;
632
633 case VKI_SYS_GETSOCKNAME:
634 ML_(generic_POST_sys_getsockname)( tid, VG_(mk_SysRes_Success)(RES),
635 ARG2_0, ARG2_1, ARG2_2 );
636 break;
637
638 case VKI_SYS_GETPEERNAME:
639 ML_(generic_POST_sys_getpeername)( tid, VG_(mk_SysRes_Success)(RES),
640 ARG2_0, ARG2_1, ARG2_2 );
641 break;
642
643 case VKI_SYS_SHUTDOWN:
644 break;
645
646 case VKI_SYS_SENDMSG:
647 break;
648
649 case VKI_SYS_RECVMSG:
650 ML_(generic_POST_sys_recvmsg)( tid, ARG2_0, ARG2_1 );
651 break;
652
653 default:
654 VG_(message)(Vg_DebugMsg,"FATAL: unhandled socketcall 0x%x",ARG1);
655 VG_(core_panic)("... bye!\n");
656 break; /*NOTREACHED*/
657 }
658# undef ARG2_0
659# undef ARG2_1
660# undef ARG2_2
661# undef ARG2_3
662# undef ARG2_4
663# undef ARG2_5
664}
cerion85665ca2005-06-20 15:51:07 +0000665
tom9548a162005-09-30 08:07:53 +0000666PRE(sys_mmap)
667{
668 SysRes r;
669
670 PRINT("sys_mmap ( %p, %llu, %d, %d, %d, %d )",
671 ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 );
672 PRE_REG_READ6(long, "mmap",
673 unsigned long, start, unsigned long, length,
674 unsigned long, prot, unsigned long, flags,
675 unsigned long, fd, unsigned long, offset);
676
sewardj274461d2005-10-02 17:01:41 +0000677 r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
678 (Off64T)ARG6 );
tom9548a162005-09-30 08:07:53 +0000679 SET_STATUS_from_SysRes(r);
680}
681
682PRE(sys_mmap2)
683{
684 SysRes r;
685
686 // Exactly like old_mmap() except:
sewardje66f2e02006-12-30 17:45:08 +0000687 // - the file offset is specified in 4K units rather than bytes,
tom9548a162005-09-30 08:07:53 +0000688 // so that it can be used for files bigger than 2^32 bytes.
689 PRINT("sys_mmap2 ( %p, %llu, %d, %d, %d, %d )",
690 ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 );
691 PRE_REG_READ6(long, "mmap2",
692 unsigned long, start, unsigned long, length,
693 unsigned long, prot, unsigned long, flags,
694 unsigned long, fd, unsigned long, offset);
695
sewardj274461d2005-10-02 17:01:41 +0000696 r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
sewardje66f2e02006-12-30 17:45:08 +0000697 4096 * (Off64T)ARG6 );
tom9548a162005-09-30 08:07:53 +0000698 SET_STATUS_from_SysRes(r);
699}
700
cerion85665ca2005-06-20 15:51:07 +0000701// XXX: lstat64/fstat64/stat64 are generic, but not necessarily
702// applicable to every architecture -- I think only to 32-bit archs.
703// We're going to need something like linux/core_os32.h for such
704// things, eventually, I think. --njn
705PRE(sys_stat64)
706{
707 PRINT("sys_stat64 ( %p, %p )",ARG1,ARG2);
708 PRE_REG_READ2(long, "stat64", char *, file_name, struct stat64 *, buf);
709 PRE_MEM_RASCIIZ( "stat64(file_name)", ARG1 );
710 PRE_MEM_WRITE( "stat64(buf)", ARG2, sizeof(struct vki_stat64) );
711}
712
713POST(sys_stat64)
714{
715 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
716}
717
cerion508aef52005-06-24 15:26:49 +0000718PRE(sys_lstat64)
719{
720 PRINT("sys_lstat64 ( %p(%s), %p )",ARG1,ARG1,ARG2);
721 PRE_REG_READ2(long, "lstat64", char *, file_name, struct stat64 *, buf);
722 PRE_MEM_RASCIIZ( "lstat64(file_name)", ARG1 );
723 PRE_MEM_WRITE( "lstat64(buf)", ARG2, sizeof(struct vki_stat64) );
724}
725
726POST(sys_lstat64)
727{
728 vg_assert(SUCCESS);
729 if (RES == 0) {
730 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
731 }
732}
733
sewardj5b91c402006-07-24 10:06:09 +0000734PRE(sys_fstatat64)
735{
736 PRINT("sys_fstatat64 ( %d, %p(%s), %p )",ARG1,ARG2,ARG2,ARG3);
737 PRE_REG_READ3(long, "fstatat64",
738 int, dfd, char *, file_name, struct stat64 *, buf);
739 PRE_MEM_RASCIIZ( "fstatat64(file_name)", ARG2 );
740 PRE_MEM_WRITE( "fstatat64(buf)", ARG3, sizeof(struct vki_stat64) );
741}
742
743POST(sys_fstatat64)
744{
745 POST_MEM_WRITE( ARG3, sizeof(struct vki_stat64) );
746}
747
cerion85665ca2005-06-20 15:51:07 +0000748PRE(sys_fstat64)
749{
750 PRINT("sys_fstat64 ( %d, %p )",ARG1,ARG2);
751 PRE_REG_READ2(long, "fstat64", unsigned long, fd, struct stat64 *, buf);
752 PRE_MEM_WRITE( "fstat64(buf)", ARG2, sizeof(struct vki_stat64) );
753}
cerion508aef52005-06-24 15:26:49 +0000754
cerion85665ca2005-06-20 15:51:07 +0000755POST(sys_fstat64)
756{
757 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
758}
759
cerion508aef52005-06-24 15:26:49 +0000760static Addr deref_Addr ( ThreadId tid, Addr a, Char* s )
761{
762 Addr* a_p = (Addr*)a;
763 PRE_MEM_READ( s, (Addr)a_p, sizeof(Addr) );
764 return *a_p;
765}
766
cerion508aef52005-06-24 15:26:49 +0000767PRE(sys_ipc)
768{
769 PRINT("sys_ipc ( %d, %d, %d, %d, %p, %d )", ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
770 // XXX: this is simplistic -- some args are not used in all circumstances.
771 PRE_REG_READ6(int, "ipc",
772 vki_uint, call, int, first, int, second, int, third,
773 void *, ptr, long, fifth)
774
775 switch (ARG1 /* call */) {
776 case VKI_SEMOP:
777 ML_(generic_PRE_sys_semop)( tid, ARG2, ARG5, ARG3 );
778 *flags |= SfMayBlock;
779 break;
780 case VKI_SEMGET:
781 break;
782 case VKI_SEMCTL:
783 {
784 UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
785 ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
786 break;
787 }
788 case VKI_SEMTIMEDOP:
789 ML_(generic_PRE_sys_semtimedop)( tid, ARG2, ARG5, ARG3, ARG6 );
790 *flags |= SfMayBlock;
791 break;
792 case VKI_MSGSND:
njnde5c5f52005-09-01 03:35:40 +0000793 ML_(linux_PRE_sys_msgsnd)( tid, ARG2, ARG5, ARG3, ARG4 );
cerion508aef52005-06-24 15:26:49 +0000794 if ((ARG4 & VKI_IPC_NOWAIT) == 0)
795 *flags |= SfMayBlock;
796 break;
797 case VKI_MSGRCV:
798 {
799 Addr msgp;
800 Word msgtyp;
801
802 msgp = deref_Addr( tid,
803 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
804 "msgrcv(msgp)" );
805 msgtyp = deref_Addr( tid,
806 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
807 "msgrcv(msgp)" );
808
njnde5c5f52005-09-01 03:35:40 +0000809 ML_(linux_PRE_sys_msgrcv)( tid, ARG2, msgp, ARG3, msgtyp, ARG4 );
cerion508aef52005-06-24 15:26:49 +0000810
811 if ((ARG4 & VKI_IPC_NOWAIT) == 0)
812 *flags |= SfMayBlock;
813 break;
814 }
815 case VKI_MSGGET:
816 break;
817 case VKI_MSGCTL:
njnde5c5f52005-09-01 03:35:40 +0000818 ML_(linux_PRE_sys_msgctl)( tid, ARG2, ARG3, ARG5 );
cerion508aef52005-06-24 15:26:49 +0000819 break;
820 case VKI_SHMAT:
821 {
822 UWord w;
823 PRE_MEM_WRITE( "shmat(raddr)", ARG4, sizeof(Addr) );
824 w = ML_(generic_PRE_sys_shmat)( tid, ARG2, ARG5, ARG3 );
825 if (w == 0)
826 SET_STATUS_Failure( VKI_EINVAL );
827 else
828 ARG5 = w;
829 break;
830 }
831 case VKI_SHMDT:
832 if (!ML_(generic_PRE_sys_shmdt)(tid, ARG5))
833 SET_STATUS_Failure( VKI_EINVAL );
834 break;
835 case VKI_SHMGET:
836 break;
837 case VKI_SHMCTL: /* IPCOP_shmctl */
838 ML_(generic_PRE_sys_shmctl)( tid, ARG2, ARG3, ARG5 );
839 break;
840 default:
841 VG_(message)(Vg_DebugMsg, "FATAL: unhandled syscall(ipc) %d", ARG1 );
842 VG_(core_panic)("... bye!\n");
843 break; /*NOTREACHED*/
844 }
845}
846
847POST(sys_ipc)
848{
849 vg_assert(SUCCESS);
850 switch (ARG1 /* call */) {
851 case VKI_SEMOP:
852 case VKI_SEMGET:
853 break;
854 case VKI_SEMCTL:
855 {
856 UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
857 ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
858 break;
859 }
860 case VKI_SEMTIMEDOP:
861 case VKI_MSGSND:
862 break;
863 case VKI_MSGRCV:
864 {
865 Addr msgp;
866 Word msgtyp;
867
868 msgp = deref_Addr( tid,
869 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
870 "msgrcv(msgp)" );
871 msgtyp = deref_Addr( tid,
872 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
873 "msgrcv(msgp)" );
874
njna560c5c2005-09-01 16:27:28 +0000875 ML_(linux_POST_sys_msgrcv)( tid, RES, ARG2, msgp, ARG3, msgtyp, ARG4 );
cerion508aef52005-06-24 15:26:49 +0000876 break;
877 }
878 case VKI_MSGGET:
879 break;
880 case VKI_MSGCTL:
njna560c5c2005-09-01 16:27:28 +0000881 ML_(linux_POST_sys_msgctl)( tid, RES, ARG2, ARG3, ARG5 );
cerion508aef52005-06-24 15:26:49 +0000882 break;
883 case VKI_SHMAT:
884 {
885 Addr addr;
886
887 /* force readability. before the syscall it is
888 * indeed uninitialized, as can be seen in
889 * glibc/sysdeps/unix/sysv/linux/shmat.c */
890 POST_MEM_WRITE( ARG4, sizeof( Addr ) );
891
892 addr = deref_Addr ( tid, ARG4, "shmat(addr)" );
893 if ( addr > 0 ) {
894 ML_(generic_POST_sys_shmat)( tid, addr, ARG2, ARG5, ARG3 );
895 }
896 break;
897 }
898 case VKI_SHMDT:
899 ML_(generic_POST_sys_shmdt)( tid, RES, ARG5 );
900 break;
901 case VKI_SHMGET:
902 break;
903 case VKI_SHMCTL:
904 ML_(generic_POST_sys_shmctl)( tid, RES, ARG2, ARG3, ARG5 );
905 break;
906 default:
907 VG_(message)(Vg_DebugMsg,
908 "FATAL: unhandled syscall(ipc) %d",
909 ARG1 );
910 VG_(core_panic)("... bye!\n");
911 break; /*NOTREACHED*/
912 }
913}
914
915
cerion85665ca2005-06-20 15:51:07 +0000916
917
918//.. PRE(old_select, MayBlock)
919//.. {
920//.. /* struct sel_arg_struct {
921//.. unsigned long n;
922//.. fd_set *inp, *outp, *exp;
923//.. struct timeval *tvp;
924//.. };
925//.. */
926//.. PRE_REG_READ1(long, "old_select", struct sel_arg_struct *, args);
927//.. PRE_MEM_READ( "old_select(args)", ARG1, 5*sizeof(UWord) );
928//..
929//.. {
930//.. UInt* arg_struct = (UInt*)ARG1;
931//.. UInt a1, a2, a3, a4, a5;
932//..
933//.. a1 = arg_struct[0];
934//.. a2 = arg_struct[1];
935//.. a3 = arg_struct[2];
936//.. a4 = arg_struct[3];
937//.. a5 = arg_struct[4];
938//..
939//.. PRINT("old_select ( %d, %p, %p, %p, %p )", a1,a2,a3,a4,a5);
940//.. if (a2 != (Addr)NULL)
941//.. PRE_MEM_READ( "old_select(readfds)", a2, a1/8 /* __FD_SETSIZE/8 */ );
942//.. if (a3 != (Addr)NULL)
943//.. PRE_MEM_READ( "old_select(writefds)", a3, a1/8 /* __FD_SETSIZE/8 */ );
944//.. if (a4 != (Addr)NULL)
945//.. PRE_MEM_READ( "old_select(exceptfds)", a4, a1/8 /* __FD_SETSIZE/8 */ );
946//.. if (a5 != (Addr)NULL)
947//.. PRE_MEM_READ( "old_select(timeout)", a5, sizeof(struct vki_timeval) );
948//.. }
949//.. }
950
sewardje23772f2005-07-02 11:27:02 +0000951PRE(sys_clone)
952{
953 UInt cloneflags;
954
955 PRINT("sys_clone ( %x, %p, %p, %p, %p )",ARG1,ARG2,ARG3,ARG4,ARG5);
956 PRE_REG_READ5(int, "clone",
957 unsigned long, flags,
sewardje21058c2005-08-05 02:15:18 +0000958 void *, child_stack,
959 int *, parent_tidptr,
960 void *, child_tls,
961 int *, child_tidptr);
sewardje23772f2005-07-02 11:27:02 +0000962
963 if (ARG1 & VKI_CLONE_PARENT_SETTID) {
964 PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int));
sewardja48a4932005-09-29 11:09:56 +0000965 if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int),
966 VKI_PROT_WRITE)) {
sewardje23772f2005-07-02 11:27:02 +0000967 SET_STATUS_Failure( VKI_EFAULT );
968 return;
969 }
970 }
971 if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) {
972 PRE_MEM_WRITE("clone(child_tidptr)", ARG5, sizeof(Int));
sewardja48a4932005-09-29 11:09:56 +0000973 if (!VG_(am_is_valid_for_client)(ARG5, sizeof(Int),
974 VKI_PROT_WRITE)) {
sewardje23772f2005-07-02 11:27:02 +0000975 SET_STATUS_Failure( VKI_EFAULT );
976 return;
977 }
978 }
979
sewardje23772f2005-07-02 11:27:02 +0000980 cloneflags = ARG1;
981
982 if (!ML_(client_signal_OK)(ARG1 & VKI_CSIGNAL)) {
983 SET_STATUS_Failure( VKI_EINVAL );
984 return;
985 }
986
987 /* Only look at the flags we really care about */
988 switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS
989 | VKI_CLONE_FILES | VKI_CLONE_VFORK)) {
990 case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES:
991 /* thread creation */
992 SET_STATUS_from_SysRes(
993 do_clone(tid,
994 ARG1, /* flags */
995 (Addr)ARG2, /* child SP */
996 (Int *)ARG3, /* parent_tidptr */
997 (Int *)ARG5, /* child_tidptr */
sewardj6a324492005-08-05 00:10:11 +0000998 (Addr)ARG4)); /* child_tls */
sewardje23772f2005-07-02 11:27:02 +0000999 break;
1000
1001 case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */
1002 /* FALLTHROUGH - assume vfork == fork */
1003 cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM);
1004
1005 case 0: /* plain fork */
1006 SET_STATUS_from_SysRes(
njne1486662005-11-10 02:48:04 +00001007 ML_(do_fork_clone)(tid,
sewardje23772f2005-07-02 11:27:02 +00001008 cloneflags, /* flags */
sewardje23772f2005-07-02 11:27:02 +00001009 (Int *)ARG3, /* parent_tidptr */
1010 (Int *)ARG5)); /* child_tidptr */
1011 break;
1012
1013 default:
1014 /* should we just ENOSYS? */
1015 VG_(message)(Vg_UserMsg, "Unsupported clone() flags: 0x%x", ARG1);
1016 VG_(message)(Vg_UserMsg, "");
1017 VG_(message)(Vg_UserMsg, "The only supported clone() uses are:");
1018 VG_(message)(Vg_UserMsg, " - via a threads library (LinuxThreads or NPTL)");
1019 VG_(message)(Vg_UserMsg, " - via the implementation of fork or vfork");
1020 VG_(unimplemented)
1021 ("Valgrind does not support general clone().");
1022 }
1023
1024 if (SUCCESS) {
1025 if (ARG1 & VKI_CLONE_PARENT_SETTID)
1026 POST_MEM_WRITE(ARG3, sizeof(Int));
1027 if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID))
1028 POST_MEM_WRITE(ARG5, sizeof(Int));
1029
1030 /* Thread creation was successful; let the child have the chance
1031 to run */
1032 *flags |= SfYieldAfter;
1033 }
1034}
cerion85665ca2005-06-20 15:51:07 +00001035
sewardjb865b162005-07-08 18:26:37 +00001036PRE(sys_sigreturn)
1037{
sewardjcba8f432007-03-19 14:34:08 +00001038 /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
1039 an explanation of what follows. */
1040
sewardjb865b162005-07-08 18:26:37 +00001041 ThreadState* tst;
sewardjcba8f432007-03-19 14:34:08 +00001042 PRINT("sys_sigreturn ( )");
sewardjb865b162005-07-08 18:26:37 +00001043
1044 vg_assert(VG_(is_valid_tid)(tid));
1045 vg_assert(tid >= 1 && tid < VG_N_THREADS);
1046 vg_assert(VG_(is_running_thread)(tid));
1047
1048 ///* Adjust esp to point to start of frame; skip back up over
1049 // sigreturn sequence's "popl %eax" and handler ret addr */
1050 tst = VG_(get_ThreadState)(tid);
1051 //tst->arch.vex.guest_ESP -= sizeof(Addr)+sizeof(Word);
sewardj4ce89e12005-11-16 19:15:33 +00001052 // Should we do something equivalent on ppc32? Who knows.
sewardjb865b162005-07-08 18:26:37 +00001053
1054 ///* This is only so that the EIP is (might be) useful to report if
1055 // something goes wrong in the sigreturn */
1056 //ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
sewardj4ce89e12005-11-16 19:15:33 +00001057 // Should we do something equivalent on ppc32? Who knows.
sewardjb865b162005-07-08 18:26:37 +00001058
sewardjcba8f432007-03-19 14:34:08 +00001059 /* Restore register state from frame and remove it */
sewardjb865b162005-07-08 18:26:37 +00001060 VG_(sigframe_destroy)(tid, False);
1061
sewardjcba8f432007-03-19 14:34:08 +00001062 /* Tell the driver not to update the guest state with the "result",
1063 and set a bogus result to keep it happy. */
1064 *flags |= SfNoWriteResult;
1065 SET_STATUS_Success(0);
sewardjb865b162005-07-08 18:26:37 +00001066
sewardjcba8f432007-03-19 14:34:08 +00001067 /* Check to see if any signals arose as a result of this. */
sewardjb865b162005-07-08 18:26:37 +00001068 *flags |= SfPollAfter;
1069}
1070
sewardj4ce89e12005-11-16 19:15:33 +00001071PRE(sys_rt_sigreturn)
1072{
sewardjcba8f432007-03-19 14:34:08 +00001073 /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
1074 an explanation of what follows. */
1075
sewardj4ce89e12005-11-16 19:15:33 +00001076 ThreadState* tst;
1077 PRINT("rt_sigreturn ( )");
cerion85665ca2005-06-20 15:51:07 +00001078
sewardj4ce89e12005-11-16 19:15:33 +00001079 vg_assert(VG_(is_valid_tid)(tid));
1080 vg_assert(tid >= 1 && tid < VG_N_THREADS);
1081 vg_assert(VG_(is_running_thread)(tid));
1082
1083 ///* Adjust esp to point to start of frame; skip back up over handler
1084 // ret addr */
1085 tst = VG_(get_ThreadState)(tid);
1086 //tst->arch.vex.guest_ESP -= sizeof(Addr);
1087 // Should we do something equivalent on ppc32? Who knows.
1088
1089 ///* This is only so that the EIP is (might be) useful to report if
1090 // something goes wrong in the sigreturn */
1091 //ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
1092 // Should we do something equivalent on ppc32? Who knows.
1093
sewardjcba8f432007-03-19 14:34:08 +00001094 /* Restore register state from frame and remove it */
sewardj4ce89e12005-11-16 19:15:33 +00001095 VG_(sigframe_destroy)(tid, True);
1096
sewardjcba8f432007-03-19 14:34:08 +00001097 /* Tell the driver not to update the guest state with the "result",
1098 and set a bogus result to keep it happy. */
1099 *flags |= SfNoWriteResult;
1100 SET_STATUS_Success(0);
sewardj4ce89e12005-11-16 19:15:33 +00001101
sewardjcba8f432007-03-19 14:34:08 +00001102 /* Check to see if any signals arose as a result of this. */
sewardj4ce89e12005-11-16 19:15:33 +00001103 *flags |= SfPollAfter;
1104}
1105
cerion85665ca2005-06-20 15:51:07 +00001106
1107//.. PRE(sys_modify_ldt, Special)
1108//.. {
1109//.. PRINT("sys_modify_ldt ( %d, %p, %d )", ARG1,ARG2,ARG3);
1110//.. PRE_REG_READ3(int, "modify_ldt", int, func, void *, ptr,
1111//.. unsigned long, bytecount);
1112//..
1113//.. if (ARG1 == 0) {
1114//.. /* read the LDT into ptr */
1115//.. PRE_MEM_WRITE( "modify_ldt(ptr)", ARG2, ARG3 );
1116//.. }
1117//.. if (ARG1 == 1 || ARG1 == 0x11) {
1118//.. /* write the LDT with the entry pointed at by ptr */
1119//.. PRE_MEM_READ( "modify_ldt(ptr)", ARG2, sizeof(vki_modify_ldt_t) );
1120//.. }
1121//.. /* "do" the syscall ourselves; the kernel never sees it */
1122//.. SET_RESULT( VG_(sys_modify_ldt)( tid, ARG1, (void*)ARG2, ARG3 ) );
1123//..
1124//.. if (ARG1 == 0 && !VG_(is_kerror)(RES) && RES > 0) {
1125//.. POST_MEM_WRITE( ARG2, RES );
1126//.. }
1127//.. }
1128
1129//.. PRE(sys_set_thread_area, Special)
1130//.. {
1131//.. PRINT("sys_set_thread_area ( %p )", ARG1);
1132//.. PRE_REG_READ1(int, "set_thread_area", struct user_desc *, u_info)
1133//.. PRE_MEM_READ( "set_thread_area(u_info)", ARG1, sizeof(vki_modify_ldt_t) );
1134//..
1135//.. /* "do" the syscall ourselves; the kernel never sees it */
1136//.. SET_RESULT( VG_(sys_set_thread_area)( tid, (void *)ARG1 ) );
1137//.. }
1138
1139//.. PRE(sys_get_thread_area, Special)
1140//.. {
1141//.. PRINT("sys_get_thread_area ( %p )", ARG1);
1142//.. PRE_REG_READ1(int, "get_thread_area", struct user_desc *, u_info)
1143//.. PRE_MEM_WRITE( "get_thread_area(u_info)", ARG1, sizeof(vki_modify_ldt_t) );
1144//..
1145//.. /* "do" the syscall ourselves; the kernel never sees it */
1146//.. SET_RESULT( VG_(sys_get_thread_area)( tid, (void *)ARG1 ) );
1147//..
1148//.. if (!VG_(is_kerror)(RES)) {
1149//.. POST_MEM_WRITE( ARG1, sizeof(vki_modify_ldt_t) );
1150//.. }
1151//.. }
1152
1153//.. // Parts of this are ppc32-specific, but the *PEEK* cases are generic.
1154//.. // XXX: Why is the memory pointed to by ARG3 never checked?
1155//.. PRE(sys_ptrace, 0)
1156//.. {
1157//.. PRINT("sys_ptrace ( %d, %d, %p, %p )", ARG1,ARG2,ARG3,ARG4);
1158//.. PRE_REG_READ4(int, "ptrace",
1159//.. long, request, long, pid, long, addr, long, data);
1160//.. switch (ARG1) {
1161//.. case VKI_PTRACE_PEEKTEXT:
1162//.. case VKI_PTRACE_PEEKDATA:
1163//.. case VKI_PTRACE_PEEKUSR:
1164//.. PRE_MEM_WRITE( "ptrace(peek)", ARG4,
1165//.. sizeof (long));
1166//.. break;
1167//.. case VKI_PTRACE_GETREGS:
1168//.. PRE_MEM_WRITE( "ptrace(getregs)", ARG4,
1169//.. sizeof (struct vki_user_regs_struct));
1170//.. break;
1171//.. case VKI_PTRACE_GETFPREGS:
1172//.. PRE_MEM_WRITE( "ptrace(getfpregs)", ARG4,
1173//.. sizeof (struct vki_user_i387_struct));
1174//.. break;
1175//.. case VKI_PTRACE_GETFPXREGS:
1176//.. PRE_MEM_WRITE( "ptrace(getfpxregs)", ARG4,
1177//.. sizeof(struct vki_user_fxsr_struct) );
1178//.. break;
1179//.. case VKI_PTRACE_SETREGS:
1180//.. PRE_MEM_READ( "ptrace(setregs)", ARG4,
1181//.. sizeof (struct vki_user_regs_struct));
1182//.. break;
1183//.. case VKI_PTRACE_SETFPREGS:
1184//.. PRE_MEM_READ( "ptrace(setfpregs)", ARG4,
1185//.. sizeof (struct vki_user_i387_struct));
1186//.. break;
1187//.. case VKI_PTRACE_SETFPXREGS:
1188//.. PRE_MEM_READ( "ptrace(setfpxregs)", ARG4,
1189//.. sizeof(struct vki_user_fxsr_struct) );
1190//.. break;
1191//.. default:
1192//.. break;
1193//.. }
1194//.. }
1195
1196//.. POST(sys_ptrace)
1197//.. {
1198//.. switch (ARG1) {
1199//.. case VKI_PTRACE_PEEKTEXT:
1200//.. case VKI_PTRACE_PEEKDATA:
1201//.. case VKI_PTRACE_PEEKUSR:
1202//.. POST_MEM_WRITE( ARG4, sizeof (long));
1203//.. break;
1204//.. case VKI_PTRACE_GETREGS:
1205//.. POST_MEM_WRITE( ARG4, sizeof (struct vki_user_regs_struct));
1206//.. break;
1207//.. case VKI_PTRACE_GETFPREGS:
1208//.. POST_MEM_WRITE( ARG4, sizeof (struct vki_user_i387_struct));
1209//.. break;
1210//.. case VKI_PTRACE_GETFPXREGS:
1211//.. POST_MEM_WRITE( ARG4, sizeof(struct vki_user_fxsr_struct) );
1212//.. break;
1213//.. default:
1214//.. break;
1215//.. }
1216//.. }
1217
1218//.. // XXX: this duplicates a function in coregrind/vg_syscalls.c, yuk
1219//.. static Addr deref_Addr ( ThreadId tid, Addr a, Char* s )
1220//.. {
1221//.. Addr* a_p = (Addr*)a;
1222//.. PRE_MEM_READ( s, (Addr)a_p, sizeof(Addr) );
1223//.. return *a_p;
1224//.. }
1225
1226//.. // XXX: should use the constants here (eg. SHMAT), not the numbers directly!
1227//.. PRE(sys_ipc, 0)
1228//.. {
1229//.. PRINT("sys_ipc ( %d, %d, %d, %d, %p, %d )", ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
1230//.. // XXX: this is simplistic -- some args are not used in all circumstances.
1231//.. PRE_REG_READ6(int, "ipc",
1232//.. vki_uint, call, int, first, int, second, int, third,
1233//.. void *, ptr, long, fifth)
1234//..
1235//.. switch (ARG1 /* call */) {
1236//.. case VKI_SEMOP:
cerion7b2c38c2005-06-23 07:52:54 +00001237//.. ML_(generic_PRE_sys_semop)( tid, ARG2, ARG5, ARG3 );
cerion85665ca2005-06-20 15:51:07 +00001238//.. /* tst->sys_flags |= MayBlock; */
1239//.. break;
1240//.. case VKI_SEMGET:
1241//.. break;
1242//.. case VKI_SEMCTL:
1243//.. {
1244//.. UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
cerion7b2c38c2005-06-23 07:52:54 +00001245//.. ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
cerion85665ca2005-06-20 15:51:07 +00001246//.. break;
1247//.. }
1248//.. case VKI_SEMTIMEDOP:
cerion7b2c38c2005-06-23 07:52:54 +00001249//.. ML_(generic_PRE_sys_semtimedop)( tid, ARG2, ARG5, ARG3, ARG6 );
cerion85665ca2005-06-20 15:51:07 +00001250//.. /* tst->sys_flags |= MayBlock; */
1251//.. break;
1252//.. case VKI_MSGSND:
njnde5c5f52005-09-01 03:35:40 +00001253//.. ML_(linux_PRE_sys_msgsnd)( tid, ARG2, ARG5, ARG3, ARG4 );
cerion85665ca2005-06-20 15:51:07 +00001254//.. /* if ((ARG4 & VKI_IPC_NOWAIT) == 0)
1255//.. tst->sys_flags |= MayBlock;
1256//.. */
1257//.. break;
1258//.. case VKI_MSGRCV:
1259//.. {
1260//.. Addr msgp;
1261//.. Word msgtyp;
1262//..
1263//.. msgp = deref_Addr( tid,
1264//.. (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
1265//.. "msgrcv(msgp)" );
1266//.. msgtyp = deref_Addr( tid,
1267//.. (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
1268//.. "msgrcv(msgp)" );
1269//..
njnde5c5f52005-09-01 03:35:40 +00001270//.. ML_(linux_PRE_sys_msgrcv)( tid, ARG2, msgp, ARG3, msgtyp, ARG4 );
cerion85665ca2005-06-20 15:51:07 +00001271//..
1272//.. /* if ((ARG4 & VKI_IPC_NOWAIT) == 0)
1273//.. tst->sys_flags |= MayBlock;
1274//.. */
1275//.. break;
1276//.. }
1277//.. case VKI_MSGGET:
1278//.. break;
1279//.. case VKI_MSGCTL:
njnde5c5f52005-09-01 03:35:40 +00001280//.. ML_(linux_PRE_sys_msgctl)( tid, ARG2, ARG3, ARG5 );
cerion85665ca2005-06-20 15:51:07 +00001281//.. break;
1282//.. case VKI_SHMAT:
1283//.. PRE_MEM_WRITE( "shmat(raddr)", ARG4, sizeof(Addr) );
cerion7b2c38c2005-06-23 07:52:54 +00001284//.. ARG5 = ML_(generic_PRE_sys_shmat)( tid, ARG2, ARG5, ARG3 );
cerion85665ca2005-06-20 15:51:07 +00001285//.. if (ARG5 == 0)
1286//.. SET_RESULT( -VKI_EINVAL );
1287//.. break;
1288//.. case VKI_SHMDT:
cerion7b2c38c2005-06-23 07:52:54 +00001289//.. if (!ML_(generic_PRE_sys_shmdt)(tid, ARG5))
cerion85665ca2005-06-20 15:51:07 +00001290//.. SET_RESULT( -VKI_EINVAL );
1291//.. break;
1292//.. case VKI_SHMGET:
1293//.. break;
1294//.. case VKI_SHMCTL: /* IPCOP_shmctl */
cerion7b2c38c2005-06-23 07:52:54 +00001295//.. ML_(generic_PRE_sys_shmctl)( tid, ARG2, ARG3, ARG5 );
cerion85665ca2005-06-20 15:51:07 +00001296//.. break;
1297//.. default:
1298//.. VG_(message)(Vg_DebugMsg, "FATAL: unhandled syscall(ipc) %d", ARG1 );
1299//.. VG_(core_panic)("... bye!\n");
1300//.. break; /*NOTREACHED*/
1301//.. }
1302//.. }
1303
1304//.. POST(sys_ipc)
1305//.. {
1306//.. switch (ARG1 /* call */) {
1307//.. case VKI_SEMOP:
1308//.. case VKI_SEMGET:
1309//.. break;
1310//.. case VKI_SEMCTL:
1311//.. {
1312//.. UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
cerion7b2c38c2005-06-23 07:52:54 +00001313//.. ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
cerion85665ca2005-06-20 15:51:07 +00001314//.. break;
1315//.. }
1316//.. case VKI_SEMTIMEDOP:
1317//.. case VKI_MSGSND:
1318//.. break;
1319//.. case VKI_MSGRCV:
1320//.. {
1321//.. Addr msgp;
1322//.. Word msgtyp;
1323//..
1324//.. msgp = deref_Addr( tid,
1325//.. (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
1326//.. "msgrcv(msgp)" );
1327//.. msgtyp = deref_Addr( tid,
1328//.. (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
1329//.. "msgrcv(msgp)" );
1330//..
njna560c5c2005-09-01 16:27:28 +00001331//.. ML_(linux_POST_sys_msgrcv)( tid, RES, ARG2, msgp, ARG3, msgtyp, ARG4 );
cerion85665ca2005-06-20 15:51:07 +00001332//.. break;
1333//.. }
1334//.. case VKI_MSGGET:
1335//.. break;
1336//.. case VKI_MSGCTL:
njna560c5c2005-09-01 16:27:28 +00001337//.. ML_(linux_POST_sys_msgctl)( tid, RES, ARG2, ARG3, ARG5 );
cerion85665ca2005-06-20 15:51:07 +00001338//.. break;
1339//.. case VKI_SHMAT:
1340//.. {
1341//.. Addr addr;
1342//..
1343//.. /* force readability. before the syscall it is
1344//.. * indeed uninitialized, as can be seen in
1345//.. * glibc/sysdeps/unix/sysv/linux/shmat.c */
1346//.. POST_MEM_WRITE( ARG4, sizeof( Addr ) );
1347//..
1348//.. addr = deref_Addr ( tid, ARG4, "shmat(addr)" );
1349//.. if ( addr > 0 ) {
cerion7b2c38c2005-06-23 07:52:54 +00001350//.. ML_(generic_POST_sys_shmat)( tid, addr, ARG2, ARG5, ARG3 );
cerion85665ca2005-06-20 15:51:07 +00001351//.. }
1352//.. break;
1353//.. }
1354//.. case VKI_SHMDT:
cerion7b2c38c2005-06-23 07:52:54 +00001355//.. ML_(generic_POST_sys_shmdt)( tid, RES, ARG5 );
cerion85665ca2005-06-20 15:51:07 +00001356//.. break;
1357//.. case VKI_SHMGET:
1358//.. break;
1359//.. case VKI_SHMCTL:
cerion7b2c38c2005-06-23 07:52:54 +00001360//.. ML_(generic_POST_sys_shmctl)( tid, RES, ARG2, ARG3, ARG5 );
cerion85665ca2005-06-20 15:51:07 +00001361//.. break;
1362//.. default:
1363//.. VG_(message)(Vg_DebugMsg,
1364//.. "FATAL: unhandled syscall(ipc) %d",
1365//.. ARG1 );
1366//.. VG_(core_panic)("... bye!\n");
1367//.. break; /*NOTREACHED*/
1368//.. }
1369//.. }
1370
1371
sewardj3849cc52005-11-07 15:48:31 +00001372/* Convert from non-RT to RT sigset_t's */
1373static
1374void convert_sigset_to_rt(const vki_old_sigset_t *oldset, vki_sigset_t *set)
1375{
1376 VG_(sigemptyset)(set);
1377 set->sig[0] = *oldset;
1378}
1379PRE(sys_sigaction)
1380{
1381 struct vki_sigaction new, old;
1382 struct vki_sigaction *newp, *oldp;
cerion85665ca2005-06-20 15:51:07 +00001383
sewardj3849cc52005-11-07 15:48:31 +00001384 PRINT("sys_sigaction ( %d, %p, %p )", ARG1,ARG2,ARG3);
1385 PRE_REG_READ3(int, "sigaction",
1386 int, signum, const struct old_sigaction *, act,
1387 struct old_sigaction *, oldact);
cerion85665ca2005-06-20 15:51:07 +00001388
sewardj3849cc52005-11-07 15:48:31 +00001389 newp = oldp = NULL;
1390
1391 if (ARG2 != 0) {
1392 struct vki_old_sigaction *sa = (struct vki_old_sigaction *)ARG2;
1393 PRE_MEM_READ( "sigaction(act->sa_handler)", (Addr)&sa->ksa_handler, sizeof(sa->ksa_handler));
1394 PRE_MEM_READ( "sigaction(act->sa_mask)", (Addr)&sa->sa_mask, sizeof(sa->sa_mask));
1395 PRE_MEM_READ( "sigaction(act->sa_flags)", (Addr)&sa->sa_flags, sizeof(sa->sa_flags));
1396 if (ML_(safe_to_deref)(sa,sizeof(sa))
1397 && (sa->sa_flags & VKI_SA_RESTORER))
1398 PRE_MEM_READ( "sigaction(act->sa_restorer)", (Addr)&sa->sa_restorer, sizeof(sa->sa_restorer));
1399 }
1400
1401 if (ARG3 != 0) {
1402 PRE_MEM_WRITE( "sigaction(oldact)", ARG3, sizeof(struct vki_old_sigaction));
1403 oldp = &old;
1404 }
1405
1406 //jrs 20050207: what?! how can this make any sense?
1407 //if (VG_(is_kerror)(SYSRES))
1408 // return;
1409
1410 if (ARG2 != 0) {
1411 struct vki_old_sigaction *oldnew = (struct vki_old_sigaction *)ARG2;
1412
1413 new.ksa_handler = oldnew->ksa_handler;
1414 new.sa_flags = oldnew->sa_flags;
1415 new.sa_restorer = oldnew->sa_restorer;
1416 convert_sigset_to_rt(&oldnew->sa_mask, &new.sa_mask);
1417 newp = &new;
1418 }
1419
1420 SET_STATUS_from_SysRes( VG_(do_sys_sigaction)(ARG1, newp, oldp) );
1421
1422 if (ARG3 != 0 && SUCCESS && RES == 0) {
1423 struct vki_old_sigaction *oldold = (struct vki_old_sigaction *)ARG3;
1424
1425 oldold->ksa_handler = oldp->ksa_handler;
1426 oldold->sa_flags = oldp->sa_flags;
1427 oldold->sa_restorer = oldp->sa_restorer;
1428 oldold->sa_mask = oldp->sa_mask.sig[0];
1429 }
1430}
1431
1432POST(sys_sigaction)
1433{
1434 vg_assert(SUCCESS);
1435 if (RES == 0 && ARG3 != 0)
1436 POST_MEM_WRITE( ARG3, sizeof(struct vki_old_sigaction));
1437}
1438
tom313639f2006-04-03 16:38:33 +00001439PRE(sys_sigsuspend)
1440{
1441 /* The C library interface to sigsuspend just takes a pointer to
1442 a signal mask but this system call only takes the first word of
1443 the signal mask as an argument so only 32 signals are supported.
1444
1445 In fact glibc normally uses rt_sigsuspend if it is available as
1446 that takes a pointer to the signal mask so supports more signals.
1447 */
1448 *flags |= SfMayBlock;
1449 PRINT("sys_sigsuspend ( %d )", ARG1 );
1450 PRE_REG_READ1(int, "sigsuspend", vki_old_sigset_t, mask);
1451}
1452
cerion85665ca2005-06-20 15:51:07 +00001453
1454#undef PRE
1455#undef POST
1456
cerion85665ca2005-06-20 15:51:07 +00001457/* ---------------------------------------------------------------------
1458 The ppc32/Linux syscall table
1459 ------------------------------------------------------------------ */
1460
1461/* Add an ppc32-linux specific wrapper to a syscall table. */
1462#define PLAX_(sysno, name) WRAPPER_ENTRY_X_(ppc32_linux, sysno, name)
1463#define PLAXY(sysno, name) WRAPPER_ENTRY_XY(ppc32_linux, sysno, name)
1464
1465// This table maps from __NR_xxx syscall numbers (from
1466// linux/include/asm-ppc/unistd.h) to the appropriate PRE/POST sys_foo()
1467// wrappers on ppc32 (as per sys_call_table in linux/arch/ppc/kernel/entry.S).
1468//
1469// For those syscalls not handled by Valgrind, the annotation indicate its
1470// arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/?
1471// (unknown).
1472
njnaf839f52005-06-23 03:27:57 +00001473const SyscallTableEntry ML_(syscall_table)[] = {
cerion85665ca2005-06-20 15:51:07 +00001474//.. (restart_syscall) // 0
sewardja932d292005-07-08 00:18:25 +00001475 GENX_(__NR_exit, sys_exit), // 1
sewardjfbba3712005-11-13 02:41:58 +00001476 GENX_(__NR_fork, sys_fork), // 2
sewardja932d292005-07-08 00:18:25 +00001477 GENXY(__NR_read, sys_read), // 3
1478 GENX_(__NR_write, sys_write), // 4
cerion85665ca2005-06-20 15:51:07 +00001479
sewardja932d292005-07-08 00:18:25 +00001480 GENXY(__NR_open, sys_open), // 5
1481 GENXY(__NR_close, sys_close), // 6
1482 GENXY(__NR_waitpid, sys_waitpid), // 7
1483 GENXY(__NR_creat, sys_creat), // 8
sewardjb865b162005-07-08 18:26:37 +00001484 GENX_(__NR_link, sys_link), // 9
1485
sewardja932d292005-07-08 00:18:25 +00001486 GENX_(__NR_unlink, sys_unlink), // 10
1487 GENX_(__NR_execve, sys_execve), // 11
sewardjb865b162005-07-08 18:26:37 +00001488 GENX_(__NR_chdir, sys_chdir), // 12
sewardja932d292005-07-08 00:18:25 +00001489 GENXY(__NR_time, sys_time), // 13
tom313639f2006-04-03 16:38:33 +00001490 GENX_(__NR_mknod, sys_mknod), // 14
cerion85665ca2005-06-20 15:51:07 +00001491//..
sewardja932d292005-07-08 00:18:25 +00001492 GENX_(__NR_chmod, sys_chmod), // 15
sewardja58bbbc2006-04-14 01:04:04 +00001493 GENX_(__NR_lchown, sys_lchown), // 16 ## P
cerion85665ca2005-06-20 15:51:07 +00001494//.. GENX_(__NR_break, sys_ni_syscall), // 17
1495//.. // (__NR_oldstat, sys_stat), // 18 (obsolete)
njncd405ea2005-08-31 02:44:31 +00001496 LINX_(__NR_lseek, sys_lseek), // 19
cerion85665ca2005-06-20 15:51:07 +00001497//..
sewardja932d292005-07-08 00:18:25 +00001498 GENX_(__NR_getpid, sys_getpid), // 20
sewardja58bbbc2006-04-14 01:04:04 +00001499 LINX_(__NR_mount, sys_mount), // 21
1500 LINX_(__NR_umount, sys_oldumount), // 22
1501 GENX_(__NR_setuid, sys_setuid), // 23 ## P
1502 GENX_(__NR_getuid, sys_getuid), // 24 ## P
cerion85665ca2005-06-20 15:51:07 +00001503//..
1504//.. // (__NR_stime, sys_stime), // 25 * (SVr4,SVID,X/OPEN)
1505//.. PLAXY(__NR_ptrace, sys_ptrace), // 26
sewardja9fff9b2005-08-19 10:07:29 +00001506 GENX_(__NR_alarm, sys_alarm), // 27
cerion85665ca2005-06-20 15:51:07 +00001507//.. // (__NR_oldfstat, sys_fstat), // 28 * L -- obsolete
sewardja932d292005-07-08 00:18:25 +00001508 GENX_(__NR_pause, sys_pause), // 29
cerion85665ca2005-06-20 15:51:07 +00001509//..
njncd405ea2005-08-31 02:44:31 +00001510 LINX_(__NR_utime, sys_utime), // 30
cerion85665ca2005-06-20 15:51:07 +00001511//.. GENX_(__NR_stty, sys_ni_syscall), // 31
1512//.. GENX_(__NR_gtty, sys_ni_syscall), // 32
sewardja932d292005-07-08 00:18:25 +00001513 GENX_(__NR_access, sys_access), // 33
cerion85665ca2005-06-20 15:51:07 +00001514//.. GENX_(__NR_nice, sys_nice), // 34
1515//..
1516//.. GENX_(__NR_ftime, sys_ni_syscall), // 35
1517//.. GENX_(__NR_sync, sys_sync), // 36
sewardjb865b162005-07-08 18:26:37 +00001518 GENX_(__NR_kill, sys_kill), // 37
1519 GENX_(__NR_rename, sys_rename), // 38
1520 GENX_(__NR_mkdir, sys_mkdir), // 39
1521
sewardj6a324492005-08-05 00:10:11 +00001522 GENX_(__NR_rmdir, sys_rmdir), // 40
sewardja932d292005-07-08 00:18:25 +00001523 GENXY(__NR_dup, sys_dup), // 41
njncd405ea2005-08-31 02:44:31 +00001524 LINXY(__NR_pipe, sys_pipe), // 42
sewardj6a324492005-08-05 00:10:11 +00001525 GENXY(__NR_times, sys_times), // 43
cerion85665ca2005-06-20 15:51:07 +00001526//.. GENX_(__NR_prof, sys_ni_syscall), // 44
1527//..
sewardja932d292005-07-08 00:18:25 +00001528 GENX_(__NR_brk, sys_brk), // 45
sewardja58bbbc2006-04-14 01:04:04 +00001529 GENX_(__NR_setgid, sys_setgid), // 46
1530 GENX_(__NR_getgid, sys_getgid), // 47
cerion85665ca2005-06-20 15:51:07 +00001531//.. // (__NR_signal, sys_signal), // 48 */* (ANSI C)
sewardja58bbbc2006-04-14 01:04:04 +00001532 GENX_(__NR_geteuid, sys_geteuid), // 49
cerion508aef52005-06-24 15:26:49 +00001533
sewardja58bbbc2006-04-14 01:04:04 +00001534 GENX_(__NR_getegid, sys_getegid), // 50
cerion85665ca2005-06-20 15:51:07 +00001535//.. GENX_(__NR_acct, sys_acct), // 51
sewardja58bbbc2006-04-14 01:04:04 +00001536 LINX_(__NR_umount2, sys_umount), // 52
cerion85665ca2005-06-20 15:51:07 +00001537//.. GENX_(__NR_lock, sys_ni_syscall), // 53
sewardja932d292005-07-08 00:18:25 +00001538 GENXY(__NR_ioctl, sys_ioctl), // 54
cerion85665ca2005-06-20 15:51:07 +00001539//..
sewardjfe0ffd42005-10-19 01:14:22 +00001540 GENXY(__NR_fcntl, sys_fcntl), // 55
cerion85665ca2005-06-20 15:51:07 +00001541//.. GENX_(__NR_mpx, sys_ni_syscall), // 56
sewardja932d292005-07-08 00:18:25 +00001542 GENX_(__NR_setpgid, sys_setpgid), // 57
cerion85665ca2005-06-20 15:51:07 +00001543//.. GENX_(__NR_ulimit, sys_ni_syscall), // 58
1544//.. // (__NR_oldolduname, sys_olduname), // 59 Linux -- obsolete
sewardjb865b162005-07-08 18:26:37 +00001545
1546 GENX_(__NR_umask, sys_umask), // 60
sewardja58bbbc2006-04-14 01:04:04 +00001547 GENX_(__NR_chroot, sys_chroot), // 61
cerion85665ca2005-06-20 15:51:07 +00001548//.. // (__NR_ustat, sys_ustat) // 62 SVr4 -- deprecated
sewardja932d292005-07-08 00:18:25 +00001549 GENXY(__NR_dup2, sys_dup2), // 63
sewardjb865b162005-07-08 18:26:37 +00001550 GENX_(__NR_getppid, sys_getppid), // 64
1551
1552 GENX_(__NR_getpgrp, sys_getpgrp), // 65
1553 GENX_(__NR_setsid, sys_setsid), // 66
sewardj3849cc52005-11-07 15:48:31 +00001554 PLAXY(__NR_sigaction, sys_sigaction), // 67
cerion85665ca2005-06-20 15:51:07 +00001555//.. // (__NR_sgetmask, sys_sgetmask), // 68 */* (ANSI C)
1556//.. // (__NR_ssetmask, sys_ssetmask), // 69 */* (ANSI C)
1557//..
sewardja58bbbc2006-04-14 01:04:04 +00001558 GENX_(__NR_setreuid, sys_setreuid), // 70
1559 GENX_(__NR_setregid, sys_setregid), // 71
tom313639f2006-04-03 16:38:33 +00001560 PLAX_(__NR_sigsuspend, sys_sigsuspend), // 72
sewardja58bbbc2006-04-14 01:04:04 +00001561 LINXY(__NR_sigpending, sys_sigpending), // 73
cerion85665ca2005-06-20 15:51:07 +00001562//.. // (__NR_sethostname, sys_sethostname), // 74 */*
1563//..
cerion508aef52005-06-24 15:26:49 +00001564 GENX_(__NR_setrlimit, sys_setrlimit), // 75
cerion85665ca2005-06-20 15:51:07 +00001565//.. GENXY(__NR_getrlimit, sys_old_getrlimit), // 76
sewardj33d17fa2005-08-21 00:49:41 +00001566 GENXY(__NR_getrusage, sys_getrusage), // 77
cerion508aef52005-06-24 15:26:49 +00001567 GENXY(__NR_gettimeofday, sys_gettimeofday), // 78
cerion85665ca2005-06-20 15:51:07 +00001568//.. GENX_(__NR_settimeofday, sys_settimeofday), // 79
1569//..
sewardja58bbbc2006-04-14 01:04:04 +00001570 GENXY(__NR_getgroups, sys_getgroups), // 80
1571 GENX_(__NR_setgroups, sys_setgroups), // 81
cerion85665ca2005-06-20 15:51:07 +00001572//.. PLAX_(__NR_select, old_select), // 82
sewardjb865b162005-07-08 18:26:37 +00001573 GENX_(__NR_symlink, sys_symlink), // 83
cerion85665ca2005-06-20 15:51:07 +00001574//.. // (__NR_oldlstat, sys_lstat), // 84 -- obsolete
1575//..
sewardja932d292005-07-08 00:18:25 +00001576 GENX_(__NR_readlink, sys_readlink), // 85
cerion85665ca2005-06-20 15:51:07 +00001577//.. // (__NR_uselib, sys_uselib), // 86 */Linux
1578//.. // (__NR_swapon, sys_swapon), // 87 */Linux
1579//.. // (__NR_reboot, sys_reboot), // 88 */Linux
1580//.. // (__NR_readdir, old_readdir), // 89 -- superseded
1581
tom9548a162005-09-30 08:07:53 +00001582 PLAX_(__NR_mmap, sys_mmap), // 90
cerion508aef52005-06-24 15:26:49 +00001583 GENXY(__NR_munmap, sys_munmap), // 91
sewardja58bbbc2006-04-14 01:04:04 +00001584 GENX_(__NR_truncate, sys_truncate), // 92
sewardj6a324492005-08-05 00:10:11 +00001585 GENX_(__NR_ftruncate, sys_ftruncate), // 93
sewardj2d7c3962005-07-29 22:01:19 +00001586 GENX_(__NR_fchmod, sys_fchmod), // 94
1587
sewardja58bbbc2006-04-14 01:04:04 +00001588 GENX_(__NR_fchown, sys_fchown), // 95
sewardjdc1750a2005-12-02 16:45:28 +00001589 GENX_(__NR_getpriority, sys_getpriority), // 96
1590 GENX_(__NR_setpriority, sys_setpriority), // 97
cerion85665ca2005-06-20 15:51:07 +00001591//.. GENX_(__NR_profil, sys_ni_syscall), // 98
sewardj17689552006-01-26 14:25:51 +00001592 GENXY(__NR_statfs, sys_statfs), // 99
cerion85665ca2005-06-20 15:51:07 +00001593//..
sewardja58bbbc2006-04-14 01:04:04 +00001594 GENXY(__NR_fstatfs, sys_fstatfs), // 100
cerion85665ca2005-06-20 15:51:07 +00001595//.. LINX_(__NR_ioperm, sys_ioperm), // 101
sewardja932d292005-07-08 00:18:25 +00001596 PLAXY(__NR_socketcall, sys_socketcall), // 102
sewardj3d45fac2006-07-24 10:14:37 +00001597 LINXY(__NR_syslog, sys_syslog), // 103
sewardja932d292005-07-08 00:18:25 +00001598 GENXY(__NR_setitimer, sys_setitimer), // 104
sewardje0036f72007-11-20 19:59:51 +00001599
1600 GENXY(__NR_getitimer, sys_getitimer), // 105
sewardja932d292005-07-08 00:18:25 +00001601 GENXY(__NR_stat, sys_newstat), // 106
sewardj82022042005-11-17 11:01:55 +00001602 GENXY(__NR_lstat, sys_newlstat), // 107
sewardjfe0ffd42005-10-19 01:14:22 +00001603 GENXY(__NR_fstat, sys_newfstat), // 108
cerion85665ca2005-06-20 15:51:07 +00001604//.. // (__NR_olduname, sys_uname), // 109 -- obsolete
1605//..
1606//.. GENX_(__NR_iopl, sys_iopl), // 110
1607//.. LINX_(__NR_vhangup, sys_vhangup), // 111
1608//.. GENX_(__NR_idle, sys_ni_syscall), // 112
1609//.. // (__NR_vm86old, sys_vm86old), // 113 x86/Linux-only
sewardjfbba3712005-11-13 02:41:58 +00001610 GENXY(__NR_wait4, sys_wait4), // 114
cerion85665ca2005-06-20 15:51:07 +00001611//..
1612//.. // (__NR_swapoff, sys_swapoff), // 115 */Linux
sewardj3d45fac2006-07-24 10:14:37 +00001613 LINXY(__NR_sysinfo, sys_sysinfo), // 116
sewardja932d292005-07-08 00:18:25 +00001614 PLAXY(__NR_ipc, sys_ipc), // 117
sewardjd84f4672005-10-07 23:06:13 +00001615 GENX_(__NR_fsync, sys_fsync), // 118
sewardjb865b162005-07-08 18:26:37 +00001616 PLAX_(__NR_sigreturn, sys_sigreturn), // 119 ?/Linux
cerion85665ca2005-06-20 15:51:07 +00001617//..
sewardja932d292005-07-08 00:18:25 +00001618 PLAX_(__NR_clone, sys_clone), // 120
cerion85665ca2005-06-20 15:51:07 +00001619//.. // (__NR_setdomainname, sys_setdomainname), // 121 */*(?)
sewardja932d292005-07-08 00:18:25 +00001620 GENXY(__NR_uname, sys_newuname), // 122
cerion85665ca2005-06-20 15:51:07 +00001621//.. PLAX_(__NR_modify_ldt, sys_modify_ldt), // 123
1622//.. LINXY(__NR_adjtimex, sys_adjtimex), // 124
1623//..
sewardja932d292005-07-08 00:18:25 +00001624 GENXY(__NR_mprotect, sys_mprotect), // 125
njncd405ea2005-08-31 02:44:31 +00001625 LINXY(__NR_sigprocmask, sys_sigprocmask), // 126
cerion85665ca2005-06-20 15:51:07 +00001626//.. // Nb: create_module() was removed 2.4-->2.6
1627//.. GENX_(__NR_create_module, sys_ni_syscall), // 127
1628//.. GENX_(__NR_init_module, sys_init_module), // 128
1629//.. // (__NR_delete_module, sys_delete_module), // 129 (*/Linux)?
1630//..
1631//.. // Nb: get_kernel_syms() was removed 2.4-->2.6
1632//.. GENX_(__NR_get_kernel_syms, sys_ni_syscall), // 130
njncd405ea2005-08-31 02:44:31 +00001633//.. LINX_(__NR_quotactl, sys_quotactl), // 131
sewardja932d292005-07-08 00:18:25 +00001634 GENX_(__NR_getpgid, sys_getpgid), // 132
sewardj3774f862006-03-21 02:23:27 +00001635 GENX_(__NR_fchdir, sys_fchdir), // 133
cerion85665ca2005-06-20 15:51:07 +00001636//.. // (__NR_bdflush, sys_bdflush), // 134 */Linux
1637//..
1638//.. // (__NR_sysfs, sys_sysfs), // 135 SVr4
sewardja58bbbc2006-04-14 01:04:04 +00001639 LINX_(__NR_personality, sys_personality), // 136
cerion85665ca2005-06-20 15:51:07 +00001640//.. GENX_(__NR_afs_syscall, sys_ni_syscall), // 137
sewardja58bbbc2006-04-14 01:04:04 +00001641 LINX_(__NR_setfsuid, sys_setfsuid), // 138
1642 LINX_(__NR_setfsgid, sys_setfsgid), // 139
sewardj31d83422005-10-15 02:00:41 +00001643
sewardja932d292005-07-08 00:18:25 +00001644 LINXY(__NR__llseek, sys_llseek), // 140
sewardj31d83422005-10-15 02:00:41 +00001645 GENXY(__NR_getdents, sys_getdents), // 141
sewardja932d292005-07-08 00:18:25 +00001646 GENX_(__NR__newselect, sys_select), // 142
sewardj6a324492005-08-05 00:10:11 +00001647 GENX_(__NR_flock, sys_flock), // 143
sewardja58bbbc2006-04-14 01:04:04 +00001648 GENX_(__NR_msync, sys_msync), // 144
cerion85665ca2005-06-20 15:51:07 +00001649//..
sewardja932d292005-07-08 00:18:25 +00001650 GENXY(__NR_readv, sys_readv), // 145
1651 GENX_(__NR_writev, sys_writev), // 146
sewardja58bbbc2006-04-14 01:04:04 +00001652 GENX_(__NR_getsid, sys_getsid), // 147
sewardj5addd6c2005-08-18 23:44:13 +00001653 GENX_(__NR_fdatasync, sys_fdatasync), // 148
sewardja932d292005-07-08 00:18:25 +00001654 LINXY(__NR__sysctl, sys_sysctl), // 149
cerion85665ca2005-06-20 15:51:07 +00001655//..
sewardja58bbbc2006-04-14 01:04:04 +00001656 GENX_(__NR_mlock, sys_mlock), // 150
1657 GENX_(__NR_munlock, sys_munlock), // 151
1658 GENX_(__NR_mlockall, sys_mlockall), // 152
1659 LINX_(__NR_munlockall, sys_munlockall), // 153
njnb2480c92005-08-30 02:17:23 +00001660//.. LINXY(__NR_sched_setparam, sys_sched_setparam), // 154
cerion85665ca2005-06-20 15:51:07 +00001661//..
njnb2480c92005-08-30 02:17:23 +00001662 LINXY(__NR_sched_getparam, sys_sched_getparam), // 155
sewardjd84f4672005-10-07 23:06:13 +00001663 LINX_(__NR_sched_setscheduler, sys_sched_setscheduler), // 156
njnb2480c92005-08-30 02:17:23 +00001664 LINX_(__NR_sched_getscheduler, sys_sched_getscheduler), // 157
dirk331e5762005-12-05 22:11:02 +00001665 LINX_(__NR_sched_yield, sys_sched_yield), // 158
njnb2480c92005-08-30 02:17:23 +00001666 LINX_(__NR_sched_get_priority_max, sys_sched_get_priority_max),// 159
sewardj5addd6c2005-08-18 23:44:13 +00001667
njnb2480c92005-08-30 02:17:23 +00001668 LINX_(__NR_sched_get_priority_min, sys_sched_get_priority_min),// 160
1669//.. //LINX?(__NR_sched_rr_get_interval, sys_sched_rr_get_interval), // 161 */*
sewardja932d292005-07-08 00:18:25 +00001670 GENXY(__NR_nanosleep, sys_nanosleep), // 162
1671 GENX_(__NR_mremap, sys_mremap), // 163
sewardja58bbbc2006-04-14 01:04:04 +00001672 LINX_(__NR_setresuid, sys_setresuid), // 164
sewardj33d17fa2005-08-21 00:49:41 +00001673
sewardja58bbbc2006-04-14 01:04:04 +00001674 LINXY(__NR_getresuid, sys_getresuid), // 165
cerion85665ca2005-06-20 15:51:07 +00001675
1676//.. GENX_(__NR_query_module, sys_ni_syscall), // 166
sewardjca334052005-07-24 06:30:37 +00001677 GENXY(__NR_poll, sys_poll), // 167
cerion85665ca2005-06-20 15:51:07 +00001678//.. // (__NR_nfsservctl, sys_nfsservctl), // 168 */Linux
1679//..
sewardja58bbbc2006-04-14 01:04:04 +00001680 LINX_(__NR_setresgid, sys_setresgid), // 169
1681 LINXY(__NR_getresgid, sys_getresgid), // 170
toma39ebc82006-12-18 15:22:46 +00001682 LINXY(__NR_prctl, sys_prctl), // 171
sewardj4ce89e12005-11-16 19:15:33 +00001683 PLAX_(__NR_rt_sigreturn, sys_rt_sigreturn), // 172
njncd405ea2005-08-31 02:44:31 +00001684 LINXY(__NR_rt_sigaction, sys_rt_sigaction), // 173
cerion85665ca2005-06-20 15:51:07 +00001685
njncd405ea2005-08-31 02:44:31 +00001686 LINXY(__NR_rt_sigprocmask, sys_rt_sigprocmask), // 174
sewardja58bbbc2006-04-14 01:04:04 +00001687 LINXY(__NR_rt_sigpending, sys_rt_sigpending), // 175
njncd405ea2005-08-31 02:44:31 +00001688 LINXY(__NR_rt_sigtimedwait, sys_rt_sigtimedwait), // 176
sewardja58bbbc2006-04-14 01:04:04 +00001689 LINXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo), // 177
sewardj1ea00a12005-11-16 12:51:34 +00001690 LINX_(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 178
1691
sewardja932d292005-07-08 00:18:25 +00001692 GENXY(__NR_pread64, sys_pread64), // 179
1693 GENX_(__NR_pwrite64, sys_pwrite64), // 180
sewardja58bbbc2006-04-14 01:04:04 +00001694 GENX_(__NR_chown, sys_chown), // 181
sewardjb865b162005-07-08 18:26:37 +00001695 GENXY(__NR_getcwd, sys_getcwd), // 182
njn9fe7b122005-08-26 04:03:04 +00001696//.. LINXY(__NR_capget, sys_capget), // 183
cerion85665ca2005-06-20 15:51:07 +00001697//..
njn9fe7b122005-08-26 04:03:04 +00001698//.. LINX_(__NR_capset, sys_capset), // 184
sewardja9fff9b2005-08-19 10:07:29 +00001699 GENXY(__NR_sigaltstack, sys_sigaltstack), // 185
sewardja58bbbc2006-04-14 01:04:04 +00001700 LINXY(__NR_sendfile, sys_sendfile), // 186
cerion85665ca2005-06-20 15:51:07 +00001701//.. GENXY(__NR_getpmsg, sys_getpmsg), // 187
1702//.. GENX_(__NR_putpmsg, sys_putpmsg), // 188
sewardja932d292005-07-08 00:18:25 +00001703
1704 // Nb: we treat vfork as fork
1705 GENX_(__NR_vfork, sys_fork), // 189
1706 GENXY(__NR_ugetrlimit, sys_getrlimit), // 190
cerion85665ca2005-06-20 15:51:07 +00001707//__NR_readahead // 191 ppc/Linux only?
tom9548a162005-09-30 08:07:53 +00001708 PLAX_(__NR_mmap2, sys_mmap2), // 192
sewardja58bbbc2006-04-14 01:04:04 +00001709 GENX_(__NR_truncate64, sys_truncate64), // 193
sewardj48db0f02005-10-07 13:30:48 +00001710 GENX_(__NR_ftruncate64, sys_ftruncate64), // 194
cerion85665ca2005-06-20 15:51:07 +00001711//..
1712
sewardja932d292005-07-08 00:18:25 +00001713 PLAXY(__NR_stat64, sys_stat64), // 195
1714 PLAXY(__NR_lstat64, sys_lstat64), // 196
1715 PLAXY(__NR_fstat64, sys_fstat64), // 197
cerion85665ca2005-06-20 15:51:07 +00001716
1717// __NR_pciconfig_read // 198
1718// __NR_pciconfig_write // 199
1719// __NR_pciconfig_iobase // 200
1720// __NR_multiplexer // 201
1721
sewardja932d292005-07-08 00:18:25 +00001722 GENXY(__NR_getdents64, sys_getdents64), // 202
cerion85665ca2005-06-20 15:51:07 +00001723//.. // (__NR_pivot_root, sys_pivot_root), // 203 */Linux
sewardja932d292005-07-08 00:18:25 +00001724 GENXY(__NR_fcntl64, sys_fcntl64), // 204
sewardj249ebd72005-10-07 19:12:18 +00001725 GENX_(__NR_madvise, sys_madvise), // 205
dirka07c7402006-02-22 12:54:44 +00001726 GENXY(__NR_mincore, sys_mincore), // 206
sewardja9fff9b2005-08-19 10:07:29 +00001727 LINX_(__NR_gettid, sys_gettid), // 207
cerion85665ca2005-06-20 15:51:07 +00001728//.. LINX_(__NR_tkill, sys_tkill), // 208 */Linux
njn65ccc502005-08-30 01:53:54 +00001729//.. LINX_(__NR_setxattr, sys_setxattr), // 209
1730//.. LINX_(__NR_lsetxattr, sys_lsetxattr), // 210
1731//.. LINX_(__NR_fsetxattr, sys_fsetxattr), // 211
njnef0da672005-08-30 03:02:00 +00001732 LINXY(__NR_getxattr, sys_getxattr), // 212
sewardja58bbbc2006-04-14 01:04:04 +00001733 LINXY(__NR_lgetxattr, sys_lgetxattr), // 213
1734 LINXY(__NR_fgetxattr, sys_fgetxattr), // 214
1735 LINXY(__NR_listxattr, sys_listxattr), // 215
1736 LINXY(__NR_llistxattr, sys_llistxattr), // 216
1737 LINXY(__NR_flistxattr, sys_flistxattr), // 217
1738 LINX_(__NR_removexattr, sys_removexattr), // 218
1739 LINX_(__NR_lremovexattr, sys_lremovexattr), // 219
1740 LINX_(__NR_fremovexattr, sys_fremovexattr), // 220
cerion85665ca2005-06-20 15:51:07 +00001741
cerion508aef52005-06-24 15:26:49 +00001742 LINXY(__NR_futex, sys_futex), // 221
sewardja58bbbc2006-04-14 01:04:04 +00001743 LINX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 222
1744 LINXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 223
cerion85665ca2005-06-20 15:51:07 +00001745/* 224 currently unused */
1746
1747// __NR_tuxcall // 225
1748
sewardja58bbbc2006-04-14 01:04:04 +00001749 LINXY(__NR_sendfile64, sys_sendfile64), // 226
cerion85665ca2005-06-20 15:51:07 +00001750//..
sewardja58bbbc2006-04-14 01:04:04 +00001751 LINX_(__NR_io_setup, sys_io_setup), // 227
1752 LINX_(__NR_io_destroy, sys_io_destroy), // 228
1753 LINXY(__NR_io_getevents, sys_io_getevents), // 229
1754 LINX_(__NR_io_submit, sys_io_submit), // 230
1755 LINXY(__NR_io_cancel, sys_io_cancel), // 231
cerion85665ca2005-06-20 15:51:07 +00001756//..
sewardja932d292005-07-08 00:18:25 +00001757 LINX_(__NR_set_tid_address, sys_set_tid_address), // 232
cerion85665ca2005-06-20 15:51:07 +00001758
sewardj79820562006-09-11 20:33:55 +00001759 LINX_(__NR_fadvise64, sys_fadvise64), // 233 */(Linux?)
sewardja932d292005-07-08 00:18:25 +00001760 LINX_(__NR_exit_group, sys_exit_group), // 234
cerion85665ca2005-06-20 15:51:07 +00001761//.. GENXY(__NR_lookup_dcookie, sys_lookup_dcookie), // 235
sewardja58bbbc2006-04-14 01:04:04 +00001762 LINXY(__NR_epoll_create, sys_epoll_create), // 236
1763 LINX_(__NR_epoll_ctl, sys_epoll_ctl), // 237
1764 LINXY(__NR_epoll_wait, sys_epoll_wait), // 238
cerion85665ca2005-06-20 15:51:07 +00001765
1766//.. // (__NR_remap_file_pages, sys_remap_file_pages), // 239 */Linux
sewardja58bbbc2006-04-14 01:04:04 +00001767 LINXY(__NR_timer_create, sys_timer_create), // 240
1768 LINXY(__NR_timer_settime, sys_timer_settime), // 241
1769 LINXY(__NR_timer_gettime, sys_timer_gettime), // 242
1770 LINX_(__NR_timer_getoverrun, sys_timer_getoverrun), // 243
1771 LINX_(__NR_timer_delete, sys_timer_delete), // 244
1772 LINX_(__NR_clock_settime, sys_clock_settime), // 245
njn1588bc02005-08-26 03:49:43 +00001773 LINXY(__NR_clock_gettime, sys_clock_gettime), // 246
dirk331e5762005-12-05 22:11:02 +00001774 LINXY(__NR_clock_getres, sys_clock_getres), // 247
sewardja58bbbc2006-04-14 01:04:04 +00001775 LINXY(__NR_clock_nanosleep, sys_clock_nanosleep), // 248
cerion85665ca2005-06-20 15:51:07 +00001776
1777// __NR_swapcontext // 249
1778
sewardj7f4bd102005-11-17 14:22:22 +00001779 LINXY(__NR_tgkill, sys_tgkill), // 250 */Linux
cerion85665ca2005-06-20 15:51:07 +00001780//.. GENX_(__NR_utimes, sys_utimes), // 251
sewardja58bbbc2006-04-14 01:04:04 +00001781 GENXY(__NR_statfs64, sys_statfs64), // 252
1782 GENXY(__NR_fstatfs64, sys_fstatfs64), // 253
1783 LINX_(__NR_fadvise64_64, sys_fadvise64_64), // 254 */(Linux?)
cerion85665ca2005-06-20 15:51:07 +00001784
1785// __NR_rtas // 255
1786
1787/* Number 256 is reserved for sys_debug_setcontext */
1788/* Number 257 is reserved for vserver */
1789/* Number 258 is reserved for new sys_remap_file_pages */
1790/* Number 259 is reserved for new sys_mbind */
dirka07c7402006-02-22 12:54:44 +00001791 LINXY(__NR_get_mempolicy, sys_get_mempolicy), // 260
1792 LINX_(__NR_set_mempolicy, sys_set_mempolicy), // 261
cerion85665ca2005-06-20 15:51:07 +00001793
sewardj54e095f2005-11-17 19:09:02 +00001794 LINXY(__NR_mq_open, sys_mq_open), // 262
1795 LINX_(__NR_mq_unlink, sys_mq_unlink), // 263
1796 LINX_(__NR_mq_timedsend, sys_mq_timedsend), // 264
1797 LINXY(__NR_mq_timedreceive, sys_mq_timedreceive), // 265
1798 LINX_(__NR_mq_notify, sys_mq_notify), // 266
1799 LINXY(__NR_mq_getsetattr, sys_mq_getsetattr), // 267
cerion85665ca2005-06-20 15:51:07 +00001800// __NR_kexec_load // 268
dirka07c7402006-02-22 12:54:44 +00001801
1802/* Number 269 is reserved for sys_add_key */
1803/* Number 270 is reserved for sys_request_key */
1804/* Number 271 is reserved for sys_keyctl */
1805/* Number 272 is reserved for sys_waitid */
1806/* Number 273 is reserved for sys_ioprio_set */
1807/* Number 274 is reserved for sys_ioprio_get */
1808
1809 LINX_(__NR_inotify_init, sys_inotify_init), // 275
1810 LINX_(__NR_inotify_add_watch, sys_inotify_add_watch), // 276
1811 LINX_(__NR_inotify_rm_watch, sys_inotify_rm_watch), // 277
sewardj5b91c402006-07-24 10:06:09 +00001812
1813 LINXY(__NR_openat, sys_openat), // 286
1814 LINX_(__NR_mkdirat, sys_mkdirat), // 287
1815 LINX_(__NR_mknodat, sys_mknodat), // 288
1816 LINX_(__NR_fchownat, sys_fchownat), // 289
1817 LINX_(__NR_futimesat, sys_futimesat), // 290
1818 PLAXY(__NR_fstatat64, sys_fstatat64), // 291
1819 LINX_(__NR_unlinkat, sys_unlinkat), // 292
1820 LINX_(__NR_renameat, sys_renameat), // 293
1821 LINX_(__NR_linkat, sys_linkat), // 294
1822 LINX_(__NR_symlinkat, sys_symlinkat), // 295
1823 LINX_(__NR_readlinkat, sys_readlinkat), // 296
1824 LINX_(__NR_fchmodat, sys_fchmodat), // 297
1825 LINX_(__NR_faccessat, sys_faccessat), // 298
1826 LINX_(__NR_set_robust_list, sys_set_robust_list), // 299
1827 LINXY(__NR_get_robust_list, sys_get_robust_list), // 300
cerion85665ca2005-06-20 15:51:07 +00001828};
1829
njnaf839f52005-06-23 03:27:57 +00001830const UInt ML_(syscall_table_size) =
1831 sizeof(ML_(syscall_table)) / sizeof(ML_(syscall_table)[0]);
cerion85665ca2005-06-20 15:51:07 +00001832
1833/*--------------------------------------------------------------------*/
1834/*--- end ---*/
1835/*--------------------------------------------------------------------*/