/*--------------------------------------------------------------------*/ /*--- The dispatcher. pub_core_dispatch.h ---*/ /*--------------------------------------------------------------------*/ /* This file is part of Valgrind, a dynamic binary instrumentation framework. Copyright (C) 2000-2017 Julian Seward jseward@acm.org This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. The GNU General Public License is contained in the file COPYING. */ #ifndef __PUB_CORE_DISPATCH_H #define __PUB_CORE_DISPATCH_H //-------------------------------------------------------------------- // PURPOSE: This module contains the inner loop of the execution // mechanism, which is: find next basic block, execute it, repeat until // the next bb isn't found in the fast-cache; or if the current bb // exited with a request for some special action before continuing; or // if the current thread has used up its scheduling quantum. //-------------------------------------------------------------------- #include "pub_core_dispatch_asm.h" #include "pub_core_basics.h" // Addr /* Run translations, with the given guest state, and starting by running the host code at 'host_addr'. It is almost always the case that host_addr is the translation for guest_state.guest_IP, that is, host_addr is what it would be if we looked up the address of the translation corresponding to guest_state.guest_IP. The only case where this isn't true is where we're running a no-redir translation. In this case host_addr is the address of the alternative (non-redirected) translation for guest_state.guest_IP. The return value must indicate why it returned back to the scheduler. It can also be exited if the executing code throws a non-resumable signal, for example SIGSEGV, in which case control longjmp()s back past here. two_words holds the return values (two words). First is a TRC value. Second is generally unused, except in the case where we have to return a chain-me request. */ void VG_(disp_run_translations)( HWord* two_words, volatile void* guest_state, Addr host_addr ); /* We need to know addresses of the continuation-point (cp_) labels so we can tell VEX what they are. They will get baked into the code VEX generates. The type is entirely mythical, but we need to state _some_ type, so as to keep gcc happy. */ void VG_(disp_cp_chain_me_to_slowEP)(void); void VG_(disp_cp_chain_me_to_fastEP)(void); void VG_(disp_cp_xindir)(void); void VG_(disp_cp_xassisted)(void); void VG_(disp_cp_evcheck_fail)(void); #endif // __PUB_CORE_DISPATCH_H /*--------------------------------------------------------------------*/ /*--- end ---*/ /*--------------------------------------------------------------------*/