blob: 46bb3177837e5cf1c8d55ff37eb9c965dcbd2b69 [file] [log] [blame]
sewardj2c48c7b2005-11-29 13:05:56 +00001
2/*--------------------------------------------------------------------*/
3/*--- Platform-specific syscalls stuff. syswrap-ppc64-linux.c ---*/
4/*--------------------------------------------------------------------*/
5
6/*
7 This file is part of Valgrind, a dynamic binary instrumentation
8 framework.
9
Elliott Hughesed398002017-06-21 14:41:24 -070010 Copyright (C) 2005-2017 Nicholas Nethercote <njn@valgrind.org>
11 Copyright (C) 2005-2017 Cerion Armour-Brown <cerion@open-works.co.uk>
sewardj2c48c7b2005-11-29 13:05:56 +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
carllcae0cc22014-08-07 23:17:29 +000031#if defined(VGP_ppc64be_linux) || defined(VGP_ppc64le_linux)
njn8b68b642009-06-24 00:37:09 +000032
sewardj2c48c7b2005-11-29 13:05:56 +000033#include "pub_core_basics.h"
sewardjc95257a2006-10-14 19:51:19 +000034#include "pub_core_vki.h"
35#include "pub_core_vkiscnums.h"
sewardj2c48c7b2005-11-29 13:05:56 +000036#include "pub_core_threadstate.h"
37#include "pub_core_aspacemgr.h"
38#include "pub_core_debuglog.h"
39#include "pub_core_libcbase.h"
40#include "pub_core_libcassert.h"
41#include "pub_core_libcprint.h"
42#include "pub_core_libcproc.h"
43#include "pub_core_libcsignal.h"
44#include "pub_core_options.h"
45#include "pub_core_scheduler.h"
46#include "pub_core_sigframe.h" // For VG_(sigframe_destroy)()
47#include "pub_core_signals.h"
48#include "pub_core_syscall.h"
49#include "pub_core_syswrap.h"
50#include "pub_core_tooliface.h"
51
52#include "priv_types_n_macros.h"
53#include "priv_syswrap-generic.h" /* for decls of generic wrappers */
54#include "priv_syswrap-linux.h" /* for decls of linux-ish wrappers */
55#include "priv_syswrap-main.h"
56
sewardj2c48c7b2005-11-29 13:05:56 +000057
58/* ---------------------------------------------------------------------
59 clone() handling
60 ------------------------------------------------------------------ */
61
62/* Call f(arg1), but first switch stacks, using 'stack' as the new
63 stack, and use 'retaddr' as f's return-to address. Also, clear all
64 the integer registers before entering f.*/
65__attribute__((noreturn))
66void ML_(call_on_new_stack_0_1) ( Addr stack,
67 Addr retaddr,
cerion21082042005-12-06 19:07:08 +000068 void (*f_desc)(Word),
sewardj2c48c7b2005-11-29 13:05:56 +000069 Word arg1 );
70// r3 = stack
71// r4 = retaddr
cerion21082042005-12-06 19:07:08 +000072// r5 = function descriptor
sewardj2c48c7b2005-11-29 13:05:56 +000073// r6 = arg1
cerion21082042005-12-06 19:07:08 +000074/* On PPC64, a func ptr is represented by a TOC entry ptr.
75 This TOC entry contains three words; the first word is the function
76 address, the second word is the TOC ptr (r2), and the third word is
77 the static chain value. */
sewardj2c48c7b2005-11-29 13:05:56 +000078asm(
carll582d5822014-08-07 23:35:54 +000079#if defined(VGP_ppc64be_linux)
cerion297c88f2005-12-22 15:53:12 +000080" .align 2\n"
cerion21082042005-12-06 19:07:08 +000081" .globl vgModuleLocal_call_on_new_stack_0_1\n"
82" .section \".opd\",\"aw\"\n"
83" .align 3\n"
84"vgModuleLocal_call_on_new_stack_0_1:\n"
85" .quad .vgModuleLocal_call_on_new_stack_0_1,.TOC.@tocbase,0\n"
86" .previous\n"
87" .type .vgModuleLocal_call_on_new_stack_0_1,@function\n"
88" .globl .vgModuleLocal_call_on_new_stack_0_1\n"
sewardj2c48c7b2005-11-29 13:05:56 +000089".vgModuleLocal_call_on_new_stack_0_1:\n"
90" mr %r1,%r3\n\t" // stack to %sp
91" mtlr %r4\n\t" // retaddr to %lr
cerion21082042005-12-06 19:07:08 +000092" ld 5,0(5)\n\t" // load f_ptr from f_desc[0]
93" mtctr %r5\n\t" // f_ptr to count reg
sewardj2c48c7b2005-11-29 13:05:56 +000094" mr %r3,%r6\n\t" // arg1 to %r3
95" li 0,0\n\t" // zero all GP regs
96" li 4,0\n\t"
97" li 5,0\n\t"
98" li 6,0\n\t"
99" li 7,0\n\t"
100" li 8,0\n\t"
101" li 9,0\n\t"
102" li 10,0\n\t"
103" li 11,0\n\t"
104" li 12,0\n\t"
105" li 13,0\n\t"
106" li 14,0\n\t"
107" li 15,0\n\t"
108" li 16,0\n\t"
109" li 17,0\n\t"
110" li 18,0\n\t"
111" li 19,0\n\t"
112" li 20,0\n\t"
113" li 21,0\n\t"
114" li 22,0\n\t"
115" li 23,0\n\t"
116" li 24,0\n\t"
117" li 25,0\n\t"
118" li 26,0\n\t"
119" li 27,0\n\t"
120" li 28,0\n\t"
121" li 29,0\n\t"
122" li 30,0\n\t"
123" li 31,0\n\t"
124" mtxer 0\n\t" // CAB: Need this?
125" mtcr 0\n\t" // CAB: Need this?
126" bctr\n\t" // jump to dst
127" trap\n" // should never get here
carll582d5822014-08-07 23:35:54 +0000128#else
129// ppc64le_linux
130" .align 2\n"
131" .globl vgModuleLocal_call_on_new_stack_0_1\n"
132"vgModuleLocal_call_on_new_stack_0_1:\n"
133" .type .vgModuleLocal_call_on_new_stack_0_1,@function\n"
134"#if _CALL_ELF == 2 \n"
135"0: addis 2,12,.TOC.-0b@ha\n"
136" addi 2,2,.TOC.-0b@l\n"
137"#endif\n"
138".localentry vgModuleLocal_call_on_new_stack_0_1, .-vgModuleLocal_call_on_new_stack_0_1\n"
139" mr %r1,%r3\n\t" // stack to %sp
140" mtlr %r4\n\t" // retaddr to %lr
141" mtctr %r5\n\t" // f_ptr to count reg
142" mr %r3,%r6\n\t" // arg1 to %r3
143" li 0,0\n\t" // zero all GP regs
144" li 4,0\n\t"
145" li 5,0\n\t"
146" li 6,0\n\t"
147" li 7,0\n\t"
148" li 8,0\n\t"
149" li 9,0\n\t"
150" li 10,0\n\t"
151" li 11,0\n\t"
152" li 12,0\n\t"
153" li 13,0\n\t"
154" li 14,0\n\t"
155" li 15,0\n\t"
156" li 16,0\n\t"
157" li 17,0\n\t"
158" li 18,0\n\t"
159" li 19,0\n\t"
160" li 20,0\n\t"
161" li 21,0\n\t"
162" li 22,0\n\t"
163" li 23,0\n\t"
164" li 24,0\n\t"
165" li 25,0\n\t"
166" li 26,0\n\t"
167" li 27,0\n\t"
168" li 28,0\n\t"
169" li 29,0\n\t"
170" li 30,0\n\t"
171" li 31,0\n\t"
172" mtxer 0\n\t" // CAB: Need this?
173" mtcr 0\n\t" // CAB: Need this?
174" bctr\n\t" // jump to dst
175" trap\n" // should never get here
176#endif
sewardj2c48c7b2005-11-29 13:05:56 +0000177);
178
179
180/*
181 Perform a clone system call. clone is strange because it has
182 fork()-like return-twice semantics, so it needs special
183 handling here.
184
185 Upon entry, we have:
186
187 word (fn)(void*) in r3
188 void* child_stack in r4
189 word flags in r5
190 void* arg in r6
191 pid_t* child_tid in r7
192 pid_t* parent_tid in r8
193 void* ??? in r9
194
cerionbae22cf2006-01-03 14:28:02 +0000195 Note: r3 contains fn desc ptr, not fn ptr -- p_fn = p_fn_desc[0]
sewardj2c48c7b2005-11-29 13:05:56 +0000196 System call requires:
197
198 int $__NR_clone in r0 (sc number)
199 int flags in r3 (sc arg1)
200 void* child_stack in r4 (sc arg2)
201 pid_t* parent_tid in r5 (sc arg3)
202 ?? child_tls in r6 (sc arg4)
203 pid_t* child_tid in r7 (sc arg5)
204 void* ??? in r8 (sc arg6)
205
206 Returns a ULong encoded as: top half is %cr following syscall,
207 low half is syscall return value (r3).
208 */
209#define __NR_CLONE VG_STRINGIFY(__NR_clone)
210#define __NR_EXIT VG_STRINGIFY(__NR_exit)
211
Elliott Hughesed398002017-06-21 14:41:24 -0700212// See priv_syswrap-linux.h for arg profile.
sewardj2c48c7b2005-11-29 13:05:56 +0000213asm(
carll582d5822014-08-07 23:35:54 +0000214#if defined(VGP_ppc64be_linux)
cerion297c88f2005-12-22 15:53:12 +0000215" .align 2\n"
216" .globl do_syscall_clone_ppc64_linux\n"
217" .section \".opd\",\"aw\"\n"
218" .align 3\n"
219"do_syscall_clone_ppc64_linux:\n"
220" .quad .do_syscall_clone_ppc64_linux,.TOC.@tocbase,0\n"
221" .previous\n"
222" .type .do_syscall_clone_ppc64_linux,@function\n"
223" .globl .do_syscall_clone_ppc64_linux\n"
sewardj2c48c7b2005-11-29 13:05:56 +0000224".do_syscall_clone_ppc64_linux:\n"
225" stdu 1,-64(1)\n"
226" std 29,40(1)\n"
227" std 30,48(1)\n"
228" std 31,56(1)\n"
229" mr 30,3\n" // preserve fn
230" mr 31,6\n" // preserve arg
231
232 // setup child stack
sewardja7421c92006-01-02 16:25:31 +0000233" rldicr 4,4, 0,59\n" // trim sp to multiple of 16 bytes
cerionbae22cf2006-01-03 14:28:02 +0000234 // (r4 &= ~0xF)
235" li 0,0\n"
sewardj2c48c7b2005-11-29 13:05:56 +0000236" stdu 0,-32(4)\n" // make initial stack frame
237" mr 29,4\n" // preserve sp
238
239 // setup syscall
240" li 0,"__NR_CLONE"\n" // syscall number
241" mr 3,5\n" // syscall arg1: flags
242 // r4 already setup // syscall arg2: child_stack
243" mr 5,8\n" // syscall arg3: parent_tid
sewardja7421c92006-01-02 16:25:31 +0000244" mr 6,13\n" // syscall arg4: REAL THREAD tls
sewardj2c48c7b2005-11-29 13:05:56 +0000245" mr 7,7\n" // syscall arg5: child_tid
246" mr 8,8\n" // syscall arg6: ????
247" mr 9,9\n" // syscall arg7: ????
248
249" sc\n" // clone()
250
251" mfcr 4\n" // CR now in low half r4
cerionbae22cf2006-01-03 14:28:02 +0000252" sldi 4,4,32\n" // CR now in hi half r4
sewardj2c48c7b2005-11-29 13:05:56 +0000253
cerionbae22cf2006-01-03 14:28:02 +0000254" sldi 3,3,32\n"
255" srdi 3,3,32\n" // zero out hi half r3
sewardj2c48c7b2005-11-29 13:05:56 +0000256
sewardja7421c92006-01-02 16:25:31 +0000257" or 3,3,4\n" // r3 = CR : syscall-retval
sewardj2c48c7b2005-11-29 13:05:56 +0000258" cmpwi 3,0\n" // child if retval == 0 (note, cmpw)
259" bne 1f\n" // jump if !child
260
261 /* CHILD - call thread function */
262 /* Note: 2.4 kernel doesn't set the child stack pointer,
263 so we do it here.
264 That does leave a small window for a signal to be delivered
265 on the wrong stack, unfortunately. */
266" mr 1,29\n"
cerionbae22cf2006-01-03 14:28:02 +0000267" ld 30, 0(30)\n" // convert fn desc ptr to fn ptr
sewardj2c48c7b2005-11-29 13:05:56 +0000268" mtctr 30\n" // ctr reg = fn
269" mr 3,31\n" // r3 = arg
270" bctrl\n" // call fn()
271
272 // exit with result
273" li 0,"__NR_EXIT"\n"
274" sc\n"
275
276 // Exit returned?!
277" .long 0\n"
278
279 // PARENT or ERROR - return
280"1: ld 29,40(1)\n"
281" ld 30,48(1)\n"
282" ld 31,56(1)\n"
283" addi 1,1,64\n"
284" blr\n"
carll582d5822014-08-07 23:35:54 +0000285#else
286" .align 2\n"
287" .globl do_syscall_clone_ppc64_linux\n"
288" .type do_syscall_clone_ppc64_linux,@function\n"
289"do_syscall_clone_ppc64_linux:\n"
290" .globl .do_syscall_clone_ppc64_linux\n"
291".do_syscall_clone_ppc64_linux:\n"
292"#if _CALL_ELF == 2 \n"
293"0: addis 2,12,.TOC.-0b@ha \n"
294" addi 2,2,.TOC.-0b@l \n"
295"#endif \n"
296" .localentry do_syscall_clone_ppc64_linux, .-do_syscall_clone_ppc64_linux \n"
297" stdu 1,-64(1)\n"
298" std 29,40(1)\n"
299" std 30,48(1)\n"
300" std 31,56(1)\n"
301" mr 30,3\n" // preserve fn
302" mr 31,6\n" // preserve arg
303
304 // setup child stack
305" rldicr 4,4, 0,59\n" // trim sp to multiple of 16 bytes
306 // (r4 &= ~0xF)
307" li 0,0\n"
308" stdu 0,-32(4)\n" // make initial stack frame
309" mr 29,4\n" // preserve sp
310
311 // setup syscall
312" li 0,"__NR_CLONE"\n" // syscall number
313" mr 3,5\n" // syscall arg1: flags
314 // r4 already setup // syscall arg2: child_stack
315" mr 5,8\n" // syscall arg3: parent_tid
316" mr 6,13\n" // syscall arg4: REAL THREAD tls
317" mr 7,7\n" // syscall arg5: child_tid
318" mr 8,8\n" // syscall arg6: ????
319" mr 9,9\n" // syscall arg7: ????
320
321" sc\n" // clone()
322
323" mfcr 4\n" // CR now in low half r4
324" sldi 4,4,32\n" // CR now in hi half r4
325
326" sldi 3,3,32\n"
327" srdi 3,3,32\n" // zero out hi half r3
328
329" or 3,3,4\n" // r3 = CR : syscall-retval
330" cmpwi 3,0\n" // child if retval == 0 (note, cmpw)
331" bne 1f\n" // jump if !child
332
333 /* CHILD - call thread function */
334 /* Note: 2.4 kernel doesn't set the child stack pointer,
335 so we do it here.
336 That does leave a small window for a signal to be delivered
337 on the wrong stack, unfortunately. */
338" mr 1,29\n"
339" mtctr 30\n" // ctr reg = fn
340" mr 3,31\n" // r3 = arg
341" bctrl\n" // call fn()
342
343 // exit with result
344" li 0,"__NR_EXIT"\n"
345" sc\n"
346
347 // Exit returned?!
348" .long 0\n"
349
350 // PARENT or ERROR - return
351"1: ld 29,40(1)\n"
352" ld 30,48(1)\n"
353" ld 31,56(1)\n"
354" addi 1,1,64\n"
355" blr\n"
356#endif
sewardj2c48c7b2005-11-29 13:05:56 +0000357);
358
359#undef __NR_CLONE
360#undef __NR_EXIT
361
sewardj2c48c7b2005-11-29 13:05:56 +0000362/* ---------------------------------------------------------------------
363 More thread stuff
364 ------------------------------------------------------------------ */
365
366void VG_(cleanup_thread) ( ThreadArchState* arch )
367{
368}
369
sewardj2c48c7b2005-11-29 13:05:56 +0000370/* ---------------------------------------------------------------------
371 PRE/POST wrappers for ppc64/Linux-specific syscalls
372 ------------------------------------------------------------------ */
373
sewardjf7fe0ee2005-12-22 19:25:51 +0000374#define PRE(name) DEFN_PRE_TEMPLATE(ppc64_linux, name)
375#define POST(name) DEFN_POST_TEMPLATE(ppc64_linux, name)
sewardj2c48c7b2005-11-29 13:05:56 +0000376
377/* Add prototypes for the wrappers declared here, so that gcc doesn't
378 harass us for not having prototypes. Really this is a kludge --
379 the right thing to do is to make these wrappers 'static' since they
380 aren't visible outside this file, but that requires even more macro
381 magic. */
382
sewardjf7fe0ee2005-12-22 19:25:51 +0000383DECL_TEMPLATE(ppc64_linux, sys_mmap);
sewardj2c48c7b2005-11-29 13:05:56 +0000384//zz DECL_TEMPLATE(ppc64_linux, sys_mmap2);
385//zz DECL_TEMPLATE(ppc64_linux, sys_stat64);
386//zz DECL_TEMPLATE(ppc64_linux, sys_lstat64);
387//zz DECL_TEMPLATE(ppc64_linux, sys_fstat64);
sewardj2c48c7b2005-11-29 13:05:56 +0000388//zz DECL_TEMPLATE(ppc64_linux, sys_sigreturn);
sewardjd74076b2006-01-03 04:10:13 +0000389DECL_TEMPLATE(ppc64_linux, sys_rt_sigreturn);
bartd0d634d2008-05-25 18:09:11 +0000390DECL_TEMPLATE(ppc64_linux, sys_fadvise64);
sewardje390bdf2006-01-02 19:06:37 +0000391
sewardjf7fe0ee2005-12-22 19:25:51 +0000392PRE(sys_mmap)
393{
394 SysRes r;
395
florianb26101c2015-08-08 21:45:33 +0000396 PRINT("sys_mmap ( %#lx, %lu, %lu, %lu, %lu, %lu )",
397 ARG1, ARG2, ARG3, ARG4, ARG5, ARG6 );
sewardjf7fe0ee2005-12-22 19:25:51 +0000398 PRE_REG_READ6(long, "mmap",
399 unsigned long, start, unsigned long, length,
400 unsigned long, prot, unsigned long, flags,
401 unsigned long, fd, unsigned long, offset);
402
403 r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
404 (Off64T)ARG6 );
405 SET_STATUS_from_SysRes(r);
406}
407
sewardj2c48c7b2005-11-29 13:05:56 +0000408//zz PRE(sys_mmap2)
409//zz {
410//zz SysRes r;
411//zz
412//zz // Exactly like old_mmap() except:
sewardje66f2e02006-12-30 17:45:08 +0000413//zz // - the file offset is specified in 4K units rather than bytes,
sewardj2c48c7b2005-11-29 13:05:56 +0000414//zz // so that it can be used for files bigger than 2^32 bytes.
415//zz PRINT("sys_mmap2 ( %p, %llu, %d, %d, %d, %d )",
416//zz ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 );
417//zz PRE_REG_READ6(long, "mmap2",
418//zz unsigned long, start, unsigned long, length,
419//zz unsigned long, prot, unsigned long, flags,
420//zz unsigned long, fd, unsigned long, offset);
421//zz
422//zz r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5,
sewardje66f2e02006-12-30 17:45:08 +0000423//zz 4096 * (Off64T)ARG6 );
sewardj2c48c7b2005-11-29 13:05:56 +0000424//zz SET_STATUS_from_SysRes(r);
425//zz }
426//zz
427//zz // XXX: lstat64/fstat64/stat64 are generic, but not necessarily
428//zz // applicable to every architecture -- I think only to 32-bit archs.
429//zz // We're going to need something like linux/core_os32.h for such
430//zz // things, eventually, I think. --njn
431//zz PRE(sys_stat64)
432//zz {
433//zz PRINT("sys_stat64 ( %p, %p )",ARG1,ARG2);
434//zz PRE_REG_READ2(long, "stat64", char *, file_name, struct stat64 *, buf);
435//zz PRE_MEM_RASCIIZ( "stat64(file_name)", ARG1 );
436//zz PRE_MEM_WRITE( "stat64(buf)", ARG2, sizeof(struct vki_stat64) );
437//zz }
438//zz
439//zz POST(sys_stat64)
440//zz {
441//zz POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
442//zz }
443//zz
444//zz PRE(sys_lstat64)
445//zz {
446//zz PRINT("sys_lstat64 ( %p(%s), %p )",ARG1,ARG1,ARG2);
447//zz PRE_REG_READ2(long, "lstat64", char *, file_name, struct stat64 *, buf);
448//zz PRE_MEM_RASCIIZ( "lstat64(file_name)", ARG1 );
449//zz PRE_MEM_WRITE( "lstat64(buf)", ARG2, sizeof(struct vki_stat64) );
450//zz }
451//zz
452//zz POST(sys_lstat64)
453//zz {
454//zz vg_assert(SUCCESS);
455//zz if (RES == 0) {
456//zz POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
457//zz }
458//zz }
459//zz
460//zz PRE(sys_fstat64)
461//zz {
462//zz PRINT("sys_fstat64 ( %d, %p )",ARG1,ARG2);
463//zz PRE_REG_READ2(long, "fstat64", unsigned long, fd, struct stat64 *, buf);
464//zz PRE_MEM_WRITE( "fstat64(buf)", ARG2, sizeof(struct vki_stat64) );
465//zz }
466//zz
467//zz POST(sys_fstat64)
468//zz {
469//zz POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
470//zz }
sewardj94c67352006-01-19 03:36:13 +0000471
bartd0d634d2008-05-25 18:09:11 +0000472PRE(sys_fadvise64)
473{
florianb26101c2015-08-08 21:45:33 +0000474 PRINT("sys_fadvise64 ( %ld, %ld, %lu, %ld )", SARG1, SARG2, SARG3, SARG4);
bartd0d634d2008-05-25 18:09:11 +0000475 PRE_REG_READ4(long, "fadvise64",
476 int, fd, vki_loff_t, offset, vki_size_t, len, int, advice);
477}
478
sewardjd74076b2006-01-03 04:10:13 +0000479PRE(sys_rt_sigreturn)
480{
sewardjcba8f432007-03-19 14:34:08 +0000481 /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for
482 an explanation of what follows. */
483
sewardjd2be8cc2011-03-28 20:33:52 +0000484 //ThreadState* tst;
sewardjcba8f432007-03-19 14:34:08 +0000485 PRINT("sys_rt_sigreturn ( )");
sewardjd74076b2006-01-03 04:10:13 +0000486
487 vg_assert(VG_(is_valid_tid)(tid));
488 vg_assert(tid >= 1 && tid < VG_N_THREADS);
489 vg_assert(VG_(is_running_thread)(tid));
490
491 ///* Adjust esp to point to start of frame; skip back up over handler
492 // ret addr */
sewardjd2be8cc2011-03-28 20:33:52 +0000493 //tst = VG_(get_ThreadState)(tid);
sewardjd74076b2006-01-03 04:10:13 +0000494 //tst->arch.vex.guest_ESP -= sizeof(Addr);
sewardjcba8f432007-03-19 14:34:08 +0000495 // Should we do something equivalent on ppc64-linux? Who knows.
sewardjd74076b2006-01-03 04:10:13 +0000496
497 ///* This is only so that the EIP is (might be) useful to report if
498 // something goes wrong in the sigreturn */
499 //ML_(fixup_guest_state_to_restart_syscall)(&tst->arch);
500 // Should we do something equivalent on ppc64? Who knows.
501
sewardjcba8f432007-03-19 14:34:08 +0000502 /* Restore register state from frame and remove it */
sewardjd74076b2006-01-03 04:10:13 +0000503 VG_(sigframe_destroy)(tid, True);
504
sewardjcba8f432007-03-19 14:34:08 +0000505 /* Tell the driver not to update the guest state with the "result",
506 and set a bogus result to keep it happy. */
507 *flags |= SfNoWriteResult;
508 SET_STATUS_Success(0);
sewardjd74076b2006-01-03 04:10:13 +0000509
sewardjcba8f432007-03-19 14:34:08 +0000510 /* Check to see if any signals arose as a result of this. */
sewardjd74076b2006-01-03 04:10:13 +0000511 *flags |= SfPollAfter;
512}
513
sewardj2c48c7b2005-11-29 13:05:56 +0000514#undef PRE
515#undef POST
516
517/* ---------------------------------------------------------------------
518 The ppc64/Linux syscall table
519 ------------------------------------------------------------------ */
520
521/* Add an ppc64-linux specific wrapper to a syscall table. */
522#define PLAX_(sysno, name) WRAPPER_ENTRY_X_(ppc64_linux, sysno, name)
523#define PLAXY(sysno, name) WRAPPER_ENTRY_XY(ppc64_linux, sysno, name)
524
525// This table maps from __NR_xxx syscall numbers (from
526// linux/include/asm-ppc/unistd.h) to the appropriate PRE/POST sys_foo()
527// wrappers on ppc64 (as per sys_call_table in linux/arch/ppc/kernel/entry.S).
528//
529// For those syscalls not handled by Valgrind, the annotation indicate its
530// arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/?
531// (unknown).
532
sewardjf5f1e122010-01-02 13:24:58 +0000533static SyscallTableEntry syscall_table[] = {
sewardj860b8dd2005-12-22 03:35:12 +0000534// _____(__NR_restart_syscall, sys_restart_syscall), // 0
sewardjf7fe0ee2005-12-22 19:25:51 +0000535 GENX_(__NR_exit, sys_exit), // 1
sewardj5b91c402006-07-24 10:06:09 +0000536 GENX_(__NR_fork, sys_fork), // 2
sewardj3d6320c2005-12-22 20:24:12 +0000537 GENXY(__NR_read, sys_read), // 3
sewardjf7fe0ee2005-12-22 19:25:51 +0000538 GENX_(__NR_write, sys_write), // 4
sewardj2c48c7b2005-11-29 13:05:56 +0000539
sewardj3d6320c2005-12-22 20:24:12 +0000540 GENXY(__NR_open, sys_open), // 5
541 GENXY(__NR_close, sys_close), // 6
sewardje390bdf2006-01-02 19:06:37 +0000542 GENXY(__NR_waitpid, sys_waitpid), // 7
543 GENXY(__NR_creat, sys_creat), // 8
sewardj5b91c402006-07-24 10:06:09 +0000544 GENX_(__NR_link, sys_link), // 9
sewardj2c48c7b2005-11-29 13:05:56 +0000545
sewardj3d6320c2005-12-22 20:24:12 +0000546 GENX_(__NR_unlink, sys_unlink), // 10
sewardje390bdf2006-01-02 19:06:37 +0000547 GENX_(__NR_execve, sys_execve), // 11
sewardjd74076b2006-01-03 04:10:13 +0000548 GENX_(__NR_chdir, sys_chdir), // 12
sewardj359c20c2006-02-14 21:48:42 +0000549 GENXY(__NR_time, sys_time), // 13
sewardj5b91c402006-07-24 10:06:09 +0000550 GENX_(__NR_mknod, sys_mknod), // 14
sewardj2c48c7b2005-11-29 13:05:56 +0000551
sewardj3d6320c2005-12-22 20:24:12 +0000552 GENX_(__NR_chmod, sys_chmod), // 15
sewardj5b91c402006-07-24 10:06:09 +0000553 GENX_(__NR_lchown, sys_lchown), // 16
sewardj860b8dd2005-12-22 03:35:12 +0000554// _____(__NR_break, sys_break), // 17
555// _____(__NR_oldstat, sys_oldstat), // 18
sewardj93baf942006-01-18 04:15:42 +0000556 LINX_(__NR_lseek, sys_lseek), // 19
sewardj2c48c7b2005-11-29 13:05:56 +0000557
sewardje390bdf2006-01-02 19:06:37 +0000558 GENX_(__NR_getpid, sys_getpid), // 20
sewardj5b91c402006-07-24 10:06:09 +0000559 LINX_(__NR_mount, sys_mount), // 21
sewardj860b8dd2005-12-22 03:35:12 +0000560// _____(__NR_umount, sys_umount), // 22
sewardj5b91c402006-07-24 10:06:09 +0000561 GENX_(__NR_setuid, sys_setuid), // 23
562 GENX_(__NR_getuid, sys_getuid), // 24
sewardj2c48c7b2005-11-29 13:05:56 +0000563
sewardj860b8dd2005-12-22 03:35:12 +0000564// _____(__NR_stime, sys_stime), // 25
florian1a7b0b92015-03-14 09:30:36 +0000565// When ptrace is supported, memcheck/tests/linux/getregset should be enabled
sewardj860b8dd2005-12-22 03:35:12 +0000566// _____(__NR_ptrace, sys_ptrace), // 26
sewardj93baf942006-01-18 04:15:42 +0000567 GENX_(__NR_alarm, sys_alarm), // 27
sewardj860b8dd2005-12-22 03:35:12 +0000568// _____(__NR_oldfstat, sys_oldfstat), // 28
sewardje390bdf2006-01-02 19:06:37 +0000569 GENX_(__NR_pause, sys_pause), // 29
sewardj2c48c7b2005-11-29 13:05:56 +0000570
sewardj3d6320c2005-12-22 20:24:12 +0000571 LINX_(__NR_utime, sys_utime), // 30
sewardj860b8dd2005-12-22 03:35:12 +0000572// _____(__NR_stty, sys_stty), // 31
573// _____(__NR_gtty, sys_gtty), // 32
sewardj50e77b22006-01-05 14:13:14 +0000574 GENX_(__NR_access, sys_access), // 33
sewardj860b8dd2005-12-22 03:35:12 +0000575// _____(__NR_nice, sys_nice), // 34
sewardj2c48c7b2005-11-29 13:05:56 +0000576
sewardj860b8dd2005-12-22 03:35:12 +0000577// _____(__NR_ftime, sys_ftime), // 35
Elliott Hughesa0664b92017-04-18 17:46:52 -0700578 GENX_(__NR_sync, sys_sync), // 36
sewardje390bdf2006-01-02 19:06:37 +0000579 GENX_(__NR_kill, sys_kill), // 37
sewardj5b91c402006-07-24 10:06:09 +0000580 GENX_(__NR_rename, sys_rename), // 38
sewardj93baf942006-01-18 04:15:42 +0000581 GENX_(__NR_mkdir, sys_mkdir), // 39
sewardj2c48c7b2005-11-29 13:05:56 +0000582
sewardjb4c72d62009-09-13 13:37:16 +0000583 GENX_(__NR_rmdir, sys_rmdir), // 40
sewardje390bdf2006-01-02 19:06:37 +0000584 GENXY(__NR_dup, sys_dup), // 41
sewardj73e16362006-01-04 15:40:16 +0000585 LINXY(__NR_pipe, sys_pipe), // 42
sewardjb4c72d62009-09-13 13:37:16 +0000586 GENXY(__NR_times, sys_times), // 43
sewardj860b8dd2005-12-22 03:35:12 +0000587// _____(__NR_prof, sys_prof), // 44
sewardj2c48c7b2005-11-29 13:05:56 +0000588
sewardj860b8dd2005-12-22 03:35:12 +0000589 GENX_(__NR_brk, sys_brk), // 45
sewardj5b91c402006-07-24 10:06:09 +0000590 GENX_(__NR_setgid, sys_setgid), // 46
591 GENX_(__NR_getgid, sys_getgid), // 47
sewardj860b8dd2005-12-22 03:35:12 +0000592// _____(__NR_signal, sys_signal), // 48
sewardjab53d3e2006-02-11 14:35:17 +0000593 GENX_(__NR_geteuid, sys_geteuid), // 49
sewardj2c48c7b2005-11-29 13:05:56 +0000594
sewardj5b91c402006-07-24 10:06:09 +0000595 GENX_(__NR_getegid, sys_getegid), // 50
sewardj860b8dd2005-12-22 03:35:12 +0000596// _____(__NR_acct, sys_acct), // 51
sewardj5b91c402006-07-24 10:06:09 +0000597 LINX_(__NR_umount2, sys_umount), // 52
sewardj860b8dd2005-12-22 03:35:12 +0000598// _____(__NR_lock, sys_lock), // 53
njn096ccdd2009-02-22 23:00:30 +0000599 LINXY(__NR_ioctl, sys_ioctl), // 54
sewardj2c48c7b2005-11-29 13:05:56 +0000600
njn096ccdd2009-02-22 23:00:30 +0000601 LINXY(__NR_fcntl, sys_fcntl), // 55
sewardj860b8dd2005-12-22 03:35:12 +0000602// _____(__NR_mpx, sys_mpx), // 56
sewardj5b91c402006-07-24 10:06:09 +0000603 GENX_(__NR_setpgid, sys_setpgid), // 57
sewardj860b8dd2005-12-22 03:35:12 +0000604// _____(__NR_ulimit, sys_ulimit), // 58
605// _____(__NR_oldolduname, sys_oldolduname), // 59
sewardj2c48c7b2005-11-29 13:05:56 +0000606
sewardj5b91c402006-07-24 10:06:09 +0000607 GENX_(__NR_umask, sys_umask), // 60
608 GENX_(__NR_chroot, sys_chroot), // 61
sewardj860b8dd2005-12-22 03:35:12 +0000609// _____(__NR_ustat, sys_ustat), // 62
sewardj73e16362006-01-04 15:40:16 +0000610 GENXY(__NR_dup2, sys_dup2), // 63
sewardjab53d3e2006-02-11 14:35:17 +0000611 GENX_(__NR_getppid, sys_getppid), // 64
sewardj2c48c7b2005-11-29 13:05:56 +0000612
sewardj5b91c402006-07-24 10:06:09 +0000613 GENX_(__NR_getpgrp, sys_getpgrp), // 65
614 GENX_(__NR_setsid, sys_setsid), // 66
sewardj860b8dd2005-12-22 03:35:12 +0000615// _____(__NR_sigaction, sys_sigaction), // 67
616// _____(__NR_sgetmask, sys_sgetmask), // 68
617// _____(__NR_ssetmask, sys_ssetmask), // 69
sewardj2c48c7b2005-11-29 13:05:56 +0000618
sewardj5b91c402006-07-24 10:06:09 +0000619 GENX_(__NR_setreuid, sys_setreuid), // 70
620 GENX_(__NR_setregid, sys_setregid), // 71
sewardj860b8dd2005-12-22 03:35:12 +0000621// _____(__NR_sigsuspend, sys_sigsuspend), // 72
622// _____(__NR_sigpending, sys_sigpending), // 73
623// _____(__NR_sethostname, sys_sethostname), // 74
sewardj2c48c7b2005-11-29 13:05:56 +0000624
sewardje390bdf2006-01-02 19:06:37 +0000625 GENX_(__NR_setrlimit, sys_setrlimit), // 75
sewardj860b8dd2005-12-22 03:35:12 +0000626// _____(__NR_getrlimit, sys_getrlimit), // 76
sewardj517cdd52006-02-09 11:16:58 +0000627 GENXY(__NR_getrusage, sys_getrusage), // 77
sewardje390bdf2006-01-02 19:06:37 +0000628 GENXY(__NR_gettimeofday, sys_gettimeofday), // 78
sewardj860b8dd2005-12-22 03:35:12 +0000629// _____(__NR_settimeofday, sys_settimeofday), // 79
sewardj2c48c7b2005-11-29 13:05:56 +0000630
sewardj5b91c402006-07-24 10:06:09 +0000631 GENXY(__NR_getgroups, sys_getgroups), // 80
632 GENX_(__NR_setgroups, sys_setgroups), // 81
sewardj860b8dd2005-12-22 03:35:12 +0000633// _____(__NR_select, sys_select), // 82
sewardj5b91c402006-07-24 10:06:09 +0000634 GENX_(__NR_symlink, sys_symlink), // 83
sewardj860b8dd2005-12-22 03:35:12 +0000635// _____(__NR_oldlstat, sys_oldlstat), // 84
sewardj2c48c7b2005-11-29 13:05:56 +0000636
sewardjab53d3e2006-02-11 14:35:17 +0000637 GENX_(__NR_readlink, sys_readlink), // 85
sewardj860b8dd2005-12-22 03:35:12 +0000638// _____(__NR_uselib, sys_uselib), // 86
639// _____(__NR_swapon, sys_swapon), // 87
640// _____(__NR_reboot, sys_reboot), // 88
641// _____(__NR_readdir, sys_readdir), // 89
sewardj2c48c7b2005-11-29 13:05:56 +0000642
sewardjf7fe0ee2005-12-22 19:25:51 +0000643 PLAX_(__NR_mmap, sys_mmap), // 90
644 GENXY(__NR_munmap, sys_munmap), // 91
sewardj5b91c402006-07-24 10:06:09 +0000645 GENX_(__NR_truncate, sys_truncate), // 92
sewardj94c67352006-01-19 03:36:13 +0000646 GENX_(__NR_ftruncate, sys_ftruncate), // 93
sewardj5b91c402006-07-24 10:06:09 +0000647 GENX_(__NR_fchmod, sys_fchmod), // 94
648
649 GENX_(__NR_fchown, sys_fchown), // 95
mjw78bc7702014-03-10 14:45:32 +0000650 GENX_(__NR_getpriority, sys_getpriority), // 96
651 GENX_(__NR_setpriority, sys_setpriority), // 97
sewardj860b8dd2005-12-22 03:35:12 +0000652// _____(__NR_profil, sys_profil), // 98
sewardj359c20c2006-02-14 21:48:42 +0000653 GENXY(__NR_statfs, sys_statfs), // 99
sewardj2c48c7b2005-11-29 13:05:56 +0000654
sewardjedc95472008-08-07 20:29:55 +0000655 GENXY(__NR_fstatfs, sys_fstatfs), // 100
sewardj860b8dd2005-12-22 03:35:12 +0000656// _____(__NR_ioperm, sys_ioperm), // 101
philippef2a7bbe2012-11-04 20:40:33 +0000657 LINXY(__NR_socketcall, sys_socketcall), // 102
bart65bfd212008-04-26 10:57:07 +0000658 LINXY(__NR_syslog, sys_syslog), // 103
sewardj5b91c402006-07-24 10:06:09 +0000659 GENXY(__NR_setitimer, sys_setitimer), // 104
sewardj2c48c7b2005-11-29 13:05:56 +0000660
sewardje0036f72007-11-20 19:59:51 +0000661 GENXY(__NR_getitimer, sys_getitimer), // 105
sewardj3d6320c2005-12-22 20:24:12 +0000662 GENXY(__NR_stat, sys_newstat), // 106
sewardj5b91c402006-07-24 10:06:09 +0000663 GENXY(__NR_lstat, sys_newlstat), // 107
sewardjf7fe0ee2005-12-22 19:25:51 +0000664 GENXY(__NR_fstat, sys_newfstat), // 108
sewardj860b8dd2005-12-22 03:35:12 +0000665// _____(__NR_olduname, sys_olduname), // 109
sewardj2c48c7b2005-11-29 13:05:56 +0000666
sewardj860b8dd2005-12-22 03:35:12 +0000667// _____(__NR_iopl, sys_iopl), // 110
tomacb7c342009-11-25 11:54:56 +0000668 LINX_(__NR_vhangup, sys_vhangup), // 111
sewardj860b8dd2005-12-22 03:35:12 +0000669// _____(__NR_idle, sys_idle), // 112
670// _____(__NR_vm86, sys_vm86), // 113
sewardje390bdf2006-01-02 19:06:37 +0000671 GENXY(__NR_wait4, sys_wait4), // 114
sewardj2c48c7b2005-11-29 13:05:56 +0000672
sewardj860b8dd2005-12-22 03:35:12 +0000673// _____(__NR_swapoff, sys_swapoff), // 115
sewardjf7af0472008-01-09 22:01:40 +0000674 LINXY(__NR_sysinfo, sys_sysinfo), // 116
philippe4eefc8c2012-10-21 20:21:17 +0000675 LINXY(__NR_ipc, sys_ipc), // 117
sewardj5b91c402006-07-24 10:06:09 +0000676 GENX_(__NR_fsync, sys_fsync), // 118
sewardj860b8dd2005-12-22 03:35:12 +0000677// _____(__NR_sigreturn, sys_sigreturn), // 119
sewardj2c48c7b2005-11-29 13:05:56 +0000678
Elliott Hughesed398002017-06-21 14:41:24 -0700679 LINX_(__NR_clone, sys_clone), // 120
sewardj860b8dd2005-12-22 03:35:12 +0000680// _____(__NR_setdomainname, sys_setdomainname), // 121
681 GENXY(__NR_uname, sys_newuname), // 122
682// _____(__NR_modify_ldt, sys_modify_ldt), // 123
tom9ceaa972009-11-24 16:38:21 +0000683 LINXY(__NR_adjtimex, sys_adjtimex), // 124
sewardj2c48c7b2005-11-29 13:05:56 +0000684
sewardjee038632005-12-30 15:02:49 +0000685 GENXY(__NR_mprotect, sys_mprotect), // 125
sewardj860b8dd2005-12-22 03:35:12 +0000686// _____(__NR_sigprocmask, sys_sigprocmask), // 126
bart65bfd212008-04-26 10:57:07 +0000687 GENX_(__NR_create_module, sys_ni_syscall), // 127
bart10ac1442008-06-21 16:28:24 +0000688 LINX_(__NR_init_module, sys_init_module), // 128
689 LINX_(__NR_delete_module, sys_delete_module), // 129
sewardj2c48c7b2005-11-29 13:05:56 +0000690
sewardj860b8dd2005-12-22 03:35:12 +0000691// _____(__NR_get_kernel_syms, sys_get_kernel_syms), // 130
692// _____(__NR_quotactl, sys_quotactl), // 131
sewardj5b91c402006-07-24 10:06:09 +0000693 GENX_(__NR_getpgid, sys_getpgid), // 132
694 GENX_(__NR_fchdir, sys_fchdir), // 133
sewardj860b8dd2005-12-22 03:35:12 +0000695// _____(__NR_bdflush, sys_bdflush), // 134
sewardj2c48c7b2005-11-29 13:05:56 +0000696
sewardj860b8dd2005-12-22 03:35:12 +0000697// _____(__NR_sysfs, sys_sysfs), // 135
sewardj5b91c402006-07-24 10:06:09 +0000698 LINX_(__NR_personality, sys_personality), // 136
sewardj860b8dd2005-12-22 03:35:12 +0000699// _____(__NR_afs_syscall, sys_afs_syscall), // 137
sewardj5b91c402006-07-24 10:06:09 +0000700 LINX_(__NR_setfsuid, sys_setfsuid), // 138
701 LINX_(__NR_setfsgid, sys_setfsgid), // 139
sewardj2c48c7b2005-11-29 13:05:56 +0000702
sewardj3d6320c2005-12-22 20:24:12 +0000703 LINXY(__NR__llseek, sys_llseek), // 140
sewardj359c20c2006-02-14 21:48:42 +0000704 GENXY(__NR_getdents, sys_getdents), // 141
sewardj5b91c402006-07-24 10:06:09 +0000705 GENX_(__NR__newselect, sys_select), // 142
706 GENX_(__NR_flock, sys_flock), // 143
707 GENX_(__NR_msync, sys_msync), // 144
sewardj2c48c7b2005-11-29 13:05:56 +0000708
sewardj93baf942006-01-18 04:15:42 +0000709 GENXY(__NR_readv, sys_readv), // 145
sewardjee038632005-12-30 15:02:49 +0000710 GENX_(__NR_writev, sys_writev), // 146
sewardj860b8dd2005-12-22 03:35:12 +0000711// _____(__NR_getsid, sys_getsid), // 147
sewardj5b91c402006-07-24 10:06:09 +0000712 GENX_(__NR_fdatasync, sys_fdatasync), // 148
sewardj50e77b22006-01-05 14:13:14 +0000713 LINXY(__NR__sysctl, sys_sysctl), // 149
sewardj2c48c7b2005-11-29 13:05:56 +0000714
sewardj5b91c402006-07-24 10:06:09 +0000715 GENX_(__NR_mlock, sys_mlock), // 150
716 GENX_(__NR_munlock, sys_munlock), // 151
717 GENX_(__NR_mlockall, sys_mlockall), // 152
718 LINX_(__NR_munlockall, sys_munlockall), // 153
bart2819f142008-07-09 07:39:09 +0000719 LINXY(__NR_sched_setparam, sys_sched_setparam), // 154
sewardj2c48c7b2005-11-29 13:05:56 +0000720
sewardj5b91c402006-07-24 10:06:09 +0000721 LINXY(__NR_sched_getparam, sys_sched_getparam), // 155
722 LINX_(__NR_sched_setscheduler, sys_sched_setscheduler), // 156
723 LINX_(__NR_sched_getscheduler, sys_sched_getscheduler), // 157
724 LINX_(__NR_sched_yield, sys_sched_yield), // 158
725 LINX_(__NR_sched_get_priority_max, sys_sched_get_priority_max),// 159
sewardj2c48c7b2005-11-29 13:05:56 +0000726
sewardj5b91c402006-07-24 10:06:09 +0000727 LINX_(__NR_sched_get_priority_min, sys_sched_get_priority_min),// 160
tomb8b48482009-11-24 16:03:19 +0000728 LINXY(__NR_sched_rr_get_interval, sys_sched_rr_get_interval), // 161
sewardj53258442005-12-30 22:49:24 +0000729 GENXY(__NR_nanosleep, sys_nanosleep), // 162
sewardje390bdf2006-01-02 19:06:37 +0000730 GENX_(__NR_mremap, sys_mremap), // 163
sewardjadf01032011-10-20 10:44:34 +0000731 LINX_(__NR_setresuid, sys_setresuid), // 164
sewardj2c48c7b2005-11-29 13:05:56 +0000732
sewardjf7af0472008-01-09 22:01:40 +0000733 LINXY(__NR_getresuid, sys_getresuid), // 165
sewardj860b8dd2005-12-22 03:35:12 +0000734// _____(__NR_query_module, sys_query_module), // 166
sewardje390bdf2006-01-02 19:06:37 +0000735 GENXY(__NR_poll, sys_poll), // 167
sewardj860b8dd2005-12-22 03:35:12 +0000736// _____(__NR_nfsservctl, sys_nfsservctl), // 168
sewardjadf01032011-10-20 10:44:34 +0000737 LINX_(__NR_setresgid, sys_setresgid), // 169
sewardj2c48c7b2005-11-29 13:05:56 +0000738
sewardjf7af0472008-01-09 22:01:40 +0000739 LINXY(__NR_getresgid, sys_getresgid), // 170
sewardjfdb70812013-03-29 09:40:48 +0000740 LINXY(__NR_prctl, sys_prctl), // 171
sewardjd74076b2006-01-03 04:10:13 +0000741 PLAX_(__NR_rt_sigreturn, sys_rt_sigreturn), // 172
sewardj3d6320c2005-12-22 20:24:12 +0000742 LINXY(__NR_rt_sigaction, sys_rt_sigaction), // 173
sewardj53258442005-12-30 22:49:24 +0000743 LINXY(__NR_rt_sigprocmask, sys_rt_sigprocmask), // 174
sewardj2c48c7b2005-11-29 13:05:56 +0000744
mjw2ca1f262015-04-22 15:29:03 +0000745 LINXY(__NR_rt_sigpending, sys_rt_sigpending), // 175
sewardj73e16362006-01-04 15:40:16 +0000746 LINXY(__NR_rt_sigtimedwait, sys_rt_sigtimedwait), // 176
barta3dbcc82009-10-27 14:55:49 +0000747 LINXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo), // 177
sewardj13de2312013-10-21 10:07:43 +0000748 LINX_(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 178
njn7b1edbd2009-05-19 06:50:37 +0000749 GENXY(__NR_pread64, sys_pread64), // 179
sewardj2c48c7b2005-11-29 13:05:56 +0000750
sewardjaf6505f2011-05-17 16:07:33 +0000751 GENX_(__NR_pwrite64, sys_pwrite64), // 180
sewardj3d6320c2005-12-22 20:24:12 +0000752 GENX_(__NR_chown, sys_chown), // 181
sewardjee038632005-12-30 15:02:49 +0000753 GENXY(__NR_getcwd, sys_getcwd), // 182
bart744f9ea2008-08-27 17:41:56 +0000754 LINXY(__NR_capget, sys_capget), // 183
755 LINX_(__NR_capset, sys_capset), // 184
sewardj2c48c7b2005-11-29 13:05:56 +0000756
sewardj94c67352006-01-19 03:36:13 +0000757 GENXY(__NR_sigaltstack, sys_sigaltstack), // 185
sewardj5b91c402006-07-24 10:06:09 +0000758 LINXY(__NR_sendfile, sys_sendfile), // 186
sewardj860b8dd2005-12-22 03:35:12 +0000759// _____(__NR_getpmsg, sys_getpmsg), // 187
760// _____(__NR_putpmsg, sys_putpmsg), // 188
sewardjd74076b2006-01-03 04:10:13 +0000761 GENX_(__NR_vfork, sys_fork), // 189 treat as fork
sewardj2c48c7b2005-11-29 13:05:56 +0000762
sewardja7421c92006-01-02 16:25:31 +0000763 GENXY(__NR_ugetrlimit, sys_getrlimit), // 190
sewardj792e00a2010-10-04 20:03:27 +0000764 LINX_(__NR_readahead, sys_readahead), // 191
sewardj2c48c7b2005-11-29 13:05:56 +0000765// /* #define __NR_mmap2 192 32bit only */
766// /* #define __NR_truncate64 193 32bit only */
767// /* #define __NR_ftruncate64 194 32bit only */
768
769// /* #define __NR_stat64 195 32bit only */
770// /* #define __NR_lstat64 196 32bit only */
771// /* #define __NR_fstat64 197 32bit only */
sewardj860b8dd2005-12-22 03:35:12 +0000772// _____(__NR_pciconfig_read, sys_pciconfig_read), // 198
773// _____(__NR_pciconfig_write, sys_pciconfig_write), // 199
sewardj2c48c7b2005-11-29 13:05:56 +0000774
sewardj860b8dd2005-12-22 03:35:12 +0000775// _____(__NR_pciconfig_iobase, sys_pciconfig_iobase), // 200
776// _____(__NR_multiplexer, sys_multiplexer), // 201
sewardjedc95472008-08-07 20:29:55 +0000777 GENXY(__NR_getdents64, sys_getdents64), // 202
sewardj8a3377f2014-09-08 11:19:48 +0000778 LINX_(__NR_pivot_root, sys_pivot_root), // 203
njn096ccdd2009-02-22 23:00:30 +0000779 LINXY(__NR_fcntl64, sys_fcntl64), // 204 !!!!?? 32bit only */
sewardj2c48c7b2005-11-29 13:05:56 +0000780
sewardj8611edf2006-01-20 21:46:03 +0000781 GENX_(__NR_madvise, sys_madvise), // 205
sewardj860b8dd2005-12-22 03:35:12 +0000782// _____(__NR_mincore, sys_mincore), // 206
sewardj94c67352006-01-19 03:36:13 +0000783 LINX_(__NR_gettid, sys_gettid), // 207
sewardj860b8dd2005-12-22 03:35:12 +0000784// _____(__NR_tkill, sys_tkill), // 208
mjwe746a122013-07-05 09:50:26 +0000785 LINX_(__NR_setxattr, sys_setxattr), // 209
sewardj2c48c7b2005-11-29 13:05:56 +0000786
mjwe746a122013-07-05 09:50:26 +0000787 LINX_(__NR_lsetxattr, sys_lsetxattr), // 210
788 LINX_(__NR_fsetxattr, sys_fsetxattr), // 211
sewardj5b91c402006-07-24 10:06:09 +0000789 LINXY(__NR_getxattr, sys_getxattr), // 212
790 LINXY(__NR_lgetxattr, sys_lgetxattr), // 213
791 LINXY(__NR_fgetxattr, sys_fgetxattr), // 214
792 LINXY(__NR_listxattr, sys_listxattr), // 215
793 LINXY(__NR_llistxattr, sys_llistxattr), // 216
794 LINXY(__NR_flistxattr, sys_flistxattr), // 217
795 LINX_(__NR_removexattr, sys_removexattr), // 218
796 LINX_(__NR_lremovexattr, sys_lremovexattr), // 219
797 LINX_(__NR_fremovexattr, sys_fremovexattr), // 220
sewardj2c48c7b2005-11-29 13:05:56 +0000798
sewardja7421c92006-01-02 16:25:31 +0000799 LINXY(__NR_futex, sys_futex), // 221
sewardj5b91c402006-07-24 10:06:09 +0000800 LINX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 222
801 LINXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 223
sewardj2c48c7b2005-11-29 13:05:56 +0000802// /* 224 currently unused */
803
sewardj860b8dd2005-12-22 03:35:12 +0000804// _____(__NR_tuxcall, sys_tuxcall), // 225
sewardj2c48c7b2005-11-29 13:05:56 +0000805// /* #define __NR_sendfile64 226 32bit only */
sewardj5b91c402006-07-24 10:06:09 +0000806 LINX_(__NR_io_setup, sys_io_setup), // 227
807 LINX_(__NR_io_destroy, sys_io_destroy), // 228
808 LINXY(__NR_io_getevents, sys_io_getevents), // 229
809 LINX_(__NR_io_submit, sys_io_submit), // 230
810 LINXY(__NR_io_cancel, sys_io_cancel), // 231
sewardja7421c92006-01-02 16:25:31 +0000811 LINX_(__NR_set_tid_address, sys_set_tid_address), // 232
bartd0d634d2008-05-25 18:09:11 +0000812 PLAX_(__NR_fadvise64, sys_fadvise64), // 233
sewardjf7fe0ee2005-12-22 19:25:51 +0000813 LINX_(__NR_exit_group, sys_exit_group), // 234
sewardj2c48c7b2005-11-29 13:05:56 +0000814
sewardj860b8dd2005-12-22 03:35:12 +0000815// _____(__NR_lookup_dcookie, sys_lookup_dcookie), // 235
sewardj5b91c402006-07-24 10:06:09 +0000816 LINXY(__NR_epoll_create, sys_epoll_create), // 236
817 LINX_(__NR_epoll_ctl, sys_epoll_ctl), // 237
818 LINXY(__NR_epoll_wait, sys_epoll_wait), // 238
sewardj860b8dd2005-12-22 03:35:12 +0000819// _____(__NR_remap_file_pages, sys_remap_file_pages), // 239
sewardj2c48c7b2005-11-29 13:05:56 +0000820
sewardj5b91c402006-07-24 10:06:09 +0000821 LINXY(__NR_timer_create, sys_timer_create), // 240
822 LINXY(__NR_timer_settime, sys_timer_settime), // 241
823 LINXY(__NR_timer_gettime, sys_timer_gettime), // 242
824 LINX_(__NR_timer_getoverrun, sys_timer_getoverrun), // 243
825 LINX_(__NR_timer_delete, sys_timer_delete), // 244
826 LINX_(__NR_clock_settime, sys_clock_settime), // 245
827 LINXY(__NR_clock_gettime, sys_clock_gettime), // 246
828 LINXY(__NR_clock_getres, sys_clock_getres), // 247
829 LINXY(__NR_clock_nanosleep, sys_clock_nanosleep), // 248
sewardj2c48c7b2005-11-29 13:05:56 +0000830
sewardj860b8dd2005-12-22 03:35:12 +0000831// _____(__NR_swapcontext, sys_swapcontext), // 249
sewardj2c48c7b2005-11-29 13:05:56 +0000832
sewardje390bdf2006-01-02 19:06:37 +0000833 LINXY(__NR_tgkill, sys_tgkill), // 250
sewardj860b8dd2005-12-22 03:35:12 +0000834// _____(__NR_utimes, sys_utimes), // 251
835// _____(__NR_statfs64, sys_statfs64), // 252
836// _____(__NR_fstatfs64, sys_fstatfs64), // 253
sewardj2c48c7b2005-11-29 13:05:56 +0000837// /* #define __NR_fadvise64_64 254 32bit only */
838
sewardj860b8dd2005-12-22 03:35:12 +0000839// _____(__NR_rtas, sys_rtas), // 255
sewardj2c48c7b2005-11-29 13:05:56 +0000840// /* Number 256 is reserved for sys_debug_setcontext */
841// /* Number 257 is reserved for vserver */
842// /* 258 currently unused */
carll521cebb2013-05-07 15:47:35 +0000843 LINX_(__NR_mbind, sys_mbind), // 259
sewardj2c48c7b2005-11-29 13:05:56 +0000844
carll521cebb2013-05-07 15:47:35 +0000845 LINXY(__NR_get_mempolicy, sys_get_mempolicy), // 260
846 LINX_(__NR_set_mempolicy, sys_set_mempolicy), // 261
sewardjf65f9d32006-01-23 04:34:22 +0000847 LINXY(__NR_mq_open, sys_mq_open), // 262
848 LINX_(__NR_mq_unlink, sys_mq_unlink), // 263
849 LINX_(__NR_mq_timedsend, sys_mq_timedsend), // 264
sewardj2c48c7b2005-11-29 13:05:56 +0000850
tom44e534d2010-05-24 13:40:10 +0000851 LINXY(__NR_mq_timedreceive, sys_mq_timedreceive), // 265
sewardjf65f9d32006-01-23 04:34:22 +0000852 LINX_(__NR_mq_notify, sys_mq_notify), // 266
853 LINXY(__NR_mq_getsetattr, sys_mq_getsetattr), // 267
sewardj860b8dd2005-12-22 03:35:12 +0000854// _____(__NR_kexec_load, sys_kexec_load), // 268
tom7f4d7e42007-03-07 11:12:13 +0000855 LINX_(__NR_add_key, sys_add_key), // 269
sewardj2c48c7b2005-11-29 13:05:56 +0000856
tom7f4d7e42007-03-07 11:12:13 +0000857 LINX_(__NR_request_key, sys_request_key), // 270
858 LINXY(__NR_keyctl, sys_keyctl), // 271
Elliott Hughesa0664b92017-04-18 17:46:52 -0700859 LINXY(__NR_waitid, sys_waitid), // 272
tom16dfea42008-12-15 08:58:29 +0000860 LINX_(__NR_ioprio_set, sys_ioprio_set), // 273
861 LINX_(__NR_ioprio_get, sys_ioprio_get), // 274
sewardj2c48c7b2005-11-29 13:05:56 +0000862
sewardj5b91c402006-07-24 10:06:09 +0000863 LINX_(__NR_inotify_init, sys_inotify_init), // 275
864 LINX_(__NR_inotify_add_watch, sys_inotify_add_watch), // 276
865 LINX_(__NR_inotify_rm_watch, sys_inotify_rm_watch), // 277
866
Elliott Hughesa0664b92017-04-18 17:46:52 -0700867 LINXY(__NR_pselect6, sys_pselect6), // 280
bart14fcbc12011-03-18 17:47:38 +0000868 LINXY(__NR_ppoll, sys_ppoll), // 281
869
sewardj5b91c402006-07-24 10:06:09 +0000870 LINXY(__NR_openat, sys_openat), // 286
871 LINX_(__NR_mkdirat, sys_mkdirat), // 287
872 LINX_(__NR_mknodat, sys_mknodat), // 288
873 LINX_(__NR_fchownat, sys_fchownat), // 289
874 LINX_(__NR_futimesat, sys_futimesat), // 290
875 LINXY(__NR_newfstatat, sys_newfstatat), // 291
876 LINX_(__NR_unlinkat, sys_unlinkat), // 292
877 LINX_(__NR_renameat, sys_renameat), // 293
878 LINX_(__NR_linkat, sys_linkat), // 294
879 LINX_(__NR_symlinkat, sys_symlinkat), // 295
880 LINX_(__NR_readlinkat, sys_readlinkat), // 296
881 LINX_(__NR_fchmodat, sys_fchmodat), // 297
882 LINX_(__NR_faccessat, sys_faccessat), // 298
883 LINX_(__NR_set_robust_list, sys_set_robust_list), // 299
884 LINXY(__NR_get_robust_list, sys_get_robust_list), // 300
tomd5fb58e2012-04-03 10:51:27 +0000885 LINXY(__NR_move_pages, sys_move_pages), // 301
tom472a34b2010-02-23 10:02:55 +0000886 LINXY(__NR_getcpu, sys_getcpu), // 302
bartf5ceec82008-04-26 07:45:10 +0000887 LINXY(__NR_epoll_pwait, sys_epoll_pwait), // 303
888 LINX_(__NR_utimensat, sys_utimensat), // 304
889 LINXY(__NR_signalfd, sys_signalfd), // 305
bart8c4a0232008-05-12 18:16:14 +0000890 LINXY(__NR_timerfd_create, sys_timerfd_create), // 306
tom4f5be8c2014-01-30 21:47:30 +0000891 LINXY(__NR_eventfd, sys_eventfd), // 307
tomc0fe32a2009-11-25 11:29:14 +0000892 LINX_(__NR_sync_file_range2, sys_sync_file_range2), // 308
njn0bd71772009-07-15 03:08:35 +0000893 LINX_(__NR_fallocate, sys_fallocate), // 309
bart5fc7da22008-04-27 12:56:06 +0000894// LINXY(__NR_subpage_prot, sys_ni_syscall), // 310
895 LINXY(__NR_timerfd_settime, sys_timerfd_settime), // 311
896 LINXY(__NR_timerfd_gettime, sys_timerfd_gettime), // 312
tom6c67ef52009-01-09 16:42:51 +0000897 LINXY(__NR_signalfd4, sys_signalfd4), // 313
tom4f5be8c2014-01-30 21:47:30 +0000898 LINXY(__NR_eventfd2, sys_eventfd2), // 314
njn72715882009-07-10 12:02:03 +0000899 LINXY(__NR_epoll_create1, sys_epoll_create1), // 315
tomf43793a2009-11-23 08:19:20 +0000900 LINXY(__NR_dup3, sys_dup3), // 316
tom3fbccee2009-10-27 09:19:26 +0000901 LINXY(__NR_pipe2, sys_pipe2), // 317
tom7bb1b1c2009-10-27 14:17:27 +0000902 LINXY(__NR_inotify_init1, sys_inotify_init1), // 318
tomc8232f92011-06-08 09:10:40 +0000903 LINXY(__NR_perf_event_open, sys_perf_event_open), // 319
tomd8feb702009-10-28 10:04:11 +0000904 LINXY(__NR_preadv, sys_preadv), // 320
905 LINX_(__NR_pwritev, sys_pwritev), // 321
tom9e4b6362012-02-10 09:39:37 +0000906 LINXY(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo),// 322
907
Elliott Hughesed398002017-06-21 14:41:24 -0700908 LINXY(__NR_prlimit64, sys_prlimit64), // 325
Elliott Hughesa0664b92017-04-18 17:46:52 -0700909 LINXY(__NR_socket, sys_socket), // 326
910 LINX_(__NR_bind, sys_bind), // 327
911 LINX_(__NR_connect, sys_connect), // 328
912 LINX_(__NR_listen, sys_listen), // 329
913 LINXY(__NR_accept, sys_accept), // 330
914 LINXY(__NR_getsockname, sys_getsockname), // 331
915 LINXY(__NR_getpeername, sys_getpeername), // 332
916 LINXY(__NR_socketpair, sys_socketpair), // 333
917 LINX_(__NR_send, sys_send), // 334
918 LINX_(__NR_sendto, sys_sendto), // 335
919 LINXY(__NR_recv, sys_recv), // 336
920 LINXY(__NR_recvfrom, sys_recvfrom), // 337
921 LINX_(__NR_shutdown, sys_shutdown), // 338
922 LINX_(__NR_setsockopt, sys_setsockopt), // 339
923 LINXY(__NR_getsockopt, sys_getsockopt), // 340
924 LINX_(__NR_sendmsg, sys_sendmsg), // 341
925 LINXY(__NR_recvmsg, sys_recvmsg), // 342
mjwc53a5342015-02-17 19:50:45 +0000926 LINXY(__NR_recvmmsg, sys_recvmmsg), // 343
mjwe4a905f2015-02-10 13:39:04 +0000927 LINXY(__NR_accept4, sys_accept4), // 344
Elliott Hughesa0664b92017-04-18 17:46:52 -0700928 LINXY(__NR_name_to_handle_at, sys_name_to_handle_at),// 345
929 LINXY(__NR_open_by_handle_at, sys_open_by_handle_at),// 346
tomddc4a182014-01-30 22:33:02 +0000930 LINXY(__NR_clock_adjtime, sys_clock_adjtime), // 347
tom9e2645c2015-05-07 18:54:31 +0000931 LINX_(__NR_syncfs, sys_syncfs), // 348
mjw13af2412015-02-17 16:04:09 +0000932 LINXY(__NR_sendmmsg, sys_sendmmsg), // 349
933
tom9e4b6362012-02-10 09:39:37 +0000934 LINXY(__NR_process_vm_readv, sys_process_vm_readv), // 351
tome6366712014-11-10 09:55:59 +0000935 LINX_(__NR_process_vm_writev, sys_process_vm_writev),// 352
936
Elliott Hughesa0664b92017-04-18 17:46:52 -0700937 LINX_(__NR_renameat2, sys_renameat2), // 357
938
tom9d7592e2015-01-19 21:52:44 +0000939 LINXY(__NR_getrandom, sys_getrandom), // 359
940 LINXY(__NR_memfd_create, sys_memfd_create) // 360
sewardj2c48c7b2005-11-29 13:05:56 +0000941};
942
sewardjf5f1e122010-01-02 13:24:58 +0000943SyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno )
944{
945 const UInt syscall_table_size
946 = sizeof(syscall_table) / sizeof(syscall_table[0]);
947
948 /* Is it in the contiguous initial section of the table? */
949 if (sysno < syscall_table_size) {
950 SyscallTableEntry* sys = &syscall_table[sysno];
951 if (sys->before == NULL)
952 return NULL; /* no entry */
953 else
954 return sys;
955 }
956
957 /* Can't find a wrapper */
958 return NULL;
959}
sewardj2c48c7b2005-11-29 13:05:56 +0000960
carllcae0cc22014-08-07 23:17:29 +0000961#endif // defined(VGP_ppc64be_linux) || defined(VGP_ppc64le_linux)
njn8b68b642009-06-24 00:37:09 +0000962
sewardj2c48c7b2005-11-29 13:05:56 +0000963/*--------------------------------------------------------------------*/
964/*--- end ---*/
965/*--------------------------------------------------------------------*/