blob: d5ce8ee0cdb80a15548463ad9fe82d04e7b1dc62 [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;
sewardj7cf4e6b2008-05-01 20:24:26 +0000378 child->vex_shadow1 = parent->vex_shadow1;
379 child->vex_shadow2 = parent->vex_shadow2;
sewardje23772f2005-07-02 11:27:02 +0000380}
cerion85665ca2005-06-20 15:51:07 +0000381
382
383/* ---------------------------------------------------------------------
384 PRE/POST wrappers for ppc32/Linux-specific syscalls
385 ------------------------------------------------------------------ */
386
387#define PRE(name) DEFN_PRE_TEMPLATE(ppc32_linux, name)
388#define POST(name) DEFN_POST_TEMPLATE(ppc32_linux, name)
389
390/* Add prototypes for the wrappers declared here, so that gcc doesn't
391 harass us for not having prototypes. Really this is a kludge --
392 the right thing to do is to make these wrappers 'static' since they
393 aren't visible outside this file, but that requires even more macro
394 magic. */
395
cerion508aef52005-06-24 15:26:49 +0000396DECL_TEMPLATE(ppc32_linux, sys_socketcall);
tom9548a162005-09-30 08:07:53 +0000397DECL_TEMPLATE(ppc32_linux, sys_mmap);
398DECL_TEMPLATE(ppc32_linux, sys_mmap2);
cerion85665ca2005-06-20 15:51:07 +0000399DECL_TEMPLATE(ppc32_linux, sys_stat64);
cerion508aef52005-06-24 15:26:49 +0000400DECL_TEMPLATE(ppc32_linux, sys_lstat64);
sewardj5b91c402006-07-24 10:06:09 +0000401DECL_TEMPLATE(ppc32_linux, sys_fstatat64);
cerion85665ca2005-06-20 15:51:07 +0000402DECL_TEMPLATE(ppc32_linux, sys_fstat64);
cerion508aef52005-06-24 15:26:49 +0000403DECL_TEMPLATE(ppc32_linux, sys_ipc);
sewardje23772f2005-07-02 11:27:02 +0000404DECL_TEMPLATE(ppc32_linux, sys_clone);
sewardjb865b162005-07-08 18:26:37 +0000405DECL_TEMPLATE(ppc32_linux, sys_sigreturn);
sewardj4ce89e12005-11-16 19:15:33 +0000406DECL_TEMPLATE(ppc32_linux, sys_rt_sigreturn);
sewardj3849cc52005-11-07 15:48:31 +0000407DECL_TEMPLATE(ppc32_linux, sys_sigaction);
tom313639f2006-04-03 16:38:33 +0000408DECL_TEMPLATE(ppc32_linux, sys_sigsuspend);
cerion508aef52005-06-24 15:26:49 +0000409
410PRE(sys_socketcall)
411{
412# define ARG2_0 (((UWord*)ARG2)[0])
413# define ARG2_1 (((UWord*)ARG2)[1])
414# define ARG2_2 (((UWord*)ARG2)[2])
415# define ARG2_3 (((UWord*)ARG2)[3])
416# define ARG2_4 (((UWord*)ARG2)[4])
417# define ARG2_5 (((UWord*)ARG2)[5])
418
419 *flags |= SfMayBlock;
420 PRINT("sys_socketcall ( %d, %p )",ARG1,ARG2);
421 PRE_REG_READ2(long, "socketcall", int, call, unsigned long *, args);
422
423 switch (ARG1 /* request */) {
424
425 case VKI_SYS_SOCKETPAIR:
426 /* int socketpair(int d, int type, int protocol, int sv[2]); */
427 PRE_MEM_READ( "socketcall.socketpair(args)", ARG2, 4*sizeof(Addr) );
428 ML_(generic_PRE_sys_socketpair)( tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3 );
429 break;
430
431 case VKI_SYS_SOCKET:
432 /* int socket(int domain, int type, int protocol); */
433 PRE_MEM_READ( "socketcall.socket(args)", ARG2, 3*sizeof(Addr) );
434 break;
435
436 case VKI_SYS_BIND:
437 /* int bind(int sockfd, struct sockaddr *my_addr,
438 int addrlen); */
439 PRE_MEM_READ( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) );
440 ML_(generic_PRE_sys_bind)( tid, ARG2_0, ARG2_1, ARG2_2 );
441 break;
442
443 case VKI_SYS_LISTEN:
444 /* int listen(int s, int backlog); */
445 PRE_MEM_READ( "socketcall.listen(args)", ARG2, 2*sizeof(Addr) );
446 break;
447
448 case VKI_SYS_ACCEPT: {
449 /* int accept(int s, struct sockaddr *addr, int *addrlen); */
450 PRE_MEM_READ( "socketcall.accept(args)", ARG2, 3*sizeof(Addr) );
451 ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
452 break;
453 }
454
455 case VKI_SYS_SENDTO:
456 /* int sendto(int s, const void *msg, int len,
457 unsigned int flags,
458 const struct sockaddr *to, int tolen); */
459 PRE_MEM_READ( "socketcall.sendto(args)", ARG2, 6*sizeof(Addr) );
460 ML_(generic_PRE_sys_sendto)( tid, ARG2_0, ARG2_1, ARG2_2,
461 ARG2_3, ARG2_4, ARG2_5 );
462 break;
463
464 case VKI_SYS_SEND:
465 /* int send(int s, const void *msg, size_t len, int flags); */
466 PRE_MEM_READ( "socketcall.send(args)", ARG2, 4*sizeof(Addr) );
467 ML_(generic_PRE_sys_send)( tid, ARG2_0, ARG2_1, ARG2_2 );
468 break;
469
470 case VKI_SYS_RECVFROM:
471 /* int recvfrom(int s, void *buf, int len, unsigned int flags,
472 struct sockaddr *from, int *fromlen); */
473 PRE_MEM_READ( "socketcall.recvfrom(args)", ARG2, 6*sizeof(Addr) );
474 ML_(generic_PRE_sys_recvfrom)( tid, ARG2_0, ARG2_1, ARG2_2,
475 ARG2_3, ARG2_4, ARG2_5 );
476 break;
477
478 case VKI_SYS_RECV:
479 /* int recv(int s, void *buf, int len, unsigned int flags); */
480 /* man 2 recv says:
481 The recv call is normally used only on a connected socket
482 (see connect(2)) and is identical to recvfrom with a NULL
483 from parameter.
484 */
485 PRE_MEM_READ( "socketcall.recv(args)", ARG2, 4*sizeof(Addr) );
486 ML_(generic_PRE_sys_recv)( tid, ARG2_0, ARG2_1, ARG2_2 );
487 break;
488
489 case VKI_SYS_CONNECT:
490 /* int connect(int sockfd,
491 struct sockaddr *serv_addr, int addrlen ); */
492 PRE_MEM_READ( "socketcall.connect(args)", ARG2, 3*sizeof(Addr) );
493 ML_(generic_PRE_sys_connect)( tid, ARG2_0, ARG2_1, ARG2_2 );
494 break;
495
496 case VKI_SYS_SETSOCKOPT:
497 /* int setsockopt(int s, int level, int optname,
498 const void *optval, int optlen); */
499 PRE_MEM_READ( "socketcall.setsockopt(args)", ARG2, 5*sizeof(Addr) );
500 ML_(generic_PRE_sys_setsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
501 ARG2_3, ARG2_4 );
502 break;
503
504 case VKI_SYS_GETSOCKOPT:
505 /* int getsockopt(int s, int level, int optname,
506 void *optval, socklen_t *optlen); */
507 PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) );
508 ML_(generic_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
509 ARG2_3, ARG2_4 );
510 break;
511
512 case VKI_SYS_GETSOCKNAME:
513 /* int getsockname(int s, struct sockaddr* name, int* namelen) */
514 PRE_MEM_READ( "socketcall.getsockname(args)", ARG2, 3*sizeof(Addr) );
515 ML_(generic_PRE_sys_getsockname)( tid, ARG2_0, ARG2_1, ARG2_2 );
516 break;
517
518 case VKI_SYS_GETPEERNAME:
519 /* int getpeername(int s, struct sockaddr* name, int* namelen) */
520 PRE_MEM_READ( "socketcall.getpeername(args)", ARG2, 3*sizeof(Addr) );
521 ML_(generic_PRE_sys_getpeername)( tid, ARG2_0, ARG2_1, ARG2_2 );
522 break;
523
524 case VKI_SYS_SHUTDOWN:
525 /* int shutdown(int s, int how); */
526 PRE_MEM_READ( "socketcall.shutdown(args)", ARG2, 2*sizeof(Addr) );
527 break;
528
529 case VKI_SYS_SENDMSG: {
530 /* int sendmsg(int s, const struct msghdr *msg, int flags); */
531
532 /* this causes warnings, and I don't get why. glibc bug?
533 * (after all it's glibc providing the arguments array)
534 PRE_MEM_READ( "socketcall.sendmsg(args)", ARG2, 3*sizeof(Addr) );
535 */
536 ML_(generic_PRE_sys_sendmsg)( tid, ARG2_0, ARG2_1 );
537 break;
538 }
539
540 case VKI_SYS_RECVMSG: {
541 /* int recvmsg(int s, struct msghdr *msg, int flags); */
542
543 /* this causes warnings, and I don't get why. glibc bug?
544 * (after all it's glibc providing the arguments array)
545 PRE_MEM_READ("socketcall.recvmsg(args)", ARG2, 3*sizeof(Addr) );
546 */
547 ML_(generic_PRE_sys_recvmsg)( tid, ARG2_0, ARG2_1 );
548 break;
549 }
550
551 default:
552 VG_(message)(Vg_DebugMsg,"Warning: unhandled socketcall 0x%x",ARG1);
553 SET_STATUS_Failure( VKI_EINVAL );
554 break;
555 }
556# undef ARG2_0
557# undef ARG2_1
558# undef ARG2_2
559# undef ARG2_3
560# undef ARG2_4
561# undef ARG2_5
562}
563
564POST(sys_socketcall)
565{
566# define ARG2_0 (((UWord*)ARG2)[0])
567# define ARG2_1 (((UWord*)ARG2)[1])
568# define ARG2_2 (((UWord*)ARG2)[2])
569# define ARG2_3 (((UWord*)ARG2)[3])
570# define ARG2_4 (((UWord*)ARG2)[4])
571# define ARG2_5 (((UWord*)ARG2)[5])
572
573 SysRes r;
574 vg_assert(SUCCESS);
575 switch (ARG1 /* request */) {
576
577 case VKI_SYS_SOCKETPAIR:
578 r = ML_(generic_POST_sys_socketpair)(
579 tid, VG_(mk_SysRes_Success)(RES),
580 ARG2_0, ARG2_1, ARG2_2, ARG2_3
581 );
582 SET_STATUS_from_SysRes(r);
583 break;
584
585 case VKI_SYS_SOCKET:
586 r = ML_(generic_POST_sys_socket)( tid, VG_(mk_SysRes_Success)(RES) );
587 SET_STATUS_from_SysRes(r);
588 break;
589
590 case VKI_SYS_BIND:
591 /* int bind(int sockfd, struct sockaddr *my_addr,
592 int addrlen); */
593 break;
594
595 case VKI_SYS_LISTEN:
596 /* int listen(int s, int backlog); */
597 break;
598
599 case VKI_SYS_ACCEPT:
600 /* int accept(int s, struct sockaddr *addr, int *addrlen); */
601 r = ML_(generic_POST_sys_accept)( tid, VG_(mk_SysRes_Success)(RES),
602 ARG2_0, ARG2_1, ARG2_2 );
603 SET_STATUS_from_SysRes(r);
604 break;
605
606 case VKI_SYS_SENDTO:
607 break;
608
609 case VKI_SYS_SEND:
610 break;
611
612 case VKI_SYS_RECVFROM:
613 ML_(generic_POST_sys_recvfrom)( tid, VG_(mk_SysRes_Success)(RES),
614 ARG2_0, ARG2_1, ARG2_2,
615 ARG2_3, ARG2_4, ARG2_5 );
616 break;
617
618 case VKI_SYS_RECV:
619 ML_(generic_POST_sys_recv)( tid, RES, ARG2_0, ARG2_1, ARG2_2 );
620 break;
621
622 case VKI_SYS_CONNECT:
623 break;
624
625 case VKI_SYS_SETSOCKOPT:
626 break;
627
628 case VKI_SYS_GETSOCKOPT:
629 ML_(generic_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
630 ARG2_0, ARG2_1,
631 ARG2_2, ARG2_3, ARG2_4 );
632 break;
633
634 case VKI_SYS_GETSOCKNAME:
635 ML_(generic_POST_sys_getsockname)( tid, VG_(mk_SysRes_Success)(RES),
636 ARG2_0, ARG2_1, ARG2_2 );
637 break;
638
639 case VKI_SYS_GETPEERNAME:
640 ML_(generic_POST_sys_getpeername)( tid, VG_(mk_SysRes_Success)(RES),
641 ARG2_0, ARG2_1, ARG2_2 );
642 break;
643
644 case VKI_SYS_SHUTDOWN:
645 break;
646
647 case VKI_SYS_SENDMSG:
648 break;
649
650 case VKI_SYS_RECVMSG:
651 ML_(generic_POST_sys_recvmsg)( tid, ARG2_0, ARG2_1 );
652 break;
653
654 default:
655 VG_(message)(Vg_DebugMsg,"FATAL: unhandled socketcall 0x%x",ARG1);
656 VG_(core_panic)("... bye!\n");
657 break; /*NOTREACHED*/
658 }
659# undef ARG2_0
660# undef ARG2_1
661# undef ARG2_2
662# undef ARG2_3
663# undef ARG2_4
664# undef ARG2_5
665}
cerion85665ca2005-06-20 15:51:07 +0000666
tom9548a162005-09-30 08:07:53 +0000667PRE(sys_mmap)
668{
669 SysRes r;
670
671 PRINT("sys_mmap ( %p, %llu, %d, %d, %d, %d )",
672 ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 );
673 PRE_REG_READ6(long, "mmap",
674 unsigned long, start, unsigned long, length,
675 unsigned long, prot, unsigned long, flags,
676 unsigned long, fd, unsigned long, offset);
677
sewardj274461d2005-10-02 17:01:41 +0000678 r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
679 (Off64T)ARG6 );
tom9548a162005-09-30 08:07:53 +0000680 SET_STATUS_from_SysRes(r);
681}
682
683PRE(sys_mmap2)
684{
685 SysRes r;
686
687 // Exactly like old_mmap() except:
sewardje66f2e02006-12-30 17:45:08 +0000688 // - the file offset is specified in 4K units rather than bytes,
tom9548a162005-09-30 08:07:53 +0000689 // so that it can be used for files bigger than 2^32 bytes.
690 PRINT("sys_mmap2 ( %p, %llu, %d, %d, %d, %d )",
691 ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 );
692 PRE_REG_READ6(long, "mmap2",
693 unsigned long, start, unsigned long, length,
694 unsigned long, prot, unsigned long, flags,
695 unsigned long, fd, unsigned long, offset);
696
sewardj274461d2005-10-02 17:01:41 +0000697 r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
sewardje66f2e02006-12-30 17:45:08 +0000698 4096 * (Off64T)ARG6 );
tom9548a162005-09-30 08:07:53 +0000699 SET_STATUS_from_SysRes(r);
700}
701
cerion85665ca2005-06-20 15:51:07 +0000702// XXX: lstat64/fstat64/stat64 are generic, but not necessarily
703// applicable to every architecture -- I think only to 32-bit archs.
704// We're going to need something like linux/core_os32.h for such
705// things, eventually, I think. --njn
706PRE(sys_stat64)
707{
708 PRINT("sys_stat64 ( %p, %p )",ARG1,ARG2);
709 PRE_REG_READ2(long, "stat64", char *, file_name, struct stat64 *, buf);
710 PRE_MEM_RASCIIZ( "stat64(file_name)", ARG1 );
711 PRE_MEM_WRITE( "stat64(buf)", ARG2, sizeof(struct vki_stat64) );
712}
713
714POST(sys_stat64)
715{
716 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
717}
718
cerion508aef52005-06-24 15:26:49 +0000719PRE(sys_lstat64)
720{
721 PRINT("sys_lstat64 ( %p(%s), %p )",ARG1,ARG1,ARG2);
722 PRE_REG_READ2(long, "lstat64", char *, file_name, struct stat64 *, buf);
723 PRE_MEM_RASCIIZ( "lstat64(file_name)", ARG1 );
724 PRE_MEM_WRITE( "lstat64(buf)", ARG2, sizeof(struct vki_stat64) );
725}
726
727POST(sys_lstat64)
728{
729 vg_assert(SUCCESS);
730 if (RES == 0) {
731 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
732 }
733}
734
sewardj5b91c402006-07-24 10:06:09 +0000735PRE(sys_fstatat64)
736{
737 PRINT("sys_fstatat64 ( %d, %p(%s), %p )",ARG1,ARG2,ARG2,ARG3);
738 PRE_REG_READ3(long, "fstatat64",
739 int, dfd, char *, file_name, struct stat64 *, buf);
740 PRE_MEM_RASCIIZ( "fstatat64(file_name)", ARG2 );
741 PRE_MEM_WRITE( "fstatat64(buf)", ARG3, sizeof(struct vki_stat64) );
742}
743
744POST(sys_fstatat64)
745{
746 POST_MEM_WRITE( ARG3, sizeof(struct vki_stat64) );
747}
748
cerion85665ca2005-06-20 15:51:07 +0000749PRE(sys_fstat64)
750{
751 PRINT("sys_fstat64 ( %d, %p )",ARG1,ARG2);
752 PRE_REG_READ2(long, "fstat64", unsigned long, fd, struct stat64 *, buf);
753 PRE_MEM_WRITE( "fstat64(buf)", ARG2, sizeof(struct vki_stat64) );
754}
cerion508aef52005-06-24 15:26:49 +0000755
cerion85665ca2005-06-20 15:51:07 +0000756POST(sys_fstat64)
757{
758 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
759}
760
cerion508aef52005-06-24 15:26:49 +0000761static Addr deref_Addr ( ThreadId tid, Addr a, Char* s )
762{
763 Addr* a_p = (Addr*)a;
764 PRE_MEM_READ( s, (Addr)a_p, sizeof(Addr) );
765 return *a_p;
766}
767
cerion508aef52005-06-24 15:26:49 +0000768PRE(sys_ipc)
769{
770 PRINT("sys_ipc ( %d, %d, %d, %d, %p, %d )", ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
771 // XXX: this is simplistic -- some args are not used in all circumstances.
772 PRE_REG_READ6(int, "ipc",
773 vki_uint, call, int, first, int, second, int, third,
774 void *, ptr, long, fifth)
775
776 switch (ARG1 /* call */) {
777 case VKI_SEMOP:
778 ML_(generic_PRE_sys_semop)( tid, ARG2, ARG5, ARG3 );
779 *flags |= SfMayBlock;
780 break;
781 case VKI_SEMGET:
782 break;
783 case VKI_SEMCTL:
784 {
785 UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
786 ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
787 break;
788 }
789 case VKI_SEMTIMEDOP:
790 ML_(generic_PRE_sys_semtimedop)( tid, ARG2, ARG5, ARG3, ARG6 );
791 *flags |= SfMayBlock;
792 break;
793 case VKI_MSGSND:
njnde5c5f52005-09-01 03:35:40 +0000794 ML_(linux_PRE_sys_msgsnd)( tid, ARG2, ARG5, ARG3, ARG4 );
cerion508aef52005-06-24 15:26:49 +0000795 if ((ARG4 & VKI_IPC_NOWAIT) == 0)
796 *flags |= SfMayBlock;
797 break;
798 case VKI_MSGRCV:
799 {
800 Addr msgp;
801 Word msgtyp;
802
803 msgp = deref_Addr( tid,
804 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
805 "msgrcv(msgp)" );
806 msgtyp = deref_Addr( tid,
807 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
808 "msgrcv(msgp)" );
809
njnde5c5f52005-09-01 03:35:40 +0000810 ML_(linux_PRE_sys_msgrcv)( tid, ARG2, msgp, ARG3, msgtyp, ARG4 );
cerion508aef52005-06-24 15:26:49 +0000811
812 if ((ARG4 & VKI_IPC_NOWAIT) == 0)
813 *flags |= SfMayBlock;
814 break;
815 }
816 case VKI_MSGGET:
817 break;
818 case VKI_MSGCTL:
njnde5c5f52005-09-01 03:35:40 +0000819 ML_(linux_PRE_sys_msgctl)( tid, ARG2, ARG3, ARG5 );
cerion508aef52005-06-24 15:26:49 +0000820 break;
821 case VKI_SHMAT:
822 {
823 UWord w;
824 PRE_MEM_WRITE( "shmat(raddr)", ARG4, sizeof(Addr) );
825 w = ML_(generic_PRE_sys_shmat)( tid, ARG2, ARG5, ARG3 );
826 if (w == 0)
827 SET_STATUS_Failure( VKI_EINVAL );
828 else
829 ARG5 = w;
830 break;
831 }
832 case VKI_SHMDT:
833 if (!ML_(generic_PRE_sys_shmdt)(tid, ARG5))
834 SET_STATUS_Failure( VKI_EINVAL );
835 break;
836 case VKI_SHMGET:
837 break;
838 case VKI_SHMCTL: /* IPCOP_shmctl */
839 ML_(generic_PRE_sys_shmctl)( tid, ARG2, ARG3, ARG5 );
840 break;
841 default:
842 VG_(message)(Vg_DebugMsg, "FATAL: unhandled syscall(ipc) %d", ARG1 );
843 VG_(core_panic)("... bye!\n");
844 break; /*NOTREACHED*/
845 }
846}
847
848POST(sys_ipc)
849{
850 vg_assert(SUCCESS);
851 switch (ARG1 /* call */) {
852 case VKI_SEMOP:
853 case VKI_SEMGET:
854 break;
855 case VKI_SEMCTL:
856 {
857 UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
858 ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
859 break;
860 }
861 case VKI_SEMTIMEDOP:
862 case VKI_MSGSND:
863 break;
864 case VKI_MSGRCV:
865 {
866 Addr msgp;
867 Word msgtyp;
868
869 msgp = deref_Addr( tid,
870 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
871 "msgrcv(msgp)" );
872 msgtyp = deref_Addr( tid,
873 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
874 "msgrcv(msgp)" );
875
njna560c5c2005-09-01 16:27:28 +0000876 ML_(linux_POST_sys_msgrcv)( tid, RES, ARG2, msgp, ARG3, msgtyp, ARG4 );
cerion508aef52005-06-24 15:26:49 +0000877 break;
878 }
879 case VKI_MSGGET:
880 break;
881 case VKI_MSGCTL:
njna560c5c2005-09-01 16:27:28 +0000882 ML_(linux_POST_sys_msgctl)( tid, RES, ARG2, ARG3, ARG5 );
cerion508aef52005-06-24 15:26:49 +0000883 break;
884 case VKI_SHMAT:
885 {
886 Addr addr;
887
888 /* force readability. before the syscall it is
889 * indeed uninitialized, as can be seen in
890 * glibc/sysdeps/unix/sysv/linux/shmat.c */
891 POST_MEM_WRITE( ARG4, sizeof( Addr ) );
892
893 addr = deref_Addr ( tid, ARG4, "shmat(addr)" );
tom3b2ab272008-02-11 14:47:05 +0000894 ML_(generic_POST_sys_shmat)( tid, addr, ARG2, ARG5, ARG3 );
cerion508aef52005-06-24 15:26:49 +0000895 break;
896 }
897 case VKI_SHMDT:
898 ML_(generic_POST_sys_shmdt)( tid, RES, ARG5 );
899 break;
900 case VKI_SHMGET:
901 break;
902 case VKI_SHMCTL:
903 ML_(generic_POST_sys_shmctl)( tid, RES, ARG2, ARG3, ARG5 );
904 break;
905 default:
906 VG_(message)(Vg_DebugMsg,
907 "FATAL: unhandled syscall(ipc) %d",
908 ARG1 );
909 VG_(core_panic)("... bye!\n");
910 break; /*NOTREACHED*/
911 }
912}
913
914
cerion85665ca2005-06-20 15:51:07 +0000915
916
917//.. PRE(old_select, MayBlock)
918//.. {
919//.. /* struct sel_arg_struct {
920//.. unsigned long n;
921//.. fd_set *inp, *outp, *exp;
922//.. struct timeval *tvp;
923//.. };
924//.. */
925//.. PRE_REG_READ1(long, "old_select", struct sel_arg_struct *, args);
926//.. PRE_MEM_READ( "old_select(args)", ARG1, 5*sizeof(UWord) );
927//..
928//.. {
929//.. UInt* arg_struct = (UInt*)ARG1;
930//.. UInt a1, a2, a3, a4, a5;
931//..
932//.. a1 = arg_struct[0];
933//.. a2 = arg_struct[1];
934//.. a3 = arg_struct[2];
935//.. a4 = arg_struct[3];
936//.. a5 = arg_struct[4];
937//..
938//.. PRINT("old_select ( %d, %p, %p, %p, %p )", a1,a2,a3,a4,a5);
939//.. if (a2 != (Addr)NULL)
940//.. PRE_MEM_READ( "old_select(readfds)", a2, a1/8 /* __FD_SETSIZE/8 */ );
941//.. if (a3 != (Addr)NULL)
942//.. PRE_MEM_READ( "old_select(writefds)", a3, a1/8 /* __FD_SETSIZE/8 */ );
943//.. if (a4 != (Addr)NULL)
944//.. PRE_MEM_READ( "old_select(exceptfds)", a4, a1/8 /* __FD_SETSIZE/8 */ );
945//.. if (a5 != (Addr)NULL)
946//.. PRE_MEM_READ( "old_select(timeout)", a5, sizeof(struct vki_timeval) );
947//.. }
948//.. }
949
sewardje23772f2005-07-02 11:27:02 +0000950PRE(sys_clone)
951{
952 UInt cloneflags;
953
954 PRINT("sys_clone ( %x, %p, %p, %p, %p )",ARG1,ARG2,ARG3,ARG4,ARG5);
955 PRE_REG_READ5(int, "clone",
956 unsigned long, flags,
sewardje21058c2005-08-05 02:15:18 +0000957 void *, child_stack,
958 int *, parent_tidptr,
959 void *, child_tls,
960 int *, child_tidptr);
sewardje23772f2005-07-02 11:27:02 +0000961
962 if (ARG1 & VKI_CLONE_PARENT_SETTID) {
963 PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int));
sewardja48a4932005-09-29 11:09:56 +0000964 if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int),
965 VKI_PROT_WRITE)) {
sewardje23772f2005-07-02 11:27:02 +0000966 SET_STATUS_Failure( VKI_EFAULT );
967 return;
968 }
969 }
970 if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) {
971 PRE_MEM_WRITE("clone(child_tidptr)", ARG5, sizeof(Int));
sewardja48a4932005-09-29 11:09:56 +0000972 if (!VG_(am_is_valid_for_client)(ARG5, sizeof(Int),
973 VKI_PROT_WRITE)) {
sewardje23772f2005-07-02 11:27:02 +0000974 SET_STATUS_Failure( VKI_EFAULT );
975 return;
976 }
977 }
978
sewardje23772f2005-07-02 11:27:02 +0000979 cloneflags = ARG1;
980
981 if (!ML_(client_signal_OK)(ARG1 & VKI_CSIGNAL)) {
982 SET_STATUS_Failure( VKI_EINVAL );
983 return;
984 }
985
986 /* Only look at the flags we really care about */
987 switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS
988 | VKI_CLONE_FILES | VKI_CLONE_VFORK)) {
989 case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES:
990 /* thread creation */
991 SET_STATUS_from_SysRes(
992 do_clone(tid,
993 ARG1, /* flags */
994 (Addr)ARG2, /* child SP */
995 (Int *)ARG3, /* parent_tidptr */
996 (Int *)ARG5, /* child_tidptr */
sewardj6a324492005-08-05 00:10:11 +0000997 (Addr)ARG4)); /* child_tls */
sewardje23772f2005-07-02 11:27:02 +0000998 break;
999
1000 case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */
1001 /* FALLTHROUGH - assume vfork == fork */
1002 cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM);
1003
1004 case 0: /* plain fork */
1005 SET_STATUS_from_SysRes(
njne1486662005-11-10 02:48:04 +00001006 ML_(do_fork_clone)(tid,
sewardje23772f2005-07-02 11:27:02 +00001007 cloneflags, /* flags */
sewardje23772f2005-07-02 11:27:02 +00001008 (Int *)ARG3, /* parent_tidptr */
1009 (Int *)ARG5)); /* child_tidptr */
1010 break;
1011
1012 default:
1013 /* should we just ENOSYS? */
1014 VG_(message)(Vg_UserMsg, "Unsupported clone() flags: 0x%x", ARG1);
1015 VG_(message)(Vg_UserMsg, "");
1016 VG_(message)(Vg_UserMsg, "The only supported clone() uses are:");
1017 VG_(message)(Vg_UserMsg, " - via a threads library (LinuxThreads or NPTL)");
1018 VG_(message)(Vg_UserMsg, " - via the implementation of fork or vfork");
1019 VG_(unimplemented)
1020 ("Valgrind does not support general clone().");
1021 }
1022
1023 if (SUCCESS) {
1024 if (ARG1 & VKI_CLONE_PARENT_SETTID)
1025 POST_MEM_WRITE(ARG3, sizeof(Int));
1026 if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID))
1027 POST_MEM_WRITE(ARG5, sizeof(Int));
1028
1029 /* Thread creation was successful; let the child have the chance
1030 to run */
1031 *flags |= SfYieldAfter;
1032 }
1033}
cerion85665ca2005-06-20 15:51:07 +00001034
sewardjb865b162005-07-08 18:26:37 +00001035PRE(sys_sigreturn)
1036{
sewardjcba8f432007-03-19 14:34:08 +00001037 /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
1038 an explanation of what follows. */
1039
sewardjb865b162005-07-08 18:26:37 +00001040 ThreadState* tst;
sewardjcba8f432007-03-19 14:34:08 +00001041 PRINT("sys_sigreturn ( )");
sewardjb865b162005-07-08 18:26:37 +00001042
1043 vg_assert(VG_(is_valid_tid)(tid));
1044 vg_assert(tid >= 1 && tid < VG_N_THREADS);
1045 vg_assert(VG_(is_running_thread)(tid));
1046
1047 ///* Adjust esp to point to start of frame; skip back up over
1048 // sigreturn sequence's "popl %eax" and handler ret addr */
1049 tst = VG_(get_ThreadState)(tid);
1050 //tst->arch.vex.guest_ESP -= sizeof(Addr)+sizeof(Word);
sewardj4ce89e12005-11-16 19:15:33 +00001051 // Should we do something equivalent on ppc32? Who knows.
sewardjb865b162005-07-08 18:26:37 +00001052
1053 ///* This is only so that the EIP is (might be) useful to report if
1054 // something goes wrong in the sigreturn */
1055 //ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
sewardj4ce89e12005-11-16 19:15:33 +00001056 // Should we do something equivalent on ppc32? Who knows.
sewardjb865b162005-07-08 18:26:37 +00001057
sewardjcba8f432007-03-19 14:34:08 +00001058 /* Restore register state from frame and remove it */
sewardjb865b162005-07-08 18:26:37 +00001059 VG_(sigframe_destroy)(tid, False);
1060
sewardjcba8f432007-03-19 14:34:08 +00001061 /* Tell the driver not to update the guest state with the "result",
1062 and set a bogus result to keep it happy. */
1063 *flags |= SfNoWriteResult;
1064 SET_STATUS_Success(0);
sewardjb865b162005-07-08 18:26:37 +00001065
sewardjcba8f432007-03-19 14:34:08 +00001066 /* Check to see if any signals arose as a result of this. */
sewardjb865b162005-07-08 18:26:37 +00001067 *flags |= SfPollAfter;
1068}
1069
sewardj4ce89e12005-11-16 19:15:33 +00001070PRE(sys_rt_sigreturn)
1071{
sewardjcba8f432007-03-19 14:34:08 +00001072 /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
1073 an explanation of what follows. */
1074
sewardj4ce89e12005-11-16 19:15:33 +00001075 ThreadState* tst;
1076 PRINT("rt_sigreturn ( )");
cerion85665ca2005-06-20 15:51:07 +00001077
sewardj4ce89e12005-11-16 19:15:33 +00001078 vg_assert(VG_(is_valid_tid)(tid));
1079 vg_assert(tid >= 1 && tid < VG_N_THREADS);
1080 vg_assert(VG_(is_running_thread)(tid));
1081
1082 ///* Adjust esp to point to start of frame; skip back up over handler
1083 // ret addr */
1084 tst = VG_(get_ThreadState)(tid);
1085 //tst->arch.vex.guest_ESP -= sizeof(Addr);
1086 // Should we do something equivalent on ppc32? Who knows.
1087
1088 ///* This is only so that the EIP is (might be) useful to report if
1089 // something goes wrong in the sigreturn */
1090 //ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
1091 // Should we do something equivalent on ppc32? Who knows.
1092
sewardjcba8f432007-03-19 14:34:08 +00001093 /* Restore register state from frame and remove it */
sewardj4ce89e12005-11-16 19:15:33 +00001094 VG_(sigframe_destroy)(tid, True);
1095
sewardjcba8f432007-03-19 14:34:08 +00001096 /* Tell the driver not to update the guest state with the "result",
1097 and set a bogus result to keep it happy. */
1098 *flags |= SfNoWriteResult;
1099 SET_STATUS_Success(0);
sewardj4ce89e12005-11-16 19:15:33 +00001100
sewardjcba8f432007-03-19 14:34:08 +00001101 /* Check to see if any signals arose as a result of this. */
sewardj4ce89e12005-11-16 19:15:33 +00001102 *flags |= SfPollAfter;
1103}
1104
cerion85665ca2005-06-20 15:51:07 +00001105
1106//.. PRE(sys_modify_ldt, Special)
1107//.. {
1108//.. PRINT("sys_modify_ldt ( %d, %p, %d )", ARG1,ARG2,ARG3);
1109//.. PRE_REG_READ3(int, "modify_ldt", int, func, void *, ptr,
1110//.. unsigned long, bytecount);
1111//..
1112//.. if (ARG1 == 0) {
1113//.. /* read the LDT into ptr */
1114//.. PRE_MEM_WRITE( "modify_ldt(ptr)", ARG2, ARG3 );
1115//.. }
1116//.. if (ARG1 == 1 || ARG1 == 0x11) {
1117//.. /* write the LDT with the entry pointed at by ptr */
1118//.. PRE_MEM_READ( "modify_ldt(ptr)", ARG2, sizeof(vki_modify_ldt_t) );
1119//.. }
1120//.. /* "do" the syscall ourselves; the kernel never sees it */
1121//.. SET_RESULT( VG_(sys_modify_ldt)( tid, ARG1, (void*)ARG2, ARG3 ) );
1122//..
1123//.. if (ARG1 == 0 && !VG_(is_kerror)(RES) && RES > 0) {
1124//.. POST_MEM_WRITE( ARG2, RES );
1125//.. }
1126//.. }
1127
1128//.. PRE(sys_set_thread_area, Special)
1129//.. {
1130//.. PRINT("sys_set_thread_area ( %p )", ARG1);
1131//.. PRE_REG_READ1(int, "set_thread_area", struct user_desc *, u_info)
1132//.. PRE_MEM_READ( "set_thread_area(u_info)", ARG1, sizeof(vki_modify_ldt_t) );
1133//..
1134//.. /* "do" the syscall ourselves; the kernel never sees it */
1135//.. SET_RESULT( VG_(sys_set_thread_area)( tid, (void *)ARG1 ) );
1136//.. }
1137
1138//.. PRE(sys_get_thread_area, Special)
1139//.. {
1140//.. PRINT("sys_get_thread_area ( %p )", ARG1);
1141//.. PRE_REG_READ1(int, "get_thread_area", struct user_desc *, u_info)
1142//.. PRE_MEM_WRITE( "get_thread_area(u_info)", ARG1, sizeof(vki_modify_ldt_t) );
1143//..
1144//.. /* "do" the syscall ourselves; the kernel never sees it */
1145//.. SET_RESULT( VG_(sys_get_thread_area)( tid, (void *)ARG1 ) );
1146//..
1147//.. if (!VG_(is_kerror)(RES)) {
1148//.. POST_MEM_WRITE( ARG1, sizeof(vki_modify_ldt_t) );
1149//.. }
1150//.. }
1151
1152//.. // Parts of this are ppc32-specific, but the *PEEK* cases are generic.
1153//.. // XXX: Why is the memory pointed to by ARG3 never checked?
1154//.. PRE(sys_ptrace, 0)
1155//.. {
1156//.. PRINT("sys_ptrace ( %d, %d, %p, %p )", ARG1,ARG2,ARG3,ARG4);
1157//.. PRE_REG_READ4(int, "ptrace",
1158//.. long, request, long, pid, long, addr, long, data);
1159//.. switch (ARG1) {
1160//.. case VKI_PTRACE_PEEKTEXT:
1161//.. case VKI_PTRACE_PEEKDATA:
1162//.. case VKI_PTRACE_PEEKUSR:
1163//.. PRE_MEM_WRITE( "ptrace(peek)", ARG4,
1164//.. sizeof (long));
1165//.. break;
1166//.. case VKI_PTRACE_GETREGS:
1167//.. PRE_MEM_WRITE( "ptrace(getregs)", ARG4,
1168//.. sizeof (struct vki_user_regs_struct));
1169//.. break;
1170//.. case VKI_PTRACE_GETFPREGS:
1171//.. PRE_MEM_WRITE( "ptrace(getfpregs)", ARG4,
1172//.. sizeof (struct vki_user_i387_struct));
1173//.. break;
1174//.. case VKI_PTRACE_GETFPXREGS:
1175//.. PRE_MEM_WRITE( "ptrace(getfpxregs)", ARG4,
1176//.. sizeof(struct vki_user_fxsr_struct) );
1177//.. break;
1178//.. case VKI_PTRACE_SETREGS:
1179//.. PRE_MEM_READ( "ptrace(setregs)", ARG4,
1180//.. sizeof (struct vki_user_regs_struct));
1181//.. break;
1182//.. case VKI_PTRACE_SETFPREGS:
1183//.. PRE_MEM_READ( "ptrace(setfpregs)", ARG4,
1184//.. sizeof (struct vki_user_i387_struct));
1185//.. break;
1186//.. case VKI_PTRACE_SETFPXREGS:
1187//.. PRE_MEM_READ( "ptrace(setfpxregs)", ARG4,
1188//.. sizeof(struct vki_user_fxsr_struct) );
1189//.. break;
1190//.. default:
1191//.. break;
1192//.. }
1193//.. }
1194
1195//.. POST(sys_ptrace)
1196//.. {
1197//.. switch (ARG1) {
1198//.. case VKI_PTRACE_PEEKTEXT:
1199//.. case VKI_PTRACE_PEEKDATA:
1200//.. case VKI_PTRACE_PEEKUSR:
1201//.. POST_MEM_WRITE( ARG4, sizeof (long));
1202//.. break;
1203//.. case VKI_PTRACE_GETREGS:
1204//.. POST_MEM_WRITE( ARG4, sizeof (struct vki_user_regs_struct));
1205//.. break;
1206//.. case VKI_PTRACE_GETFPREGS:
1207//.. POST_MEM_WRITE( ARG4, sizeof (struct vki_user_i387_struct));
1208//.. break;
1209//.. case VKI_PTRACE_GETFPXREGS:
1210//.. POST_MEM_WRITE( ARG4, sizeof(struct vki_user_fxsr_struct) );
1211//.. break;
1212//.. default:
1213//.. break;
1214//.. }
1215//.. }
1216
1217//.. // XXX: this duplicates a function in coregrind/vg_syscalls.c, yuk
1218//.. static Addr deref_Addr ( ThreadId tid, Addr a, Char* s )
1219//.. {
1220//.. Addr* a_p = (Addr*)a;
1221//.. PRE_MEM_READ( s, (Addr)a_p, sizeof(Addr) );
1222//.. return *a_p;
1223//.. }
1224
1225//.. // XXX: should use the constants here (eg. SHMAT), not the numbers directly!
1226//.. PRE(sys_ipc, 0)
1227//.. {
1228//.. PRINT("sys_ipc ( %d, %d, %d, %d, %p, %d )", ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
1229//.. // XXX: this is simplistic -- some args are not used in all circumstances.
1230//.. PRE_REG_READ6(int, "ipc",
1231//.. vki_uint, call, int, first, int, second, int, third,
1232//.. void *, ptr, long, fifth)
1233//..
1234//.. switch (ARG1 /* call */) {
1235//.. case VKI_SEMOP:
cerion7b2c38c2005-06-23 07:52:54 +00001236//.. ML_(generic_PRE_sys_semop)( tid, ARG2, ARG5, ARG3 );
cerion85665ca2005-06-20 15:51:07 +00001237//.. /* tst->sys_flags |= MayBlock; */
1238//.. break;
1239//.. case VKI_SEMGET:
1240//.. break;
1241//.. case VKI_SEMCTL:
1242//.. {
1243//.. UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
cerion7b2c38c2005-06-23 07:52:54 +00001244//.. ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
cerion85665ca2005-06-20 15:51:07 +00001245//.. break;
1246//.. }
1247//.. case VKI_SEMTIMEDOP:
cerion7b2c38c2005-06-23 07:52:54 +00001248//.. ML_(generic_PRE_sys_semtimedop)( tid, ARG2, ARG5, ARG3, ARG6 );
cerion85665ca2005-06-20 15:51:07 +00001249//.. /* tst->sys_flags |= MayBlock; */
1250//.. break;
1251//.. case VKI_MSGSND:
njnde5c5f52005-09-01 03:35:40 +00001252//.. ML_(linux_PRE_sys_msgsnd)( tid, ARG2, ARG5, ARG3, ARG4 );
cerion85665ca2005-06-20 15:51:07 +00001253//.. /* if ((ARG4 & VKI_IPC_NOWAIT) == 0)
1254//.. tst->sys_flags |= MayBlock;
1255//.. */
1256//.. break;
1257//.. case VKI_MSGRCV:
1258//.. {
1259//.. Addr msgp;
1260//.. Word msgtyp;
1261//..
1262//.. msgp = deref_Addr( tid,
1263//.. (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
1264//.. "msgrcv(msgp)" );
1265//.. msgtyp = deref_Addr( tid,
1266//.. (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
1267//.. "msgrcv(msgp)" );
1268//..
njnde5c5f52005-09-01 03:35:40 +00001269//.. ML_(linux_PRE_sys_msgrcv)( tid, ARG2, msgp, ARG3, msgtyp, ARG4 );
cerion85665ca2005-06-20 15:51:07 +00001270//..
1271//.. /* if ((ARG4 & VKI_IPC_NOWAIT) == 0)
1272//.. tst->sys_flags |= MayBlock;
1273//.. */
1274//.. break;
1275//.. }
1276//.. case VKI_MSGGET:
1277//.. break;
1278//.. case VKI_MSGCTL:
njnde5c5f52005-09-01 03:35:40 +00001279//.. ML_(linux_PRE_sys_msgctl)( tid, ARG2, ARG3, ARG5 );
cerion85665ca2005-06-20 15:51:07 +00001280//.. break;
1281//.. case VKI_SHMAT:
1282//.. PRE_MEM_WRITE( "shmat(raddr)", ARG4, sizeof(Addr) );
cerion7b2c38c2005-06-23 07:52:54 +00001283//.. ARG5 = ML_(generic_PRE_sys_shmat)( tid, ARG2, ARG5, ARG3 );
cerion85665ca2005-06-20 15:51:07 +00001284//.. if (ARG5 == 0)
1285//.. SET_RESULT( -VKI_EINVAL );
1286//.. break;
1287//.. case VKI_SHMDT:
cerion7b2c38c2005-06-23 07:52:54 +00001288//.. if (!ML_(generic_PRE_sys_shmdt)(tid, ARG5))
cerion85665ca2005-06-20 15:51:07 +00001289//.. SET_RESULT( -VKI_EINVAL );
1290//.. break;
1291//.. case VKI_SHMGET:
1292//.. break;
1293//.. case VKI_SHMCTL: /* IPCOP_shmctl */
cerion7b2c38c2005-06-23 07:52:54 +00001294//.. ML_(generic_PRE_sys_shmctl)( tid, ARG2, ARG3, ARG5 );
cerion85665ca2005-06-20 15:51:07 +00001295//.. break;
1296//.. default:
1297//.. VG_(message)(Vg_DebugMsg, "FATAL: unhandled syscall(ipc) %d", ARG1 );
1298//.. VG_(core_panic)("... bye!\n");
1299//.. break; /*NOTREACHED*/
1300//.. }
1301//.. }
1302
1303//.. POST(sys_ipc)
1304//.. {
1305//.. switch (ARG1 /* call */) {
1306//.. case VKI_SEMOP:
1307//.. case VKI_SEMGET:
1308//.. break;
1309//.. case VKI_SEMCTL:
1310//.. {
1311//.. UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
cerion7b2c38c2005-06-23 07:52:54 +00001312//.. ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
cerion85665ca2005-06-20 15:51:07 +00001313//.. break;
1314//.. }
1315//.. case VKI_SEMTIMEDOP:
1316//.. case VKI_MSGSND:
1317//.. break;
1318//.. case VKI_MSGRCV:
1319//.. {
1320//.. Addr msgp;
1321//.. Word msgtyp;
1322//..
1323//.. msgp = deref_Addr( tid,
1324//.. (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
1325//.. "msgrcv(msgp)" );
1326//.. msgtyp = deref_Addr( tid,
1327//.. (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
1328//.. "msgrcv(msgp)" );
1329//..
njna560c5c2005-09-01 16:27:28 +00001330//.. ML_(linux_POST_sys_msgrcv)( tid, RES, ARG2, msgp, ARG3, msgtyp, ARG4 );
cerion85665ca2005-06-20 15:51:07 +00001331//.. break;
1332//.. }
1333//.. case VKI_MSGGET:
1334//.. break;
1335//.. case VKI_MSGCTL:
njna560c5c2005-09-01 16:27:28 +00001336//.. ML_(linux_POST_sys_msgctl)( tid, RES, ARG2, ARG3, ARG5 );
cerion85665ca2005-06-20 15:51:07 +00001337//.. break;
1338//.. case VKI_SHMAT:
1339//.. {
1340//.. Addr addr;
1341//..
1342//.. /* force readability. before the syscall it is
1343//.. * indeed uninitialized, as can be seen in
1344//.. * glibc/sysdeps/unix/sysv/linux/shmat.c */
1345//.. POST_MEM_WRITE( ARG4, sizeof( Addr ) );
1346//..
1347//.. addr = deref_Addr ( tid, ARG4, "shmat(addr)" );
1348//.. if ( addr > 0 ) {
cerion7b2c38c2005-06-23 07:52:54 +00001349//.. ML_(generic_POST_sys_shmat)( tid, addr, ARG2, ARG5, ARG3 );
cerion85665ca2005-06-20 15:51:07 +00001350//.. }
1351//.. break;
1352//.. }
1353//.. case VKI_SHMDT:
cerion7b2c38c2005-06-23 07:52:54 +00001354//.. ML_(generic_POST_sys_shmdt)( tid, RES, ARG5 );
cerion85665ca2005-06-20 15:51:07 +00001355//.. break;
1356//.. case VKI_SHMGET:
1357//.. break;
1358//.. case VKI_SHMCTL:
cerion7b2c38c2005-06-23 07:52:54 +00001359//.. ML_(generic_POST_sys_shmctl)( tid, RES, ARG2, ARG3, ARG5 );
cerion85665ca2005-06-20 15:51:07 +00001360//.. break;
1361//.. default:
1362//.. VG_(message)(Vg_DebugMsg,
1363//.. "FATAL: unhandled syscall(ipc) %d",
1364//.. ARG1 );
1365//.. VG_(core_panic)("... bye!\n");
1366//.. break; /*NOTREACHED*/
1367//.. }
1368//.. }
1369
1370
sewardj3849cc52005-11-07 15:48:31 +00001371/* Convert from non-RT to RT sigset_t's */
1372static
1373void convert_sigset_to_rt(const vki_old_sigset_t *oldset, vki_sigset_t *set)
1374{
1375 VG_(sigemptyset)(set);
1376 set->sig[0] = *oldset;
1377}
1378PRE(sys_sigaction)
1379{
1380 struct vki_sigaction new, old;
1381 struct vki_sigaction *newp, *oldp;
cerion85665ca2005-06-20 15:51:07 +00001382
sewardj3849cc52005-11-07 15:48:31 +00001383 PRINT("sys_sigaction ( %d, %p, %p )", ARG1,ARG2,ARG3);
1384 PRE_REG_READ3(int, "sigaction",
1385 int, signum, const struct old_sigaction *, act,
1386 struct old_sigaction *, oldact);
cerion85665ca2005-06-20 15:51:07 +00001387
sewardj3849cc52005-11-07 15:48:31 +00001388 newp = oldp = NULL;
1389
1390 if (ARG2 != 0) {
1391 struct vki_old_sigaction *sa = (struct vki_old_sigaction *)ARG2;
1392 PRE_MEM_READ( "sigaction(act->sa_handler)", (Addr)&sa->ksa_handler, sizeof(sa->ksa_handler));
1393 PRE_MEM_READ( "sigaction(act->sa_mask)", (Addr)&sa->sa_mask, sizeof(sa->sa_mask));
1394 PRE_MEM_READ( "sigaction(act->sa_flags)", (Addr)&sa->sa_flags, sizeof(sa->sa_flags));
1395 if (ML_(safe_to_deref)(sa,sizeof(sa))
1396 && (sa->sa_flags & VKI_SA_RESTORER))
1397 PRE_MEM_READ( "sigaction(act->sa_restorer)", (Addr)&sa->sa_restorer, sizeof(sa->sa_restorer));
1398 }
1399
1400 if (ARG3 != 0) {
1401 PRE_MEM_WRITE( "sigaction(oldact)", ARG3, sizeof(struct vki_old_sigaction));
1402 oldp = &old;
1403 }
1404
1405 //jrs 20050207: what?! how can this make any sense?
1406 //if (VG_(is_kerror)(SYSRES))
1407 // return;
1408
1409 if (ARG2 != 0) {
1410 struct vki_old_sigaction *oldnew = (struct vki_old_sigaction *)ARG2;
1411
1412 new.ksa_handler = oldnew->ksa_handler;
1413 new.sa_flags = oldnew->sa_flags;
1414 new.sa_restorer = oldnew->sa_restorer;
1415 convert_sigset_to_rt(&oldnew->sa_mask, &new.sa_mask);
1416 newp = &new;
1417 }
1418
1419 SET_STATUS_from_SysRes( VG_(do_sys_sigaction)(ARG1, newp, oldp) );
1420
1421 if (ARG3 != 0 && SUCCESS && RES == 0) {
1422 struct vki_old_sigaction *oldold = (struct vki_old_sigaction *)ARG3;
1423
1424 oldold->ksa_handler = oldp->ksa_handler;
1425 oldold->sa_flags = oldp->sa_flags;
1426 oldold->sa_restorer = oldp->sa_restorer;
1427 oldold->sa_mask = oldp->sa_mask.sig[0];
1428 }
1429}
1430
1431POST(sys_sigaction)
1432{
1433 vg_assert(SUCCESS);
1434 if (RES == 0 && ARG3 != 0)
1435 POST_MEM_WRITE( ARG3, sizeof(struct vki_old_sigaction));
1436}
1437
tom313639f2006-04-03 16:38:33 +00001438PRE(sys_sigsuspend)
1439{
1440 /* The C library interface to sigsuspend just takes a pointer to
1441 a signal mask but this system call only takes the first word of
1442 the signal mask as an argument so only 32 signals are supported.
1443
1444 In fact glibc normally uses rt_sigsuspend if it is available as
1445 that takes a pointer to the signal mask so supports more signals.
1446 */
1447 *flags |= SfMayBlock;
1448 PRINT("sys_sigsuspend ( %d )", ARG1 );
1449 PRE_REG_READ1(int, "sigsuspend", vki_old_sigset_t, mask);
1450}
1451
cerion85665ca2005-06-20 15:51:07 +00001452
1453#undef PRE
1454#undef POST
1455
cerion85665ca2005-06-20 15:51:07 +00001456/* ---------------------------------------------------------------------
1457 The ppc32/Linux syscall table
1458 ------------------------------------------------------------------ */
1459
1460/* Add an ppc32-linux specific wrapper to a syscall table. */
1461#define PLAX_(sysno, name) WRAPPER_ENTRY_X_(ppc32_linux, sysno, name)
1462#define PLAXY(sysno, name) WRAPPER_ENTRY_XY(ppc32_linux, sysno, name)
1463
1464// This table maps from __NR_xxx syscall numbers (from
1465// linux/include/asm-ppc/unistd.h) to the appropriate PRE/POST sys_foo()
1466// wrappers on ppc32 (as per sys_call_table in linux/arch/ppc/kernel/entry.S).
1467//
1468// For those syscalls not handled by Valgrind, the annotation indicate its
1469// arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/?
1470// (unknown).
1471
njnaf839f52005-06-23 03:27:57 +00001472const SyscallTableEntry ML_(syscall_table)[] = {
cerion85665ca2005-06-20 15:51:07 +00001473//.. (restart_syscall) // 0
sewardja932d292005-07-08 00:18:25 +00001474 GENX_(__NR_exit, sys_exit), // 1
sewardjfbba3712005-11-13 02:41:58 +00001475 GENX_(__NR_fork, sys_fork), // 2
sewardja932d292005-07-08 00:18:25 +00001476 GENXY(__NR_read, sys_read), // 3
1477 GENX_(__NR_write, sys_write), // 4
cerion85665ca2005-06-20 15:51:07 +00001478
sewardja932d292005-07-08 00:18:25 +00001479 GENXY(__NR_open, sys_open), // 5
1480 GENXY(__NR_close, sys_close), // 6
1481 GENXY(__NR_waitpid, sys_waitpid), // 7
1482 GENXY(__NR_creat, sys_creat), // 8
sewardjb865b162005-07-08 18:26:37 +00001483 GENX_(__NR_link, sys_link), // 9
1484
sewardja932d292005-07-08 00:18:25 +00001485 GENX_(__NR_unlink, sys_unlink), // 10
1486 GENX_(__NR_execve, sys_execve), // 11
sewardjb865b162005-07-08 18:26:37 +00001487 GENX_(__NR_chdir, sys_chdir), // 12
sewardja932d292005-07-08 00:18:25 +00001488 GENXY(__NR_time, sys_time), // 13
tom313639f2006-04-03 16:38:33 +00001489 GENX_(__NR_mknod, sys_mknod), // 14
cerion85665ca2005-06-20 15:51:07 +00001490//..
sewardja932d292005-07-08 00:18:25 +00001491 GENX_(__NR_chmod, sys_chmod), // 15
sewardja58bbbc2006-04-14 01:04:04 +00001492 GENX_(__NR_lchown, sys_lchown), // 16 ## P
cerion85665ca2005-06-20 15:51:07 +00001493//.. GENX_(__NR_break, sys_ni_syscall), // 17
1494//.. // (__NR_oldstat, sys_stat), // 18 (obsolete)
njncd405ea2005-08-31 02:44:31 +00001495 LINX_(__NR_lseek, sys_lseek), // 19
cerion85665ca2005-06-20 15:51:07 +00001496//..
sewardja932d292005-07-08 00:18:25 +00001497 GENX_(__NR_getpid, sys_getpid), // 20
sewardja58bbbc2006-04-14 01:04:04 +00001498 LINX_(__NR_mount, sys_mount), // 21
1499 LINX_(__NR_umount, sys_oldumount), // 22
1500 GENX_(__NR_setuid, sys_setuid), // 23 ## P
1501 GENX_(__NR_getuid, sys_getuid), // 24 ## P
cerion85665ca2005-06-20 15:51:07 +00001502//..
1503//.. // (__NR_stime, sys_stime), // 25 * (SVr4,SVID,X/OPEN)
1504//.. PLAXY(__NR_ptrace, sys_ptrace), // 26
sewardja9fff9b2005-08-19 10:07:29 +00001505 GENX_(__NR_alarm, sys_alarm), // 27
cerion85665ca2005-06-20 15:51:07 +00001506//.. // (__NR_oldfstat, sys_fstat), // 28 * L -- obsolete
sewardja932d292005-07-08 00:18:25 +00001507 GENX_(__NR_pause, sys_pause), // 29
cerion85665ca2005-06-20 15:51:07 +00001508//..
njncd405ea2005-08-31 02:44:31 +00001509 LINX_(__NR_utime, sys_utime), // 30
cerion85665ca2005-06-20 15:51:07 +00001510//.. GENX_(__NR_stty, sys_ni_syscall), // 31
1511//.. GENX_(__NR_gtty, sys_ni_syscall), // 32
sewardja932d292005-07-08 00:18:25 +00001512 GENX_(__NR_access, sys_access), // 33
cerion85665ca2005-06-20 15:51:07 +00001513//.. GENX_(__NR_nice, sys_nice), // 34
1514//..
1515//.. GENX_(__NR_ftime, sys_ni_syscall), // 35
1516//.. GENX_(__NR_sync, sys_sync), // 36
sewardjb865b162005-07-08 18:26:37 +00001517 GENX_(__NR_kill, sys_kill), // 37
1518 GENX_(__NR_rename, sys_rename), // 38
1519 GENX_(__NR_mkdir, sys_mkdir), // 39
1520
sewardj6a324492005-08-05 00:10:11 +00001521 GENX_(__NR_rmdir, sys_rmdir), // 40
sewardja932d292005-07-08 00:18:25 +00001522 GENXY(__NR_dup, sys_dup), // 41
njncd405ea2005-08-31 02:44:31 +00001523 LINXY(__NR_pipe, sys_pipe), // 42
sewardj6a324492005-08-05 00:10:11 +00001524 GENXY(__NR_times, sys_times), // 43
cerion85665ca2005-06-20 15:51:07 +00001525//.. GENX_(__NR_prof, sys_ni_syscall), // 44
1526//..
sewardja932d292005-07-08 00:18:25 +00001527 GENX_(__NR_brk, sys_brk), // 45
sewardja58bbbc2006-04-14 01:04:04 +00001528 GENX_(__NR_setgid, sys_setgid), // 46
1529 GENX_(__NR_getgid, sys_getgid), // 47
cerion85665ca2005-06-20 15:51:07 +00001530//.. // (__NR_signal, sys_signal), // 48 */* (ANSI C)
sewardja58bbbc2006-04-14 01:04:04 +00001531 GENX_(__NR_geteuid, sys_geteuid), // 49
cerion508aef52005-06-24 15:26:49 +00001532
sewardja58bbbc2006-04-14 01:04:04 +00001533 GENX_(__NR_getegid, sys_getegid), // 50
cerion85665ca2005-06-20 15:51:07 +00001534//.. GENX_(__NR_acct, sys_acct), // 51
sewardja58bbbc2006-04-14 01:04:04 +00001535 LINX_(__NR_umount2, sys_umount), // 52
cerion85665ca2005-06-20 15:51:07 +00001536//.. GENX_(__NR_lock, sys_ni_syscall), // 53
sewardja932d292005-07-08 00:18:25 +00001537 GENXY(__NR_ioctl, sys_ioctl), // 54
cerion85665ca2005-06-20 15:51:07 +00001538//..
sewardjfe0ffd42005-10-19 01:14:22 +00001539 GENXY(__NR_fcntl, sys_fcntl), // 55
cerion85665ca2005-06-20 15:51:07 +00001540//.. GENX_(__NR_mpx, sys_ni_syscall), // 56
sewardja932d292005-07-08 00:18:25 +00001541 GENX_(__NR_setpgid, sys_setpgid), // 57
cerion85665ca2005-06-20 15:51:07 +00001542//.. GENX_(__NR_ulimit, sys_ni_syscall), // 58
1543//.. // (__NR_oldolduname, sys_olduname), // 59 Linux -- obsolete
sewardjb865b162005-07-08 18:26:37 +00001544
1545 GENX_(__NR_umask, sys_umask), // 60
sewardja58bbbc2006-04-14 01:04:04 +00001546 GENX_(__NR_chroot, sys_chroot), // 61
cerion85665ca2005-06-20 15:51:07 +00001547//.. // (__NR_ustat, sys_ustat) // 62 SVr4 -- deprecated
sewardja932d292005-07-08 00:18:25 +00001548 GENXY(__NR_dup2, sys_dup2), // 63
sewardjb865b162005-07-08 18:26:37 +00001549 GENX_(__NR_getppid, sys_getppid), // 64
1550
1551 GENX_(__NR_getpgrp, sys_getpgrp), // 65
1552 GENX_(__NR_setsid, sys_setsid), // 66
sewardj3849cc52005-11-07 15:48:31 +00001553 PLAXY(__NR_sigaction, sys_sigaction), // 67
cerion85665ca2005-06-20 15:51:07 +00001554//.. // (__NR_sgetmask, sys_sgetmask), // 68 */* (ANSI C)
1555//.. // (__NR_ssetmask, sys_ssetmask), // 69 */* (ANSI C)
1556//..
sewardja58bbbc2006-04-14 01:04:04 +00001557 GENX_(__NR_setreuid, sys_setreuid), // 70
1558 GENX_(__NR_setregid, sys_setregid), // 71
tom313639f2006-04-03 16:38:33 +00001559 PLAX_(__NR_sigsuspend, sys_sigsuspend), // 72
sewardja58bbbc2006-04-14 01:04:04 +00001560 LINXY(__NR_sigpending, sys_sigpending), // 73
cerion85665ca2005-06-20 15:51:07 +00001561//.. // (__NR_sethostname, sys_sethostname), // 74 */*
1562//..
cerion508aef52005-06-24 15:26:49 +00001563 GENX_(__NR_setrlimit, sys_setrlimit), // 75
cerion85665ca2005-06-20 15:51:07 +00001564//.. GENXY(__NR_getrlimit, sys_old_getrlimit), // 76
sewardj33d17fa2005-08-21 00:49:41 +00001565 GENXY(__NR_getrusage, sys_getrusage), // 77
cerion508aef52005-06-24 15:26:49 +00001566 GENXY(__NR_gettimeofday, sys_gettimeofday), // 78
cerion85665ca2005-06-20 15:51:07 +00001567//.. GENX_(__NR_settimeofday, sys_settimeofday), // 79
1568//..
sewardja58bbbc2006-04-14 01:04:04 +00001569 GENXY(__NR_getgroups, sys_getgroups), // 80
1570 GENX_(__NR_setgroups, sys_setgroups), // 81
cerion85665ca2005-06-20 15:51:07 +00001571//.. PLAX_(__NR_select, old_select), // 82
sewardjb865b162005-07-08 18:26:37 +00001572 GENX_(__NR_symlink, sys_symlink), // 83
cerion85665ca2005-06-20 15:51:07 +00001573//.. // (__NR_oldlstat, sys_lstat), // 84 -- obsolete
1574//..
sewardja932d292005-07-08 00:18:25 +00001575 GENX_(__NR_readlink, sys_readlink), // 85
cerion85665ca2005-06-20 15:51:07 +00001576//.. // (__NR_uselib, sys_uselib), // 86 */Linux
1577//.. // (__NR_swapon, sys_swapon), // 87 */Linux
1578//.. // (__NR_reboot, sys_reboot), // 88 */Linux
1579//.. // (__NR_readdir, old_readdir), // 89 -- superseded
1580
tom9548a162005-09-30 08:07:53 +00001581 PLAX_(__NR_mmap, sys_mmap), // 90
cerion508aef52005-06-24 15:26:49 +00001582 GENXY(__NR_munmap, sys_munmap), // 91
sewardja58bbbc2006-04-14 01:04:04 +00001583 GENX_(__NR_truncate, sys_truncate), // 92
sewardj6a324492005-08-05 00:10:11 +00001584 GENX_(__NR_ftruncate, sys_ftruncate), // 93
sewardj2d7c3962005-07-29 22:01:19 +00001585 GENX_(__NR_fchmod, sys_fchmod), // 94
1586
sewardja58bbbc2006-04-14 01:04:04 +00001587 GENX_(__NR_fchown, sys_fchown), // 95
sewardjdc1750a2005-12-02 16:45:28 +00001588 GENX_(__NR_getpriority, sys_getpriority), // 96
1589 GENX_(__NR_setpriority, sys_setpriority), // 97
cerion85665ca2005-06-20 15:51:07 +00001590//.. GENX_(__NR_profil, sys_ni_syscall), // 98
sewardj17689552006-01-26 14:25:51 +00001591 GENXY(__NR_statfs, sys_statfs), // 99
cerion85665ca2005-06-20 15:51:07 +00001592//..
sewardja58bbbc2006-04-14 01:04:04 +00001593 GENXY(__NR_fstatfs, sys_fstatfs), // 100
cerion85665ca2005-06-20 15:51:07 +00001594//.. LINX_(__NR_ioperm, sys_ioperm), // 101
sewardja932d292005-07-08 00:18:25 +00001595 PLAXY(__NR_socketcall, sys_socketcall), // 102
sewardj3d45fac2006-07-24 10:14:37 +00001596 LINXY(__NR_syslog, sys_syslog), // 103
sewardja932d292005-07-08 00:18:25 +00001597 GENXY(__NR_setitimer, sys_setitimer), // 104
sewardje0036f72007-11-20 19:59:51 +00001598
1599 GENXY(__NR_getitimer, sys_getitimer), // 105
sewardja932d292005-07-08 00:18:25 +00001600 GENXY(__NR_stat, sys_newstat), // 106
sewardj82022042005-11-17 11:01:55 +00001601 GENXY(__NR_lstat, sys_newlstat), // 107
sewardjfe0ffd42005-10-19 01:14:22 +00001602 GENXY(__NR_fstat, sys_newfstat), // 108
cerion85665ca2005-06-20 15:51:07 +00001603//.. // (__NR_olduname, sys_uname), // 109 -- obsolete
1604//..
1605//.. GENX_(__NR_iopl, sys_iopl), // 110
1606//.. LINX_(__NR_vhangup, sys_vhangup), // 111
1607//.. GENX_(__NR_idle, sys_ni_syscall), // 112
1608//.. // (__NR_vm86old, sys_vm86old), // 113 x86/Linux-only
sewardjfbba3712005-11-13 02:41:58 +00001609 GENXY(__NR_wait4, sys_wait4), // 114
cerion85665ca2005-06-20 15:51:07 +00001610//..
1611//.. // (__NR_swapoff, sys_swapoff), // 115 */Linux
sewardj3d45fac2006-07-24 10:14:37 +00001612 LINXY(__NR_sysinfo, sys_sysinfo), // 116
sewardja932d292005-07-08 00:18:25 +00001613 PLAXY(__NR_ipc, sys_ipc), // 117
sewardjd84f4672005-10-07 23:06:13 +00001614 GENX_(__NR_fsync, sys_fsync), // 118
sewardjb865b162005-07-08 18:26:37 +00001615 PLAX_(__NR_sigreturn, sys_sigreturn), // 119 ?/Linux
cerion85665ca2005-06-20 15:51:07 +00001616//..
sewardja932d292005-07-08 00:18:25 +00001617 PLAX_(__NR_clone, sys_clone), // 120
cerion85665ca2005-06-20 15:51:07 +00001618//.. // (__NR_setdomainname, sys_setdomainname), // 121 */*(?)
sewardja932d292005-07-08 00:18:25 +00001619 GENXY(__NR_uname, sys_newuname), // 122
cerion85665ca2005-06-20 15:51:07 +00001620//.. PLAX_(__NR_modify_ldt, sys_modify_ldt), // 123
1621//.. LINXY(__NR_adjtimex, sys_adjtimex), // 124
1622//..
sewardja932d292005-07-08 00:18:25 +00001623 GENXY(__NR_mprotect, sys_mprotect), // 125
njncd405ea2005-08-31 02:44:31 +00001624 LINXY(__NR_sigprocmask, sys_sigprocmask), // 126
bart65bfd212008-04-26 10:57:07 +00001625 GENX_(__NR_create_module, sys_ni_syscall), // 127
cerion85665ca2005-06-20 15:51:07 +00001626//.. GENX_(__NR_init_module, sys_init_module), // 128
1627//.. // (__NR_delete_module, sys_delete_module), // 129 (*/Linux)?
1628//..
1629//.. // Nb: get_kernel_syms() was removed 2.4-->2.6
1630//.. GENX_(__NR_get_kernel_syms, sys_ni_syscall), // 130
njncd405ea2005-08-31 02:44:31 +00001631//.. LINX_(__NR_quotactl, sys_quotactl), // 131
sewardja932d292005-07-08 00:18:25 +00001632 GENX_(__NR_getpgid, sys_getpgid), // 132
sewardj3774f862006-03-21 02:23:27 +00001633 GENX_(__NR_fchdir, sys_fchdir), // 133
cerion85665ca2005-06-20 15:51:07 +00001634//.. // (__NR_bdflush, sys_bdflush), // 134 */Linux
1635//..
1636//.. // (__NR_sysfs, sys_sysfs), // 135 SVr4
sewardja58bbbc2006-04-14 01:04:04 +00001637 LINX_(__NR_personality, sys_personality), // 136
cerion85665ca2005-06-20 15:51:07 +00001638//.. GENX_(__NR_afs_syscall, sys_ni_syscall), // 137
sewardja58bbbc2006-04-14 01:04:04 +00001639 LINX_(__NR_setfsuid, sys_setfsuid), // 138
1640 LINX_(__NR_setfsgid, sys_setfsgid), // 139
sewardj31d83422005-10-15 02:00:41 +00001641
sewardja932d292005-07-08 00:18:25 +00001642 LINXY(__NR__llseek, sys_llseek), // 140
sewardj31d83422005-10-15 02:00:41 +00001643 GENXY(__NR_getdents, sys_getdents), // 141
sewardja932d292005-07-08 00:18:25 +00001644 GENX_(__NR__newselect, sys_select), // 142
sewardj6a324492005-08-05 00:10:11 +00001645 GENX_(__NR_flock, sys_flock), // 143
sewardja58bbbc2006-04-14 01:04:04 +00001646 GENX_(__NR_msync, sys_msync), // 144
cerion85665ca2005-06-20 15:51:07 +00001647//..
sewardja932d292005-07-08 00:18:25 +00001648 GENXY(__NR_readv, sys_readv), // 145
1649 GENX_(__NR_writev, sys_writev), // 146
sewardja58bbbc2006-04-14 01:04:04 +00001650 GENX_(__NR_getsid, sys_getsid), // 147
sewardj5addd6c2005-08-18 23:44:13 +00001651 GENX_(__NR_fdatasync, sys_fdatasync), // 148
sewardja932d292005-07-08 00:18:25 +00001652 LINXY(__NR__sysctl, sys_sysctl), // 149
cerion85665ca2005-06-20 15:51:07 +00001653//..
sewardja58bbbc2006-04-14 01:04:04 +00001654 GENX_(__NR_mlock, sys_mlock), // 150
1655 GENX_(__NR_munlock, sys_munlock), // 151
1656 GENX_(__NR_mlockall, sys_mlockall), // 152
1657 LINX_(__NR_munlockall, sys_munlockall), // 153
njnb2480c92005-08-30 02:17:23 +00001658//.. LINXY(__NR_sched_setparam, sys_sched_setparam), // 154
cerion85665ca2005-06-20 15:51:07 +00001659//..
njnb2480c92005-08-30 02:17:23 +00001660 LINXY(__NR_sched_getparam, sys_sched_getparam), // 155
sewardjd84f4672005-10-07 23:06:13 +00001661 LINX_(__NR_sched_setscheduler, sys_sched_setscheduler), // 156
njnb2480c92005-08-30 02:17:23 +00001662 LINX_(__NR_sched_getscheduler, sys_sched_getscheduler), // 157
dirk331e5762005-12-05 22:11:02 +00001663 LINX_(__NR_sched_yield, sys_sched_yield), // 158
njnb2480c92005-08-30 02:17:23 +00001664 LINX_(__NR_sched_get_priority_max, sys_sched_get_priority_max),// 159
sewardj5addd6c2005-08-18 23:44:13 +00001665
njnb2480c92005-08-30 02:17:23 +00001666 LINX_(__NR_sched_get_priority_min, sys_sched_get_priority_min),// 160
1667//.. //LINX?(__NR_sched_rr_get_interval, sys_sched_rr_get_interval), // 161 */*
sewardja932d292005-07-08 00:18:25 +00001668 GENXY(__NR_nanosleep, sys_nanosleep), // 162
1669 GENX_(__NR_mremap, sys_mremap), // 163
sewardja58bbbc2006-04-14 01:04:04 +00001670 LINX_(__NR_setresuid, sys_setresuid), // 164
sewardj33d17fa2005-08-21 00:49:41 +00001671
sewardja58bbbc2006-04-14 01:04:04 +00001672 LINXY(__NR_getresuid, sys_getresuid), // 165
cerion85665ca2005-06-20 15:51:07 +00001673
1674//.. GENX_(__NR_query_module, sys_ni_syscall), // 166
sewardjca334052005-07-24 06:30:37 +00001675 GENXY(__NR_poll, sys_poll), // 167
cerion85665ca2005-06-20 15:51:07 +00001676//.. // (__NR_nfsservctl, sys_nfsservctl), // 168 */Linux
1677//..
sewardja58bbbc2006-04-14 01:04:04 +00001678 LINX_(__NR_setresgid, sys_setresgid), // 169
1679 LINXY(__NR_getresgid, sys_getresgid), // 170
toma39ebc82006-12-18 15:22:46 +00001680 LINXY(__NR_prctl, sys_prctl), // 171
sewardj4ce89e12005-11-16 19:15:33 +00001681 PLAX_(__NR_rt_sigreturn, sys_rt_sigreturn), // 172
njncd405ea2005-08-31 02:44:31 +00001682 LINXY(__NR_rt_sigaction, sys_rt_sigaction), // 173
cerion85665ca2005-06-20 15:51:07 +00001683
njncd405ea2005-08-31 02:44:31 +00001684 LINXY(__NR_rt_sigprocmask, sys_rt_sigprocmask), // 174
sewardja58bbbc2006-04-14 01:04:04 +00001685 LINXY(__NR_rt_sigpending, sys_rt_sigpending), // 175
njncd405ea2005-08-31 02:44:31 +00001686 LINXY(__NR_rt_sigtimedwait, sys_rt_sigtimedwait), // 176
sewardja58bbbc2006-04-14 01:04:04 +00001687 LINXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo), // 177
sewardj1ea00a12005-11-16 12:51:34 +00001688 LINX_(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 178
1689
sewardja932d292005-07-08 00:18:25 +00001690 GENXY(__NR_pread64, sys_pread64), // 179
1691 GENX_(__NR_pwrite64, sys_pwrite64), // 180
sewardja58bbbc2006-04-14 01:04:04 +00001692 GENX_(__NR_chown, sys_chown), // 181
sewardjb865b162005-07-08 18:26:37 +00001693 GENXY(__NR_getcwd, sys_getcwd), // 182
njn9fe7b122005-08-26 04:03:04 +00001694//.. LINXY(__NR_capget, sys_capget), // 183
cerion85665ca2005-06-20 15:51:07 +00001695//..
njn9fe7b122005-08-26 04:03:04 +00001696//.. LINX_(__NR_capset, sys_capset), // 184
sewardja9fff9b2005-08-19 10:07:29 +00001697 GENXY(__NR_sigaltstack, sys_sigaltstack), // 185
sewardja58bbbc2006-04-14 01:04:04 +00001698 LINXY(__NR_sendfile, sys_sendfile), // 186
cerion85665ca2005-06-20 15:51:07 +00001699//.. GENXY(__NR_getpmsg, sys_getpmsg), // 187
1700//.. GENX_(__NR_putpmsg, sys_putpmsg), // 188
sewardja932d292005-07-08 00:18:25 +00001701
1702 // Nb: we treat vfork as fork
1703 GENX_(__NR_vfork, sys_fork), // 189
1704 GENXY(__NR_ugetrlimit, sys_getrlimit), // 190
cerion85665ca2005-06-20 15:51:07 +00001705//__NR_readahead // 191 ppc/Linux only?
tom9548a162005-09-30 08:07:53 +00001706 PLAX_(__NR_mmap2, sys_mmap2), // 192
sewardja58bbbc2006-04-14 01:04:04 +00001707 GENX_(__NR_truncate64, sys_truncate64), // 193
sewardj48db0f02005-10-07 13:30:48 +00001708 GENX_(__NR_ftruncate64, sys_ftruncate64), // 194
cerion85665ca2005-06-20 15:51:07 +00001709//..
1710
sewardja932d292005-07-08 00:18:25 +00001711 PLAXY(__NR_stat64, sys_stat64), // 195
1712 PLAXY(__NR_lstat64, sys_lstat64), // 196
1713 PLAXY(__NR_fstat64, sys_fstat64), // 197
cerion85665ca2005-06-20 15:51:07 +00001714
1715// __NR_pciconfig_read // 198
1716// __NR_pciconfig_write // 199
1717// __NR_pciconfig_iobase // 200
1718// __NR_multiplexer // 201
1719
sewardja932d292005-07-08 00:18:25 +00001720 GENXY(__NR_getdents64, sys_getdents64), // 202
cerion85665ca2005-06-20 15:51:07 +00001721//.. // (__NR_pivot_root, sys_pivot_root), // 203 */Linux
sewardja932d292005-07-08 00:18:25 +00001722 GENXY(__NR_fcntl64, sys_fcntl64), // 204
sewardj249ebd72005-10-07 19:12:18 +00001723 GENX_(__NR_madvise, sys_madvise), // 205
dirka07c7402006-02-22 12:54:44 +00001724 GENXY(__NR_mincore, sys_mincore), // 206
sewardja9fff9b2005-08-19 10:07:29 +00001725 LINX_(__NR_gettid, sys_gettid), // 207
cerion85665ca2005-06-20 15:51:07 +00001726//.. LINX_(__NR_tkill, sys_tkill), // 208 */Linux
njn65ccc502005-08-30 01:53:54 +00001727//.. LINX_(__NR_setxattr, sys_setxattr), // 209
1728//.. LINX_(__NR_lsetxattr, sys_lsetxattr), // 210
1729//.. LINX_(__NR_fsetxattr, sys_fsetxattr), // 211
njnef0da672005-08-30 03:02:00 +00001730 LINXY(__NR_getxattr, sys_getxattr), // 212
sewardja58bbbc2006-04-14 01:04:04 +00001731 LINXY(__NR_lgetxattr, sys_lgetxattr), // 213
1732 LINXY(__NR_fgetxattr, sys_fgetxattr), // 214
1733 LINXY(__NR_listxattr, sys_listxattr), // 215
1734 LINXY(__NR_llistxattr, sys_llistxattr), // 216
1735 LINXY(__NR_flistxattr, sys_flistxattr), // 217
1736 LINX_(__NR_removexattr, sys_removexattr), // 218
1737 LINX_(__NR_lremovexattr, sys_lremovexattr), // 219
1738 LINX_(__NR_fremovexattr, sys_fremovexattr), // 220
cerion85665ca2005-06-20 15:51:07 +00001739
cerion508aef52005-06-24 15:26:49 +00001740 LINXY(__NR_futex, sys_futex), // 221
sewardja58bbbc2006-04-14 01:04:04 +00001741 LINX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 222
1742 LINXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 223
cerion85665ca2005-06-20 15:51:07 +00001743/* 224 currently unused */
1744
1745// __NR_tuxcall // 225
1746
sewardja58bbbc2006-04-14 01:04:04 +00001747 LINXY(__NR_sendfile64, sys_sendfile64), // 226
cerion85665ca2005-06-20 15:51:07 +00001748//..
sewardja58bbbc2006-04-14 01:04:04 +00001749 LINX_(__NR_io_setup, sys_io_setup), // 227
1750 LINX_(__NR_io_destroy, sys_io_destroy), // 228
1751 LINXY(__NR_io_getevents, sys_io_getevents), // 229
1752 LINX_(__NR_io_submit, sys_io_submit), // 230
1753 LINXY(__NR_io_cancel, sys_io_cancel), // 231
cerion85665ca2005-06-20 15:51:07 +00001754//..
sewardja932d292005-07-08 00:18:25 +00001755 LINX_(__NR_set_tid_address, sys_set_tid_address), // 232
cerion85665ca2005-06-20 15:51:07 +00001756
sewardj79820562006-09-11 20:33:55 +00001757 LINX_(__NR_fadvise64, sys_fadvise64), // 233 */(Linux?)
sewardja932d292005-07-08 00:18:25 +00001758 LINX_(__NR_exit_group, sys_exit_group), // 234
cerion85665ca2005-06-20 15:51:07 +00001759//.. GENXY(__NR_lookup_dcookie, sys_lookup_dcookie), // 235
sewardja58bbbc2006-04-14 01:04:04 +00001760 LINXY(__NR_epoll_create, sys_epoll_create), // 236
1761 LINX_(__NR_epoll_ctl, sys_epoll_ctl), // 237
1762 LINXY(__NR_epoll_wait, sys_epoll_wait), // 238
cerion85665ca2005-06-20 15:51:07 +00001763
1764//.. // (__NR_remap_file_pages, sys_remap_file_pages), // 239 */Linux
sewardja58bbbc2006-04-14 01:04:04 +00001765 LINXY(__NR_timer_create, sys_timer_create), // 240
1766 LINXY(__NR_timer_settime, sys_timer_settime), // 241
1767 LINXY(__NR_timer_gettime, sys_timer_gettime), // 242
1768 LINX_(__NR_timer_getoverrun, sys_timer_getoverrun), // 243
1769 LINX_(__NR_timer_delete, sys_timer_delete), // 244
1770 LINX_(__NR_clock_settime, sys_clock_settime), // 245
njn1588bc02005-08-26 03:49:43 +00001771 LINXY(__NR_clock_gettime, sys_clock_gettime), // 246
dirk331e5762005-12-05 22:11:02 +00001772 LINXY(__NR_clock_getres, sys_clock_getres), // 247
sewardja58bbbc2006-04-14 01:04:04 +00001773 LINXY(__NR_clock_nanosleep, sys_clock_nanosleep), // 248
cerion85665ca2005-06-20 15:51:07 +00001774
1775// __NR_swapcontext // 249
1776
sewardj7f4bd102005-11-17 14:22:22 +00001777 LINXY(__NR_tgkill, sys_tgkill), // 250 */Linux
cerion85665ca2005-06-20 15:51:07 +00001778//.. GENX_(__NR_utimes, sys_utimes), // 251
sewardja58bbbc2006-04-14 01:04:04 +00001779 GENXY(__NR_statfs64, sys_statfs64), // 252
1780 GENXY(__NR_fstatfs64, sys_fstatfs64), // 253
1781 LINX_(__NR_fadvise64_64, sys_fadvise64_64), // 254 */(Linux?)
cerion85665ca2005-06-20 15:51:07 +00001782
1783// __NR_rtas // 255
1784
1785/* Number 256 is reserved for sys_debug_setcontext */
1786/* Number 257 is reserved for vserver */
1787/* Number 258 is reserved for new sys_remap_file_pages */
1788/* Number 259 is reserved for new sys_mbind */
dirka07c7402006-02-22 12:54:44 +00001789 LINXY(__NR_get_mempolicy, sys_get_mempolicy), // 260
1790 LINX_(__NR_set_mempolicy, sys_set_mempolicy), // 261
cerion85665ca2005-06-20 15:51:07 +00001791
sewardj54e095f2005-11-17 19:09:02 +00001792 LINXY(__NR_mq_open, sys_mq_open), // 262
1793 LINX_(__NR_mq_unlink, sys_mq_unlink), // 263
1794 LINX_(__NR_mq_timedsend, sys_mq_timedsend), // 264
1795 LINXY(__NR_mq_timedreceive, sys_mq_timedreceive), // 265
1796 LINX_(__NR_mq_notify, sys_mq_notify), // 266
1797 LINXY(__NR_mq_getsetattr, sys_mq_getsetattr), // 267
cerion85665ca2005-06-20 15:51:07 +00001798// __NR_kexec_load // 268
dirka07c7402006-02-22 12:54:44 +00001799
1800/* Number 269 is reserved for sys_add_key */
1801/* Number 270 is reserved for sys_request_key */
1802/* Number 271 is reserved for sys_keyctl */
1803/* Number 272 is reserved for sys_waitid */
1804/* Number 273 is reserved for sys_ioprio_set */
1805/* Number 274 is reserved for sys_ioprio_get */
1806
1807 LINX_(__NR_inotify_init, sys_inotify_init), // 275
1808 LINX_(__NR_inotify_add_watch, sys_inotify_add_watch), // 276
1809 LINX_(__NR_inotify_rm_watch, sys_inotify_rm_watch), // 277
sewardj5b91c402006-07-24 10:06:09 +00001810
1811 LINXY(__NR_openat, sys_openat), // 286
1812 LINX_(__NR_mkdirat, sys_mkdirat), // 287
1813 LINX_(__NR_mknodat, sys_mknodat), // 288
1814 LINX_(__NR_fchownat, sys_fchownat), // 289
1815 LINX_(__NR_futimesat, sys_futimesat), // 290
1816 PLAXY(__NR_fstatat64, sys_fstatat64), // 291
1817 LINX_(__NR_unlinkat, sys_unlinkat), // 292
1818 LINX_(__NR_renameat, sys_renameat), // 293
1819 LINX_(__NR_linkat, sys_linkat), // 294
1820 LINX_(__NR_symlinkat, sys_symlinkat), // 295
1821 LINX_(__NR_readlinkat, sys_readlinkat), // 296
1822 LINX_(__NR_fchmodat, sys_fchmodat), // 297
1823 LINX_(__NR_faccessat, sys_faccessat), // 298
1824 LINX_(__NR_set_robust_list, sys_set_robust_list), // 299
1825 LINXY(__NR_get_robust_list, sys_get_robust_list), // 300
bartf5ceec82008-04-26 07:45:10 +00001826// LINX_(__NR_move_pages, sys_ni_syscall), // 301
1827// LINX_(__NR_getcpu, sys_ni_syscall), // 302
1828 LINXY(__NR_epoll_pwait, sys_epoll_pwait), // 303
1829 LINX_(__NR_utimensat, sys_utimensat), // 304
1830 LINXY(__NR_signalfd, sys_signalfd), // 305
1831 LINXY(__NR_timerfd, sys_timerfd), // 306
1832 LINX_(__NR_eventfd, sys_eventfd), // 307
1833// LINX_(__NR_sync_file_range2, sys_ni_syscall), // 308
1834// LINX_(__NR_fallocate, sys_ni_syscall), // 309
bart5fc7da22008-04-27 12:56:06 +00001835// LINXY(__NR_subpage_prot, sys_ni_syscall), // 310
1836 LINXY(__NR_timerfd_settime, sys_timerfd_settime), // 311
1837 LINXY(__NR_timerfd_gettime, sys_timerfd_gettime), // 312
cerion85665ca2005-06-20 15:51:07 +00001838};
1839
njnaf839f52005-06-23 03:27:57 +00001840const UInt ML_(syscall_table_size) =
1841 sizeof(ML_(syscall_table)) / sizeof(ML_(syscall_table)[0]);
cerion85665ca2005-06-20 15:51:07 +00001842
1843/*--------------------------------------------------------------------*/
1844/*--- end ---*/
1845/*--------------------------------------------------------------------*/