blob: a166f15e45c6a372c8b81c69eaa69e76d536882c [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
njn9a0cba42007-04-15 22:15:57 +000010 Copyright (C) 2005-2007 Nicholas Nethercote <njn@valgrind.org>
11 Copyright (C) 2005-2007 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"
49
50#include "priv_types_n_macros.h"
51#include "priv_syswrap-generic.h" /* for decls of generic wrappers */
52#include "priv_syswrap-linux.h" /* for decls of linux-ish wrappers */
53#include "priv_syswrap-main.h"
54
cerion85665ca2005-06-20 15:51:07 +000055
56/* ---------------------------------------------------------------------
njne1486662005-11-10 02:48:04 +000057 clone() handling
cerion85665ca2005-06-20 15:51:07 +000058 ------------------------------------------------------------------ */
59
cerion85665ca2005-06-20 15:51:07 +000060/* Call f(arg1), but first switch stacks, using 'stack' as the new
njna3afdfb2005-11-09 04:49:28 +000061 stack, and use 'retaddr' as f's return-to address. Also, clear all
cerion85665ca2005-06-20 15:51:07 +000062 the integer registers before entering f.*/
63__attribute__((noreturn))
njna3afdfb2005-11-09 04:49:28 +000064void ML_(call_on_new_stack_0_1) ( Addr stack,
65 Addr retaddr,
66 void (*f)(Word),
67 Word arg1 );
cerion85665ca2005-06-20 15:51:07 +000068// r3 = stack
69// r4 = retaddr
70// r5 = f
71// r6 = arg1
72asm(
sewardjd9fc3822005-11-18 23:50:43 +000073".text\n"
njna3afdfb2005-11-09 04:49:28 +000074".globl vgModuleLocal_call_on_new_stack_0_1\n"
75"vgModuleLocal_call_on_new_stack_0_1:\n"
cerion85665ca2005-06-20 15:51:07 +000076" mr %r1,%r3\n\t" // stack to %sp
77" mtlr %r4\n\t" // retaddr to %lr
78" mtctr %r5\n\t" // f to count reg
79" mr %r3,%r6\n\t" // arg1 to %r3
80" li 0,0\n\t" // zero all GP regs
81" li 4,0\n\t"
82" li 5,0\n\t"
83" li 6,0\n\t"
84" li 7,0\n\t"
85" li 8,0\n\t"
86" li 9,0\n\t"
87" li 10,0\n\t"
88" li 11,0\n\t"
89" li 12,0\n\t"
90" li 13,0\n\t"
91" li 14,0\n\t"
92" li 15,0\n\t"
93" li 16,0\n\t"
94" li 17,0\n\t"
95" li 18,0\n\t"
96" li 19,0\n\t"
97" li 20,0\n\t"
98" li 21,0\n\t"
99" li 22,0\n\t"
100" li 23,0\n\t"
101" li 24,0\n\t"
102" li 25,0\n\t"
103" li 26,0\n\t"
104" li 27,0\n\t"
105" li 28,0\n\t"
106" li 29,0\n\t"
107" li 30,0\n\t"
108" li 31,0\n\t"
109" mtxer 0\n\t" // CAB: Need this?
110" mtcr 0\n\t" // CAB: Need this?
111" bctr\n\t" // jump to dst
112" trap\n" // should never get here
sewardj2fedc642005-11-19 02:02:57 +0000113".previous\n"
cerion85665ca2005-06-20 15:51:07 +0000114);
115
116
cerion85665ca2005-06-20 15:51:07 +0000117/*
118 Perform a clone system call. clone is strange because it has
119 fork()-like return-twice semantics, so it needs special
120 handling here.
121
122 Upon entry, we have:
123
124 int (fn)(void*) in r3
125 void* child_stack in r4
126 int flags in r5
127 void* arg in r6
128 pid_t* child_tid in r7
129 pid_t* parent_tid in r8
sewardje21058c2005-08-05 02:15:18 +0000130 void* ??? in r9
cerion85665ca2005-06-20 15:51:07 +0000131
132 System call requires:
133
134 int $__NR_clone in r0 (sc number)
135 int flags in r3 (sc arg1)
136 void* child_stack in r4 (sc arg2)
137 pid_t* parent_tid in r5 (sc arg3)
sewardje21058c2005-08-05 02:15:18 +0000138 ?? child_tls in r6 (sc arg4)
139 pid_t* child_tid in r7 (sc arg5)
140 void* ??? in r8 (sc arg6)
cerion85665ca2005-06-20 15:51:07 +0000141
142 Returns an Int encoded in the linux-ppc32 way, not a SysRes.
143 */
sewardj7d15e512005-09-30 01:20:47 +0000144#define __NR_CLONE VG_STRINGIFY(__NR_clone)
145#define __NR_EXIT VG_STRINGIFY(__NR_exit)
cerion85665ca2005-06-20 15:51:07 +0000146
147extern
njnffd9c1d2005-11-10 04:02:19 +0000148ULong do_syscall_clone_ppc32_linux ( Word (*fn)(void *),
cerion85665ca2005-06-20 15:51:07 +0000149 void* stack,
150 Int flags,
151 void* arg,
152 Int* child_tid,
153 Int* parent_tid,
154 vki_modify_ldt_t * );
155asm(
sewardjd9fc3822005-11-18 23:50:43 +0000156".text\n"
cerion85665ca2005-06-20 15:51:07 +0000157"do_syscall_clone_ppc32_linux:\n"
158" stwu 1,-32(1)\n"
159" stw 29,20(1)\n"
160" stw 30,24(1)\n"
161" stw 31,28(1)\n"
162" mr 30,3\n" // preserve fn
163" mr 31,6\n" // preserve arg
164
165 // setup child stack
166" rlwinm 4,4,0,~0xf\n" // trim sp to multiple of 16 bytes
167" li 0,0\n"
168" stwu 0,-16(4)\n" // make initial stack frame
169" mr 29,4\n" // preserve sp
170
171 // setup syscall
172" li 0,"__NR_CLONE"\n" // syscall number
173" mr 3,5\n" // syscall arg1: flags
174 // r4 already setup // syscall arg2: child_stack
175" mr 5,8\n" // syscall arg3: parent_tid
sewardje21058c2005-08-05 02:15:18 +0000176" mr 6,2\n" // syscall arg4: REAL THREAD tls
177" mr 7,7\n" // syscall arg5: child_tid
178" mr 8,8\n" // syscall arg6: ????
179" mr 9,9\n" // syscall arg7: ????
cerion85665ca2005-06-20 15:51:07 +0000180
181" sc\n" // clone()
182
183" mfcr 4\n" // return CR in r4 (low word of ULong)
184" cmpwi 3,0\n" // child if retval == 0
185" bne 1f\n" // jump if !child
186
187 /* CHILD - call thread function */
188 /* Note: 2.4 kernel doesn't set the child stack pointer,
189 so we do it here.
190 That does leave a small window for a signal to be delivered
191 on the wrong stack, unfortunately. */
192" mr 1,29\n"
193" mtctr 30\n" // ctr reg = fn
194" mr 3,31\n" // r3 = arg
195" bctrl\n" // call fn()
196
197 // exit with result
198" li 0,"__NR_EXIT"\n"
199" sc\n"
200
201 // Exit returned?!
202" .long 0\n"
203
204 // PARENT or ERROR - return
205"1: lwz 29,20(1)\n"
206" lwz 30,24(1)\n"
207" lwz 31,28(1)\n"
208" addi 1,1,32\n"
209" blr\n"
sewardj2fedc642005-11-19 02:02:57 +0000210".previous\n"
cerion85665ca2005-06-20 15:51:07 +0000211);
212
213#undef __NR_CLONE
214#undef __NR_EXIT
cerion85665ca2005-06-20 15:51:07 +0000215
216// forward declarations
sewardje23772f2005-07-02 11:27:02 +0000217static void setup_child ( ThreadArchState*, ThreadArchState* );
cerion85665ca2005-06-20 15:51:07 +0000218
219/*
220 When a client clones, we need to keep track of the new thread. This means:
221 1. allocate a ThreadId+ThreadState+stack for the the thread
222
223 2. initialize the thread's new VCPU state
224
225 3. create the thread using the same args as the client requested,
226 but using the scheduler entrypoint for IP, and a separate stack
227 for SP.
228 */
sewardje23772f2005-07-02 11:27:02 +0000229static SysRes do_clone ( ThreadId ptid,
230 UInt flags, Addr sp,
231 Int *parent_tidptr,
232 Int *child_tidptr,
sewardj6a324492005-08-05 00:10:11 +0000233 Addr child_tls)
sewardje23772f2005-07-02 11:27:02 +0000234{
sewardj6a324492005-08-05 00:10:11 +0000235 const Bool debug = False;
sewardje23772f2005-07-02 11:27:02 +0000236
237 ThreadId ctid = VG_(alloc_ThreadState)();
238 ThreadState* ptst = VG_(get_ThreadState)(ptid);
239 ThreadState* ctst = VG_(get_ThreadState)(ctid);
240 ULong word64;
241 UWord* stack;
sewardjef1cf8b2006-10-17 01:47:30 +0000242 NSegment const* seg;
sewardje23772f2005-07-02 11:27:02 +0000243 SysRes res;
244 vki_sigset_t blockall, savedmask;
245
246 VG_(sigfillset)(&blockall);
247
248 vg_assert(VG_(is_running_thread)(ptid));
249 vg_assert(VG_(is_valid_tid)(ctid));
250
njna3afdfb2005-11-09 04:49:28 +0000251 stack = (UWord*)ML_(allocstack)(ctid);
sewardj45f4e7c2005-09-27 19:20:21 +0000252 if (stack == NULL) {
253 res = VG_(mk_SysRes_Error)( VKI_ENOMEM );
254 goto out;
255 }
cerion85665ca2005-06-20 15:51:07 +0000256
257//? /* make a stack frame */
258//? stack -= 16;
259//? *(UWord *)stack = 0;
260
sewardje23772f2005-07-02 11:27:02 +0000261
262 /* Copy register state
263
264 Both parent and child return to the same place, and the code
265 following the clone syscall works out which is which, so we
266 don't need to worry about it.
267
268 The parent gets the child's new tid returned from clone, but the
269 child gets 0.
270
271 If the clone call specifies a NULL SP for the new thread, then
272 it actually gets a copy of the parent's SP.
sewardj6a324492005-08-05 00:10:11 +0000273
274 The child's TLS register (r2) gets set to the tlsaddr argument
275 if the CLONE_SETTLS flag is set.
sewardje23772f2005-07-02 11:27:02 +0000276 */
277 setup_child( &ctst->arch, &ptst->arch );
278
279 /* Make sys_clone appear to have returned Success(0) in the
280 child. */
sewardj6a324492005-08-05 00:10:11 +0000281 { UInt old_cr = LibVEX_GuestPPC32_get_CR( &ctst->arch.vex );
282 /* %r3 = 0 */
283 ctst->arch.vex.guest_GPR3 = 0;
284 /* %cr0.so = 0 */
285 LibVEX_GuestPPC32_put_CR( old_cr & ~(1<<28), &ctst->arch.vex );
286 }
sewardje23772f2005-07-02 11:27:02 +0000287
288 if (sp != 0)
289 ctst->arch.vex.guest_GPR1 = sp;
290
291 ctst->os_state.parent = ptid;
292
293 /* inherit signal mask */
294 ctst->sig_mask = ptst->sig_mask;
295 ctst->tmp_sig_mask = ptst->sig_mask;
296
297 /* We don't really know where the client stack is, because its
298 allocated by the client. The best we can do is look at the
299 memory mappings and try to derive some useful information. We
300 assume that esp starts near its highest possible value, and can
301 only go down to the start of the mmaped segment. */
sewardja48a4932005-09-29 11:09:56 +0000302 seg = VG_(am_find_nsegment)(sp);
303 if (seg && seg->kind != SkResvn) {
sewardje23772f2005-07-02 11:27:02 +0000304 ctst->client_stack_highest_word = (Addr)VG_PGROUNDUP(sp);
sewardja48a4932005-09-29 11:09:56 +0000305 ctst->client_stack_szB = ctst->client_stack_highest_word - seg->start;
sewardje23772f2005-07-02 11:27:02 +0000306
tom690c3c82008-02-08 15:17:07 +0000307 VG_(register_stack)(seg->start, ctst->client_stack_highest_word);
308
sewardje23772f2005-07-02 11:27:02 +0000309 if (debug)
sewardje21058c2005-08-05 02:15:18 +0000310 VG_(printf)("\ntid %d: guessed client stack range %p-%p\n",
sewardja48a4932005-09-29 11:09:56 +0000311 ctid, seg->start, VG_PGROUNDUP(sp));
sewardje23772f2005-07-02 11:27:02 +0000312 } else {
313 VG_(message)(Vg_UserMsg, "!? New thread %d starts with R1(%p) unmapped\n",
314 ctid, sp);
315 ctst->client_stack_szB = 0;
316 }
317
sewardjadb102f2007-11-09 23:21:44 +0000318 /* Assume the clone will succeed, and tell any tool that wants to
319 know that this thread has come into existence. If the clone
320 fails, we'll send out a ll_exit notification for it at the out:
321 label below, to clean up. */
322 VG_TRACK ( pre_thread_ll_create, ptid, ctid );
323
sewardje23772f2005-07-02 11:27:02 +0000324 if (flags & VKI_CLONE_SETTLS) {
325 if (debug)
sewardj6a324492005-08-05 00:10:11 +0000326 VG_(printf)("clone child has SETTLS: tls at %p\n", child_tls);
327 ctst->arch.vex.guest_GPR2 = child_tls;
sewardje23772f2005-07-02 11:27:02 +0000328 }
329
330 flags &= ~VKI_CLONE_SETTLS;
331
332 /* start the thread with everything blocked */
333 VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask);
334
335 /* Create the new thread */
336 word64 = do_syscall_clone_ppc32_linux(
njna3afdfb2005-11-09 04:49:28 +0000337 ML_(start_thread_NORETURN), stack, flags, &VG_(threads)[ctid],
sewardje23772f2005-07-02 11:27:02 +0000338 child_tidptr, parent_tidptr, NULL
339 );
sewardj6a324492005-08-05 00:10:11 +0000340 /* High half word64 is syscall return value. Low half is
341 the entire CR, from which we need to extract CR0.SO. */
342 /* VG_(printf)("word64 = 0x%llx\n", word64); */
343 res = VG_(mk_SysRes_ppc32_linux)(
344 /*val*/(UInt)(word64 >> 32),
345 /*errflag*/ (((UInt)word64) >> 28) & 1
346 );
sewardje23772f2005-07-02 11:27:02 +0000347
348 VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL);
349
sewardja48a4932005-09-29 11:09:56 +0000350 out:
sewardje23772f2005-07-02 11:27:02 +0000351 if (res.isError) {
352 /* clone failed */
353 VG_(cleanup_thread)(&ctst->arch);
354 ctst->status = VgTs_Empty;
sewardjadb102f2007-11-09 23:21:44 +0000355 /* oops. Better tell the tool the thread exited in a hurry :-) */
356 VG_TRACK( pre_thread_ll_exit, ctid );
sewardje23772f2005-07-02 11:27:02 +0000357 }
358
359 return res;
360}
cerion85665ca2005-06-20 15:51:07 +0000361
362
cerion85665ca2005-06-20 15:51:07 +0000363
364/* ---------------------------------------------------------------------
cerion85665ca2005-06-20 15:51:07 +0000365 More thread stuff
366 ------------------------------------------------------------------ */
367
njnaf839f52005-06-23 03:27:57 +0000368void VG_(cleanup_thread) ( ThreadArchState* arch )
cerion85665ca2005-06-20 15:51:07 +0000369{
cerion85665ca2005-06-20 15:51:07 +0000370}
371
sewardje23772f2005-07-02 11:27:02 +0000372void setup_child ( /*OUT*/ ThreadArchState *child,
373 /*IN*/ ThreadArchState *parent )
374{
375 /* We inherit our parent's guest state. */
376 child->vex = parent->vex;
377 child->vex_shadow = parent->vex_shadow;
378}
cerion85665ca2005-06-20 15:51:07 +0000379
380
381/* ---------------------------------------------------------------------
382 PRE/POST wrappers for ppc32/Linux-specific syscalls
383 ------------------------------------------------------------------ */
384
385#define PRE(name) DEFN_PRE_TEMPLATE(ppc32_linux, name)
386#define POST(name) DEFN_POST_TEMPLATE(ppc32_linux, name)
387
388/* Add prototypes for the wrappers declared here, so that gcc doesn't
389 harass us for not having prototypes. Really this is a kludge --
390 the right thing to do is to make these wrappers 'static' since they
391 aren't visible outside this file, but that requires even more macro
392 magic. */
393
cerion508aef52005-06-24 15:26:49 +0000394DECL_TEMPLATE(ppc32_linux, sys_socketcall);
tom9548a162005-09-30 08:07:53 +0000395DECL_TEMPLATE(ppc32_linux, sys_mmap);
396DECL_TEMPLATE(ppc32_linux, sys_mmap2);
cerion85665ca2005-06-20 15:51:07 +0000397DECL_TEMPLATE(ppc32_linux, sys_stat64);
cerion508aef52005-06-24 15:26:49 +0000398DECL_TEMPLATE(ppc32_linux, sys_lstat64);
sewardj5b91c402006-07-24 10:06:09 +0000399DECL_TEMPLATE(ppc32_linux, sys_fstatat64);
cerion85665ca2005-06-20 15:51:07 +0000400DECL_TEMPLATE(ppc32_linux, sys_fstat64);
cerion508aef52005-06-24 15:26:49 +0000401DECL_TEMPLATE(ppc32_linux, sys_ipc);
sewardje23772f2005-07-02 11:27:02 +0000402DECL_TEMPLATE(ppc32_linux, sys_clone);
sewardjb865b162005-07-08 18:26:37 +0000403DECL_TEMPLATE(ppc32_linux, sys_sigreturn);
sewardj4ce89e12005-11-16 19:15:33 +0000404DECL_TEMPLATE(ppc32_linux, sys_rt_sigreturn);
sewardj3849cc52005-11-07 15:48:31 +0000405DECL_TEMPLATE(ppc32_linux, sys_sigaction);
tom313639f2006-04-03 16:38:33 +0000406DECL_TEMPLATE(ppc32_linux, sys_sigsuspend);
cerion508aef52005-06-24 15:26:49 +0000407
408PRE(sys_socketcall)
409{
410# define ARG2_0 (((UWord*)ARG2)[0])
411# define ARG2_1 (((UWord*)ARG2)[1])
412# define ARG2_2 (((UWord*)ARG2)[2])
413# define ARG2_3 (((UWord*)ARG2)[3])
414# define ARG2_4 (((UWord*)ARG2)[4])
415# define ARG2_5 (((UWord*)ARG2)[5])
416
417 *flags |= SfMayBlock;
418 PRINT("sys_socketcall ( %d, %p )",ARG1,ARG2);
419 PRE_REG_READ2(long, "socketcall", int, call, unsigned long *, args);
420
421 switch (ARG1 /* request */) {
422
423 case VKI_SYS_SOCKETPAIR:
424 /* int socketpair(int d, int type, int protocol, int sv[2]); */
425 PRE_MEM_READ( "socketcall.socketpair(args)", ARG2, 4*sizeof(Addr) );
426 ML_(generic_PRE_sys_socketpair)( tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3 );
427 break;
428
429 case VKI_SYS_SOCKET:
430 /* int socket(int domain, int type, int protocol); */
431 PRE_MEM_READ( "socketcall.socket(args)", ARG2, 3*sizeof(Addr) );
432 break;
433
434 case VKI_SYS_BIND:
435 /* int bind(int sockfd, struct sockaddr *my_addr,
436 int addrlen); */
437 PRE_MEM_READ( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) );
438 ML_(generic_PRE_sys_bind)( tid, ARG2_0, ARG2_1, ARG2_2 );
439 break;
440
441 case VKI_SYS_LISTEN:
442 /* int listen(int s, int backlog); */
443 PRE_MEM_READ( "socketcall.listen(args)", ARG2, 2*sizeof(Addr) );
444 break;
445
446 case VKI_SYS_ACCEPT: {
447 /* int accept(int s, struct sockaddr *addr, int *addrlen); */
448 PRE_MEM_READ( "socketcall.accept(args)", ARG2, 3*sizeof(Addr) );
449 ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
450 break;
451 }
452
453 case VKI_SYS_SENDTO:
454 /* int sendto(int s, const void *msg, int len,
455 unsigned int flags,
456 const struct sockaddr *to, int tolen); */
457 PRE_MEM_READ( "socketcall.sendto(args)", ARG2, 6*sizeof(Addr) );
458 ML_(generic_PRE_sys_sendto)( tid, ARG2_0, ARG2_1, ARG2_2,
459 ARG2_3, ARG2_4, ARG2_5 );
460 break;
461
462 case VKI_SYS_SEND:
463 /* int send(int s, const void *msg, size_t len, int flags); */
464 PRE_MEM_READ( "socketcall.send(args)", ARG2, 4*sizeof(Addr) );
465 ML_(generic_PRE_sys_send)( tid, ARG2_0, ARG2_1, ARG2_2 );
466 break;
467
468 case VKI_SYS_RECVFROM:
469 /* int recvfrom(int s, void *buf, int len, unsigned int flags,
470 struct sockaddr *from, int *fromlen); */
471 PRE_MEM_READ( "socketcall.recvfrom(args)", ARG2, 6*sizeof(Addr) );
472 ML_(generic_PRE_sys_recvfrom)( tid, ARG2_0, ARG2_1, ARG2_2,
473 ARG2_3, ARG2_4, ARG2_5 );
474 break;
475
476 case VKI_SYS_RECV:
477 /* int recv(int s, void *buf, int len, unsigned int flags); */
478 /* man 2 recv says:
479 The recv call is normally used only on a connected socket
480 (see connect(2)) and is identical to recvfrom with a NULL
481 from parameter.
482 */
483 PRE_MEM_READ( "socketcall.recv(args)", ARG2, 4*sizeof(Addr) );
484 ML_(generic_PRE_sys_recv)( tid, ARG2_0, ARG2_1, ARG2_2 );
485 break;
486
487 case VKI_SYS_CONNECT:
488 /* int connect(int sockfd,
489 struct sockaddr *serv_addr, int addrlen ); */
490 PRE_MEM_READ( "socketcall.connect(args)", ARG2, 3*sizeof(Addr) );
491 ML_(generic_PRE_sys_connect)( tid, ARG2_0, ARG2_1, ARG2_2 );
492 break;
493
494 case VKI_SYS_SETSOCKOPT:
495 /* int setsockopt(int s, int level, int optname,
496 const void *optval, int optlen); */
497 PRE_MEM_READ( "socketcall.setsockopt(args)", ARG2, 5*sizeof(Addr) );
498 ML_(generic_PRE_sys_setsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
499 ARG2_3, ARG2_4 );
500 break;
501
502 case VKI_SYS_GETSOCKOPT:
503 /* int getsockopt(int s, int level, int optname,
504 void *optval, socklen_t *optlen); */
505 PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) );
506 ML_(generic_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
507 ARG2_3, ARG2_4 );
508 break;
509
510 case VKI_SYS_GETSOCKNAME:
511 /* int getsockname(int s, struct sockaddr* name, int* namelen) */
512 PRE_MEM_READ( "socketcall.getsockname(args)", ARG2, 3*sizeof(Addr) );
513 ML_(generic_PRE_sys_getsockname)( tid, ARG2_0, ARG2_1, ARG2_2 );
514 break;
515
516 case VKI_SYS_GETPEERNAME:
517 /* int getpeername(int s, struct sockaddr* name, int* namelen) */
518 PRE_MEM_READ( "socketcall.getpeername(args)", ARG2, 3*sizeof(Addr) );
519 ML_(generic_PRE_sys_getpeername)( tid, ARG2_0, ARG2_1, ARG2_2 );
520 break;
521
522 case VKI_SYS_SHUTDOWN:
523 /* int shutdown(int s, int how); */
524 PRE_MEM_READ( "socketcall.shutdown(args)", ARG2, 2*sizeof(Addr) );
525 break;
526
527 case VKI_SYS_SENDMSG: {
528 /* int sendmsg(int s, const struct msghdr *msg, int flags); */
529
530 /* this causes warnings, and I don't get why. glibc bug?
531 * (after all it's glibc providing the arguments array)
532 PRE_MEM_READ( "socketcall.sendmsg(args)", ARG2, 3*sizeof(Addr) );
533 */
534 ML_(generic_PRE_sys_sendmsg)( tid, ARG2_0, ARG2_1 );
535 break;
536 }
537
538 case VKI_SYS_RECVMSG: {
539 /* int recvmsg(int s, struct msghdr *msg, int flags); */
540
541 /* this causes warnings, and I don't get why. glibc bug?
542 * (after all it's glibc providing the arguments array)
543 PRE_MEM_READ("socketcall.recvmsg(args)", ARG2, 3*sizeof(Addr) );
544 */
545 ML_(generic_PRE_sys_recvmsg)( tid, ARG2_0, ARG2_1 );
546 break;
547 }
548
549 default:
550 VG_(message)(Vg_DebugMsg,"Warning: unhandled socketcall 0x%x",ARG1);
551 SET_STATUS_Failure( VKI_EINVAL );
552 break;
553 }
554# undef ARG2_0
555# undef ARG2_1
556# undef ARG2_2
557# undef ARG2_3
558# undef ARG2_4
559# undef ARG2_5
560}
561
562POST(sys_socketcall)
563{
564# define ARG2_0 (((UWord*)ARG2)[0])
565# define ARG2_1 (((UWord*)ARG2)[1])
566# define ARG2_2 (((UWord*)ARG2)[2])
567# define ARG2_3 (((UWord*)ARG2)[3])
568# define ARG2_4 (((UWord*)ARG2)[4])
569# define ARG2_5 (((UWord*)ARG2)[5])
570
571 SysRes r;
572 vg_assert(SUCCESS);
573 switch (ARG1 /* request */) {
574
575 case VKI_SYS_SOCKETPAIR:
576 r = ML_(generic_POST_sys_socketpair)(
577 tid, VG_(mk_SysRes_Success)(RES),
578 ARG2_0, ARG2_1, ARG2_2, ARG2_3
579 );
580 SET_STATUS_from_SysRes(r);
581 break;
582
583 case VKI_SYS_SOCKET:
584 r = ML_(generic_POST_sys_socket)( tid, VG_(mk_SysRes_Success)(RES) );
585 SET_STATUS_from_SysRes(r);
586 break;
587
588 case VKI_SYS_BIND:
589 /* int bind(int sockfd, struct sockaddr *my_addr,
590 int addrlen); */
591 break;
592
593 case VKI_SYS_LISTEN:
594 /* int listen(int s, int backlog); */
595 break;
596
597 case VKI_SYS_ACCEPT:
598 /* int accept(int s, struct sockaddr *addr, int *addrlen); */
599 r = ML_(generic_POST_sys_accept)( tid, VG_(mk_SysRes_Success)(RES),
600 ARG2_0, ARG2_1, ARG2_2 );
601 SET_STATUS_from_SysRes(r);
602 break;
603
604 case VKI_SYS_SENDTO:
605 break;
606
607 case VKI_SYS_SEND:
608 break;
609
610 case VKI_SYS_RECVFROM:
611 ML_(generic_POST_sys_recvfrom)( tid, VG_(mk_SysRes_Success)(RES),
612 ARG2_0, ARG2_1, ARG2_2,
613 ARG2_3, ARG2_4, ARG2_5 );
614 break;
615
616 case VKI_SYS_RECV:
617 ML_(generic_POST_sys_recv)( tid, RES, ARG2_0, ARG2_1, ARG2_2 );
618 break;
619
620 case VKI_SYS_CONNECT:
621 break;
622
623 case VKI_SYS_SETSOCKOPT:
624 break;
625
626 case VKI_SYS_GETSOCKOPT:
627 ML_(generic_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
628 ARG2_0, ARG2_1,
629 ARG2_2, ARG2_3, ARG2_4 );
630 break;
631
632 case VKI_SYS_GETSOCKNAME:
633 ML_(generic_POST_sys_getsockname)( tid, VG_(mk_SysRes_Success)(RES),
634 ARG2_0, ARG2_1, ARG2_2 );
635 break;
636
637 case VKI_SYS_GETPEERNAME:
638 ML_(generic_POST_sys_getpeername)( tid, VG_(mk_SysRes_Success)(RES),
639 ARG2_0, ARG2_1, ARG2_2 );
640 break;
641
642 case VKI_SYS_SHUTDOWN:
643 break;
644
645 case VKI_SYS_SENDMSG:
646 break;
647
648 case VKI_SYS_RECVMSG:
649 ML_(generic_POST_sys_recvmsg)( tid, ARG2_0, ARG2_1 );
650 break;
651
652 default:
653 VG_(message)(Vg_DebugMsg,"FATAL: unhandled socketcall 0x%x",ARG1);
654 VG_(core_panic)("... bye!\n");
655 break; /*NOTREACHED*/
656 }
657# undef ARG2_0
658# undef ARG2_1
659# undef ARG2_2
660# undef ARG2_3
661# undef ARG2_4
662# undef ARG2_5
663}
cerion85665ca2005-06-20 15:51:07 +0000664
tom9548a162005-09-30 08:07:53 +0000665PRE(sys_mmap)
666{
667 SysRes r;
668
669 PRINT("sys_mmap ( %p, %llu, %d, %d, %d, %d )",
670 ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 );
671 PRE_REG_READ6(long, "mmap",
672 unsigned long, start, unsigned long, length,
673 unsigned long, prot, unsigned long, flags,
674 unsigned long, fd, unsigned long, offset);
675
sewardj274461d2005-10-02 17:01:41 +0000676 r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
677 (Off64T)ARG6 );
tom9548a162005-09-30 08:07:53 +0000678 SET_STATUS_from_SysRes(r);
679}
680
681PRE(sys_mmap2)
682{
683 SysRes r;
684
685 // Exactly like old_mmap() except:
sewardje66f2e02006-12-30 17:45:08 +0000686 // - the file offset is specified in 4K units rather than bytes,
tom9548a162005-09-30 08:07:53 +0000687 // so that it can be used for files bigger than 2^32 bytes.
688 PRINT("sys_mmap2 ( %p, %llu, %d, %d, %d, %d )",
689 ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 );
690 PRE_REG_READ6(long, "mmap2",
691 unsigned long, start, unsigned long, length,
692 unsigned long, prot, unsigned long, flags,
693 unsigned long, fd, unsigned long, offset);
694
sewardj274461d2005-10-02 17:01:41 +0000695 r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
sewardje66f2e02006-12-30 17:45:08 +0000696 4096 * (Off64T)ARG6 );
tom9548a162005-09-30 08:07:53 +0000697 SET_STATUS_from_SysRes(r);
698}
699
cerion85665ca2005-06-20 15:51:07 +0000700// XXX: lstat64/fstat64/stat64 are generic, but not necessarily
701// applicable to every architecture -- I think only to 32-bit archs.
702// We're going to need something like linux/core_os32.h for such
703// things, eventually, I think. --njn
704PRE(sys_stat64)
705{
706 PRINT("sys_stat64 ( %p, %p )",ARG1,ARG2);
707 PRE_REG_READ2(long, "stat64", char *, file_name, struct stat64 *, buf);
708 PRE_MEM_RASCIIZ( "stat64(file_name)", ARG1 );
709 PRE_MEM_WRITE( "stat64(buf)", ARG2, sizeof(struct vki_stat64) );
710}
711
712POST(sys_stat64)
713{
714 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
715}
716
cerion508aef52005-06-24 15:26:49 +0000717PRE(sys_lstat64)
718{
719 PRINT("sys_lstat64 ( %p(%s), %p )",ARG1,ARG1,ARG2);
720 PRE_REG_READ2(long, "lstat64", char *, file_name, struct stat64 *, buf);
721 PRE_MEM_RASCIIZ( "lstat64(file_name)", ARG1 );
722 PRE_MEM_WRITE( "lstat64(buf)", ARG2, sizeof(struct vki_stat64) );
723}
724
725POST(sys_lstat64)
726{
727 vg_assert(SUCCESS);
728 if (RES == 0) {
729 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
730 }
731}
732
sewardj5b91c402006-07-24 10:06:09 +0000733PRE(sys_fstatat64)
734{
735 PRINT("sys_fstatat64 ( %d, %p(%s), %p )",ARG1,ARG2,ARG2,ARG3);
736 PRE_REG_READ3(long, "fstatat64",
737 int, dfd, char *, file_name, struct stat64 *, buf);
738 PRE_MEM_RASCIIZ( "fstatat64(file_name)", ARG2 );
739 PRE_MEM_WRITE( "fstatat64(buf)", ARG3, sizeof(struct vki_stat64) );
740}
741
742POST(sys_fstatat64)
743{
744 POST_MEM_WRITE( ARG3, sizeof(struct vki_stat64) );
745}
746
cerion85665ca2005-06-20 15:51:07 +0000747PRE(sys_fstat64)
748{
749 PRINT("sys_fstat64 ( %d, %p )",ARG1,ARG2);
750 PRE_REG_READ2(long, "fstat64", unsigned long, fd, struct stat64 *, buf);
751 PRE_MEM_WRITE( "fstat64(buf)", ARG2, sizeof(struct vki_stat64) );
752}
cerion508aef52005-06-24 15:26:49 +0000753
cerion85665ca2005-06-20 15:51:07 +0000754POST(sys_fstat64)
755{
756 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
757}
758
cerion508aef52005-06-24 15:26:49 +0000759static Addr deref_Addr ( ThreadId tid, Addr a, Char* s )
760{
761 Addr* a_p = (Addr*)a;
762 PRE_MEM_READ( s, (Addr)a_p, sizeof(Addr) );
763 return *a_p;
764}
765
cerion508aef52005-06-24 15:26:49 +0000766PRE(sys_ipc)
767{
768 PRINT("sys_ipc ( %d, %d, %d, %d, %p, %d )", ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
769 // XXX: this is simplistic -- some args are not used in all circumstances.
770 PRE_REG_READ6(int, "ipc",
771 vki_uint, call, int, first, int, second, int, third,
772 void *, ptr, long, fifth)
773
774 switch (ARG1 /* call */) {
775 case VKI_SEMOP:
776 ML_(generic_PRE_sys_semop)( tid, ARG2, ARG5, ARG3 );
777 *flags |= SfMayBlock;
778 break;
779 case VKI_SEMGET:
780 break;
781 case VKI_SEMCTL:
782 {
783 UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
784 ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
785 break;
786 }
787 case VKI_SEMTIMEDOP:
788 ML_(generic_PRE_sys_semtimedop)( tid, ARG2, ARG5, ARG3, ARG6 );
789 *flags |= SfMayBlock;
790 break;
791 case VKI_MSGSND:
njnde5c5f52005-09-01 03:35:40 +0000792 ML_(linux_PRE_sys_msgsnd)( tid, ARG2, ARG5, ARG3, ARG4 );
cerion508aef52005-06-24 15:26:49 +0000793 if ((ARG4 & VKI_IPC_NOWAIT) == 0)
794 *flags |= SfMayBlock;
795 break;
796 case VKI_MSGRCV:
797 {
798 Addr msgp;
799 Word msgtyp;
800
801 msgp = deref_Addr( tid,
802 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
803 "msgrcv(msgp)" );
804 msgtyp = deref_Addr( tid,
805 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
806 "msgrcv(msgp)" );
807
njnde5c5f52005-09-01 03:35:40 +0000808 ML_(linux_PRE_sys_msgrcv)( tid, ARG2, msgp, ARG3, msgtyp, ARG4 );
cerion508aef52005-06-24 15:26:49 +0000809
810 if ((ARG4 & VKI_IPC_NOWAIT) == 0)
811 *flags |= SfMayBlock;
812 break;
813 }
814 case VKI_MSGGET:
815 break;
816 case VKI_MSGCTL:
njnde5c5f52005-09-01 03:35:40 +0000817 ML_(linux_PRE_sys_msgctl)( tid, ARG2, ARG3, ARG5 );
cerion508aef52005-06-24 15:26:49 +0000818 break;
819 case VKI_SHMAT:
820 {
821 UWord w;
822 PRE_MEM_WRITE( "shmat(raddr)", ARG4, sizeof(Addr) );
823 w = ML_(generic_PRE_sys_shmat)( tid, ARG2, ARG5, ARG3 );
824 if (w == 0)
825 SET_STATUS_Failure( VKI_EINVAL );
826 else
827 ARG5 = w;
828 break;
829 }
830 case VKI_SHMDT:
831 if (!ML_(generic_PRE_sys_shmdt)(tid, ARG5))
832 SET_STATUS_Failure( VKI_EINVAL );
833 break;
834 case VKI_SHMGET:
835 break;
836 case VKI_SHMCTL: /* IPCOP_shmctl */
837 ML_(generic_PRE_sys_shmctl)( tid, ARG2, ARG3, ARG5 );
838 break;
839 default:
840 VG_(message)(Vg_DebugMsg, "FATAL: unhandled syscall(ipc) %d", ARG1 );
841 VG_(core_panic)("... bye!\n");
842 break; /*NOTREACHED*/
843 }
844}
845
846POST(sys_ipc)
847{
848 vg_assert(SUCCESS);
849 switch (ARG1 /* call */) {
850 case VKI_SEMOP:
851 case VKI_SEMGET:
852 break;
853 case VKI_SEMCTL:
854 {
855 UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
856 ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
857 break;
858 }
859 case VKI_SEMTIMEDOP:
860 case VKI_MSGSND:
861 break;
862 case VKI_MSGRCV:
863 {
864 Addr msgp;
865 Word msgtyp;
866
867 msgp = deref_Addr( tid,
868 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
869 "msgrcv(msgp)" );
870 msgtyp = deref_Addr( tid,
871 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
872 "msgrcv(msgp)" );
873
njna560c5c2005-09-01 16:27:28 +0000874 ML_(linux_POST_sys_msgrcv)( tid, RES, ARG2, msgp, ARG3, msgtyp, ARG4 );
cerion508aef52005-06-24 15:26:49 +0000875 break;
876 }
877 case VKI_MSGGET:
878 break;
879 case VKI_MSGCTL:
njna560c5c2005-09-01 16:27:28 +0000880 ML_(linux_POST_sys_msgctl)( tid, RES, ARG2, ARG3, ARG5 );
cerion508aef52005-06-24 15:26:49 +0000881 break;
882 case VKI_SHMAT:
883 {
884 Addr addr;
885
886 /* force readability. before the syscall it is
887 * indeed uninitialized, as can be seen in
888 * glibc/sysdeps/unix/sysv/linux/shmat.c */
889 POST_MEM_WRITE( ARG4, sizeof( Addr ) );
890
891 addr = deref_Addr ( tid, ARG4, "shmat(addr)" );
892 if ( addr > 0 ) {
893 ML_(generic_POST_sys_shmat)( tid, addr, ARG2, ARG5, ARG3 );
894 }
895 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
cerion85665ca2005-06-20 15:51:07 +00001625//.. // Nb: create_module() was removed 2.4-->2.6
1626//.. GENX_(__NR_create_module, sys_ni_syscall), // 127
1627//.. GENX_(__NR_init_module, sys_init_module), // 128
1628//.. // (__NR_delete_module, sys_delete_module), // 129 (*/Linux)?
1629//..
1630//.. // Nb: get_kernel_syms() was removed 2.4-->2.6
1631//.. GENX_(__NR_get_kernel_syms, sys_ni_syscall), // 130
njncd405ea2005-08-31 02:44:31 +00001632//.. LINX_(__NR_quotactl, sys_quotactl), // 131
sewardja932d292005-07-08 00:18:25 +00001633 GENX_(__NR_getpgid, sys_getpgid), // 132
sewardj3774f862006-03-21 02:23:27 +00001634 GENX_(__NR_fchdir, sys_fchdir), // 133
cerion85665ca2005-06-20 15:51:07 +00001635//.. // (__NR_bdflush, sys_bdflush), // 134 */Linux
1636//..
1637//.. // (__NR_sysfs, sys_sysfs), // 135 SVr4
sewardja58bbbc2006-04-14 01:04:04 +00001638 LINX_(__NR_personality, sys_personality), // 136
cerion85665ca2005-06-20 15:51:07 +00001639//.. GENX_(__NR_afs_syscall, sys_ni_syscall), // 137
sewardja58bbbc2006-04-14 01:04:04 +00001640 LINX_(__NR_setfsuid, sys_setfsuid), // 138
1641 LINX_(__NR_setfsgid, sys_setfsgid), // 139
sewardj31d83422005-10-15 02:00:41 +00001642
sewardja932d292005-07-08 00:18:25 +00001643 LINXY(__NR__llseek, sys_llseek), // 140
sewardj31d83422005-10-15 02:00:41 +00001644 GENXY(__NR_getdents, sys_getdents), // 141
sewardja932d292005-07-08 00:18:25 +00001645 GENX_(__NR__newselect, sys_select), // 142
sewardj6a324492005-08-05 00:10:11 +00001646 GENX_(__NR_flock, sys_flock), // 143
sewardja58bbbc2006-04-14 01:04:04 +00001647 GENX_(__NR_msync, sys_msync), // 144
cerion85665ca2005-06-20 15:51:07 +00001648//..
sewardja932d292005-07-08 00:18:25 +00001649 GENXY(__NR_readv, sys_readv), // 145
1650 GENX_(__NR_writev, sys_writev), // 146
sewardja58bbbc2006-04-14 01:04:04 +00001651 GENX_(__NR_getsid, sys_getsid), // 147
sewardj5addd6c2005-08-18 23:44:13 +00001652 GENX_(__NR_fdatasync, sys_fdatasync), // 148
sewardja932d292005-07-08 00:18:25 +00001653 LINXY(__NR__sysctl, sys_sysctl), // 149
cerion85665ca2005-06-20 15:51:07 +00001654//..
sewardja58bbbc2006-04-14 01:04:04 +00001655 GENX_(__NR_mlock, sys_mlock), // 150
1656 GENX_(__NR_munlock, sys_munlock), // 151
1657 GENX_(__NR_mlockall, sys_mlockall), // 152
1658 LINX_(__NR_munlockall, sys_munlockall), // 153
njnb2480c92005-08-30 02:17:23 +00001659//.. LINXY(__NR_sched_setparam, sys_sched_setparam), // 154
cerion85665ca2005-06-20 15:51:07 +00001660//..
njnb2480c92005-08-30 02:17:23 +00001661 LINXY(__NR_sched_getparam, sys_sched_getparam), // 155
sewardjd84f4672005-10-07 23:06:13 +00001662 LINX_(__NR_sched_setscheduler, sys_sched_setscheduler), // 156
njnb2480c92005-08-30 02:17:23 +00001663 LINX_(__NR_sched_getscheduler, sys_sched_getscheduler), // 157
dirk331e5762005-12-05 22:11:02 +00001664 LINX_(__NR_sched_yield, sys_sched_yield), // 158
njnb2480c92005-08-30 02:17:23 +00001665 LINX_(__NR_sched_get_priority_max, sys_sched_get_priority_max),// 159
sewardj5addd6c2005-08-18 23:44:13 +00001666
njnb2480c92005-08-30 02:17:23 +00001667 LINX_(__NR_sched_get_priority_min, sys_sched_get_priority_min),// 160
1668//.. //LINX?(__NR_sched_rr_get_interval, sys_sched_rr_get_interval), // 161 */*
sewardja932d292005-07-08 00:18:25 +00001669 GENXY(__NR_nanosleep, sys_nanosleep), // 162
1670 GENX_(__NR_mremap, sys_mremap), // 163
sewardja58bbbc2006-04-14 01:04:04 +00001671 LINX_(__NR_setresuid, sys_setresuid), // 164
sewardj33d17fa2005-08-21 00:49:41 +00001672
sewardja58bbbc2006-04-14 01:04:04 +00001673 LINXY(__NR_getresuid, sys_getresuid), // 165
cerion85665ca2005-06-20 15:51:07 +00001674
1675//.. GENX_(__NR_query_module, sys_ni_syscall), // 166
sewardjca334052005-07-24 06:30:37 +00001676 GENXY(__NR_poll, sys_poll), // 167
cerion85665ca2005-06-20 15:51:07 +00001677//.. // (__NR_nfsservctl, sys_nfsservctl), // 168 */Linux
1678//..
sewardja58bbbc2006-04-14 01:04:04 +00001679 LINX_(__NR_setresgid, sys_setresgid), // 169
1680 LINXY(__NR_getresgid, sys_getresgid), // 170
toma39ebc82006-12-18 15:22:46 +00001681 LINXY(__NR_prctl, sys_prctl), // 171
sewardj4ce89e12005-11-16 19:15:33 +00001682 PLAX_(__NR_rt_sigreturn, sys_rt_sigreturn), // 172
njncd405ea2005-08-31 02:44:31 +00001683 LINXY(__NR_rt_sigaction, sys_rt_sigaction), // 173
cerion85665ca2005-06-20 15:51:07 +00001684
njncd405ea2005-08-31 02:44:31 +00001685 LINXY(__NR_rt_sigprocmask, sys_rt_sigprocmask), // 174
sewardja58bbbc2006-04-14 01:04:04 +00001686 LINXY(__NR_rt_sigpending, sys_rt_sigpending), // 175
njncd405ea2005-08-31 02:44:31 +00001687 LINXY(__NR_rt_sigtimedwait, sys_rt_sigtimedwait), // 176
sewardja58bbbc2006-04-14 01:04:04 +00001688 LINXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo), // 177
sewardj1ea00a12005-11-16 12:51:34 +00001689 LINX_(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 178
1690
sewardja932d292005-07-08 00:18:25 +00001691 GENXY(__NR_pread64, sys_pread64), // 179
1692 GENX_(__NR_pwrite64, sys_pwrite64), // 180
sewardja58bbbc2006-04-14 01:04:04 +00001693 GENX_(__NR_chown, sys_chown), // 181
sewardjb865b162005-07-08 18:26:37 +00001694 GENXY(__NR_getcwd, sys_getcwd), // 182
njn9fe7b122005-08-26 04:03:04 +00001695//.. LINXY(__NR_capget, sys_capget), // 183
cerion85665ca2005-06-20 15:51:07 +00001696//..
njn9fe7b122005-08-26 04:03:04 +00001697//.. LINX_(__NR_capset, sys_capset), // 184
sewardja9fff9b2005-08-19 10:07:29 +00001698 GENXY(__NR_sigaltstack, sys_sigaltstack), // 185
sewardja58bbbc2006-04-14 01:04:04 +00001699 LINXY(__NR_sendfile, sys_sendfile), // 186
cerion85665ca2005-06-20 15:51:07 +00001700//.. GENXY(__NR_getpmsg, sys_getpmsg), // 187
1701//.. GENX_(__NR_putpmsg, sys_putpmsg), // 188
sewardja932d292005-07-08 00:18:25 +00001702
1703 // Nb: we treat vfork as fork
1704 GENX_(__NR_vfork, sys_fork), // 189
1705 GENXY(__NR_ugetrlimit, sys_getrlimit), // 190
cerion85665ca2005-06-20 15:51:07 +00001706//__NR_readahead // 191 ppc/Linux only?
tom9548a162005-09-30 08:07:53 +00001707 PLAX_(__NR_mmap2, sys_mmap2), // 192
sewardja58bbbc2006-04-14 01:04:04 +00001708 GENX_(__NR_truncate64, sys_truncate64), // 193
sewardj48db0f02005-10-07 13:30:48 +00001709 GENX_(__NR_ftruncate64, sys_ftruncate64), // 194
cerion85665ca2005-06-20 15:51:07 +00001710//..
1711
sewardja932d292005-07-08 00:18:25 +00001712 PLAXY(__NR_stat64, sys_stat64), // 195
1713 PLAXY(__NR_lstat64, sys_lstat64), // 196
1714 PLAXY(__NR_fstat64, sys_fstat64), // 197
cerion85665ca2005-06-20 15:51:07 +00001715
1716// __NR_pciconfig_read // 198
1717// __NR_pciconfig_write // 199
1718// __NR_pciconfig_iobase // 200
1719// __NR_multiplexer // 201
1720
sewardja932d292005-07-08 00:18:25 +00001721 GENXY(__NR_getdents64, sys_getdents64), // 202
cerion85665ca2005-06-20 15:51:07 +00001722//.. // (__NR_pivot_root, sys_pivot_root), // 203 */Linux
sewardja932d292005-07-08 00:18:25 +00001723 GENXY(__NR_fcntl64, sys_fcntl64), // 204
sewardj249ebd72005-10-07 19:12:18 +00001724 GENX_(__NR_madvise, sys_madvise), // 205
dirka07c7402006-02-22 12:54:44 +00001725 GENXY(__NR_mincore, sys_mincore), // 206
sewardja9fff9b2005-08-19 10:07:29 +00001726 LINX_(__NR_gettid, sys_gettid), // 207
cerion85665ca2005-06-20 15:51:07 +00001727//.. LINX_(__NR_tkill, sys_tkill), // 208 */Linux
njn65ccc502005-08-30 01:53:54 +00001728//.. LINX_(__NR_setxattr, sys_setxattr), // 209
1729//.. LINX_(__NR_lsetxattr, sys_lsetxattr), // 210
1730//.. LINX_(__NR_fsetxattr, sys_fsetxattr), // 211
njnef0da672005-08-30 03:02:00 +00001731 LINXY(__NR_getxattr, sys_getxattr), // 212
sewardja58bbbc2006-04-14 01:04:04 +00001732 LINXY(__NR_lgetxattr, sys_lgetxattr), // 213
1733 LINXY(__NR_fgetxattr, sys_fgetxattr), // 214
1734 LINXY(__NR_listxattr, sys_listxattr), // 215
1735 LINXY(__NR_llistxattr, sys_llistxattr), // 216
1736 LINXY(__NR_flistxattr, sys_flistxattr), // 217
1737 LINX_(__NR_removexattr, sys_removexattr), // 218
1738 LINX_(__NR_lremovexattr, sys_lremovexattr), // 219
1739 LINX_(__NR_fremovexattr, sys_fremovexattr), // 220
cerion85665ca2005-06-20 15:51:07 +00001740
cerion508aef52005-06-24 15:26:49 +00001741 LINXY(__NR_futex, sys_futex), // 221
sewardja58bbbc2006-04-14 01:04:04 +00001742 LINX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 222
1743 LINXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 223
cerion85665ca2005-06-20 15:51:07 +00001744/* 224 currently unused */
1745
1746// __NR_tuxcall // 225
1747
sewardja58bbbc2006-04-14 01:04:04 +00001748 LINXY(__NR_sendfile64, sys_sendfile64), // 226
cerion85665ca2005-06-20 15:51:07 +00001749//..
sewardja58bbbc2006-04-14 01:04:04 +00001750 LINX_(__NR_io_setup, sys_io_setup), // 227
1751 LINX_(__NR_io_destroy, sys_io_destroy), // 228
1752 LINXY(__NR_io_getevents, sys_io_getevents), // 229
1753 LINX_(__NR_io_submit, sys_io_submit), // 230
1754 LINXY(__NR_io_cancel, sys_io_cancel), // 231
cerion85665ca2005-06-20 15:51:07 +00001755//..
sewardja932d292005-07-08 00:18:25 +00001756 LINX_(__NR_set_tid_address, sys_set_tid_address), // 232
cerion85665ca2005-06-20 15:51:07 +00001757
sewardj79820562006-09-11 20:33:55 +00001758 LINX_(__NR_fadvise64, sys_fadvise64), // 233 */(Linux?)
sewardja932d292005-07-08 00:18:25 +00001759 LINX_(__NR_exit_group, sys_exit_group), // 234
cerion85665ca2005-06-20 15:51:07 +00001760//.. GENXY(__NR_lookup_dcookie, sys_lookup_dcookie), // 235
sewardja58bbbc2006-04-14 01:04:04 +00001761 LINXY(__NR_epoll_create, sys_epoll_create), // 236
1762 LINX_(__NR_epoll_ctl, sys_epoll_ctl), // 237
1763 LINXY(__NR_epoll_wait, sys_epoll_wait), // 238
cerion85665ca2005-06-20 15:51:07 +00001764
1765//.. // (__NR_remap_file_pages, sys_remap_file_pages), // 239 */Linux
sewardja58bbbc2006-04-14 01:04:04 +00001766 LINXY(__NR_timer_create, sys_timer_create), // 240
1767 LINXY(__NR_timer_settime, sys_timer_settime), // 241
1768 LINXY(__NR_timer_gettime, sys_timer_gettime), // 242
1769 LINX_(__NR_timer_getoverrun, sys_timer_getoverrun), // 243
1770 LINX_(__NR_timer_delete, sys_timer_delete), // 244
1771 LINX_(__NR_clock_settime, sys_clock_settime), // 245
njn1588bc02005-08-26 03:49:43 +00001772 LINXY(__NR_clock_gettime, sys_clock_gettime), // 246
dirk331e5762005-12-05 22:11:02 +00001773 LINXY(__NR_clock_getres, sys_clock_getres), // 247
sewardja58bbbc2006-04-14 01:04:04 +00001774 LINXY(__NR_clock_nanosleep, sys_clock_nanosleep), // 248
cerion85665ca2005-06-20 15:51:07 +00001775
1776// __NR_swapcontext // 249
1777
sewardj7f4bd102005-11-17 14:22:22 +00001778 LINXY(__NR_tgkill, sys_tgkill), // 250 */Linux
cerion85665ca2005-06-20 15:51:07 +00001779//.. GENX_(__NR_utimes, sys_utimes), // 251
sewardja58bbbc2006-04-14 01:04:04 +00001780 GENXY(__NR_statfs64, sys_statfs64), // 252
1781 GENXY(__NR_fstatfs64, sys_fstatfs64), // 253
1782 LINX_(__NR_fadvise64_64, sys_fadvise64_64), // 254 */(Linux?)
cerion85665ca2005-06-20 15:51:07 +00001783
1784// __NR_rtas // 255
1785
1786/* Number 256 is reserved for sys_debug_setcontext */
1787/* Number 257 is reserved for vserver */
1788/* Number 258 is reserved for new sys_remap_file_pages */
1789/* Number 259 is reserved for new sys_mbind */
dirka07c7402006-02-22 12:54:44 +00001790 LINXY(__NR_get_mempolicy, sys_get_mempolicy), // 260
1791 LINX_(__NR_set_mempolicy, sys_set_mempolicy), // 261
cerion85665ca2005-06-20 15:51:07 +00001792
sewardj54e095f2005-11-17 19:09:02 +00001793 LINXY(__NR_mq_open, sys_mq_open), // 262
1794 LINX_(__NR_mq_unlink, sys_mq_unlink), // 263
1795 LINX_(__NR_mq_timedsend, sys_mq_timedsend), // 264
1796 LINXY(__NR_mq_timedreceive, sys_mq_timedreceive), // 265
1797 LINX_(__NR_mq_notify, sys_mq_notify), // 266
1798 LINXY(__NR_mq_getsetattr, sys_mq_getsetattr), // 267
cerion85665ca2005-06-20 15:51:07 +00001799// __NR_kexec_load // 268
dirka07c7402006-02-22 12:54:44 +00001800
1801/* Number 269 is reserved for sys_add_key */
1802/* Number 270 is reserved for sys_request_key */
1803/* Number 271 is reserved for sys_keyctl */
1804/* Number 272 is reserved for sys_waitid */
1805/* Number 273 is reserved for sys_ioprio_set */
1806/* Number 274 is reserved for sys_ioprio_get */
1807
1808 LINX_(__NR_inotify_init, sys_inotify_init), // 275
1809 LINX_(__NR_inotify_add_watch, sys_inotify_add_watch), // 276
1810 LINX_(__NR_inotify_rm_watch, sys_inotify_rm_watch), // 277
sewardj5b91c402006-07-24 10:06:09 +00001811
1812 LINXY(__NR_openat, sys_openat), // 286
1813 LINX_(__NR_mkdirat, sys_mkdirat), // 287
1814 LINX_(__NR_mknodat, sys_mknodat), // 288
1815 LINX_(__NR_fchownat, sys_fchownat), // 289
1816 LINX_(__NR_futimesat, sys_futimesat), // 290
1817 PLAXY(__NR_fstatat64, sys_fstatat64), // 291
1818 LINX_(__NR_unlinkat, sys_unlinkat), // 292
1819 LINX_(__NR_renameat, sys_renameat), // 293
1820 LINX_(__NR_linkat, sys_linkat), // 294
1821 LINX_(__NR_symlinkat, sys_symlinkat), // 295
1822 LINX_(__NR_readlinkat, sys_readlinkat), // 296
1823 LINX_(__NR_fchmodat, sys_fchmodat), // 297
1824 LINX_(__NR_faccessat, sys_faccessat), // 298
1825 LINX_(__NR_set_robust_list, sys_set_robust_list), // 299
1826 LINXY(__NR_get_robust_list, sys_get_robust_list), // 300
cerion85665ca2005-06-20 15:51:07 +00001827};
1828
njnaf839f52005-06-23 03:27:57 +00001829const UInt ML_(syscall_table_size) =
1830 sizeof(ML_(syscall_table)) / sizeof(ML_(syscall_table)[0]);
cerion85665ca2005-06-20 15:51:07 +00001831
1832/*--------------------------------------------------------------------*/
1833/*--- end ---*/
1834/*--------------------------------------------------------------------*/