blob: faec292e45f884b42b733806c11be051f9b0bb06 [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
307 if (debug)
sewardje21058c2005-08-05 02:15:18 +0000308 VG_(printf)("\ntid %d: guessed client stack range %p-%p\n",
sewardja48a4932005-09-29 11:09:56 +0000309 ctid, seg->start, VG_PGROUNDUP(sp));
sewardje23772f2005-07-02 11:27:02 +0000310 } else {
311 VG_(message)(Vg_UserMsg, "!? New thread %d starts with R1(%p) unmapped\n",
312 ctid, sp);
313 ctst->client_stack_szB = 0;
314 }
315
316 if (flags & VKI_CLONE_SETTLS) {
317 if (debug)
sewardj6a324492005-08-05 00:10:11 +0000318 VG_(printf)("clone child has SETTLS: tls at %p\n", child_tls);
319 ctst->arch.vex.guest_GPR2 = child_tls;
sewardje23772f2005-07-02 11:27:02 +0000320 }
321
322 flags &= ~VKI_CLONE_SETTLS;
323
324 /* start the thread with everything blocked */
325 VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask);
326
327 /* Create the new thread */
328 word64 = do_syscall_clone_ppc32_linux(
njna3afdfb2005-11-09 04:49:28 +0000329 ML_(start_thread_NORETURN), stack, flags, &VG_(threads)[ctid],
sewardje23772f2005-07-02 11:27:02 +0000330 child_tidptr, parent_tidptr, NULL
331 );
sewardj6a324492005-08-05 00:10:11 +0000332 /* High half word64 is syscall return value. Low half is
333 the entire CR, from which we need to extract CR0.SO. */
334 /* VG_(printf)("word64 = 0x%llx\n", word64); */
335 res = VG_(mk_SysRes_ppc32_linux)(
336 /*val*/(UInt)(word64 >> 32),
337 /*errflag*/ (((UInt)word64) >> 28) & 1
338 );
sewardje23772f2005-07-02 11:27:02 +0000339
340 VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL);
341
sewardja48a4932005-09-29 11:09:56 +0000342 out:
sewardje23772f2005-07-02 11:27:02 +0000343 if (res.isError) {
344 /* clone failed */
345 VG_(cleanup_thread)(&ctst->arch);
346 ctst->status = VgTs_Empty;
347 }
348
349 return res;
350}
cerion85665ca2005-06-20 15:51:07 +0000351
352
cerion85665ca2005-06-20 15:51:07 +0000353
354/* ---------------------------------------------------------------------
cerion85665ca2005-06-20 15:51:07 +0000355 More thread stuff
356 ------------------------------------------------------------------ */
357
njnaf839f52005-06-23 03:27:57 +0000358void VG_(cleanup_thread) ( ThreadArchState* arch )
cerion85665ca2005-06-20 15:51:07 +0000359{
cerion85665ca2005-06-20 15:51:07 +0000360}
361
sewardje23772f2005-07-02 11:27:02 +0000362void setup_child ( /*OUT*/ ThreadArchState *child,
363 /*IN*/ ThreadArchState *parent )
364{
365 /* We inherit our parent's guest state. */
366 child->vex = parent->vex;
367 child->vex_shadow = parent->vex_shadow;
368}
cerion85665ca2005-06-20 15:51:07 +0000369
370
371/* ---------------------------------------------------------------------
372 PRE/POST wrappers for ppc32/Linux-specific syscalls
373 ------------------------------------------------------------------ */
374
375#define PRE(name) DEFN_PRE_TEMPLATE(ppc32_linux, name)
376#define POST(name) DEFN_POST_TEMPLATE(ppc32_linux, name)
377
378/* Add prototypes for the wrappers declared here, so that gcc doesn't
379 harass us for not having prototypes. Really this is a kludge --
380 the right thing to do is to make these wrappers 'static' since they
381 aren't visible outside this file, but that requires even more macro
382 magic. */
383
cerion508aef52005-06-24 15:26:49 +0000384DECL_TEMPLATE(ppc32_linux, sys_socketcall);
tom9548a162005-09-30 08:07:53 +0000385DECL_TEMPLATE(ppc32_linux, sys_mmap);
386DECL_TEMPLATE(ppc32_linux, sys_mmap2);
cerion85665ca2005-06-20 15:51:07 +0000387DECL_TEMPLATE(ppc32_linux, sys_stat64);
cerion508aef52005-06-24 15:26:49 +0000388DECL_TEMPLATE(ppc32_linux, sys_lstat64);
sewardj5b91c402006-07-24 10:06:09 +0000389DECL_TEMPLATE(ppc32_linux, sys_fstatat64);
cerion85665ca2005-06-20 15:51:07 +0000390DECL_TEMPLATE(ppc32_linux, sys_fstat64);
cerion508aef52005-06-24 15:26:49 +0000391DECL_TEMPLATE(ppc32_linux, sys_ipc);
sewardje23772f2005-07-02 11:27:02 +0000392DECL_TEMPLATE(ppc32_linux, sys_clone);
sewardjb865b162005-07-08 18:26:37 +0000393DECL_TEMPLATE(ppc32_linux, sys_sigreturn);
sewardj4ce89e12005-11-16 19:15:33 +0000394DECL_TEMPLATE(ppc32_linux, sys_rt_sigreturn);
sewardj3849cc52005-11-07 15:48:31 +0000395DECL_TEMPLATE(ppc32_linux, sys_sigaction);
tom313639f2006-04-03 16:38:33 +0000396DECL_TEMPLATE(ppc32_linux, sys_sigsuspend);
cerion508aef52005-06-24 15:26:49 +0000397
398PRE(sys_socketcall)
399{
400# define ARG2_0 (((UWord*)ARG2)[0])
401# define ARG2_1 (((UWord*)ARG2)[1])
402# define ARG2_2 (((UWord*)ARG2)[2])
403# define ARG2_3 (((UWord*)ARG2)[3])
404# define ARG2_4 (((UWord*)ARG2)[4])
405# define ARG2_5 (((UWord*)ARG2)[5])
406
407 *flags |= SfMayBlock;
408 PRINT("sys_socketcall ( %d, %p )",ARG1,ARG2);
409 PRE_REG_READ2(long, "socketcall", int, call, unsigned long *, args);
410
411 switch (ARG1 /* request */) {
412
413 case VKI_SYS_SOCKETPAIR:
414 /* int socketpair(int d, int type, int protocol, int sv[2]); */
415 PRE_MEM_READ( "socketcall.socketpair(args)", ARG2, 4*sizeof(Addr) );
416 ML_(generic_PRE_sys_socketpair)( tid, ARG2_0, ARG2_1, ARG2_2, ARG2_3 );
417 break;
418
419 case VKI_SYS_SOCKET:
420 /* int socket(int domain, int type, int protocol); */
421 PRE_MEM_READ( "socketcall.socket(args)", ARG2, 3*sizeof(Addr) );
422 break;
423
424 case VKI_SYS_BIND:
425 /* int bind(int sockfd, struct sockaddr *my_addr,
426 int addrlen); */
427 PRE_MEM_READ( "socketcall.bind(args)", ARG2, 3*sizeof(Addr) );
428 ML_(generic_PRE_sys_bind)( tid, ARG2_0, ARG2_1, ARG2_2 );
429 break;
430
431 case VKI_SYS_LISTEN:
432 /* int listen(int s, int backlog); */
433 PRE_MEM_READ( "socketcall.listen(args)", ARG2, 2*sizeof(Addr) );
434 break;
435
436 case VKI_SYS_ACCEPT: {
437 /* int accept(int s, struct sockaddr *addr, int *addrlen); */
438 PRE_MEM_READ( "socketcall.accept(args)", ARG2, 3*sizeof(Addr) );
439 ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 );
440 break;
441 }
442
443 case VKI_SYS_SENDTO:
444 /* int sendto(int s, const void *msg, int len,
445 unsigned int flags,
446 const struct sockaddr *to, int tolen); */
447 PRE_MEM_READ( "socketcall.sendto(args)", ARG2, 6*sizeof(Addr) );
448 ML_(generic_PRE_sys_sendto)( tid, ARG2_0, ARG2_1, ARG2_2,
449 ARG2_3, ARG2_4, ARG2_5 );
450 break;
451
452 case VKI_SYS_SEND:
453 /* int send(int s, const void *msg, size_t len, int flags); */
454 PRE_MEM_READ( "socketcall.send(args)", ARG2, 4*sizeof(Addr) );
455 ML_(generic_PRE_sys_send)( tid, ARG2_0, ARG2_1, ARG2_2 );
456 break;
457
458 case VKI_SYS_RECVFROM:
459 /* int recvfrom(int s, void *buf, int len, unsigned int flags,
460 struct sockaddr *from, int *fromlen); */
461 PRE_MEM_READ( "socketcall.recvfrom(args)", ARG2, 6*sizeof(Addr) );
462 ML_(generic_PRE_sys_recvfrom)( tid, ARG2_0, ARG2_1, ARG2_2,
463 ARG2_3, ARG2_4, ARG2_5 );
464 break;
465
466 case VKI_SYS_RECV:
467 /* int recv(int s, void *buf, int len, unsigned int flags); */
468 /* man 2 recv says:
469 The recv call is normally used only on a connected socket
470 (see connect(2)) and is identical to recvfrom with a NULL
471 from parameter.
472 */
473 PRE_MEM_READ( "socketcall.recv(args)", ARG2, 4*sizeof(Addr) );
474 ML_(generic_PRE_sys_recv)( tid, ARG2_0, ARG2_1, ARG2_2 );
475 break;
476
477 case VKI_SYS_CONNECT:
478 /* int connect(int sockfd,
479 struct sockaddr *serv_addr, int addrlen ); */
480 PRE_MEM_READ( "socketcall.connect(args)", ARG2, 3*sizeof(Addr) );
481 ML_(generic_PRE_sys_connect)( tid, ARG2_0, ARG2_1, ARG2_2 );
482 break;
483
484 case VKI_SYS_SETSOCKOPT:
485 /* int setsockopt(int s, int level, int optname,
486 const void *optval, int optlen); */
487 PRE_MEM_READ( "socketcall.setsockopt(args)", ARG2, 5*sizeof(Addr) );
488 ML_(generic_PRE_sys_setsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
489 ARG2_3, ARG2_4 );
490 break;
491
492 case VKI_SYS_GETSOCKOPT:
493 /* int getsockopt(int s, int level, int optname,
494 void *optval, socklen_t *optlen); */
495 PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) );
496 ML_(generic_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
497 ARG2_3, ARG2_4 );
498 break;
499
500 case VKI_SYS_GETSOCKNAME:
501 /* int getsockname(int s, struct sockaddr* name, int* namelen) */
502 PRE_MEM_READ( "socketcall.getsockname(args)", ARG2, 3*sizeof(Addr) );
503 ML_(generic_PRE_sys_getsockname)( tid, ARG2_0, ARG2_1, ARG2_2 );
504 break;
505
506 case VKI_SYS_GETPEERNAME:
507 /* int getpeername(int s, struct sockaddr* name, int* namelen) */
508 PRE_MEM_READ( "socketcall.getpeername(args)", ARG2, 3*sizeof(Addr) );
509 ML_(generic_PRE_sys_getpeername)( tid, ARG2_0, ARG2_1, ARG2_2 );
510 break;
511
512 case VKI_SYS_SHUTDOWN:
513 /* int shutdown(int s, int how); */
514 PRE_MEM_READ( "socketcall.shutdown(args)", ARG2, 2*sizeof(Addr) );
515 break;
516
517 case VKI_SYS_SENDMSG: {
518 /* int sendmsg(int s, const struct msghdr *msg, int flags); */
519
520 /* this causes warnings, and I don't get why. glibc bug?
521 * (after all it's glibc providing the arguments array)
522 PRE_MEM_READ( "socketcall.sendmsg(args)", ARG2, 3*sizeof(Addr) );
523 */
524 ML_(generic_PRE_sys_sendmsg)( tid, ARG2_0, ARG2_1 );
525 break;
526 }
527
528 case VKI_SYS_RECVMSG: {
529 /* int recvmsg(int s, struct msghdr *msg, int flags); */
530
531 /* this causes warnings, and I don't get why. glibc bug?
532 * (after all it's glibc providing the arguments array)
533 PRE_MEM_READ("socketcall.recvmsg(args)", ARG2, 3*sizeof(Addr) );
534 */
535 ML_(generic_PRE_sys_recvmsg)( tid, ARG2_0, ARG2_1 );
536 break;
537 }
538
539 default:
540 VG_(message)(Vg_DebugMsg,"Warning: unhandled socketcall 0x%x",ARG1);
541 SET_STATUS_Failure( VKI_EINVAL );
542 break;
543 }
544# undef ARG2_0
545# undef ARG2_1
546# undef ARG2_2
547# undef ARG2_3
548# undef ARG2_4
549# undef ARG2_5
550}
551
552POST(sys_socketcall)
553{
554# define ARG2_0 (((UWord*)ARG2)[0])
555# define ARG2_1 (((UWord*)ARG2)[1])
556# define ARG2_2 (((UWord*)ARG2)[2])
557# define ARG2_3 (((UWord*)ARG2)[3])
558# define ARG2_4 (((UWord*)ARG2)[4])
559# define ARG2_5 (((UWord*)ARG2)[5])
560
561 SysRes r;
562 vg_assert(SUCCESS);
563 switch (ARG1 /* request */) {
564
565 case VKI_SYS_SOCKETPAIR:
566 r = ML_(generic_POST_sys_socketpair)(
567 tid, VG_(mk_SysRes_Success)(RES),
568 ARG2_0, ARG2_1, ARG2_2, ARG2_3
569 );
570 SET_STATUS_from_SysRes(r);
571 break;
572
573 case VKI_SYS_SOCKET:
574 r = ML_(generic_POST_sys_socket)( tid, VG_(mk_SysRes_Success)(RES) );
575 SET_STATUS_from_SysRes(r);
576 break;
577
578 case VKI_SYS_BIND:
579 /* int bind(int sockfd, struct sockaddr *my_addr,
580 int addrlen); */
581 break;
582
583 case VKI_SYS_LISTEN:
584 /* int listen(int s, int backlog); */
585 break;
586
587 case VKI_SYS_ACCEPT:
588 /* int accept(int s, struct sockaddr *addr, int *addrlen); */
589 r = ML_(generic_POST_sys_accept)( tid, VG_(mk_SysRes_Success)(RES),
590 ARG2_0, ARG2_1, ARG2_2 );
591 SET_STATUS_from_SysRes(r);
592 break;
593
594 case VKI_SYS_SENDTO:
595 break;
596
597 case VKI_SYS_SEND:
598 break;
599
600 case VKI_SYS_RECVFROM:
601 ML_(generic_POST_sys_recvfrom)( tid, VG_(mk_SysRes_Success)(RES),
602 ARG2_0, ARG2_1, ARG2_2,
603 ARG2_3, ARG2_4, ARG2_5 );
604 break;
605
606 case VKI_SYS_RECV:
607 ML_(generic_POST_sys_recv)( tid, RES, ARG2_0, ARG2_1, ARG2_2 );
608 break;
609
610 case VKI_SYS_CONNECT:
611 break;
612
613 case VKI_SYS_SETSOCKOPT:
614 break;
615
616 case VKI_SYS_GETSOCKOPT:
617 ML_(generic_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
618 ARG2_0, ARG2_1,
619 ARG2_2, ARG2_3, ARG2_4 );
620 break;
621
622 case VKI_SYS_GETSOCKNAME:
623 ML_(generic_POST_sys_getsockname)( tid, VG_(mk_SysRes_Success)(RES),
624 ARG2_0, ARG2_1, ARG2_2 );
625 break;
626
627 case VKI_SYS_GETPEERNAME:
628 ML_(generic_POST_sys_getpeername)( tid, VG_(mk_SysRes_Success)(RES),
629 ARG2_0, ARG2_1, ARG2_2 );
630 break;
631
632 case VKI_SYS_SHUTDOWN:
633 break;
634
635 case VKI_SYS_SENDMSG:
636 break;
637
638 case VKI_SYS_RECVMSG:
639 ML_(generic_POST_sys_recvmsg)( tid, ARG2_0, ARG2_1 );
640 break;
641
642 default:
643 VG_(message)(Vg_DebugMsg,"FATAL: unhandled socketcall 0x%x",ARG1);
644 VG_(core_panic)("... bye!\n");
645 break; /*NOTREACHED*/
646 }
647# undef ARG2_0
648# undef ARG2_1
649# undef ARG2_2
650# undef ARG2_3
651# undef ARG2_4
652# undef ARG2_5
653}
cerion85665ca2005-06-20 15:51:07 +0000654
tom9548a162005-09-30 08:07:53 +0000655PRE(sys_mmap)
656{
657 SysRes r;
658
659 PRINT("sys_mmap ( %p, %llu, %d, %d, %d, %d )",
660 ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 );
661 PRE_REG_READ6(long, "mmap",
662 unsigned long, start, unsigned long, length,
663 unsigned long, prot, unsigned long, flags,
664 unsigned long, fd, unsigned long, offset);
665
sewardj274461d2005-10-02 17:01:41 +0000666 r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
667 (Off64T)ARG6 );
tom9548a162005-09-30 08:07:53 +0000668 SET_STATUS_from_SysRes(r);
669}
670
671PRE(sys_mmap2)
672{
673 SysRes r;
674
675 // Exactly like old_mmap() except:
sewardje66f2e02006-12-30 17:45:08 +0000676 // - the file offset is specified in 4K units rather than bytes,
tom9548a162005-09-30 08:07:53 +0000677 // so that it can be used for files bigger than 2^32 bytes.
678 PRINT("sys_mmap2 ( %p, %llu, %d, %d, %d, %d )",
679 ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 );
680 PRE_REG_READ6(long, "mmap2",
681 unsigned long, start, unsigned long, length,
682 unsigned long, prot, unsigned long, flags,
683 unsigned long, fd, unsigned long, offset);
684
sewardj274461d2005-10-02 17:01:41 +0000685 r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
sewardje66f2e02006-12-30 17:45:08 +0000686 4096 * (Off64T)ARG6 );
tom9548a162005-09-30 08:07:53 +0000687 SET_STATUS_from_SysRes(r);
688}
689
cerion85665ca2005-06-20 15:51:07 +0000690// XXX: lstat64/fstat64/stat64 are generic, but not necessarily
691// applicable to every architecture -- I think only to 32-bit archs.
692// We're going to need something like linux/core_os32.h for such
693// things, eventually, I think. --njn
694PRE(sys_stat64)
695{
696 PRINT("sys_stat64 ( %p, %p )",ARG1,ARG2);
697 PRE_REG_READ2(long, "stat64", char *, file_name, struct stat64 *, buf);
698 PRE_MEM_RASCIIZ( "stat64(file_name)", ARG1 );
699 PRE_MEM_WRITE( "stat64(buf)", ARG2, sizeof(struct vki_stat64) );
700}
701
702POST(sys_stat64)
703{
704 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
705}
706
cerion508aef52005-06-24 15:26:49 +0000707PRE(sys_lstat64)
708{
709 PRINT("sys_lstat64 ( %p(%s), %p )",ARG1,ARG1,ARG2);
710 PRE_REG_READ2(long, "lstat64", char *, file_name, struct stat64 *, buf);
711 PRE_MEM_RASCIIZ( "lstat64(file_name)", ARG1 );
712 PRE_MEM_WRITE( "lstat64(buf)", ARG2, sizeof(struct vki_stat64) );
713}
714
715POST(sys_lstat64)
716{
717 vg_assert(SUCCESS);
718 if (RES == 0) {
719 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
720 }
721}
722
sewardj5b91c402006-07-24 10:06:09 +0000723PRE(sys_fstatat64)
724{
725 PRINT("sys_fstatat64 ( %d, %p(%s), %p )",ARG1,ARG2,ARG2,ARG3);
726 PRE_REG_READ3(long, "fstatat64",
727 int, dfd, char *, file_name, struct stat64 *, buf);
728 PRE_MEM_RASCIIZ( "fstatat64(file_name)", ARG2 );
729 PRE_MEM_WRITE( "fstatat64(buf)", ARG3, sizeof(struct vki_stat64) );
730}
731
732POST(sys_fstatat64)
733{
734 POST_MEM_WRITE( ARG3, sizeof(struct vki_stat64) );
735}
736
cerion85665ca2005-06-20 15:51:07 +0000737PRE(sys_fstat64)
738{
739 PRINT("sys_fstat64 ( %d, %p )",ARG1,ARG2);
740 PRE_REG_READ2(long, "fstat64", unsigned long, fd, struct stat64 *, buf);
741 PRE_MEM_WRITE( "fstat64(buf)", ARG2, sizeof(struct vki_stat64) );
742}
cerion508aef52005-06-24 15:26:49 +0000743
cerion85665ca2005-06-20 15:51:07 +0000744POST(sys_fstat64)
745{
746 POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
747}
748
cerion508aef52005-06-24 15:26:49 +0000749static Addr deref_Addr ( ThreadId tid, Addr a, Char* s )
750{
751 Addr* a_p = (Addr*)a;
752 PRE_MEM_READ( s, (Addr)a_p, sizeof(Addr) );
753 return *a_p;
754}
755
cerion508aef52005-06-24 15:26:49 +0000756PRE(sys_ipc)
757{
758 PRINT("sys_ipc ( %d, %d, %d, %d, %p, %d )", ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
759 // XXX: this is simplistic -- some args are not used in all circumstances.
760 PRE_REG_READ6(int, "ipc",
761 vki_uint, call, int, first, int, second, int, third,
762 void *, ptr, long, fifth)
763
764 switch (ARG1 /* call */) {
765 case VKI_SEMOP:
766 ML_(generic_PRE_sys_semop)( tid, ARG2, ARG5, ARG3 );
767 *flags |= SfMayBlock;
768 break;
769 case VKI_SEMGET:
770 break;
771 case VKI_SEMCTL:
772 {
773 UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
774 ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
775 break;
776 }
777 case VKI_SEMTIMEDOP:
778 ML_(generic_PRE_sys_semtimedop)( tid, ARG2, ARG5, ARG3, ARG6 );
779 *flags |= SfMayBlock;
780 break;
781 case VKI_MSGSND:
njnde5c5f52005-09-01 03:35:40 +0000782 ML_(linux_PRE_sys_msgsnd)( tid, ARG2, ARG5, ARG3, ARG4 );
cerion508aef52005-06-24 15:26:49 +0000783 if ((ARG4 & VKI_IPC_NOWAIT) == 0)
784 *flags |= SfMayBlock;
785 break;
786 case VKI_MSGRCV:
787 {
788 Addr msgp;
789 Word msgtyp;
790
791 msgp = deref_Addr( tid,
792 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
793 "msgrcv(msgp)" );
794 msgtyp = deref_Addr( tid,
795 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
796 "msgrcv(msgp)" );
797
njnde5c5f52005-09-01 03:35:40 +0000798 ML_(linux_PRE_sys_msgrcv)( tid, ARG2, msgp, ARG3, msgtyp, ARG4 );
cerion508aef52005-06-24 15:26:49 +0000799
800 if ((ARG4 & VKI_IPC_NOWAIT) == 0)
801 *flags |= SfMayBlock;
802 break;
803 }
804 case VKI_MSGGET:
805 break;
806 case VKI_MSGCTL:
njnde5c5f52005-09-01 03:35:40 +0000807 ML_(linux_PRE_sys_msgctl)( tid, ARG2, ARG3, ARG5 );
cerion508aef52005-06-24 15:26:49 +0000808 break;
809 case VKI_SHMAT:
810 {
811 UWord w;
812 PRE_MEM_WRITE( "shmat(raddr)", ARG4, sizeof(Addr) );
813 w = ML_(generic_PRE_sys_shmat)( tid, ARG2, ARG5, ARG3 );
814 if (w == 0)
815 SET_STATUS_Failure( VKI_EINVAL );
816 else
817 ARG5 = w;
818 break;
819 }
820 case VKI_SHMDT:
821 if (!ML_(generic_PRE_sys_shmdt)(tid, ARG5))
822 SET_STATUS_Failure( VKI_EINVAL );
823 break;
824 case VKI_SHMGET:
825 break;
826 case VKI_SHMCTL: /* IPCOP_shmctl */
827 ML_(generic_PRE_sys_shmctl)( tid, ARG2, ARG3, ARG5 );
828 break;
829 default:
830 VG_(message)(Vg_DebugMsg, "FATAL: unhandled syscall(ipc) %d", ARG1 );
831 VG_(core_panic)("... bye!\n");
832 break; /*NOTREACHED*/
833 }
834}
835
836POST(sys_ipc)
837{
838 vg_assert(SUCCESS);
839 switch (ARG1 /* call */) {
840 case VKI_SEMOP:
841 case VKI_SEMGET:
842 break;
843 case VKI_SEMCTL:
844 {
845 UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
846 ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
847 break;
848 }
849 case VKI_SEMTIMEDOP:
850 case VKI_MSGSND:
851 break;
852 case VKI_MSGRCV:
853 {
854 Addr msgp;
855 Word msgtyp;
856
857 msgp = deref_Addr( tid,
858 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
859 "msgrcv(msgp)" );
860 msgtyp = deref_Addr( tid,
861 (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
862 "msgrcv(msgp)" );
863
njna560c5c2005-09-01 16:27:28 +0000864 ML_(linux_POST_sys_msgrcv)( tid, RES, ARG2, msgp, ARG3, msgtyp, ARG4 );
cerion508aef52005-06-24 15:26:49 +0000865 break;
866 }
867 case VKI_MSGGET:
868 break;
869 case VKI_MSGCTL:
njna560c5c2005-09-01 16:27:28 +0000870 ML_(linux_POST_sys_msgctl)( tid, RES, ARG2, ARG3, ARG5 );
cerion508aef52005-06-24 15:26:49 +0000871 break;
872 case VKI_SHMAT:
873 {
874 Addr addr;
875
876 /* force readability. before the syscall it is
877 * indeed uninitialized, as can be seen in
878 * glibc/sysdeps/unix/sysv/linux/shmat.c */
879 POST_MEM_WRITE( ARG4, sizeof( Addr ) );
880
881 addr = deref_Addr ( tid, ARG4, "shmat(addr)" );
882 if ( addr > 0 ) {
883 ML_(generic_POST_sys_shmat)( tid, addr, ARG2, ARG5, ARG3 );
884 }
885 break;
886 }
887 case VKI_SHMDT:
888 ML_(generic_POST_sys_shmdt)( tid, RES, ARG5 );
889 break;
890 case VKI_SHMGET:
891 break;
892 case VKI_SHMCTL:
893 ML_(generic_POST_sys_shmctl)( tid, RES, ARG2, ARG3, ARG5 );
894 break;
895 default:
896 VG_(message)(Vg_DebugMsg,
897 "FATAL: unhandled syscall(ipc) %d",
898 ARG1 );
899 VG_(core_panic)("... bye!\n");
900 break; /*NOTREACHED*/
901 }
902}
903
904
cerion85665ca2005-06-20 15:51:07 +0000905
906
907//.. PRE(old_select, MayBlock)
908//.. {
909//.. /* struct sel_arg_struct {
910//.. unsigned long n;
911//.. fd_set *inp, *outp, *exp;
912//.. struct timeval *tvp;
913//.. };
914//.. */
915//.. PRE_REG_READ1(long, "old_select", struct sel_arg_struct *, args);
916//.. PRE_MEM_READ( "old_select(args)", ARG1, 5*sizeof(UWord) );
917//..
918//.. {
919//.. UInt* arg_struct = (UInt*)ARG1;
920//.. UInt a1, a2, a3, a4, a5;
921//..
922//.. a1 = arg_struct[0];
923//.. a2 = arg_struct[1];
924//.. a3 = arg_struct[2];
925//.. a4 = arg_struct[3];
926//.. a5 = arg_struct[4];
927//..
928//.. PRINT("old_select ( %d, %p, %p, %p, %p )", a1,a2,a3,a4,a5);
929//.. if (a2 != (Addr)NULL)
930//.. PRE_MEM_READ( "old_select(readfds)", a2, a1/8 /* __FD_SETSIZE/8 */ );
931//.. if (a3 != (Addr)NULL)
932//.. PRE_MEM_READ( "old_select(writefds)", a3, a1/8 /* __FD_SETSIZE/8 */ );
933//.. if (a4 != (Addr)NULL)
934//.. PRE_MEM_READ( "old_select(exceptfds)", a4, a1/8 /* __FD_SETSIZE/8 */ );
935//.. if (a5 != (Addr)NULL)
936//.. PRE_MEM_READ( "old_select(timeout)", a5, sizeof(struct vki_timeval) );
937//.. }
938//.. }
939
sewardje23772f2005-07-02 11:27:02 +0000940PRE(sys_clone)
941{
942 UInt cloneflags;
943
944 PRINT("sys_clone ( %x, %p, %p, %p, %p )",ARG1,ARG2,ARG3,ARG4,ARG5);
945 PRE_REG_READ5(int, "clone",
946 unsigned long, flags,
sewardje21058c2005-08-05 02:15:18 +0000947 void *, child_stack,
948 int *, parent_tidptr,
949 void *, child_tls,
950 int *, child_tidptr);
sewardje23772f2005-07-02 11:27:02 +0000951
952 if (ARG1 & VKI_CLONE_PARENT_SETTID) {
953 PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int));
sewardja48a4932005-09-29 11:09:56 +0000954 if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int),
955 VKI_PROT_WRITE)) {
sewardje23772f2005-07-02 11:27:02 +0000956 SET_STATUS_Failure( VKI_EFAULT );
957 return;
958 }
959 }
960 if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) {
961 PRE_MEM_WRITE("clone(child_tidptr)", ARG5, sizeof(Int));
sewardja48a4932005-09-29 11:09:56 +0000962 if (!VG_(am_is_valid_for_client)(ARG5, sizeof(Int),
963 VKI_PROT_WRITE)) {
sewardje23772f2005-07-02 11:27:02 +0000964 SET_STATUS_Failure( VKI_EFAULT );
965 return;
966 }
967 }
968
sewardje23772f2005-07-02 11:27:02 +0000969 cloneflags = ARG1;
970
971 if (!ML_(client_signal_OK)(ARG1 & VKI_CSIGNAL)) {
972 SET_STATUS_Failure( VKI_EINVAL );
973 return;
974 }
975
976 /* Only look at the flags we really care about */
977 switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS
978 | VKI_CLONE_FILES | VKI_CLONE_VFORK)) {
979 case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES:
980 /* thread creation */
981 SET_STATUS_from_SysRes(
982 do_clone(tid,
983 ARG1, /* flags */
984 (Addr)ARG2, /* child SP */
985 (Int *)ARG3, /* parent_tidptr */
986 (Int *)ARG5, /* child_tidptr */
sewardj6a324492005-08-05 00:10:11 +0000987 (Addr)ARG4)); /* child_tls */
sewardje23772f2005-07-02 11:27:02 +0000988 break;
989
990 case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */
991 /* FALLTHROUGH - assume vfork == fork */
992 cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM);
993
994 case 0: /* plain fork */
995 SET_STATUS_from_SysRes(
njne1486662005-11-10 02:48:04 +0000996 ML_(do_fork_clone)(tid,
sewardje23772f2005-07-02 11:27:02 +0000997 cloneflags, /* flags */
sewardje23772f2005-07-02 11:27:02 +0000998 (Int *)ARG3, /* parent_tidptr */
999 (Int *)ARG5)); /* child_tidptr */
1000 break;
1001
1002 default:
1003 /* should we just ENOSYS? */
1004 VG_(message)(Vg_UserMsg, "Unsupported clone() flags: 0x%x", ARG1);
1005 VG_(message)(Vg_UserMsg, "");
1006 VG_(message)(Vg_UserMsg, "The only supported clone() uses are:");
1007 VG_(message)(Vg_UserMsg, " - via a threads library (LinuxThreads or NPTL)");
1008 VG_(message)(Vg_UserMsg, " - via the implementation of fork or vfork");
1009 VG_(unimplemented)
1010 ("Valgrind does not support general clone().");
1011 }
1012
1013 if (SUCCESS) {
1014 if (ARG1 & VKI_CLONE_PARENT_SETTID)
1015 POST_MEM_WRITE(ARG3, sizeof(Int));
1016 if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID))
1017 POST_MEM_WRITE(ARG5, sizeof(Int));
1018
1019 /* Thread creation was successful; let the child have the chance
1020 to run */
1021 *flags |= SfYieldAfter;
1022 }
1023}
cerion85665ca2005-06-20 15:51:07 +00001024
sewardjb865b162005-07-08 18:26:37 +00001025PRE(sys_sigreturn)
1026{
sewardjcba8f432007-03-19 14:34:08 +00001027 /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
1028 an explanation of what follows. */
1029
sewardjb865b162005-07-08 18:26:37 +00001030 ThreadState* tst;
sewardjcba8f432007-03-19 14:34:08 +00001031 PRINT("sys_sigreturn ( )");
sewardjb865b162005-07-08 18:26:37 +00001032
1033 vg_assert(VG_(is_valid_tid)(tid));
1034 vg_assert(tid >= 1 && tid < VG_N_THREADS);
1035 vg_assert(VG_(is_running_thread)(tid));
1036
1037 ///* Adjust esp to point to start of frame; skip back up over
1038 // sigreturn sequence's "popl %eax" and handler ret addr */
1039 tst = VG_(get_ThreadState)(tid);
1040 //tst->arch.vex.guest_ESP -= sizeof(Addr)+sizeof(Word);
sewardj4ce89e12005-11-16 19:15:33 +00001041 // Should we do something equivalent on ppc32? Who knows.
sewardjb865b162005-07-08 18:26:37 +00001042
1043 ///* This is only so that the EIP is (might be) useful to report if
1044 // something goes wrong in the sigreturn */
1045 //ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
sewardj4ce89e12005-11-16 19:15:33 +00001046 // Should we do something equivalent on ppc32? Who knows.
sewardjb865b162005-07-08 18:26:37 +00001047
sewardjcba8f432007-03-19 14:34:08 +00001048 /* Restore register state from frame and remove it */
sewardjb865b162005-07-08 18:26:37 +00001049 VG_(sigframe_destroy)(tid, False);
1050
sewardjcba8f432007-03-19 14:34:08 +00001051 /* Tell the driver not to update the guest state with the "result",
1052 and set a bogus result to keep it happy. */
1053 *flags |= SfNoWriteResult;
1054 SET_STATUS_Success(0);
sewardjb865b162005-07-08 18:26:37 +00001055
sewardjcba8f432007-03-19 14:34:08 +00001056 /* Check to see if any signals arose as a result of this. */
sewardjb865b162005-07-08 18:26:37 +00001057 *flags |= SfPollAfter;
1058}
1059
sewardj4ce89e12005-11-16 19:15:33 +00001060PRE(sys_rt_sigreturn)
1061{
sewardjcba8f432007-03-19 14:34:08 +00001062 /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
1063 an explanation of what follows. */
1064
sewardj4ce89e12005-11-16 19:15:33 +00001065 ThreadState* tst;
1066 PRINT("rt_sigreturn ( )");
cerion85665ca2005-06-20 15:51:07 +00001067
sewardj4ce89e12005-11-16 19:15:33 +00001068 vg_assert(VG_(is_valid_tid)(tid));
1069 vg_assert(tid >= 1 && tid < VG_N_THREADS);
1070 vg_assert(VG_(is_running_thread)(tid));
1071
1072 ///* Adjust esp to point to start of frame; skip back up over handler
1073 // ret addr */
1074 tst = VG_(get_ThreadState)(tid);
1075 //tst->arch.vex.guest_ESP -= sizeof(Addr);
1076 // Should we do something equivalent on ppc32? Who knows.
1077
1078 ///* This is only so that the EIP is (might be) useful to report if
1079 // something goes wrong in the sigreturn */
1080 //ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
1081 // Should we do something equivalent on ppc32? Who knows.
1082
sewardjcba8f432007-03-19 14:34:08 +00001083 /* Restore register state from frame and remove it */
sewardj4ce89e12005-11-16 19:15:33 +00001084 VG_(sigframe_destroy)(tid, True);
1085
sewardjcba8f432007-03-19 14:34:08 +00001086 /* Tell the driver not to update the guest state with the "result",
1087 and set a bogus result to keep it happy. */
1088 *flags |= SfNoWriteResult;
1089 SET_STATUS_Success(0);
sewardj4ce89e12005-11-16 19:15:33 +00001090
sewardjcba8f432007-03-19 14:34:08 +00001091 /* Check to see if any signals arose as a result of this. */
sewardj4ce89e12005-11-16 19:15:33 +00001092 *flags |= SfPollAfter;
1093}
1094
cerion85665ca2005-06-20 15:51:07 +00001095
1096//.. PRE(sys_modify_ldt, Special)
1097//.. {
1098//.. PRINT("sys_modify_ldt ( %d, %p, %d )", ARG1,ARG2,ARG3);
1099//.. PRE_REG_READ3(int, "modify_ldt", int, func, void *, ptr,
1100//.. unsigned long, bytecount);
1101//..
1102//.. if (ARG1 == 0) {
1103//.. /* read the LDT into ptr */
1104//.. PRE_MEM_WRITE( "modify_ldt(ptr)", ARG2, ARG3 );
1105//.. }
1106//.. if (ARG1 == 1 || ARG1 == 0x11) {
1107//.. /* write the LDT with the entry pointed at by ptr */
1108//.. PRE_MEM_READ( "modify_ldt(ptr)", ARG2, sizeof(vki_modify_ldt_t) );
1109//.. }
1110//.. /* "do" the syscall ourselves; the kernel never sees it */
1111//.. SET_RESULT( VG_(sys_modify_ldt)( tid, ARG1, (void*)ARG2, ARG3 ) );
1112//..
1113//.. if (ARG1 == 0 && !VG_(is_kerror)(RES) && RES > 0) {
1114//.. POST_MEM_WRITE( ARG2, RES );
1115//.. }
1116//.. }
1117
1118//.. PRE(sys_set_thread_area, Special)
1119//.. {
1120//.. PRINT("sys_set_thread_area ( %p )", ARG1);
1121//.. PRE_REG_READ1(int, "set_thread_area", struct user_desc *, u_info)
1122//.. PRE_MEM_READ( "set_thread_area(u_info)", ARG1, sizeof(vki_modify_ldt_t) );
1123//..
1124//.. /* "do" the syscall ourselves; the kernel never sees it */
1125//.. SET_RESULT( VG_(sys_set_thread_area)( tid, (void *)ARG1 ) );
1126//.. }
1127
1128//.. PRE(sys_get_thread_area, Special)
1129//.. {
1130//.. PRINT("sys_get_thread_area ( %p )", ARG1);
1131//.. PRE_REG_READ1(int, "get_thread_area", struct user_desc *, u_info)
1132//.. PRE_MEM_WRITE( "get_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_get_thread_area)( tid, (void *)ARG1 ) );
1136//..
1137//.. if (!VG_(is_kerror)(RES)) {
1138//.. POST_MEM_WRITE( ARG1, sizeof(vki_modify_ldt_t) );
1139//.. }
1140//.. }
1141
1142//.. // Parts of this are ppc32-specific, but the *PEEK* cases are generic.
1143//.. // XXX: Why is the memory pointed to by ARG3 never checked?
1144//.. PRE(sys_ptrace, 0)
1145//.. {
1146//.. PRINT("sys_ptrace ( %d, %d, %p, %p )", ARG1,ARG2,ARG3,ARG4);
1147//.. PRE_REG_READ4(int, "ptrace",
1148//.. long, request, long, pid, long, addr, long, data);
1149//.. switch (ARG1) {
1150//.. case VKI_PTRACE_PEEKTEXT:
1151//.. case VKI_PTRACE_PEEKDATA:
1152//.. case VKI_PTRACE_PEEKUSR:
1153//.. PRE_MEM_WRITE( "ptrace(peek)", ARG4,
1154//.. sizeof (long));
1155//.. break;
1156//.. case VKI_PTRACE_GETREGS:
1157//.. PRE_MEM_WRITE( "ptrace(getregs)", ARG4,
1158//.. sizeof (struct vki_user_regs_struct));
1159//.. break;
1160//.. case VKI_PTRACE_GETFPREGS:
1161//.. PRE_MEM_WRITE( "ptrace(getfpregs)", ARG4,
1162//.. sizeof (struct vki_user_i387_struct));
1163//.. break;
1164//.. case VKI_PTRACE_GETFPXREGS:
1165//.. PRE_MEM_WRITE( "ptrace(getfpxregs)", ARG4,
1166//.. sizeof(struct vki_user_fxsr_struct) );
1167//.. break;
1168//.. case VKI_PTRACE_SETREGS:
1169//.. PRE_MEM_READ( "ptrace(setregs)", ARG4,
1170//.. sizeof (struct vki_user_regs_struct));
1171//.. break;
1172//.. case VKI_PTRACE_SETFPREGS:
1173//.. PRE_MEM_READ( "ptrace(setfpregs)", ARG4,
1174//.. sizeof (struct vki_user_i387_struct));
1175//.. break;
1176//.. case VKI_PTRACE_SETFPXREGS:
1177//.. PRE_MEM_READ( "ptrace(setfpxregs)", ARG4,
1178//.. sizeof(struct vki_user_fxsr_struct) );
1179//.. break;
1180//.. default:
1181//.. break;
1182//.. }
1183//.. }
1184
1185//.. POST(sys_ptrace)
1186//.. {
1187//.. switch (ARG1) {
1188//.. case VKI_PTRACE_PEEKTEXT:
1189//.. case VKI_PTRACE_PEEKDATA:
1190//.. case VKI_PTRACE_PEEKUSR:
1191//.. POST_MEM_WRITE( ARG4, sizeof (long));
1192//.. break;
1193//.. case VKI_PTRACE_GETREGS:
1194//.. POST_MEM_WRITE( ARG4, sizeof (struct vki_user_regs_struct));
1195//.. break;
1196//.. case VKI_PTRACE_GETFPREGS:
1197//.. POST_MEM_WRITE( ARG4, sizeof (struct vki_user_i387_struct));
1198//.. break;
1199//.. case VKI_PTRACE_GETFPXREGS:
1200//.. POST_MEM_WRITE( ARG4, sizeof(struct vki_user_fxsr_struct) );
1201//.. break;
1202//.. default:
1203//.. break;
1204//.. }
1205//.. }
1206
1207//.. // XXX: this duplicates a function in coregrind/vg_syscalls.c, yuk
1208//.. static Addr deref_Addr ( ThreadId tid, Addr a, Char* s )
1209//.. {
1210//.. Addr* a_p = (Addr*)a;
1211//.. PRE_MEM_READ( s, (Addr)a_p, sizeof(Addr) );
1212//.. return *a_p;
1213//.. }
1214
1215//.. // XXX: should use the constants here (eg. SHMAT), not the numbers directly!
1216//.. PRE(sys_ipc, 0)
1217//.. {
1218//.. PRINT("sys_ipc ( %d, %d, %d, %d, %p, %d )", ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
1219//.. // XXX: this is simplistic -- some args are not used in all circumstances.
1220//.. PRE_REG_READ6(int, "ipc",
1221//.. vki_uint, call, int, first, int, second, int, third,
1222//.. void *, ptr, long, fifth)
1223//..
1224//.. switch (ARG1 /* call */) {
1225//.. case VKI_SEMOP:
cerion7b2c38c2005-06-23 07:52:54 +00001226//.. ML_(generic_PRE_sys_semop)( tid, ARG2, ARG5, ARG3 );
cerion85665ca2005-06-20 15:51:07 +00001227//.. /* tst->sys_flags |= MayBlock; */
1228//.. break;
1229//.. case VKI_SEMGET:
1230//.. break;
1231//.. case VKI_SEMCTL:
1232//.. {
1233//.. UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
cerion7b2c38c2005-06-23 07:52:54 +00001234//.. ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
cerion85665ca2005-06-20 15:51:07 +00001235//.. break;
1236//.. }
1237//.. case VKI_SEMTIMEDOP:
cerion7b2c38c2005-06-23 07:52:54 +00001238//.. ML_(generic_PRE_sys_semtimedop)( tid, ARG2, ARG5, ARG3, ARG6 );
cerion85665ca2005-06-20 15:51:07 +00001239//.. /* tst->sys_flags |= MayBlock; */
1240//.. break;
1241//.. case VKI_MSGSND:
njnde5c5f52005-09-01 03:35:40 +00001242//.. ML_(linux_PRE_sys_msgsnd)( tid, ARG2, ARG5, ARG3, ARG4 );
cerion85665ca2005-06-20 15:51:07 +00001243//.. /* if ((ARG4 & VKI_IPC_NOWAIT) == 0)
1244//.. tst->sys_flags |= MayBlock;
1245//.. */
1246//.. break;
1247//.. case VKI_MSGRCV:
1248//.. {
1249//.. Addr msgp;
1250//.. Word msgtyp;
1251//..
1252//.. msgp = deref_Addr( tid,
1253//.. (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
1254//.. "msgrcv(msgp)" );
1255//.. msgtyp = deref_Addr( tid,
1256//.. (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
1257//.. "msgrcv(msgp)" );
1258//..
njnde5c5f52005-09-01 03:35:40 +00001259//.. ML_(linux_PRE_sys_msgrcv)( tid, ARG2, msgp, ARG3, msgtyp, ARG4 );
cerion85665ca2005-06-20 15:51:07 +00001260//..
1261//.. /* if ((ARG4 & VKI_IPC_NOWAIT) == 0)
1262//.. tst->sys_flags |= MayBlock;
1263//.. */
1264//.. break;
1265//.. }
1266//.. case VKI_MSGGET:
1267//.. break;
1268//.. case VKI_MSGCTL:
njnde5c5f52005-09-01 03:35:40 +00001269//.. ML_(linux_PRE_sys_msgctl)( tid, ARG2, ARG3, ARG5 );
cerion85665ca2005-06-20 15:51:07 +00001270//.. break;
1271//.. case VKI_SHMAT:
1272//.. PRE_MEM_WRITE( "shmat(raddr)", ARG4, sizeof(Addr) );
cerion7b2c38c2005-06-23 07:52:54 +00001273//.. ARG5 = ML_(generic_PRE_sys_shmat)( tid, ARG2, ARG5, ARG3 );
cerion85665ca2005-06-20 15:51:07 +00001274//.. if (ARG5 == 0)
1275//.. SET_RESULT( -VKI_EINVAL );
1276//.. break;
1277//.. case VKI_SHMDT:
cerion7b2c38c2005-06-23 07:52:54 +00001278//.. if (!ML_(generic_PRE_sys_shmdt)(tid, ARG5))
cerion85665ca2005-06-20 15:51:07 +00001279//.. SET_RESULT( -VKI_EINVAL );
1280//.. break;
1281//.. case VKI_SHMGET:
1282//.. break;
1283//.. case VKI_SHMCTL: /* IPCOP_shmctl */
cerion7b2c38c2005-06-23 07:52:54 +00001284//.. ML_(generic_PRE_sys_shmctl)( tid, ARG2, ARG3, ARG5 );
cerion85665ca2005-06-20 15:51:07 +00001285//.. break;
1286//.. default:
1287//.. VG_(message)(Vg_DebugMsg, "FATAL: unhandled syscall(ipc) %d", ARG1 );
1288//.. VG_(core_panic)("... bye!\n");
1289//.. break; /*NOTREACHED*/
1290//.. }
1291//.. }
1292
1293//.. POST(sys_ipc)
1294//.. {
1295//.. switch (ARG1 /* call */) {
1296//.. case VKI_SEMOP:
1297//.. case VKI_SEMGET:
1298//.. break;
1299//.. case VKI_SEMCTL:
1300//.. {
1301//.. UWord arg = deref_Addr( tid, ARG5, "semctl(arg)" );
cerion7b2c38c2005-06-23 07:52:54 +00001302//.. ML_(generic_PRE_sys_semctl)( tid, ARG2, ARG3, ARG4, arg );
cerion85665ca2005-06-20 15:51:07 +00001303//.. break;
1304//.. }
1305//.. case VKI_SEMTIMEDOP:
1306//.. case VKI_MSGSND:
1307//.. break;
1308//.. case VKI_MSGRCV:
1309//.. {
1310//.. Addr msgp;
1311//.. Word msgtyp;
1312//..
1313//.. msgp = deref_Addr( tid,
1314//.. (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgp),
1315//.. "msgrcv(msgp)" );
1316//.. msgtyp = deref_Addr( tid,
1317//.. (Addr) (&((struct vki_ipc_kludge *)ARG5)->msgtyp),
1318//.. "msgrcv(msgp)" );
1319//..
njna560c5c2005-09-01 16:27:28 +00001320//.. ML_(linux_POST_sys_msgrcv)( tid, RES, ARG2, msgp, ARG3, msgtyp, ARG4 );
cerion85665ca2005-06-20 15:51:07 +00001321//.. break;
1322//.. }
1323//.. case VKI_MSGGET:
1324//.. break;
1325//.. case VKI_MSGCTL:
njna560c5c2005-09-01 16:27:28 +00001326//.. ML_(linux_POST_sys_msgctl)( tid, RES, ARG2, ARG3, ARG5 );
cerion85665ca2005-06-20 15:51:07 +00001327//.. break;
1328//.. case VKI_SHMAT:
1329//.. {
1330//.. Addr addr;
1331//..
1332//.. /* force readability. before the syscall it is
1333//.. * indeed uninitialized, as can be seen in
1334//.. * glibc/sysdeps/unix/sysv/linux/shmat.c */
1335//.. POST_MEM_WRITE( ARG4, sizeof( Addr ) );
1336//..
1337//.. addr = deref_Addr ( tid, ARG4, "shmat(addr)" );
1338//.. if ( addr > 0 ) {
cerion7b2c38c2005-06-23 07:52:54 +00001339//.. ML_(generic_POST_sys_shmat)( tid, addr, ARG2, ARG5, ARG3 );
cerion85665ca2005-06-20 15:51:07 +00001340//.. }
1341//.. break;
1342//.. }
1343//.. case VKI_SHMDT:
cerion7b2c38c2005-06-23 07:52:54 +00001344//.. ML_(generic_POST_sys_shmdt)( tid, RES, ARG5 );
cerion85665ca2005-06-20 15:51:07 +00001345//.. break;
1346//.. case VKI_SHMGET:
1347//.. break;
1348//.. case VKI_SHMCTL:
cerion7b2c38c2005-06-23 07:52:54 +00001349//.. ML_(generic_POST_sys_shmctl)( tid, RES, ARG2, ARG3, ARG5 );
cerion85665ca2005-06-20 15:51:07 +00001350//.. break;
1351//.. default:
1352//.. VG_(message)(Vg_DebugMsg,
1353//.. "FATAL: unhandled syscall(ipc) %d",
1354//.. ARG1 );
1355//.. VG_(core_panic)("... bye!\n");
1356//.. break; /*NOTREACHED*/
1357//.. }
1358//.. }
1359
1360
sewardj3849cc52005-11-07 15:48:31 +00001361/* Convert from non-RT to RT sigset_t's */
1362static
1363void convert_sigset_to_rt(const vki_old_sigset_t *oldset, vki_sigset_t *set)
1364{
1365 VG_(sigemptyset)(set);
1366 set->sig[0] = *oldset;
1367}
1368PRE(sys_sigaction)
1369{
1370 struct vki_sigaction new, old;
1371 struct vki_sigaction *newp, *oldp;
cerion85665ca2005-06-20 15:51:07 +00001372
sewardj3849cc52005-11-07 15:48:31 +00001373 PRINT("sys_sigaction ( %d, %p, %p )", ARG1,ARG2,ARG3);
1374 PRE_REG_READ3(int, "sigaction",
1375 int, signum, const struct old_sigaction *, act,
1376 struct old_sigaction *, oldact);
cerion85665ca2005-06-20 15:51:07 +00001377
sewardj3849cc52005-11-07 15:48:31 +00001378 newp = oldp = NULL;
1379
1380 if (ARG2 != 0) {
1381 struct vki_old_sigaction *sa = (struct vki_old_sigaction *)ARG2;
1382 PRE_MEM_READ( "sigaction(act->sa_handler)", (Addr)&sa->ksa_handler, sizeof(sa->ksa_handler));
1383 PRE_MEM_READ( "sigaction(act->sa_mask)", (Addr)&sa->sa_mask, sizeof(sa->sa_mask));
1384 PRE_MEM_READ( "sigaction(act->sa_flags)", (Addr)&sa->sa_flags, sizeof(sa->sa_flags));
1385 if (ML_(safe_to_deref)(sa,sizeof(sa))
1386 && (sa->sa_flags & VKI_SA_RESTORER))
1387 PRE_MEM_READ( "sigaction(act->sa_restorer)", (Addr)&sa->sa_restorer, sizeof(sa->sa_restorer));
1388 }
1389
1390 if (ARG3 != 0) {
1391 PRE_MEM_WRITE( "sigaction(oldact)", ARG3, sizeof(struct vki_old_sigaction));
1392 oldp = &old;
1393 }
1394
1395 //jrs 20050207: what?! how can this make any sense?
1396 //if (VG_(is_kerror)(SYSRES))
1397 // return;
1398
1399 if (ARG2 != 0) {
1400 struct vki_old_sigaction *oldnew = (struct vki_old_sigaction *)ARG2;
1401
1402 new.ksa_handler = oldnew->ksa_handler;
1403 new.sa_flags = oldnew->sa_flags;
1404 new.sa_restorer = oldnew->sa_restorer;
1405 convert_sigset_to_rt(&oldnew->sa_mask, &new.sa_mask);
1406 newp = &new;
1407 }
1408
1409 SET_STATUS_from_SysRes( VG_(do_sys_sigaction)(ARG1, newp, oldp) );
1410
1411 if (ARG3 != 0 && SUCCESS && RES == 0) {
1412 struct vki_old_sigaction *oldold = (struct vki_old_sigaction *)ARG3;
1413
1414 oldold->ksa_handler = oldp->ksa_handler;
1415 oldold->sa_flags = oldp->sa_flags;
1416 oldold->sa_restorer = oldp->sa_restorer;
1417 oldold->sa_mask = oldp->sa_mask.sig[0];
1418 }
1419}
1420
1421POST(sys_sigaction)
1422{
1423 vg_assert(SUCCESS);
1424 if (RES == 0 && ARG3 != 0)
1425 POST_MEM_WRITE( ARG3, sizeof(struct vki_old_sigaction));
1426}
1427
tom313639f2006-04-03 16:38:33 +00001428PRE(sys_sigsuspend)
1429{
1430 /* The C library interface to sigsuspend just takes a pointer to
1431 a signal mask but this system call only takes the first word of
1432 the signal mask as an argument so only 32 signals are supported.
1433
1434 In fact glibc normally uses rt_sigsuspend if it is available as
1435 that takes a pointer to the signal mask so supports more signals.
1436 */
1437 *flags |= SfMayBlock;
1438 PRINT("sys_sigsuspend ( %d )", ARG1 );
1439 PRE_REG_READ1(int, "sigsuspend", vki_old_sigset_t, mask);
1440}
1441
cerion85665ca2005-06-20 15:51:07 +00001442
1443#undef PRE
1444#undef POST
1445
cerion85665ca2005-06-20 15:51:07 +00001446/* ---------------------------------------------------------------------
1447 The ppc32/Linux syscall table
1448 ------------------------------------------------------------------ */
1449
1450/* Add an ppc32-linux specific wrapper to a syscall table. */
1451#define PLAX_(sysno, name) WRAPPER_ENTRY_X_(ppc32_linux, sysno, name)
1452#define PLAXY(sysno, name) WRAPPER_ENTRY_XY(ppc32_linux, sysno, name)
1453
1454// This table maps from __NR_xxx syscall numbers (from
1455// linux/include/asm-ppc/unistd.h) to the appropriate PRE/POST sys_foo()
1456// wrappers on ppc32 (as per sys_call_table in linux/arch/ppc/kernel/entry.S).
1457//
1458// For those syscalls not handled by Valgrind, the annotation indicate its
1459// arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/?
1460// (unknown).
1461
njnaf839f52005-06-23 03:27:57 +00001462const SyscallTableEntry ML_(syscall_table)[] = {
cerion85665ca2005-06-20 15:51:07 +00001463//.. (restart_syscall) // 0
sewardja932d292005-07-08 00:18:25 +00001464 GENX_(__NR_exit, sys_exit), // 1
sewardjfbba3712005-11-13 02:41:58 +00001465 GENX_(__NR_fork, sys_fork), // 2
sewardja932d292005-07-08 00:18:25 +00001466 GENXY(__NR_read, sys_read), // 3
1467 GENX_(__NR_write, sys_write), // 4
cerion85665ca2005-06-20 15:51:07 +00001468
sewardja932d292005-07-08 00:18:25 +00001469 GENXY(__NR_open, sys_open), // 5
1470 GENXY(__NR_close, sys_close), // 6
1471 GENXY(__NR_waitpid, sys_waitpid), // 7
1472 GENXY(__NR_creat, sys_creat), // 8
sewardjb865b162005-07-08 18:26:37 +00001473 GENX_(__NR_link, sys_link), // 9
1474
sewardja932d292005-07-08 00:18:25 +00001475 GENX_(__NR_unlink, sys_unlink), // 10
1476 GENX_(__NR_execve, sys_execve), // 11
sewardjb865b162005-07-08 18:26:37 +00001477 GENX_(__NR_chdir, sys_chdir), // 12
sewardja932d292005-07-08 00:18:25 +00001478 GENXY(__NR_time, sys_time), // 13
tom313639f2006-04-03 16:38:33 +00001479 GENX_(__NR_mknod, sys_mknod), // 14
cerion85665ca2005-06-20 15:51:07 +00001480//..
sewardja932d292005-07-08 00:18:25 +00001481 GENX_(__NR_chmod, sys_chmod), // 15
sewardja58bbbc2006-04-14 01:04:04 +00001482 GENX_(__NR_lchown, sys_lchown), // 16 ## P
cerion85665ca2005-06-20 15:51:07 +00001483//.. GENX_(__NR_break, sys_ni_syscall), // 17
1484//.. // (__NR_oldstat, sys_stat), // 18 (obsolete)
njncd405ea2005-08-31 02:44:31 +00001485 LINX_(__NR_lseek, sys_lseek), // 19
cerion85665ca2005-06-20 15:51:07 +00001486//..
sewardja932d292005-07-08 00:18:25 +00001487 GENX_(__NR_getpid, sys_getpid), // 20
sewardja58bbbc2006-04-14 01:04:04 +00001488 LINX_(__NR_mount, sys_mount), // 21
1489 LINX_(__NR_umount, sys_oldumount), // 22
1490 GENX_(__NR_setuid, sys_setuid), // 23 ## P
1491 GENX_(__NR_getuid, sys_getuid), // 24 ## P
cerion85665ca2005-06-20 15:51:07 +00001492//..
1493//.. // (__NR_stime, sys_stime), // 25 * (SVr4,SVID,X/OPEN)
1494//.. PLAXY(__NR_ptrace, sys_ptrace), // 26
sewardja9fff9b2005-08-19 10:07:29 +00001495 GENX_(__NR_alarm, sys_alarm), // 27
cerion85665ca2005-06-20 15:51:07 +00001496//.. // (__NR_oldfstat, sys_fstat), // 28 * L -- obsolete
sewardja932d292005-07-08 00:18:25 +00001497 GENX_(__NR_pause, sys_pause), // 29
cerion85665ca2005-06-20 15:51:07 +00001498//..
njncd405ea2005-08-31 02:44:31 +00001499 LINX_(__NR_utime, sys_utime), // 30
cerion85665ca2005-06-20 15:51:07 +00001500//.. GENX_(__NR_stty, sys_ni_syscall), // 31
1501//.. GENX_(__NR_gtty, sys_ni_syscall), // 32
sewardja932d292005-07-08 00:18:25 +00001502 GENX_(__NR_access, sys_access), // 33
cerion85665ca2005-06-20 15:51:07 +00001503//.. GENX_(__NR_nice, sys_nice), // 34
1504//..
1505//.. GENX_(__NR_ftime, sys_ni_syscall), // 35
1506//.. GENX_(__NR_sync, sys_sync), // 36
sewardjb865b162005-07-08 18:26:37 +00001507 GENX_(__NR_kill, sys_kill), // 37
1508 GENX_(__NR_rename, sys_rename), // 38
1509 GENX_(__NR_mkdir, sys_mkdir), // 39
1510
sewardj6a324492005-08-05 00:10:11 +00001511 GENX_(__NR_rmdir, sys_rmdir), // 40
sewardja932d292005-07-08 00:18:25 +00001512 GENXY(__NR_dup, sys_dup), // 41
njncd405ea2005-08-31 02:44:31 +00001513 LINXY(__NR_pipe, sys_pipe), // 42
sewardj6a324492005-08-05 00:10:11 +00001514 GENXY(__NR_times, sys_times), // 43
cerion85665ca2005-06-20 15:51:07 +00001515//.. GENX_(__NR_prof, sys_ni_syscall), // 44
1516//..
sewardja932d292005-07-08 00:18:25 +00001517 GENX_(__NR_brk, sys_brk), // 45
sewardja58bbbc2006-04-14 01:04:04 +00001518 GENX_(__NR_setgid, sys_setgid), // 46
1519 GENX_(__NR_getgid, sys_getgid), // 47
cerion85665ca2005-06-20 15:51:07 +00001520//.. // (__NR_signal, sys_signal), // 48 */* (ANSI C)
sewardja58bbbc2006-04-14 01:04:04 +00001521 GENX_(__NR_geteuid, sys_geteuid), // 49
cerion508aef52005-06-24 15:26:49 +00001522
sewardja58bbbc2006-04-14 01:04:04 +00001523 GENX_(__NR_getegid, sys_getegid), // 50
cerion85665ca2005-06-20 15:51:07 +00001524//.. GENX_(__NR_acct, sys_acct), // 51
sewardja58bbbc2006-04-14 01:04:04 +00001525 LINX_(__NR_umount2, sys_umount), // 52
cerion85665ca2005-06-20 15:51:07 +00001526//.. GENX_(__NR_lock, sys_ni_syscall), // 53
sewardja932d292005-07-08 00:18:25 +00001527 GENXY(__NR_ioctl, sys_ioctl), // 54
cerion85665ca2005-06-20 15:51:07 +00001528//..
sewardjfe0ffd42005-10-19 01:14:22 +00001529 GENXY(__NR_fcntl, sys_fcntl), // 55
cerion85665ca2005-06-20 15:51:07 +00001530//.. GENX_(__NR_mpx, sys_ni_syscall), // 56
sewardja932d292005-07-08 00:18:25 +00001531 GENX_(__NR_setpgid, sys_setpgid), // 57
cerion85665ca2005-06-20 15:51:07 +00001532//.. GENX_(__NR_ulimit, sys_ni_syscall), // 58
1533//.. // (__NR_oldolduname, sys_olduname), // 59 Linux -- obsolete
sewardjb865b162005-07-08 18:26:37 +00001534
1535 GENX_(__NR_umask, sys_umask), // 60
sewardja58bbbc2006-04-14 01:04:04 +00001536 GENX_(__NR_chroot, sys_chroot), // 61
cerion85665ca2005-06-20 15:51:07 +00001537//.. // (__NR_ustat, sys_ustat) // 62 SVr4 -- deprecated
sewardja932d292005-07-08 00:18:25 +00001538 GENXY(__NR_dup2, sys_dup2), // 63
sewardjb865b162005-07-08 18:26:37 +00001539 GENX_(__NR_getppid, sys_getppid), // 64
1540
1541 GENX_(__NR_getpgrp, sys_getpgrp), // 65
1542 GENX_(__NR_setsid, sys_setsid), // 66
sewardj3849cc52005-11-07 15:48:31 +00001543 PLAXY(__NR_sigaction, sys_sigaction), // 67
cerion85665ca2005-06-20 15:51:07 +00001544//.. // (__NR_sgetmask, sys_sgetmask), // 68 */* (ANSI C)
1545//.. // (__NR_ssetmask, sys_ssetmask), // 69 */* (ANSI C)
1546//..
sewardja58bbbc2006-04-14 01:04:04 +00001547 GENX_(__NR_setreuid, sys_setreuid), // 70
1548 GENX_(__NR_setregid, sys_setregid), // 71
tom313639f2006-04-03 16:38:33 +00001549 PLAX_(__NR_sigsuspend, sys_sigsuspend), // 72
sewardja58bbbc2006-04-14 01:04:04 +00001550 LINXY(__NR_sigpending, sys_sigpending), // 73
cerion85665ca2005-06-20 15:51:07 +00001551//.. // (__NR_sethostname, sys_sethostname), // 74 */*
1552//..
cerion508aef52005-06-24 15:26:49 +00001553 GENX_(__NR_setrlimit, sys_setrlimit), // 75
cerion85665ca2005-06-20 15:51:07 +00001554//.. GENXY(__NR_getrlimit, sys_old_getrlimit), // 76
sewardj33d17fa2005-08-21 00:49:41 +00001555 GENXY(__NR_getrusage, sys_getrusage), // 77
cerion508aef52005-06-24 15:26:49 +00001556 GENXY(__NR_gettimeofday, sys_gettimeofday), // 78
cerion85665ca2005-06-20 15:51:07 +00001557//.. GENX_(__NR_settimeofday, sys_settimeofday), // 79
1558//..
sewardja58bbbc2006-04-14 01:04:04 +00001559 GENXY(__NR_getgroups, sys_getgroups), // 80
1560 GENX_(__NR_setgroups, sys_setgroups), // 81
cerion85665ca2005-06-20 15:51:07 +00001561//.. PLAX_(__NR_select, old_select), // 82
sewardjb865b162005-07-08 18:26:37 +00001562 GENX_(__NR_symlink, sys_symlink), // 83
cerion85665ca2005-06-20 15:51:07 +00001563//.. // (__NR_oldlstat, sys_lstat), // 84 -- obsolete
1564//..
sewardja932d292005-07-08 00:18:25 +00001565 GENX_(__NR_readlink, sys_readlink), // 85
cerion85665ca2005-06-20 15:51:07 +00001566//.. // (__NR_uselib, sys_uselib), // 86 */Linux
1567//.. // (__NR_swapon, sys_swapon), // 87 */Linux
1568//.. // (__NR_reboot, sys_reboot), // 88 */Linux
1569//.. // (__NR_readdir, old_readdir), // 89 -- superseded
1570
tom9548a162005-09-30 08:07:53 +00001571 PLAX_(__NR_mmap, sys_mmap), // 90
cerion508aef52005-06-24 15:26:49 +00001572 GENXY(__NR_munmap, sys_munmap), // 91
sewardja58bbbc2006-04-14 01:04:04 +00001573 GENX_(__NR_truncate, sys_truncate), // 92
sewardj6a324492005-08-05 00:10:11 +00001574 GENX_(__NR_ftruncate, sys_ftruncate), // 93
sewardj2d7c3962005-07-29 22:01:19 +00001575 GENX_(__NR_fchmod, sys_fchmod), // 94
1576
sewardja58bbbc2006-04-14 01:04:04 +00001577 GENX_(__NR_fchown, sys_fchown), // 95
sewardjdc1750a2005-12-02 16:45:28 +00001578 GENX_(__NR_getpriority, sys_getpriority), // 96
1579 GENX_(__NR_setpriority, sys_setpriority), // 97
cerion85665ca2005-06-20 15:51:07 +00001580//.. GENX_(__NR_profil, sys_ni_syscall), // 98
sewardj17689552006-01-26 14:25:51 +00001581 GENXY(__NR_statfs, sys_statfs), // 99
cerion85665ca2005-06-20 15:51:07 +00001582//..
sewardja58bbbc2006-04-14 01:04:04 +00001583 GENXY(__NR_fstatfs, sys_fstatfs), // 100
cerion85665ca2005-06-20 15:51:07 +00001584//.. LINX_(__NR_ioperm, sys_ioperm), // 101
sewardja932d292005-07-08 00:18:25 +00001585 PLAXY(__NR_socketcall, sys_socketcall), // 102
sewardj3d45fac2006-07-24 10:14:37 +00001586 LINXY(__NR_syslog, sys_syslog), // 103
sewardja932d292005-07-08 00:18:25 +00001587 GENXY(__NR_setitimer, sys_setitimer), // 104
cerion85665ca2005-06-20 15:51:07 +00001588//..
1589//.. GENXY(__NR_getitimer, sys_getitimer), // 105
sewardja932d292005-07-08 00:18:25 +00001590 GENXY(__NR_stat, sys_newstat), // 106
sewardj82022042005-11-17 11:01:55 +00001591 GENXY(__NR_lstat, sys_newlstat), // 107
sewardjfe0ffd42005-10-19 01:14:22 +00001592 GENXY(__NR_fstat, sys_newfstat), // 108
cerion85665ca2005-06-20 15:51:07 +00001593//.. // (__NR_olduname, sys_uname), // 109 -- obsolete
1594//..
1595//.. GENX_(__NR_iopl, sys_iopl), // 110
1596//.. LINX_(__NR_vhangup, sys_vhangup), // 111
1597//.. GENX_(__NR_idle, sys_ni_syscall), // 112
1598//.. // (__NR_vm86old, sys_vm86old), // 113 x86/Linux-only
sewardjfbba3712005-11-13 02:41:58 +00001599 GENXY(__NR_wait4, sys_wait4), // 114
cerion85665ca2005-06-20 15:51:07 +00001600//..
1601//.. // (__NR_swapoff, sys_swapoff), // 115 */Linux
sewardj3d45fac2006-07-24 10:14:37 +00001602 LINXY(__NR_sysinfo, sys_sysinfo), // 116
sewardja932d292005-07-08 00:18:25 +00001603 PLAXY(__NR_ipc, sys_ipc), // 117
sewardjd84f4672005-10-07 23:06:13 +00001604 GENX_(__NR_fsync, sys_fsync), // 118
sewardjb865b162005-07-08 18:26:37 +00001605 PLAX_(__NR_sigreturn, sys_sigreturn), // 119 ?/Linux
cerion85665ca2005-06-20 15:51:07 +00001606//..
sewardja932d292005-07-08 00:18:25 +00001607 PLAX_(__NR_clone, sys_clone), // 120
cerion85665ca2005-06-20 15:51:07 +00001608//.. // (__NR_setdomainname, sys_setdomainname), // 121 */*(?)
sewardja932d292005-07-08 00:18:25 +00001609 GENXY(__NR_uname, sys_newuname), // 122
cerion85665ca2005-06-20 15:51:07 +00001610//.. PLAX_(__NR_modify_ldt, sys_modify_ldt), // 123
1611//.. LINXY(__NR_adjtimex, sys_adjtimex), // 124
1612//..
sewardja932d292005-07-08 00:18:25 +00001613 GENXY(__NR_mprotect, sys_mprotect), // 125
njncd405ea2005-08-31 02:44:31 +00001614 LINXY(__NR_sigprocmask, sys_sigprocmask), // 126
cerion85665ca2005-06-20 15:51:07 +00001615//.. // Nb: create_module() was removed 2.4-->2.6
1616//.. GENX_(__NR_create_module, sys_ni_syscall), // 127
1617//.. GENX_(__NR_init_module, sys_init_module), // 128
1618//.. // (__NR_delete_module, sys_delete_module), // 129 (*/Linux)?
1619//..
1620//.. // Nb: get_kernel_syms() was removed 2.4-->2.6
1621//.. GENX_(__NR_get_kernel_syms, sys_ni_syscall), // 130
njncd405ea2005-08-31 02:44:31 +00001622//.. LINX_(__NR_quotactl, sys_quotactl), // 131
sewardja932d292005-07-08 00:18:25 +00001623 GENX_(__NR_getpgid, sys_getpgid), // 132
sewardj3774f862006-03-21 02:23:27 +00001624 GENX_(__NR_fchdir, sys_fchdir), // 133
cerion85665ca2005-06-20 15:51:07 +00001625//.. // (__NR_bdflush, sys_bdflush), // 134 */Linux
1626//..
1627//.. // (__NR_sysfs, sys_sysfs), // 135 SVr4
sewardja58bbbc2006-04-14 01:04:04 +00001628 LINX_(__NR_personality, sys_personality), // 136
cerion85665ca2005-06-20 15:51:07 +00001629//.. GENX_(__NR_afs_syscall, sys_ni_syscall), // 137
sewardja58bbbc2006-04-14 01:04:04 +00001630 LINX_(__NR_setfsuid, sys_setfsuid), // 138
1631 LINX_(__NR_setfsgid, sys_setfsgid), // 139
sewardj31d83422005-10-15 02:00:41 +00001632
sewardja932d292005-07-08 00:18:25 +00001633 LINXY(__NR__llseek, sys_llseek), // 140
sewardj31d83422005-10-15 02:00:41 +00001634 GENXY(__NR_getdents, sys_getdents), // 141
sewardja932d292005-07-08 00:18:25 +00001635 GENX_(__NR__newselect, sys_select), // 142
sewardj6a324492005-08-05 00:10:11 +00001636 GENX_(__NR_flock, sys_flock), // 143
sewardja58bbbc2006-04-14 01:04:04 +00001637 GENX_(__NR_msync, sys_msync), // 144
cerion85665ca2005-06-20 15:51:07 +00001638//..
sewardja932d292005-07-08 00:18:25 +00001639 GENXY(__NR_readv, sys_readv), // 145
1640 GENX_(__NR_writev, sys_writev), // 146
sewardja58bbbc2006-04-14 01:04:04 +00001641 GENX_(__NR_getsid, sys_getsid), // 147
sewardj5addd6c2005-08-18 23:44:13 +00001642 GENX_(__NR_fdatasync, sys_fdatasync), // 148
sewardja932d292005-07-08 00:18:25 +00001643 LINXY(__NR__sysctl, sys_sysctl), // 149
cerion85665ca2005-06-20 15:51:07 +00001644//..
sewardja58bbbc2006-04-14 01:04:04 +00001645 GENX_(__NR_mlock, sys_mlock), // 150
1646 GENX_(__NR_munlock, sys_munlock), // 151
1647 GENX_(__NR_mlockall, sys_mlockall), // 152
1648 LINX_(__NR_munlockall, sys_munlockall), // 153
njnb2480c92005-08-30 02:17:23 +00001649//.. LINXY(__NR_sched_setparam, sys_sched_setparam), // 154
cerion85665ca2005-06-20 15:51:07 +00001650//..
njnb2480c92005-08-30 02:17:23 +00001651 LINXY(__NR_sched_getparam, sys_sched_getparam), // 155
sewardjd84f4672005-10-07 23:06:13 +00001652 LINX_(__NR_sched_setscheduler, sys_sched_setscheduler), // 156
njnb2480c92005-08-30 02:17:23 +00001653 LINX_(__NR_sched_getscheduler, sys_sched_getscheduler), // 157
dirk331e5762005-12-05 22:11:02 +00001654 LINX_(__NR_sched_yield, sys_sched_yield), // 158
njnb2480c92005-08-30 02:17:23 +00001655 LINX_(__NR_sched_get_priority_max, sys_sched_get_priority_max),// 159
sewardj5addd6c2005-08-18 23:44:13 +00001656
njnb2480c92005-08-30 02:17:23 +00001657 LINX_(__NR_sched_get_priority_min, sys_sched_get_priority_min),// 160
1658//.. //LINX?(__NR_sched_rr_get_interval, sys_sched_rr_get_interval), // 161 */*
sewardja932d292005-07-08 00:18:25 +00001659 GENXY(__NR_nanosleep, sys_nanosleep), // 162
1660 GENX_(__NR_mremap, sys_mremap), // 163
sewardja58bbbc2006-04-14 01:04:04 +00001661 LINX_(__NR_setresuid, sys_setresuid), // 164
sewardj33d17fa2005-08-21 00:49:41 +00001662
sewardja58bbbc2006-04-14 01:04:04 +00001663 LINXY(__NR_getresuid, sys_getresuid), // 165
cerion85665ca2005-06-20 15:51:07 +00001664
1665//.. GENX_(__NR_query_module, sys_ni_syscall), // 166
sewardjca334052005-07-24 06:30:37 +00001666 GENXY(__NR_poll, sys_poll), // 167
cerion85665ca2005-06-20 15:51:07 +00001667//.. // (__NR_nfsservctl, sys_nfsservctl), // 168 */Linux
1668//..
sewardja58bbbc2006-04-14 01:04:04 +00001669 LINX_(__NR_setresgid, sys_setresgid), // 169
1670 LINXY(__NR_getresgid, sys_getresgid), // 170
toma39ebc82006-12-18 15:22:46 +00001671 LINXY(__NR_prctl, sys_prctl), // 171
sewardj4ce89e12005-11-16 19:15:33 +00001672 PLAX_(__NR_rt_sigreturn, sys_rt_sigreturn), // 172
njncd405ea2005-08-31 02:44:31 +00001673 LINXY(__NR_rt_sigaction, sys_rt_sigaction), // 173
cerion85665ca2005-06-20 15:51:07 +00001674
njncd405ea2005-08-31 02:44:31 +00001675 LINXY(__NR_rt_sigprocmask, sys_rt_sigprocmask), // 174
sewardja58bbbc2006-04-14 01:04:04 +00001676 LINXY(__NR_rt_sigpending, sys_rt_sigpending), // 175
njncd405ea2005-08-31 02:44:31 +00001677 LINXY(__NR_rt_sigtimedwait, sys_rt_sigtimedwait), // 176
sewardja58bbbc2006-04-14 01:04:04 +00001678 LINXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo), // 177
sewardj1ea00a12005-11-16 12:51:34 +00001679 LINX_(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 178
1680
sewardja932d292005-07-08 00:18:25 +00001681 GENXY(__NR_pread64, sys_pread64), // 179
1682 GENX_(__NR_pwrite64, sys_pwrite64), // 180
sewardja58bbbc2006-04-14 01:04:04 +00001683 GENX_(__NR_chown, sys_chown), // 181
sewardjb865b162005-07-08 18:26:37 +00001684 GENXY(__NR_getcwd, sys_getcwd), // 182
njn9fe7b122005-08-26 04:03:04 +00001685//.. LINXY(__NR_capget, sys_capget), // 183
cerion85665ca2005-06-20 15:51:07 +00001686//..
njn9fe7b122005-08-26 04:03:04 +00001687//.. LINX_(__NR_capset, sys_capset), // 184
sewardja9fff9b2005-08-19 10:07:29 +00001688 GENXY(__NR_sigaltstack, sys_sigaltstack), // 185
sewardja58bbbc2006-04-14 01:04:04 +00001689 LINXY(__NR_sendfile, sys_sendfile), // 186
cerion85665ca2005-06-20 15:51:07 +00001690//.. GENXY(__NR_getpmsg, sys_getpmsg), // 187
1691//.. GENX_(__NR_putpmsg, sys_putpmsg), // 188
sewardja932d292005-07-08 00:18:25 +00001692
1693 // Nb: we treat vfork as fork
1694 GENX_(__NR_vfork, sys_fork), // 189
1695 GENXY(__NR_ugetrlimit, sys_getrlimit), // 190
cerion85665ca2005-06-20 15:51:07 +00001696//__NR_readahead // 191 ppc/Linux only?
tom9548a162005-09-30 08:07:53 +00001697 PLAX_(__NR_mmap2, sys_mmap2), // 192
sewardja58bbbc2006-04-14 01:04:04 +00001698 GENX_(__NR_truncate64, sys_truncate64), // 193
sewardj48db0f02005-10-07 13:30:48 +00001699 GENX_(__NR_ftruncate64, sys_ftruncate64), // 194
cerion85665ca2005-06-20 15:51:07 +00001700//..
1701
sewardja932d292005-07-08 00:18:25 +00001702 PLAXY(__NR_stat64, sys_stat64), // 195
1703 PLAXY(__NR_lstat64, sys_lstat64), // 196
1704 PLAXY(__NR_fstat64, sys_fstat64), // 197
cerion85665ca2005-06-20 15:51:07 +00001705
1706// __NR_pciconfig_read // 198
1707// __NR_pciconfig_write // 199
1708// __NR_pciconfig_iobase // 200
1709// __NR_multiplexer // 201
1710
sewardja932d292005-07-08 00:18:25 +00001711 GENXY(__NR_getdents64, sys_getdents64), // 202
cerion85665ca2005-06-20 15:51:07 +00001712//.. // (__NR_pivot_root, sys_pivot_root), // 203 */Linux
sewardja932d292005-07-08 00:18:25 +00001713 GENXY(__NR_fcntl64, sys_fcntl64), // 204
sewardj249ebd72005-10-07 19:12:18 +00001714 GENX_(__NR_madvise, sys_madvise), // 205
dirka07c7402006-02-22 12:54:44 +00001715 GENXY(__NR_mincore, sys_mincore), // 206
sewardja9fff9b2005-08-19 10:07:29 +00001716 LINX_(__NR_gettid, sys_gettid), // 207
cerion85665ca2005-06-20 15:51:07 +00001717//.. LINX_(__NR_tkill, sys_tkill), // 208 */Linux
njn65ccc502005-08-30 01:53:54 +00001718//.. LINX_(__NR_setxattr, sys_setxattr), // 209
1719//.. LINX_(__NR_lsetxattr, sys_lsetxattr), // 210
1720//.. LINX_(__NR_fsetxattr, sys_fsetxattr), // 211
njnef0da672005-08-30 03:02:00 +00001721 LINXY(__NR_getxattr, sys_getxattr), // 212
sewardja58bbbc2006-04-14 01:04:04 +00001722 LINXY(__NR_lgetxattr, sys_lgetxattr), // 213
1723 LINXY(__NR_fgetxattr, sys_fgetxattr), // 214
1724 LINXY(__NR_listxattr, sys_listxattr), // 215
1725 LINXY(__NR_llistxattr, sys_llistxattr), // 216
1726 LINXY(__NR_flistxattr, sys_flistxattr), // 217
1727 LINX_(__NR_removexattr, sys_removexattr), // 218
1728 LINX_(__NR_lremovexattr, sys_lremovexattr), // 219
1729 LINX_(__NR_fremovexattr, sys_fremovexattr), // 220
cerion85665ca2005-06-20 15:51:07 +00001730
cerion508aef52005-06-24 15:26:49 +00001731 LINXY(__NR_futex, sys_futex), // 221
sewardja58bbbc2006-04-14 01:04:04 +00001732 LINX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 222
1733 LINXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 223
cerion85665ca2005-06-20 15:51:07 +00001734/* 224 currently unused */
1735
1736// __NR_tuxcall // 225
1737
sewardja58bbbc2006-04-14 01:04:04 +00001738 LINXY(__NR_sendfile64, sys_sendfile64), // 226
cerion85665ca2005-06-20 15:51:07 +00001739//..
sewardja58bbbc2006-04-14 01:04:04 +00001740 LINX_(__NR_io_setup, sys_io_setup), // 227
1741 LINX_(__NR_io_destroy, sys_io_destroy), // 228
1742 LINXY(__NR_io_getevents, sys_io_getevents), // 229
1743 LINX_(__NR_io_submit, sys_io_submit), // 230
1744 LINXY(__NR_io_cancel, sys_io_cancel), // 231
cerion85665ca2005-06-20 15:51:07 +00001745//..
sewardja932d292005-07-08 00:18:25 +00001746 LINX_(__NR_set_tid_address, sys_set_tid_address), // 232
cerion85665ca2005-06-20 15:51:07 +00001747
sewardj79820562006-09-11 20:33:55 +00001748 LINX_(__NR_fadvise64, sys_fadvise64), // 233 */(Linux?)
sewardja932d292005-07-08 00:18:25 +00001749 LINX_(__NR_exit_group, sys_exit_group), // 234
cerion85665ca2005-06-20 15:51:07 +00001750//.. GENXY(__NR_lookup_dcookie, sys_lookup_dcookie), // 235
sewardja58bbbc2006-04-14 01:04:04 +00001751 LINXY(__NR_epoll_create, sys_epoll_create), // 236
1752 LINX_(__NR_epoll_ctl, sys_epoll_ctl), // 237
1753 LINXY(__NR_epoll_wait, sys_epoll_wait), // 238
cerion85665ca2005-06-20 15:51:07 +00001754
1755//.. // (__NR_remap_file_pages, sys_remap_file_pages), // 239 */Linux
sewardja58bbbc2006-04-14 01:04:04 +00001756 LINXY(__NR_timer_create, sys_timer_create), // 240
1757 LINXY(__NR_timer_settime, sys_timer_settime), // 241
1758 LINXY(__NR_timer_gettime, sys_timer_gettime), // 242
1759 LINX_(__NR_timer_getoverrun, sys_timer_getoverrun), // 243
1760 LINX_(__NR_timer_delete, sys_timer_delete), // 244
1761 LINX_(__NR_clock_settime, sys_clock_settime), // 245
njn1588bc02005-08-26 03:49:43 +00001762 LINXY(__NR_clock_gettime, sys_clock_gettime), // 246
dirk331e5762005-12-05 22:11:02 +00001763 LINXY(__NR_clock_getres, sys_clock_getres), // 247
sewardja58bbbc2006-04-14 01:04:04 +00001764 LINXY(__NR_clock_nanosleep, sys_clock_nanosleep), // 248
cerion85665ca2005-06-20 15:51:07 +00001765
1766// __NR_swapcontext // 249
1767
sewardj7f4bd102005-11-17 14:22:22 +00001768 LINXY(__NR_tgkill, sys_tgkill), // 250 */Linux
cerion85665ca2005-06-20 15:51:07 +00001769//.. GENX_(__NR_utimes, sys_utimes), // 251
sewardja58bbbc2006-04-14 01:04:04 +00001770 GENXY(__NR_statfs64, sys_statfs64), // 252
1771 GENXY(__NR_fstatfs64, sys_fstatfs64), // 253
1772 LINX_(__NR_fadvise64_64, sys_fadvise64_64), // 254 */(Linux?)
cerion85665ca2005-06-20 15:51:07 +00001773
1774// __NR_rtas // 255
1775
1776/* Number 256 is reserved for sys_debug_setcontext */
1777/* Number 257 is reserved for vserver */
1778/* Number 258 is reserved for new sys_remap_file_pages */
1779/* Number 259 is reserved for new sys_mbind */
dirka07c7402006-02-22 12:54:44 +00001780 LINXY(__NR_get_mempolicy, sys_get_mempolicy), // 260
1781 LINX_(__NR_set_mempolicy, sys_set_mempolicy), // 261
cerion85665ca2005-06-20 15:51:07 +00001782
sewardj54e095f2005-11-17 19:09:02 +00001783 LINXY(__NR_mq_open, sys_mq_open), // 262
1784 LINX_(__NR_mq_unlink, sys_mq_unlink), // 263
1785 LINX_(__NR_mq_timedsend, sys_mq_timedsend), // 264
1786 LINXY(__NR_mq_timedreceive, sys_mq_timedreceive), // 265
1787 LINX_(__NR_mq_notify, sys_mq_notify), // 266
1788 LINXY(__NR_mq_getsetattr, sys_mq_getsetattr), // 267
cerion85665ca2005-06-20 15:51:07 +00001789// __NR_kexec_load // 268
dirka07c7402006-02-22 12:54:44 +00001790
1791/* Number 269 is reserved for sys_add_key */
1792/* Number 270 is reserved for sys_request_key */
1793/* Number 271 is reserved for sys_keyctl */
1794/* Number 272 is reserved for sys_waitid */
1795/* Number 273 is reserved for sys_ioprio_set */
1796/* Number 274 is reserved for sys_ioprio_get */
1797
1798 LINX_(__NR_inotify_init, sys_inotify_init), // 275
1799 LINX_(__NR_inotify_add_watch, sys_inotify_add_watch), // 276
1800 LINX_(__NR_inotify_rm_watch, sys_inotify_rm_watch), // 277
sewardj5b91c402006-07-24 10:06:09 +00001801
1802 LINXY(__NR_openat, sys_openat), // 286
1803 LINX_(__NR_mkdirat, sys_mkdirat), // 287
1804 LINX_(__NR_mknodat, sys_mknodat), // 288
1805 LINX_(__NR_fchownat, sys_fchownat), // 289
1806 LINX_(__NR_futimesat, sys_futimesat), // 290
1807 PLAXY(__NR_fstatat64, sys_fstatat64), // 291
1808 LINX_(__NR_unlinkat, sys_unlinkat), // 292
1809 LINX_(__NR_renameat, sys_renameat), // 293
1810 LINX_(__NR_linkat, sys_linkat), // 294
1811 LINX_(__NR_symlinkat, sys_symlinkat), // 295
1812 LINX_(__NR_readlinkat, sys_readlinkat), // 296
1813 LINX_(__NR_fchmodat, sys_fchmodat), // 297
1814 LINX_(__NR_faccessat, sys_faccessat), // 298
1815 LINX_(__NR_set_robust_list, sys_set_robust_list), // 299
1816 LINXY(__NR_get_robust_list, sys_get_robust_list), // 300
cerion85665ca2005-06-20 15:51:07 +00001817};
1818
njnaf839f52005-06-23 03:27:57 +00001819const UInt ML_(syscall_table_size) =
1820 sizeof(ML_(syscall_table)) / sizeof(ML_(syscall_table)[0]);
cerion85665ca2005-06-20 15:51:07 +00001821
1822/*--------------------------------------------------------------------*/
1823/*--- end ---*/
1824/*--------------------------------------------------------------------*/