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