19e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
29e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj/*--------------------------------------------------------------------*/
3752f90673ebbb6b2f55fc5e46606dea371313713sewardj/*--- begin                               guest_generic_bb_to_IR.h ---*/
49e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj/*--------------------------------------------------------------------*/
59e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
69e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj/*
7752f90673ebbb6b2f55fc5e46606dea371313713sewardj   This file is part of Valgrind, a dynamic binary instrumentation
8752f90673ebbb6b2f55fc5e46606dea371313713sewardj   framework.
99e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
10ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   Copyright (C) 2004-2017 OpenWorks LLP
11752f90673ebbb6b2f55fc5e46606dea371313713sewardj      info@open-works.net
127bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
13752f90673ebbb6b2f55fc5e46606dea371313713sewardj   This program is free software; you can redistribute it and/or
14752f90673ebbb6b2f55fc5e46606dea371313713sewardj   modify it under the terms of the GNU General Public License as
15752f90673ebbb6b2f55fc5e46606dea371313713sewardj   published by the Free Software Foundation; either version 2 of the
16752f90673ebbb6b2f55fc5e46606dea371313713sewardj   License, or (at your option) any later version.
177bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
18752f90673ebbb6b2f55fc5e46606dea371313713sewardj   This program is distributed in the hope that it will be useful, but
19752f90673ebbb6b2f55fc5e46606dea371313713sewardj   WITHOUT ANY WARRANTY; without even the implied warranty of
20752f90673ebbb6b2f55fc5e46606dea371313713sewardj   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21752f90673ebbb6b2f55fc5e46606dea371313713sewardj   General Public License for more details.
22752f90673ebbb6b2f55fc5e46606dea371313713sewardj
23752f90673ebbb6b2f55fc5e46606dea371313713sewardj   You should have received a copy of the GNU General Public License
24752f90673ebbb6b2f55fc5e46606dea371313713sewardj   along with this program; if not, write to the Free Software
25752f90673ebbb6b2f55fc5e46606dea371313713sewardj   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
267bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   02110-1301, USA.
277bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
28752f90673ebbb6b2f55fc5e46606dea371313713sewardj   The GNU General Public License is contained in the file COPYING.
299e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
309e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   Neither the names of the U.S. Department of Energy nor the
319e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   University of California nor the names of its contributors may be
329e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   used to endorse or promote products derived from this software
339e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   without prior written permission.
349e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj*/
359e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
36cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#ifndef __VEX_GUEST_GENERIC_BB_TO_IR_H
37cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#define __VEX_GUEST_GENERIC_BB_TO_IR_H
389e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
3958a637b6675d4d68e13d18b75cea7eee2a2a91feflorian#include "libvex_basictypes.h"
4058a637b6675d4d68e13d18b75cea7eee2a2a91feflorian#include "libvex_ir.h"              // IRJumpKind
4158a637b6675d4d68e13d18b75cea7eee2a2a91feflorian#include "libvex.h"                 // VexArch
429e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
439e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj/* This defines stuff needed by the guest insn disassemblers.
449e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   It's a bit circular; is imported by
457594920259781fa292dd6a3b27beb63f5875c308cerion   - the guest-specific toIR.c files (guest-{x86,amd64,ppc,arm}/toIR.c)
469e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   - the generic disassembly driver (bb_to_IR.c)
479e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   - vex_main.c
489e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj*/
499e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
509e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
519e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj/* ---------------------------------------------------------------
529e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   Result of disassembling an instruction
539e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   --------------------------------------------------------------- */
549e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
559e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj/* The results of disassembling an instruction.  There are three
569e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   possible outcomes.  For Dis_Resteer, the disassembler _must_
579e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   continue at the specified address.  For Dis_StopHere, the
589e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   disassembler _must_ terminate the BB.  For Dis_Continue, we may at
599e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   our option either disassemble the next insn, or terminate the BB;
609e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   but in the latter case we must set the bb's ->next field to point
619e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   to the next instruction.  */
629e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
639e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardjtypedef
649e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
659e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   struct {
669e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
679e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj      /* The disassembled insn has this length.  Must always be
689e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj         set. */
698e2d97185921fc9a9b97c8e111fc980e01ff746eflorian      UInt len;
709e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
719e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj      /* What happens next?
729e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj         Dis_StopHere:  this insn terminates the BB; we must stop.
739e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj         Dis_Continue:  we can optionally continue into the next insn
74984d9b164dd17f07e603c41fe1e506e641e57d18sewardj         Dis_ResteerU:  followed an unconditional branch; continue at
75984d9b164dd17f07e603c41fe1e506e641e57d18sewardj                        'continueAt'
76984d9b164dd17f07e603c41fe1e506e641e57d18sewardj         Dis_ResteerC:  (speculatively, of course) followed a
77984d9b164dd17f07e603c41fe1e506e641e57d18sewardj                        conditional branch; continue at 'continueAt'
789e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj      */
79ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      enum { Dis_StopHere=0x10, Dis_Continue,
80984d9b164dd17f07e603c41fe1e506e641e57d18sewardj             Dis_ResteerU, Dis_ResteerC } whatNext;
819e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
82ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      /* Any other hints that we should feed back to the disassembler?
83ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         Dis_HintNone:     no hint
84ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         Dis_HintVerbose:  this insn potentially generates a lot of code
85ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      */
86ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      enum { Dis_HintNone=0x20, Dis_HintVerbose } hint;
87ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
88ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      /* For whatNext==Dis_StopHere, we need to end the block and create a
89c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         transfer to whatever the NIA is.  That will have presumably
90c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         been set by the IR generated for this insn.  So we need to
91c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         know the jump kind to use.  Should Ijk_INVALID in other Dis_
92c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         cases. */
93c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj      IRJumpKind jk_StopHere;
94c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj
959e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj      /* For Dis_Resteer, this is the guest address we should continue
969e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj         at.  Otherwise ignored (should be zero). */
970eaa35ff5569f09129073be27c2f827926f7010dflorian      Addr   continueAt;
989e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   }
999e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
1009e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   DisResult;
1019e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
1029e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
1039e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj/* ---------------------------------------------------------------
1049e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   The type of a function which disassembles one instruction.
1059e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   C's function-type syntax is really astonishing bizarre.
1069e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   --------------------------------------------------------------- */
1079e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
1089e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj/* A function of this type (DisOneInstrFn) disassembles an instruction
1099e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   located at host address &guest_code[delta], whose guest IP is
1109e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   guest_IP (this may be entirely unrelated to where the insn is
1119e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   actually located in the host's address space.).  The returned
1129e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   DisResult.len field carries its size.  If the returned
1139e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   DisResult.whatNext field is Dis_Resteer then DisResult.continueAt
1149e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   should hold the guest IP of the next insn to disassemble.
1159e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
1169e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   disInstr is not permitted to return Dis_Resteer if resteerOkFn,
1179e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   when applied to the address which it wishes to resteer into,
1189e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   returns False.
1199e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
1209e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   The resulting IR is added to the end of irbb.
1219e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj*/
1229e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
1239e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardjtypedef
1249e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
1259e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   DisResult (*DisOneInstrFn) (
1269e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
127dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      /* This is the IRSB to which the resulting IR is to be appended. */
128dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      /*OUT*/ IRSB*        irbb,
1299e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
130984d9b164dd17f07e603c41fe1e506e641e57d18sewardj      /* Return True iff resteering to the given addr is allowed (for
131984d9b164dd17f07e603c41fe1e506e641e57d18sewardj         branches/calls to destinations that are known at JIT-time) */
132beac530a718fcc646bc61fe60a86f599df54e1d7florian      /*IN*/  Bool         (*resteerOkFn) ( /*opaque*/void*, Addr ),
133c716aea1cafe66ee431dc7d6909c98f18788a028sewardj
134984d9b164dd17f07e603c41fe1e506e641e57d18sewardj      /* Should we speculatively resteer across conditional branches?
135984d9b164dd17f07e603c41fe1e506e641e57d18sewardj         (Experimental and not enabled by default).  The strategy is
136984d9b164dd17f07e603c41fe1e506e641e57d18sewardj         to assume that backward branches are taken and forward
137984d9b164dd17f07e603c41fe1e506e641e57d18sewardj         branches are not taken. */
138984d9b164dd17f07e603c41fe1e506e641e57d18sewardj      /*IN*/  Bool         resteerCisOk,
139984d9b164dd17f07e603c41fe1e506e641e57d18sewardj
140c716aea1cafe66ee431dc7d6909c98f18788a028sewardj      /* Vex-opaque data passed to all caller (valgrind) supplied
141c716aea1cafe66ee431dc7d6909c98f18788a028sewardj         callbacks. */
142c716aea1cafe66ee431dc7d6909c98f18788a028sewardj      /*IN*/  void*        callback_opaque,
1439e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
1449e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj      /* Where is the guest code? */
1458462d113e3efeacceb304222dada8d85f748295aflorian      /*IN*/  const UChar* guest_code,
1469e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
1479e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj      /* Where is the actual insn?  Note: it's at &guest_code[delta] */
1489e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj      /*IN*/  Long         delta,
1499e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
1509e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj      /* What is the guest IP of the insn? */
151d4cc0deec55ec0be1f2ac3b20f0d340265341f83florian      /*IN*/  Addr         guest_IP,
1529e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
1539e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj      /* Info about the guest architecture */
154a5f55da7e956978fddad927436da5fab9568f3f1sewardj      /*IN*/  VexArch      guest_arch,
155cacba8e675988fbf21b08feea1f317a9c896c053florian      /*IN*/  const VexArchInfo* archinfo,
1569e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
157dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      /* ABI info for both guest and host */
158cacba8e675988fbf21b08feea1f317a9c896c053florian      /*IN*/  const VexAbiInfo*  abiinfo,
159aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj
1609b76916dcc1628e133d57db001563429c6e3a590sewardj      /* The endianness of the host */
1619b76916dcc1628e133d57db001563429c6e3a590sewardj      /*IN*/  VexEndness   host_endness,
162442e51a26cf3bc7f243167a4ff3fbfb02206f6e6sewardj
163442e51a26cf3bc7f243167a4ff3fbfb02206f6e6sewardj      /* Should diagnostics be printed for illegal instructions? */
164442e51a26cf3bc7f243167a4ff3fbfb02206f6e6sewardj      /*IN*/  Bool         sigill_diag
1659e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
1669e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   );
1679e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
1689e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
1699e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj/* ---------------------------------------------------------------
1709e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   Top-level BB to IR conversion fn.
1719e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   --------------------------------------------------------------- */
1729e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
173ca2c3c75784d35d136fc7c952717cdee5063c193sewardj/* See detailed comment in guest_generic_bb_to_IR.c. */
1749e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardjextern
175bc161a407b3cbd722821812afb8fb47420ae538fsewardjIRSB* bb_to_IR (
176bc161a407b3cbd722821812afb8fb47420ae538fsewardj         /*OUT*/VexGuestExtents* vge,
177bc161a407b3cbd722821812afb8fb47420ae538fsewardj         /*OUT*/UInt*            n_sc_extents,
178fadbbe2870ffba4e4565563f21fc20b9ab89fd8fsewardj         /*OUT*/UInt*            n_guest_instrs, /* stats only */
179ca2c3c75784d35d136fc7c952717cdee5063c193sewardj         /*MOD*/VexRegisterUpdates* pxControl,
180bc161a407b3cbd722821812afb8fb47420ae538fsewardj         /*IN*/ void*            callback_opaque,
181bc161a407b3cbd722821812afb8fb47420ae538fsewardj         /*IN*/ DisOneInstrFn    dis_instr_fn,
1828462d113e3efeacceb304222dada8d85f748295aflorian         /*IN*/ const UChar*     guest_code,
183d4cc0deec55ec0be1f2ac3b20f0d340265341f83florian         /*IN*/ Addr             guest_IP_bbstart,
184beac530a718fcc646bc61fe60a86f599df54e1d7florian         /*IN*/ Bool             (*chase_into_ok)(void*,Addr),
1859b76916dcc1628e133d57db001563429c6e3a590sewardj         /*IN*/ VexEndness       host_endness,
186442e51a26cf3bc7f243167a4ff3fbfb02206f6e6sewardj         /*IN*/ Bool             sigill_diag,
187bc161a407b3cbd722821812afb8fb47420ae538fsewardj         /*IN*/ VexArch          arch_guest,
188cacba8e675988fbf21b08feea1f317a9c896c053florian         /*IN*/ const VexArchInfo* archinfo_guest,
189cacba8e675988fbf21b08feea1f317a9c896c053florian         /*IN*/ const VexAbiInfo*  abiinfo_both,
190bc161a407b3cbd722821812afb8fb47420ae538fsewardj         /*IN*/ IRType           guest_word_type,
191ca2c3c75784d35d136fc7c952717cdee5063c193sewardj         /*IN*/ UInt             (*needs_self_check)
192ca2c3c75784d35d136fc7c952717cdee5063c193sewardj                                    (void*, /*MB_MOD*/VexRegisterUpdates*,
193ca2c3c75784d35d136fc7c952717cdee5063c193sewardj                                            const VexGuestExtents*),
194bc161a407b3cbd722821812afb8fb47420ae538fsewardj         /*IN*/ Bool             (*preamble_function)(void*,IRSB*),
19505f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         /*IN*/ Int              offB_GUEST_CMSTART,
19605f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj         /*IN*/ Int              offB_GUEST_CMLEN,
197c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         /*IN*/ Int              offB_GUEST_IP,
198c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj         /*IN*/ Int              szB_GUEST_IP
199bc161a407b3cbd722821812afb8fb47420ae538fsewardj      );
2009e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
2019e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
202cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#endif /* ndef __VEX_GUEST_GENERIC_BB_TO_IR_H */
2039e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
2049e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj/*--------------------------------------------------------------------*/
205cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj/*--- end                                 guest_generic_bb_to_IR.h ---*/
2069e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj/*--------------------------------------------------------------------*/
207