12521d32807363e7b993631cdee52b34303c96e3anjn
22521d32807363e7b993631cdee52b34303c96e3anjn/*--------------------------------------------------------------------*/
3c1b0181cbd6f296401daa6ff0e6e14d3a8ab91a0njn/*--- System call wrappers, etc.                pub_core_syswrap.h ---*/
42521d32807363e7b993631cdee52b34303c96e3anjn/*--------------------------------------------------------------------*/
52521d32807363e7b993631cdee52b34303c96e3anjn
62521d32807363e7b993631cdee52b34303c96e3anjn/*
72521d32807363e7b993631cdee52b34303c96e3anjn   This file is part of Valgrind, a dynamic binary instrumentation
82521d32807363e7b993631cdee52b34303c96e3anjn   framework.
92521d32807363e7b993631cdee52b34303c96e3anjn
10ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   Copyright (C) 2000-2017 Julian Seward
112521d32807363e7b993631cdee52b34303c96e3anjn      jseward@acm.org
122521d32807363e7b993631cdee52b34303c96e3anjn
132521d32807363e7b993631cdee52b34303c96e3anjn   This program is free software; you can redistribute it and/or
142521d32807363e7b993631cdee52b34303c96e3anjn   modify it under the terms of the GNU General Public License as
152521d32807363e7b993631cdee52b34303c96e3anjn   published by the Free Software Foundation; either version 2 of the
162521d32807363e7b993631cdee52b34303c96e3anjn   License, or (at your option) any later version.
172521d32807363e7b993631cdee52b34303c96e3anjn
182521d32807363e7b993631cdee52b34303c96e3anjn   This program is distributed in the hope that it will be useful, but
192521d32807363e7b993631cdee52b34303c96e3anjn   WITHOUT ANY WARRANTY; without even the implied warranty of
202521d32807363e7b993631cdee52b34303c96e3anjn   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
212521d32807363e7b993631cdee52b34303c96e3anjn   General Public License for more details.
222521d32807363e7b993631cdee52b34303c96e3anjn
232521d32807363e7b993631cdee52b34303c96e3anjn   You should have received a copy of the GNU General Public License
242521d32807363e7b993631cdee52b34303c96e3anjn   along with this program; if not, write to the Free Software
252521d32807363e7b993631cdee52b34303c96e3anjn   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
262521d32807363e7b993631cdee52b34303c96e3anjn   02111-1307, USA.
272521d32807363e7b993631cdee52b34303c96e3anjn
282521d32807363e7b993631cdee52b34303c96e3anjn   The GNU General Public License is contained in the file COPYING.
292521d32807363e7b993631cdee52b34303c96e3anjn*/
302521d32807363e7b993631cdee52b34303c96e3anjn
31c1b0181cbd6f296401daa6ff0e6e14d3a8ab91a0njn#ifndef __PUB_CORE_SYSWRAP_H
32c1b0181cbd6f296401daa6ff0e6e14d3a8ab91a0njn#define __PUB_CORE_SYSWRAP_H
332521d32807363e7b993631cdee52b34303c96e3anjn
34535fb1b49a80f2e880f755ee618381de3e222ddfflorian#include "pub_core_basics.h"        // VG_ macro
35535fb1b49a80f2e880f755ee618381de3e222ddfflorian#include "pub_core_threadstate.h"   // ThreadArchState
368eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#include "pub_core_tooliface.h"     // CorePart
37535fb1b49a80f2e880f755ee618381de3e222ddfflorian
382521d32807363e7b993631cdee52b34303c96e3anjn//--------------------------------------------------------------------
39899ce73b9eb1f679562e93f8e5c162aa049413f1njn// PURPOSE: This module contains all the syscall junk:  mostly PRE/POST
40899ce73b9eb1f679562e93f8e5c162aa049413f1njn// wrappers, but also the main syscall jacketing code.
412521d32807363e7b993631cdee52b34303c96e3anjn//--------------------------------------------------------------------
422521d32807363e7b993631cdee52b34303c96e3anjn
438c2e1530decb6cc857fa24890d02faf7efdb3312njn// Allocates a stack for the first thread, then runs it,
448c2e1530decb6cc857fa24890d02faf7efdb3312njn// as if the thread had been set up by clone()
45af839f52d74df156d655201a889954133ab01be7njnextern void VG_(main_thread_wrapper_NORETURN)(ThreadId tid);
468c2e1530decb6cc857fa24890d02faf7efdb3312njn
47f76d27a697a7b0bf3b84490baf60623fc96a23afnjnextern void VG_(client_syscall) ( ThreadId tid, UInt trc );
482521d32807363e7b993631cdee52b34303c96e3anjn
492521d32807363e7b993631cdee52b34303c96e3anjnextern void VG_(post_syscall)   ( ThreadId tid );
502521d32807363e7b993631cdee52b34303c96e3anjn
51a8d8e239876796bc194636b8bb4b3b3c86db8528sewardj/* Clear this module's private state for thread 'tid' */
52a8d8e239876796bc194636b8bb4b3b3c86db8528sewardjextern void VG_(clear_syscallInfo) ( Int tid );
53a8d8e239876796bc194636b8bb4b3b3c86db8528sewardj
54bc3770e4f6c8fe86d5baee6e874df5bb6dbe1292rhyskidd// Returns True if the given thread is currently in a system call
55bc3770e4f6c8fe86d5baee6e874df5bb6dbe1292rhyskiddextern Bool VG_(is_in_syscall) ( Int tid );
56bc3770e4f6c8fe86d5baee6e874df5bb6dbe1292rhyskidd
57a8d8e239876796bc194636b8bb4b3b3c86db8528sewardj// Fix up a thread's state when syscall is interrupted by a signal.
58a8d8e239876796bc194636b8bb4b3b3c86db8528sewardjextern void VG_(fixup_guest_state_after_syscall_interrupted)(
59a8d8e239876796bc194636b8bb4b3b3c86db8528sewardj               ThreadId tid,
60a8d8e239876796bc194636b8bb4b3b3c86db8528sewardj               Addr     ip,
61a8d8e239876796bc194636b8bb4b3b3c86db8528sewardj               SysRes   sysret,
628eb8bab992e3998c33770b0cdb16059a8b918a06sewardj               Bool     restart,
638eb8bab992e3998c33770b0cdb16059a8b918a06sewardj               struct vki_ucontext *uc
64a8d8e239876796bc194636b8bb4b3b3c86db8528sewardj            );
652521d32807363e7b993631cdee52b34303c96e3anjn
668eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#if defined(VGO_solaris)
678eb8bab992e3998c33770b0cdb16059a8b918a06sewardj// Determine if in a blocking syscall.
688eb8bab992e3998c33770b0cdb16059a8b918a06sewardjextern Bool VG_(is_ip_in_blocking_syscall)(ThreadId tid, Addr ip);
698eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#endif
708eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
717b85dd57f12f86a03f51f7cedea46147ef937f82njn// Wait until all other threads are dead
727b85dd57f12f86a03f51f7cedea46147ef937f82njnextern void VG_(reap_threads)(ThreadId self);
737b85dd57f12f86a03f51f7cedea46147ef937f82njn
742335d11da6922461f1481fedb5a19350391b895dnjn// Release resources held by this thread
75af839f52d74df156d655201a889954133ab01be7njnextern void VG_(cleanup_thread) ( ThreadArchState* );
762335d11da6922461f1481fedb5a19350391b895dnjn
772521d32807363e7b993631cdee52b34303c96e3anjn/* fd leakage calls. */
782521d32807363e7b993631cdee52b34303c96e3anjnextern void VG_(init_preopened_fds) ( void );
79e543f3024ace2925a0fb81985e9fcfc95b8c555aflorianextern void VG_(show_open_fds) ( const HChar* when );
802521d32807363e7b993631cdee52b34303c96e3anjn
811ae3f3ae5188a7da990be18406c7920b89f19043sewardj// When the final thread is done, where shall I call to shutdown the
821ae3f3ae5188a7da990be18406c7920b89f19043sewardj// system cleanly?  Is set once at startup (in m_main) and never
831ae3f3ae5188a7da990be18406c7920b89f19043sewardj// changes after that.  Is basically a pointer to the exit
841ae3f3ae5188a7da990be18406c7920b89f19043sewardj// continuation.  This is all just a nasty hack to avoid calling
851ae3f3ae5188a7da990be18406c7920b89f19043sewardj// directly from m_syswrap to m_main at exit, since that would cause
861ae3f3ae5188a7da990be18406c7920b89f19043sewardj// m_main to become part of a module cycle, which is silly.
871ae3f3ae5188a7da990be18406c7920b89f19043sewardjextern void (* VG_(address_of_m_main_shutdown_actions_NORETURN) )
881ae3f3ae5188a7da990be18406c7920b89f19043sewardj            (ThreadId,VgSchedReturnCode);
891ae3f3ae5188a7da990be18406c7920b89f19043sewardj
908eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#if defined(VGO_solaris)
918eb8bab992e3998c33770b0cdb16059a8b918a06sewardjextern void VG_(save_context)(ThreadId tid, vki_ucontext_t *uc,
928eb8bab992e3998c33770b0cdb16059a8b918a06sewardj                              CorePart part);
938eb8bab992e3998c33770b0cdb16059a8b918a06sewardjextern void VG_(restore_context)(ThreadId tid, vki_ucontext_t *uc,
948eb8bab992e3998c33770b0cdb16059a8b918a06sewardj                                 CorePart part, Bool esp_is_thrptr);
958eb8bab992e3998c33770b0cdb16059a8b918a06sewardjextern void VG_(syswrap_init)(void);
96e03654002556aa3ece73c344ec8c8cbe15754df1iraisrextern void VG_(change_mapping_ownership)(Addr addr, Bool once_only);
97bcfaeedb1e1ac2625eea81951a785a777834321ciraisrextern Bool VG_(setup_client_dataseg)(void);
98bcfaeedb1e1ac2625eea81951a785a777834321ciraisrextern void VG_(track_client_dataseg)(ThreadId tid);
998eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#endif
1008eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
101c1b0181cbd6f296401daa6ff0e6e14d3a8ab91a0njn#endif   // __PUB_CORE_SYSWRAP_H
1022521d32807363e7b993631cdee52b34303c96e3anjn
1032521d32807363e7b993631cdee52b34303c96e3anjn/*--------------------------------------------------------------------*/
1042521d32807363e7b993631cdee52b34303c96e3anjn/*--- end                                                          ---*/
1052521d32807363e7b993631cdee52b34303c96e3anjn/*--------------------------------------------------------------------*/
1062521d32807363e7b993631cdee52b34303c96e3anjn
107