1 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 10 Copyright (C) 2005-2013 Nicholas Nethercote <njn@valgrind.org> 11 Copyright (C) 2005-2013 Cerion Armour-Brown <cerion@open-works.co.uk> 12 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#if defined(VGP_ppc64_linux) 32 33#include "pub_core_basics.h" 34#include "pub_core_vki.h" 35#include "pub_core_vkiscnums.h" 36#include "pub_core_libcsetjmp.h" // to keep _threadstate.h happy 37#include "pub_core_threadstate.h" 38#include "pub_core_aspacemgr.h" 39#include "pub_core_debuglog.h" 40#include "pub_core_libcbase.h" 41#include "pub_core_libcassert.h" 42#include "pub_core_libcprint.h" 43#include "pub_core_libcproc.h" 44#include "pub_core_libcsignal.h" 45#include "pub_core_options.h" 46#include "pub_core_scheduler.h" 47#include "pub_core_sigframe.h" // For VG_(sigframe_destroy)() 48#include "pub_core_signals.h" 49#include "pub_core_syscall.h" 50#include "pub_core_syswrap.h" 51#include "pub_core_tooliface.h" 52#include "pub_core_stacks.h" // VG_(register_stack) 53 54#include "priv_types_n_macros.h" 55#include "priv_syswrap-generic.h" /* for decls of generic wrappers */ 56#include "priv_syswrap-linux.h" /* for decls of linux-ish wrappers */ 57#include "priv_syswrap-main.h" 58 59 60/* --------------------------------------------------------------------- 61 clone() handling 62 ------------------------------------------------------------------ */ 63 64/* Call f(arg1), but first switch stacks, using 'stack' as the new 65 stack, and use 'retaddr' as f's return-to address. Also, clear all 66 the integer registers before entering f.*/ 67__attribute__((noreturn)) 68void ML_(call_on_new_stack_0_1) ( Addr stack, 69 Addr retaddr, 70 void (*f_desc)(Word), 71 Word arg1 ); 72// r3 = stack 73// r4 = retaddr 74// r5 = function descriptor 75// r6 = arg1 76/* On PPC64, a func ptr is represented by a TOC entry ptr. 77 This TOC entry contains three words; the first word is the function 78 address, the second word is the TOC ptr (r2), and the third word is 79 the static chain value. */ 80asm( 81" .align 2\n" 82" .globl vgModuleLocal_call_on_new_stack_0_1\n" 83" .section \".opd\",\"aw\"\n" 84" .align 3\n" 85"vgModuleLocal_call_on_new_stack_0_1:\n" 86" .quad .vgModuleLocal_call_on_new_stack_0_1,.TOC.@tocbase,0\n" 87" .previous\n" 88" .type .vgModuleLocal_call_on_new_stack_0_1,@function\n" 89" .globl .vgModuleLocal_call_on_new_stack_0_1\n" 90".vgModuleLocal_call_on_new_stack_0_1:\n" 91" mr %r1,%r3\n\t" // stack to %sp 92" mtlr %r4\n\t" // retaddr to %lr 93" ld 5,0(5)\n\t" // load f_ptr from f_desc[0] 94" mtctr %r5\n\t" // f_ptr to count reg 95" mr %r3,%r6\n\t" // arg1 to %r3 96" li 0,0\n\t" // zero all GP regs 97" li 4,0\n\t" 98" li 5,0\n\t" 99" li 6,0\n\t" 100" li 7,0\n\t" 101" li 8,0\n\t" 102" li 9,0\n\t" 103" li 10,0\n\t" 104" li 11,0\n\t" 105" li 12,0\n\t" 106" li 13,0\n\t" 107" li 14,0\n\t" 108" li 15,0\n\t" 109" li 16,0\n\t" 110" li 17,0\n\t" 111" li 18,0\n\t" 112" li 19,0\n\t" 113" li 20,0\n\t" 114" li 21,0\n\t" 115" li 22,0\n\t" 116" li 23,0\n\t" 117" li 24,0\n\t" 118" li 25,0\n\t" 119" li 26,0\n\t" 120" li 27,0\n\t" 121" li 28,0\n\t" 122" li 29,0\n\t" 123" li 30,0\n\t" 124" li 31,0\n\t" 125" mtxer 0\n\t" // CAB: Need this? 126" mtcr 0\n\t" // CAB: Need this? 127" bctr\n\t" // jump to dst 128" trap\n" // should never get here 129); 130 131 132/* 133 Perform a clone system call. clone is strange because it has 134 fork()-like return-twice semantics, so it needs special 135 handling here. 136 137 Upon entry, we have: 138 139 word (fn)(void*) in r3 140 void* child_stack in r4 141 word flags in r5 142 void* arg in r6 143 pid_t* child_tid in r7 144 pid_t* parent_tid in r8 145 void* ??? in r9 146 147 Note: r3 contains fn desc ptr, not fn ptr -- p_fn = p_fn_desc[0] 148 System call requires: 149 150 int $__NR_clone in r0 (sc number) 151 int flags in r3 (sc arg1) 152 void* child_stack in r4 (sc arg2) 153 pid_t* parent_tid in r5 (sc arg3) 154 ?? child_tls in r6 (sc arg4) 155 pid_t* child_tid in r7 (sc arg5) 156 void* ??? in r8 (sc arg6) 157 158 Returns a ULong encoded as: top half is %cr following syscall, 159 low half is syscall return value (r3). 160 */ 161#define __NR_CLONE VG_STRINGIFY(__NR_clone) 162#define __NR_EXIT VG_STRINGIFY(__NR_exit) 163 164extern 165ULong do_syscall_clone_ppc64_linux ( Word (*fn)(void *), 166 void* stack, 167 Int flags, 168 void* arg, 169 Int* child_tid, 170 Int* parent_tid, 171 void/*vki_modify_ldt_t*/ * ); 172asm( 173" .align 2\n" 174" .globl do_syscall_clone_ppc64_linux\n" 175" .section \".opd\",\"aw\"\n" 176" .align 3\n" 177"do_syscall_clone_ppc64_linux:\n" 178" .quad .do_syscall_clone_ppc64_linux,.TOC.@tocbase,0\n" 179" .previous\n" 180" .type .do_syscall_clone_ppc64_linux,@function\n" 181" .globl .do_syscall_clone_ppc64_linux\n" 182".do_syscall_clone_ppc64_linux:\n" 183" stdu 1,-64(1)\n" 184" std 29,40(1)\n" 185" std 30,48(1)\n" 186" std 31,56(1)\n" 187" mr 30,3\n" // preserve fn 188" mr 31,6\n" // preserve arg 189 190 // setup child stack 191" rldicr 4,4, 0,59\n" // trim sp to multiple of 16 bytes 192 // (r4 &= ~0xF) 193" li 0,0\n" 194" stdu 0,-32(4)\n" // make initial stack frame 195" mr 29,4\n" // preserve sp 196 197 // setup syscall 198" li 0,"__NR_CLONE"\n" // syscall number 199" mr 3,5\n" // syscall arg1: flags 200 // r4 already setup // syscall arg2: child_stack 201" mr 5,8\n" // syscall arg3: parent_tid 202" mr 6,13\n" // syscall arg4: REAL THREAD tls 203" mr 7,7\n" // syscall arg5: child_tid 204" mr 8,8\n" // syscall arg6: ???? 205" mr 9,9\n" // syscall arg7: ???? 206 207" sc\n" // clone() 208 209" mfcr 4\n" // CR now in low half r4 210" sldi 4,4,32\n" // CR now in hi half r4 211 212" sldi 3,3,32\n" 213" srdi 3,3,32\n" // zero out hi half r3 214 215" or 3,3,4\n" // r3 = CR : syscall-retval 216" cmpwi 3,0\n" // child if retval == 0 (note, cmpw) 217" bne 1f\n" // jump if !child 218 219 /* CHILD - call thread function */ 220 /* Note: 2.4 kernel doesn't set the child stack pointer, 221 so we do it here. 222 That does leave a small window for a signal to be delivered 223 on the wrong stack, unfortunately. */ 224" mr 1,29\n" 225" ld 30, 0(30)\n" // convert fn desc ptr to fn ptr 226" mtctr 30\n" // ctr reg = fn 227" mr 3,31\n" // r3 = arg 228" bctrl\n" // call fn() 229 230 // exit with result 231" li 0,"__NR_EXIT"\n" 232" sc\n" 233 234 // Exit returned?! 235" .long 0\n" 236 237 // PARENT or ERROR - return 238"1: ld 29,40(1)\n" 239" ld 30,48(1)\n" 240" ld 31,56(1)\n" 241" addi 1,1,64\n" 242" blr\n" 243); 244 245#undef __NR_CLONE 246#undef __NR_EXIT 247 248// forward declarations 249static void setup_child ( ThreadArchState*, ThreadArchState* ); 250 251/* 252 When a client clones, we need to keep track of the new thread. This means: 253 1. allocate a ThreadId+ThreadState+stack for the the thread 254 255 2. initialize the thread's new VCPU state 256 257 3. create the thread using the same args as the client requested, 258 but using the scheduler entrypoint for IP, and a separate stack 259 for SP. 260 */ 261static SysRes do_clone ( ThreadId ptid, 262 UInt flags, Addr sp, 263 Int *parent_tidptr, 264 Int *child_tidptr, 265 Addr child_tls) 266{ 267 const Bool debug = False; 268 269 ThreadId ctid = VG_(alloc_ThreadState)(); 270 ThreadState* ptst = VG_(get_ThreadState)(ptid); 271 ThreadState* ctst = VG_(get_ThreadState)(ctid); 272 ULong word64; 273 UWord* stack; 274 NSegment const* seg; 275 SysRes res; 276 vki_sigset_t blockall, savedmask; 277 278 VG_(sigfillset)(&blockall); 279 280 vg_assert(VG_(is_running_thread)(ptid)); 281 vg_assert(VG_(is_valid_tid)(ctid)); 282 283 stack = (UWord*)ML_(allocstack)(ctid); 284 if (stack == NULL) { 285 res = VG_(mk_SysRes_Error)( VKI_ENOMEM ); 286 goto out; 287 } 288 289//? /* make a stack frame */ 290//? stack -= 16; 291//? *(UWord *)stack = 0; 292 293 294 /* Copy register state 295 296 Both parent and child return to the same place, and the code 297 following the clone syscall works out which is which, so we 298 don't need to worry about it. 299 300 The parent gets the child's new tid returned from clone, but the 301 child gets 0. 302 303 If the clone call specifies a NULL SP for the new thread, then 304 it actually gets a copy of the parent's SP. 305 306 The child's TLS register (r2) gets set to the tlsaddr argument 307 if the CLONE_SETTLS flag is set. 308 */ 309 setup_child( &ctst->arch, &ptst->arch ); 310 311 /* Make sys_clone appear to have returned Success(0) in the 312 child. */ 313 { UInt old_cr = LibVEX_GuestPPC64_get_CR( &ctst->arch.vex ); 314 /* %r3 = 0 */ 315 ctst->arch.vex.guest_GPR3 = 0; 316 /* %cr0.so = 0 */ 317 LibVEX_GuestPPC64_put_CR( old_cr & ~(1<<28), &ctst->arch.vex ); 318 } 319 320 if (sp != 0) 321 ctst->arch.vex.guest_GPR1 = sp; 322 323 ctst->os_state.parent = ptid; 324 325 /* inherit signal mask */ 326 ctst->sig_mask = ptst->sig_mask; 327 ctst->tmp_sig_mask = ptst->sig_mask; 328 329 /* Start the child with its threadgroup being the same as the 330 parent's. This is so that any exit_group calls that happen 331 after the child is created but before it sets its 332 os_state.threadgroup field for real (in thread_wrapper in 333 syswrap-linux.c), really kill the new thread. a.k.a this avoids 334 a race condition in which the thread is unkillable (via 335 exit_group) because its threadgroup is not set. The race window 336 is probably only a few hundred or a few thousand cycles long. 337 See #226116. */ 338 ctst->os_state.threadgroup = ptst->os_state.threadgroup; 339 340 /* We don't really know where the client stack is, because its 341 allocated by the client. The best we can do is look at the 342 memory mappings and try to derive some useful information. We 343 assume that esp starts near its highest possible value, and can 344 only go down to the start of the mmaped segment. */ 345 seg = VG_(am_find_nsegment)(sp); 346 if (seg && seg->kind != SkResvn) { 347 ctst->client_stack_highest_word = (Addr)VG_PGROUNDUP(sp); 348 ctst->client_stack_szB = ctst->client_stack_highest_word - seg->start; 349 350 VG_(register_stack)(seg->start, ctst->client_stack_highest_word); 351 352 if (debug) 353 VG_(printf)("\ntid %d: guessed client stack range %#lx-%#lx\n", 354 ctid, seg->start, VG_PGROUNDUP(sp)); 355 } else { 356 VG_(message)(Vg_UserMsg, 357 "!? New thread %d starts with R1(%#lx) unmapped\n", 358 ctid, sp); 359 ctst->client_stack_szB = 0; 360 } 361 362 /* Assume the clone will succeed, and tell any tool that wants to 363 know that this thread has come into existence. If the clone 364 fails, we'll send out a ll_exit notification for it at the out: 365 label below, to clean up. */ 366 vg_assert(VG_(owns_BigLock_LL)(ptid)); 367 VG_TRACK ( pre_thread_ll_create, ptid, ctid ); 368 369 if (flags & VKI_CLONE_SETTLS) { 370 if (debug) 371 VG_(printf)("clone child has SETTLS: tls at %#lx\n", child_tls); 372 ctst->arch.vex.guest_GPR13 = child_tls; 373 } 374 375 flags &= ~VKI_CLONE_SETTLS; 376 377 /* start the thread with everything blocked */ 378 VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, &savedmask); 379 380 /* Create the new thread */ 381 word64 = do_syscall_clone_ppc64_linux( 382 ML_(start_thread_NORETURN), 383 stack, flags, &VG_(threads)[ctid], 384 child_tidptr, parent_tidptr, NULL 385 ); 386 387 /* Low half word64 is syscall return value. Hi half is 388 the entire CR, from which we need to extract CR0.SO. */ 389 /* VG_(printf)("word64 = 0x%llx\n", word64); */ 390 res = VG_(mk_SysRes_ppc64_linux)( 391 /*val*/(UInt)(word64 & 0xFFFFFFFFULL), 392 /*errflag*/ (UInt)((word64 >> (32+28)) & 1) 393 ); 394 395 VG_(sigprocmask)(VKI_SIG_SETMASK, &savedmask, NULL); 396 397 out: 398 if (sr_isError(res)) { 399 /* clone failed */ 400 VG_(cleanup_thread)(&ctst->arch); 401 ctst->status = VgTs_Empty; 402 /* oops. Better tell the tool the thread exited in a hurry :-) */ 403 VG_TRACK( pre_thread_ll_exit, ctid ); 404 } 405 406 return res; 407} 408 409 410 411/* --------------------------------------------------------------------- 412 More thread stuff 413 ------------------------------------------------------------------ */ 414 415void VG_(cleanup_thread) ( ThreadArchState* arch ) 416{ 417} 418 419void setup_child ( /*OUT*/ ThreadArchState *child, 420 /*IN*/ ThreadArchState *parent ) 421{ 422 /* We inherit our parent's guest state. */ 423 child->vex = parent->vex; 424 child->vex_shadow1 = parent->vex_shadow1; 425 child->vex_shadow2 = parent->vex_shadow2; 426} 427 428 429/* --------------------------------------------------------------------- 430 PRE/POST wrappers for ppc64/Linux-specific syscalls 431 ------------------------------------------------------------------ */ 432 433#define PRE(name) DEFN_PRE_TEMPLATE(ppc64_linux, name) 434#define POST(name) DEFN_POST_TEMPLATE(ppc64_linux, name) 435 436/* Add prototypes for the wrappers declared here, so that gcc doesn't 437 harass us for not having prototypes. Really this is a kludge -- 438 the right thing to do is to make these wrappers 'static' since they 439 aren't visible outside this file, but that requires even more macro 440 magic. */ 441 442DECL_TEMPLATE(ppc64_linux, sys_mmap); 443//zz DECL_TEMPLATE(ppc64_linux, sys_mmap2); 444//zz DECL_TEMPLATE(ppc64_linux, sys_stat64); 445//zz DECL_TEMPLATE(ppc64_linux, sys_lstat64); 446//zz DECL_TEMPLATE(ppc64_linux, sys_fstat64); 447DECL_TEMPLATE(ppc64_linux, sys_clone); 448//zz DECL_TEMPLATE(ppc64_linux, sys_sigreturn); 449DECL_TEMPLATE(ppc64_linux, sys_rt_sigreturn); 450DECL_TEMPLATE(ppc64_linux, sys_fadvise64); 451 452PRE(sys_mmap) 453{ 454 SysRes r; 455 456 PRINT("sys_mmap ( %#lx, %llu, %ld, %ld, %ld, %ld )", 457 ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 ); 458 PRE_REG_READ6(long, "mmap", 459 unsigned long, start, unsigned long, length, 460 unsigned long, prot, unsigned long, flags, 461 unsigned long, fd, unsigned long, offset); 462 463 r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5, 464 (Off64T)ARG6 ); 465 SET_STATUS_from_SysRes(r); 466} 467 468//zz PRE(sys_mmap2) 469//zz { 470//zz SysRes r; 471//zz 472//zz // Exactly like old_mmap() except: 473//zz // - the file offset is specified in 4K units rather than bytes, 474//zz // so that it can be used for files bigger than 2^32 bytes. 475//zz PRINT("sys_mmap2 ( %p, %llu, %d, %d, %d, %d )", 476//zz ARG1, (ULong)ARG2, ARG3, ARG4, ARG5, ARG6 ); 477//zz PRE_REG_READ6(long, "mmap2", 478//zz unsigned long, start, unsigned long, length, 479//zz unsigned long, prot, unsigned long, flags, 480//zz unsigned long, fd, unsigned long, offset); 481//zz 482//zz r = ML_(generic_PRE_sys_mmap)( tid, ARG1, ARG2, ARG3, ARG4, ARG5, 483//zz 4096 * (Off64T)ARG6 ); 484//zz SET_STATUS_from_SysRes(r); 485//zz } 486//zz 487//zz // XXX: lstat64/fstat64/stat64 are generic, but not necessarily 488//zz // applicable to every architecture -- I think only to 32-bit archs. 489//zz // We're going to need something like linux/core_os32.h for such 490//zz // things, eventually, I think. --njn 491//zz PRE(sys_stat64) 492//zz { 493//zz PRINT("sys_stat64 ( %p, %p )",ARG1,ARG2); 494//zz PRE_REG_READ2(long, "stat64", char *, file_name, struct stat64 *, buf); 495//zz PRE_MEM_RASCIIZ( "stat64(file_name)", ARG1 ); 496//zz PRE_MEM_WRITE( "stat64(buf)", ARG2, sizeof(struct vki_stat64) ); 497//zz } 498//zz 499//zz POST(sys_stat64) 500//zz { 501//zz POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) ); 502//zz } 503//zz 504//zz PRE(sys_lstat64) 505//zz { 506//zz PRINT("sys_lstat64 ( %p(%s), %p )",ARG1,ARG1,ARG2); 507//zz PRE_REG_READ2(long, "lstat64", char *, file_name, struct stat64 *, buf); 508//zz PRE_MEM_RASCIIZ( "lstat64(file_name)", ARG1 ); 509//zz PRE_MEM_WRITE( "lstat64(buf)", ARG2, sizeof(struct vki_stat64) ); 510//zz } 511//zz 512//zz POST(sys_lstat64) 513//zz { 514//zz vg_assert(SUCCESS); 515//zz if (RES == 0) { 516//zz POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) ); 517//zz } 518//zz } 519//zz 520//zz PRE(sys_fstat64) 521//zz { 522//zz PRINT("sys_fstat64 ( %d, %p )",ARG1,ARG2); 523//zz PRE_REG_READ2(long, "fstat64", unsigned long, fd, struct stat64 *, buf); 524//zz PRE_MEM_WRITE( "fstat64(buf)", ARG2, sizeof(struct vki_stat64) ); 525//zz } 526//zz 527//zz POST(sys_fstat64) 528//zz { 529//zz POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) ); 530//zz } 531 532 533PRE(sys_clone) 534{ 535 UInt cloneflags; 536 537 PRINT("sys_clone ( %lx, %#lx, %#lx, %#lx, %#lx )",ARG1,ARG2,ARG3,ARG4,ARG5); 538 PRE_REG_READ5(int, "clone", 539 unsigned long, flags, 540 void *, child_stack, 541 int *, parent_tidptr, 542 void *, child_tls, 543 int *, child_tidptr); 544 545 if (ARG1 & VKI_CLONE_PARENT_SETTID) { 546 PRE_MEM_WRITE("clone(parent_tidptr)", ARG3, sizeof(Int)); 547 if (!VG_(am_is_valid_for_client)(ARG3, sizeof(Int), 548 VKI_PROT_WRITE)) { 549 SET_STATUS_Failure( VKI_EFAULT ); 550 return; 551 } 552 } 553 if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) { 554 PRE_MEM_WRITE("clone(child_tidptr)", ARG5, sizeof(Int)); 555 if (!VG_(am_is_valid_for_client)(ARG5, sizeof(Int), 556 VKI_PROT_WRITE)) { 557 SET_STATUS_Failure( VKI_EFAULT ); 558 return; 559 } 560 } 561 562 cloneflags = ARG1; 563 564 if (!ML_(client_signal_OK)(ARG1 & VKI_CSIGNAL)) { 565 SET_STATUS_Failure( VKI_EINVAL ); 566 return; 567 } 568 569 /* Only look at the flags we really care about */ 570 switch (cloneflags & (VKI_CLONE_VM | VKI_CLONE_FS 571 | VKI_CLONE_FILES | VKI_CLONE_VFORK)) { 572 case VKI_CLONE_VM | VKI_CLONE_FS | VKI_CLONE_FILES: 573 /* thread creation */ 574 SET_STATUS_from_SysRes( 575 do_clone(tid, 576 ARG1, /* flags */ 577 (Addr)ARG2, /* child SP */ 578 (Int *)ARG3, /* parent_tidptr */ 579 (Int *)ARG5, /* child_tidptr */ 580 (Addr)ARG4)); /* child_tls */ 581 break; 582 583 case VKI_CLONE_VFORK | VKI_CLONE_VM: /* vfork */ 584 /* FALLTHROUGH - assume vfork == fork */ 585 cloneflags &= ~(VKI_CLONE_VFORK | VKI_CLONE_VM); 586 587 case 0: /* plain fork */ 588 SET_STATUS_from_SysRes( 589 ML_(do_fork_clone)(tid, 590 cloneflags, /* flags */ 591 (Int *)ARG3, /* parent_tidptr */ 592 (Int *)ARG5)); /* child_tidptr */ 593 break; 594 595 default: 596 /* should we just ENOSYS? */ 597 VG_(message)(Vg_UserMsg, "Unsupported clone() flags: 0x%lx\n", ARG1); 598 VG_(message)(Vg_UserMsg, "\n"); 599 VG_(message)(Vg_UserMsg, "The only supported clone() uses are:\n"); 600 VG_(message)(Vg_UserMsg, " - via a threads library (LinuxThreads or NPTL)\n"); 601 VG_(message)(Vg_UserMsg, " - via the implementation of fork or vfork\n"); 602 VG_(unimplemented) 603 ("Valgrind does not support general clone()."); 604 } 605 606 if (SUCCESS) { 607 if (ARG1 & VKI_CLONE_PARENT_SETTID) 608 POST_MEM_WRITE(ARG3, sizeof(Int)); 609 if (ARG1 & (VKI_CLONE_CHILD_SETTID | VKI_CLONE_CHILD_CLEARTID)) 610 POST_MEM_WRITE(ARG5, sizeof(Int)); 611 612 /* Thread creation was successful; let the child have the chance 613 to run */ 614 *flags |= SfYieldAfter; 615 } 616} 617 618PRE(sys_fadvise64) 619{ 620 PRINT("sys_fadvise64 ( %ld, %ld, %lu, %ld )", ARG1,ARG2,ARG3,ARG4); 621 PRE_REG_READ4(long, "fadvise64", 622 int, fd, vki_loff_t, offset, vki_size_t, len, int, advice); 623} 624 625PRE(sys_rt_sigreturn) 626{ 627 /* See comments on PRE(sys_rt_sigreturn) in syswrap-amd64-linux.c for 628 an explanation of what follows. */ 629 630 //ThreadState* tst; 631 PRINT("sys_rt_sigreturn ( )"); 632 633 vg_assert(VG_(is_valid_tid)(tid)); 634 vg_assert(tid >= 1 && tid < VG_N_THREADS); 635 vg_assert(VG_(is_running_thread)(tid)); 636 637 ///* Adjust esp to point to start of frame; skip back up over handler 638 // ret addr */ 639 //tst = VG_(get_ThreadState)(tid); 640 //tst->arch.vex.guest_ESP -= sizeof(Addr); 641 // Should we do something equivalent on ppc64-linux? Who knows. 642 643 ///* This is only so that the EIP is (might be) useful to report if 644 // something goes wrong in the sigreturn */ 645 //ML_(fixup_guest_state_to_restart_syscall)(&tst->arch); 646 // Should we do something equivalent on ppc64? Who knows. 647 648 /* Restore register state from frame and remove it */ 649 VG_(sigframe_destroy)(tid, True); 650 651 /* Tell the driver not to update the guest state with the "result", 652 and set a bogus result to keep it happy. */ 653 *flags |= SfNoWriteResult; 654 SET_STATUS_Success(0); 655 656 /* Check to see if any signals arose as a result of this. */ 657 *flags |= SfPollAfter; 658} 659 660#undef PRE 661#undef POST 662 663/* --------------------------------------------------------------------- 664 The ppc64/Linux syscall table 665 ------------------------------------------------------------------ */ 666 667/* Add an ppc64-linux specific wrapper to a syscall table. */ 668#define PLAX_(sysno, name) WRAPPER_ENTRY_X_(ppc64_linux, sysno, name) 669#define PLAXY(sysno, name) WRAPPER_ENTRY_XY(ppc64_linux, sysno, name) 670 671// This table maps from __NR_xxx syscall numbers (from 672// linux/include/asm-ppc/unistd.h) to the appropriate PRE/POST sys_foo() 673// wrappers on ppc64 (as per sys_call_table in linux/arch/ppc/kernel/entry.S). 674// 675// For those syscalls not handled by Valgrind, the annotation indicate its 676// arch/OS combination, eg. */* (generic), */Linux (Linux only), ?/? 677// (unknown). 678 679static SyscallTableEntry syscall_table[] = { 680// _____(__NR_restart_syscall, sys_restart_syscall), // 0 681 GENX_(__NR_exit, sys_exit), // 1 682 GENX_(__NR_fork, sys_fork), // 2 683 GENXY(__NR_read, sys_read), // 3 684 GENX_(__NR_write, sys_write), // 4 685 686 GENXY(__NR_open, sys_open), // 5 687 GENXY(__NR_close, sys_close), // 6 688 GENXY(__NR_waitpid, sys_waitpid), // 7 689 GENXY(__NR_creat, sys_creat), // 8 690 GENX_(__NR_link, sys_link), // 9 691 692 GENX_(__NR_unlink, sys_unlink), // 10 693 GENX_(__NR_execve, sys_execve), // 11 694 GENX_(__NR_chdir, sys_chdir), // 12 695 GENXY(__NR_time, sys_time), // 13 696 GENX_(__NR_mknod, sys_mknod), // 14 697 698 GENX_(__NR_chmod, sys_chmod), // 15 699 GENX_(__NR_lchown, sys_lchown), // 16 700// _____(__NR_break, sys_break), // 17 701// _____(__NR_oldstat, sys_oldstat), // 18 702 LINX_(__NR_lseek, sys_lseek), // 19 703 704 GENX_(__NR_getpid, sys_getpid), // 20 705 LINX_(__NR_mount, sys_mount), // 21 706// _____(__NR_umount, sys_umount), // 22 707 GENX_(__NR_setuid, sys_setuid), // 23 708 GENX_(__NR_getuid, sys_getuid), // 24 709 710// _____(__NR_stime, sys_stime), // 25 711// _____(__NR_ptrace, sys_ptrace), // 26 712 GENX_(__NR_alarm, sys_alarm), // 27 713// _____(__NR_oldfstat, sys_oldfstat), // 28 714 GENX_(__NR_pause, sys_pause), // 29 715 716 LINX_(__NR_utime, sys_utime), // 30 717// _____(__NR_stty, sys_stty), // 31 718// _____(__NR_gtty, sys_gtty), // 32 719 GENX_(__NR_access, sys_access), // 33 720// _____(__NR_nice, sys_nice), // 34 721 722// _____(__NR_ftime, sys_ftime), // 35 723// _____(__NR_sync, sys_sync), // 36 724 GENX_(__NR_kill, sys_kill), // 37 725 GENX_(__NR_rename, sys_rename), // 38 726 GENX_(__NR_mkdir, sys_mkdir), // 39 727 728 GENX_(__NR_rmdir, sys_rmdir), // 40 729 GENXY(__NR_dup, sys_dup), // 41 730 LINXY(__NR_pipe, sys_pipe), // 42 731 GENXY(__NR_times, sys_times), // 43 732// _____(__NR_prof, sys_prof), // 44 733 734 GENX_(__NR_brk, sys_brk), // 45 735 GENX_(__NR_setgid, sys_setgid), // 46 736 GENX_(__NR_getgid, sys_getgid), // 47 737// _____(__NR_signal, sys_signal), // 48 738 GENX_(__NR_geteuid, sys_geteuid), // 49 739 740 GENX_(__NR_getegid, sys_getegid), // 50 741// _____(__NR_acct, sys_acct), // 51 742 LINX_(__NR_umount2, sys_umount), // 52 743// _____(__NR_lock, sys_lock), // 53 744 LINXY(__NR_ioctl, sys_ioctl), // 54 745 746 LINXY(__NR_fcntl, sys_fcntl), // 55 747// _____(__NR_mpx, sys_mpx), // 56 748 GENX_(__NR_setpgid, sys_setpgid), // 57 749// _____(__NR_ulimit, sys_ulimit), // 58 750// _____(__NR_oldolduname, sys_oldolduname), // 59 751 752 GENX_(__NR_umask, sys_umask), // 60 753 GENX_(__NR_chroot, sys_chroot), // 61 754// _____(__NR_ustat, sys_ustat), // 62 755 GENXY(__NR_dup2, sys_dup2), // 63 756 GENX_(__NR_getppid, sys_getppid), // 64 757 758 GENX_(__NR_getpgrp, sys_getpgrp), // 65 759 GENX_(__NR_setsid, sys_setsid), // 66 760// _____(__NR_sigaction, sys_sigaction), // 67 761// _____(__NR_sgetmask, sys_sgetmask), // 68 762// _____(__NR_ssetmask, sys_ssetmask), // 69 763 764 GENX_(__NR_setreuid, sys_setreuid), // 70 765 GENX_(__NR_setregid, sys_setregid), // 71 766// _____(__NR_sigsuspend, sys_sigsuspend), // 72 767// _____(__NR_sigpending, sys_sigpending), // 73 768// _____(__NR_sethostname, sys_sethostname), // 74 769 770 GENX_(__NR_setrlimit, sys_setrlimit), // 75 771// _____(__NR_getrlimit, sys_getrlimit), // 76 772 GENXY(__NR_getrusage, sys_getrusage), // 77 773 GENXY(__NR_gettimeofday, sys_gettimeofday), // 78 774// _____(__NR_settimeofday, sys_settimeofday), // 79 775 776 GENXY(__NR_getgroups, sys_getgroups), // 80 777 GENX_(__NR_setgroups, sys_setgroups), // 81 778// _____(__NR_select, sys_select), // 82 779 GENX_(__NR_symlink, sys_symlink), // 83 780// _____(__NR_oldlstat, sys_oldlstat), // 84 781 782 GENX_(__NR_readlink, sys_readlink), // 85 783// _____(__NR_uselib, sys_uselib), // 86 784// _____(__NR_swapon, sys_swapon), // 87 785// _____(__NR_reboot, sys_reboot), // 88 786// _____(__NR_readdir, sys_readdir), // 89 787 788 PLAX_(__NR_mmap, sys_mmap), // 90 789 GENXY(__NR_munmap, sys_munmap), // 91 790 GENX_(__NR_truncate, sys_truncate), // 92 791 GENX_(__NR_ftruncate, sys_ftruncate), // 93 792 GENX_(__NR_fchmod, sys_fchmod), // 94 793 794 GENX_(__NR_fchown, sys_fchown), // 95 795 GENX_(__NR_getpriority, sys_getpriority), // 96 796 GENX_(__NR_setpriority, sys_setpriority), // 97 797// _____(__NR_profil, sys_profil), // 98 798 GENXY(__NR_statfs, sys_statfs), // 99 799 800 GENXY(__NR_fstatfs, sys_fstatfs), // 100 801// _____(__NR_ioperm, sys_ioperm), // 101 802 LINXY(__NR_socketcall, sys_socketcall), // 102 803 LINXY(__NR_syslog, sys_syslog), // 103 804 GENXY(__NR_setitimer, sys_setitimer), // 104 805 806 GENXY(__NR_getitimer, sys_getitimer), // 105 807 GENXY(__NR_stat, sys_newstat), // 106 808 GENXY(__NR_lstat, sys_newlstat), // 107 809 GENXY(__NR_fstat, sys_newfstat), // 108 810// _____(__NR_olduname, sys_olduname), // 109 811 812// _____(__NR_iopl, sys_iopl), // 110 813 LINX_(__NR_vhangup, sys_vhangup), // 111 814// _____(__NR_idle, sys_idle), // 112 815// _____(__NR_vm86, sys_vm86), // 113 816 GENXY(__NR_wait4, sys_wait4), // 114 817 818// _____(__NR_swapoff, sys_swapoff), // 115 819 LINXY(__NR_sysinfo, sys_sysinfo), // 116 820 LINXY(__NR_ipc, sys_ipc), // 117 821 GENX_(__NR_fsync, sys_fsync), // 118 822// _____(__NR_sigreturn, sys_sigreturn), // 119 823 824 PLAX_(__NR_clone, sys_clone), // 120 825// _____(__NR_setdomainname, sys_setdomainname), // 121 826 GENXY(__NR_uname, sys_newuname), // 122 827// _____(__NR_modify_ldt, sys_modify_ldt), // 123 828 LINXY(__NR_adjtimex, sys_adjtimex), // 124 829 830 GENXY(__NR_mprotect, sys_mprotect), // 125 831// _____(__NR_sigprocmask, sys_sigprocmask), // 126 832 GENX_(__NR_create_module, sys_ni_syscall), // 127 833 LINX_(__NR_init_module, sys_init_module), // 128 834 LINX_(__NR_delete_module, sys_delete_module), // 129 835 836// _____(__NR_get_kernel_syms, sys_get_kernel_syms), // 130 837// _____(__NR_quotactl, sys_quotactl), // 131 838 GENX_(__NR_getpgid, sys_getpgid), // 132 839 GENX_(__NR_fchdir, sys_fchdir), // 133 840// _____(__NR_bdflush, sys_bdflush), // 134 841 842// _____(__NR_sysfs, sys_sysfs), // 135 843 LINX_(__NR_personality, sys_personality), // 136 844// _____(__NR_afs_syscall, sys_afs_syscall), // 137 845 LINX_(__NR_setfsuid, sys_setfsuid), // 138 846 LINX_(__NR_setfsgid, sys_setfsgid), // 139 847 848 LINXY(__NR__llseek, sys_llseek), // 140 849 GENXY(__NR_getdents, sys_getdents), // 141 850 GENX_(__NR__newselect, sys_select), // 142 851 GENX_(__NR_flock, sys_flock), // 143 852 GENX_(__NR_msync, sys_msync), // 144 853 854 GENXY(__NR_readv, sys_readv), // 145 855 GENX_(__NR_writev, sys_writev), // 146 856// _____(__NR_getsid, sys_getsid), // 147 857 GENX_(__NR_fdatasync, sys_fdatasync), // 148 858 LINXY(__NR__sysctl, sys_sysctl), // 149 859 860 GENX_(__NR_mlock, sys_mlock), // 150 861 GENX_(__NR_munlock, sys_munlock), // 151 862 GENX_(__NR_mlockall, sys_mlockall), // 152 863 LINX_(__NR_munlockall, sys_munlockall), // 153 864 LINXY(__NR_sched_setparam, sys_sched_setparam), // 154 865 866 LINXY(__NR_sched_getparam, sys_sched_getparam), // 155 867 LINX_(__NR_sched_setscheduler, sys_sched_setscheduler), // 156 868 LINX_(__NR_sched_getscheduler, sys_sched_getscheduler), // 157 869 LINX_(__NR_sched_yield, sys_sched_yield), // 158 870 LINX_(__NR_sched_get_priority_max, sys_sched_get_priority_max),// 159 871 872 LINX_(__NR_sched_get_priority_min, sys_sched_get_priority_min),// 160 873 LINXY(__NR_sched_rr_get_interval, sys_sched_rr_get_interval), // 161 874 GENXY(__NR_nanosleep, sys_nanosleep), // 162 875 GENX_(__NR_mremap, sys_mremap), // 163 876 LINX_(__NR_setresuid, sys_setresuid), // 164 877 878 LINXY(__NR_getresuid, sys_getresuid), // 165 879// _____(__NR_query_module, sys_query_module), // 166 880 GENXY(__NR_poll, sys_poll), // 167 881// _____(__NR_nfsservctl, sys_nfsservctl), // 168 882 LINX_(__NR_setresgid, sys_setresgid), // 169 883 884 LINXY(__NR_getresgid, sys_getresgid), // 170 885 LINXY(__NR_prctl, sys_prctl), // 171 886 PLAX_(__NR_rt_sigreturn, sys_rt_sigreturn), // 172 887 LINXY(__NR_rt_sigaction, sys_rt_sigaction), // 173 888 LINXY(__NR_rt_sigprocmask, sys_rt_sigprocmask), // 174 889 890// _____(__NR_rt_sigpending, sys_rt_sigpending), // 175 891 LINXY(__NR_rt_sigtimedwait, sys_rt_sigtimedwait), // 176 892 LINXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo), // 177 893 LINX_(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 178 894 GENXY(__NR_pread64, sys_pread64), // 179 895 896 GENX_(__NR_pwrite64, sys_pwrite64), // 180 897 GENX_(__NR_chown, sys_chown), // 181 898 GENXY(__NR_getcwd, sys_getcwd), // 182 899 LINXY(__NR_capget, sys_capget), // 183 900 LINX_(__NR_capset, sys_capset), // 184 901 902 GENXY(__NR_sigaltstack, sys_sigaltstack), // 185 903 LINXY(__NR_sendfile, sys_sendfile), // 186 904// _____(__NR_getpmsg, sys_getpmsg), // 187 905// _____(__NR_putpmsg, sys_putpmsg), // 188 906 GENX_(__NR_vfork, sys_fork), // 189 treat as fork 907 908 GENXY(__NR_ugetrlimit, sys_getrlimit), // 190 909 LINX_(__NR_readahead, sys_readahead), // 191 910// /* #define __NR_mmap2 192 32bit only */ 911// /* #define __NR_truncate64 193 32bit only */ 912// /* #define __NR_ftruncate64 194 32bit only */ 913 914// /* #define __NR_stat64 195 32bit only */ 915// /* #define __NR_lstat64 196 32bit only */ 916// /* #define __NR_fstat64 197 32bit only */ 917// _____(__NR_pciconfig_read, sys_pciconfig_read), // 198 918// _____(__NR_pciconfig_write, sys_pciconfig_write), // 199 919 920// _____(__NR_pciconfig_iobase, sys_pciconfig_iobase), // 200 921// _____(__NR_multiplexer, sys_multiplexer), // 201 922 GENXY(__NR_getdents64, sys_getdents64), // 202 923// _____(__NR_pivot_root, sys_pivot_root), // 203 924 LINXY(__NR_fcntl64, sys_fcntl64), // 204 !!!!?? 32bit only */ 925 926 GENX_(__NR_madvise, sys_madvise), // 205 927// _____(__NR_mincore, sys_mincore), // 206 928 LINX_(__NR_gettid, sys_gettid), // 207 929// _____(__NR_tkill, sys_tkill), // 208 930 LINX_(__NR_setxattr, sys_setxattr), // 209 931 932 LINX_(__NR_lsetxattr, sys_lsetxattr), // 210 933 LINX_(__NR_fsetxattr, sys_fsetxattr), // 211 934 LINXY(__NR_getxattr, sys_getxattr), // 212 935 LINXY(__NR_lgetxattr, sys_lgetxattr), // 213 936 LINXY(__NR_fgetxattr, sys_fgetxattr), // 214 937 LINXY(__NR_listxattr, sys_listxattr), // 215 938 LINXY(__NR_llistxattr, sys_llistxattr), // 216 939 LINXY(__NR_flistxattr, sys_flistxattr), // 217 940 LINX_(__NR_removexattr, sys_removexattr), // 218 941 LINX_(__NR_lremovexattr, sys_lremovexattr), // 219 942 LINX_(__NR_fremovexattr, sys_fremovexattr), // 220 943 944 LINXY(__NR_futex, sys_futex), // 221 945 LINX_(__NR_sched_setaffinity, sys_sched_setaffinity), // 222 946 LINXY(__NR_sched_getaffinity, sys_sched_getaffinity), // 223 947// /* 224 currently unused */ 948 949// _____(__NR_tuxcall, sys_tuxcall), // 225 950// /* #define __NR_sendfile64 226 32bit only */ 951 LINX_(__NR_io_setup, sys_io_setup), // 227 952 LINX_(__NR_io_destroy, sys_io_destroy), // 228 953 LINXY(__NR_io_getevents, sys_io_getevents), // 229 954 LINX_(__NR_io_submit, sys_io_submit), // 230 955 LINXY(__NR_io_cancel, sys_io_cancel), // 231 956 LINX_(__NR_set_tid_address, sys_set_tid_address), // 232 957 PLAX_(__NR_fadvise64, sys_fadvise64), // 233 958 LINX_(__NR_exit_group, sys_exit_group), // 234 959 960// _____(__NR_lookup_dcookie, sys_lookup_dcookie), // 235 961 LINXY(__NR_epoll_create, sys_epoll_create), // 236 962 LINX_(__NR_epoll_ctl, sys_epoll_ctl), // 237 963 LINXY(__NR_epoll_wait, sys_epoll_wait), // 238 964// _____(__NR_remap_file_pages, sys_remap_file_pages), // 239 965 966 LINXY(__NR_timer_create, sys_timer_create), // 240 967 LINXY(__NR_timer_settime, sys_timer_settime), // 241 968 LINXY(__NR_timer_gettime, sys_timer_gettime), // 242 969 LINX_(__NR_timer_getoverrun, sys_timer_getoverrun), // 243 970 LINX_(__NR_timer_delete, sys_timer_delete), // 244 971 LINX_(__NR_clock_settime, sys_clock_settime), // 245 972 LINXY(__NR_clock_gettime, sys_clock_gettime), // 246 973 LINXY(__NR_clock_getres, sys_clock_getres), // 247 974 LINXY(__NR_clock_nanosleep, sys_clock_nanosleep), // 248 975 976// _____(__NR_swapcontext, sys_swapcontext), // 249 977 978 LINXY(__NR_tgkill, sys_tgkill), // 250 979// _____(__NR_utimes, sys_utimes), // 251 980// _____(__NR_statfs64, sys_statfs64), // 252 981// _____(__NR_fstatfs64, sys_fstatfs64), // 253 982// /* #define __NR_fadvise64_64 254 32bit only */ 983 984// _____(__NR_rtas, sys_rtas), // 255 985// /* Number 256 is reserved for sys_debug_setcontext */ 986// /* Number 257 is reserved for vserver */ 987// /* 258 currently unused */ 988 LINX_(__NR_mbind, sys_mbind), // 259 989 990 LINXY(__NR_get_mempolicy, sys_get_mempolicy), // 260 991 LINX_(__NR_set_mempolicy, sys_set_mempolicy), // 261 992 LINXY(__NR_mq_open, sys_mq_open), // 262 993 LINX_(__NR_mq_unlink, sys_mq_unlink), // 263 994 LINX_(__NR_mq_timedsend, sys_mq_timedsend), // 264 995 996 LINXY(__NR_mq_timedreceive, sys_mq_timedreceive), // 265 997 LINX_(__NR_mq_notify, sys_mq_notify), // 266 998 LINXY(__NR_mq_getsetattr, sys_mq_getsetattr), // 267 999// _____(__NR_kexec_load, sys_kexec_load), // 268 1000 LINX_(__NR_add_key, sys_add_key), // 269 1001 1002 LINX_(__NR_request_key, sys_request_key), // 270 1003 LINXY(__NR_keyctl, sys_keyctl), // 271 1004// _____(__NR_waitid, sys_waitid), // 272 1005 LINX_(__NR_ioprio_set, sys_ioprio_set), // 273 1006 LINX_(__NR_ioprio_get, sys_ioprio_get), // 274 1007 1008 LINX_(__NR_inotify_init, sys_inotify_init), // 275 1009 LINX_(__NR_inotify_add_watch, sys_inotify_add_watch), // 276 1010 LINX_(__NR_inotify_rm_watch, sys_inotify_rm_watch), // 277 1011 1012 LINX_(__NR_pselect6, sys_pselect6), // 280 1013 LINXY(__NR_ppoll, sys_ppoll), // 281 1014 1015 LINXY(__NR_openat, sys_openat), // 286 1016 LINX_(__NR_mkdirat, sys_mkdirat), // 287 1017 LINX_(__NR_mknodat, sys_mknodat), // 288 1018 LINX_(__NR_fchownat, sys_fchownat), // 289 1019 LINX_(__NR_futimesat, sys_futimesat), // 290 1020 LINXY(__NR_newfstatat, sys_newfstatat), // 291 1021 LINX_(__NR_unlinkat, sys_unlinkat), // 292 1022 LINX_(__NR_renameat, sys_renameat), // 293 1023 LINX_(__NR_linkat, sys_linkat), // 294 1024 LINX_(__NR_symlinkat, sys_symlinkat), // 295 1025 LINX_(__NR_readlinkat, sys_readlinkat), // 296 1026 LINX_(__NR_fchmodat, sys_fchmodat), // 297 1027 LINX_(__NR_faccessat, sys_faccessat), // 298 1028 LINX_(__NR_set_robust_list, sys_set_robust_list), // 299 1029 LINXY(__NR_get_robust_list, sys_get_robust_list), // 300 1030 LINXY(__NR_move_pages, sys_move_pages), // 301 1031 LINXY(__NR_getcpu, sys_getcpu), // 302 1032 LINXY(__NR_epoll_pwait, sys_epoll_pwait), // 303 1033 LINX_(__NR_utimensat, sys_utimensat), // 304 1034 LINXY(__NR_signalfd, sys_signalfd), // 305 1035 LINXY(__NR_timerfd_create, sys_timerfd_create), // 306 1036 LINXY(__NR_eventfd, sys_eventfd), // 307 1037 LINX_(__NR_sync_file_range2, sys_sync_file_range2), // 308 1038 LINX_(__NR_fallocate, sys_fallocate), // 309 1039// LINXY(__NR_subpage_prot, sys_ni_syscall), // 310 1040 LINXY(__NR_timerfd_settime, sys_timerfd_settime), // 311 1041 LINXY(__NR_timerfd_gettime, sys_timerfd_gettime), // 312 1042 LINXY(__NR_signalfd4, sys_signalfd4), // 313 1043 LINXY(__NR_eventfd2, sys_eventfd2), // 314 1044 LINXY(__NR_epoll_create1, sys_epoll_create1), // 315 1045 LINXY(__NR_dup3, sys_dup3), // 316 1046 LINXY(__NR_pipe2, sys_pipe2), // 317 1047 LINXY(__NR_inotify_init1, sys_inotify_init1), // 318 1048 LINXY(__NR_perf_event_open, sys_perf_event_open), // 319 1049 LINXY(__NR_preadv, sys_preadv), // 320 1050 LINX_(__NR_pwritev, sys_pwritev), // 321 1051 LINXY(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo),// 322 1052 1053 LINXY(__NR_clock_adjtime, sys_clock_adjtime), // 347 1054 1055 LINXY(__NR_process_vm_readv, sys_process_vm_readv), // 351 1056 LINX_(__NR_process_vm_writev, sys_process_vm_writev) // 352 1057}; 1058 1059SyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno ) 1060{ 1061 const UInt syscall_table_size 1062 = sizeof(syscall_table) / sizeof(syscall_table[0]); 1063 1064 /* Is it in the contiguous initial section of the table? */ 1065 if (sysno < syscall_table_size) { 1066 SyscallTableEntry* sys = &syscall_table[sysno]; 1067 if (sys->before == NULL) 1068 return NULL; /* no entry */ 1069 else 1070 return sys; 1071 } 1072 1073 /* Can't find a wrapper */ 1074 return NULL; 1075} 1076 1077#endif // defined(VGP_ppc64_linux) 1078 1079/*--------------------------------------------------------------------*/ 1080/*--- end ---*/ 1081/*--------------------------------------------------------------------*/ 1082