main_main.c revision be1b6ff6cdb576c59734762fb778ae48eb8e7a10
135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---------------------------------------------------------------*/ 335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*--- ---*/ 4c0ee2edb4563c90bc8f1a83a09984a1fda86d1d3sewardj/*--- This file (main/vex_main.c) is ---*/ 5dbcfae724d5338205befbcd379a48f2303658198sewardj/*--- Copyright (C) OpenWorks LLP. All rights reserved. ---*/ 635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*--- ---*/ 735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---------------------------------------------------------------*/ 835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 9f8ed9d874a7b8651654591c68c6d431c758d787csewardj/* 10f8ed9d874a7b8651654591c68c6d431c758d787csewardj This file is part of LibVEX, a library for dynamic binary 11f8ed9d874a7b8651654591c68c6d431c758d787csewardj instrumentation and translation. 12f8ed9d874a7b8651654591c68c6d431c758d787csewardj 13e744153445a2b0277be5e4d0eed68466af9a3101sewardj Copyright (C) 2004-2007 OpenWorks LLP. All rights reserved. 147bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj 157bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj This library is made available under a dual licensing scheme. 167bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj 177bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj If you link LibVEX against other code all of which is itself 187bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj licensed under the GNU General Public License, version 2 dated June 197bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj 1991 ("GPL v2"), then you may use LibVEX under the terms of the GPL 207bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj v2, as appearing in the file LICENSE.GPL. If the file LICENSE.GPL 217bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj is missing, you can obtain a copy of the GPL v2 from the Free 227bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj Software Foundation Inc., 51 Franklin St, Fifth Floor, Boston, MA 237bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj 02110-1301, USA. 247bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj 257bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj For any other uses of LibVEX, you must first obtain a commercial 267bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj license from OpenWorks LLP. Please contact info@open-works.co.uk 277bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj for information about commercial licensing. 287bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj 297bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj This software is provided by OpenWorks LLP "as is" and any express 307bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj or implied warranties, including, but not limited to, the implied 317bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj warranties of merchantability and fitness for a particular purpose 327bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj are disclaimed. In no event shall OpenWorks LLP be liable for any 337bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj direct, indirect, incidental, special, exemplary, or consequential 347bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj damages (including, but not limited to, procurement of substitute 357bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj goods or services; loss of use, data, or profits; or business 367bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj interruption) however caused and on any theory of liability, 377bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj whether in contract, strict liability, or tort (including 387bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj negligence or otherwise) arising in any way out of the use of this 397bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj software, even if advised of the possibility of such damage. 40f8ed9d874a7b8651654591c68c6d431c758d787csewardj 41f8ed9d874a7b8651654591c68c6d431c758d787csewardj Neither the names of the U.S. Department of Energy nor the 42f8ed9d874a7b8651654591c68c6d431c758d787csewardj University of California nor the names of its contributors may be 43f8ed9d874a7b8651654591c68c6d431c758d787csewardj used to endorse or promote products derived from this software 44f8ed9d874a7b8651654591c68c6d431c758d787csewardj without prior written permission. 45f8ed9d874a7b8651654591c68c6d431c758d787csewardj*/ 46f8ed9d874a7b8651654591c68c6d431c758d787csewardj 47887a11a609f3e61d2ae8fe4e67f176207715da7esewardj#include "libvex.h" 48893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj#include "libvex_emwarn.h" 4981ec4189e287a97256f1e0a9fa7c0be316aaefc6sewardj#include "libvex_guest_x86.h" 5044d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj#include "libvex_guest_amd64.h" 512a9ad023890d3b34cf45e429df2a8ae88b419128sewardj#include "libvex_guest_arm.h" 52aabdfbf4193a965a8c50c643e536129d1d33661bcerion#include "libvex_guest_ppc32.h" 53f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion#include "libvex_guest_ppc64.h" 54f13a16a82132fa2358899c7683193effecf9a56fsewardj 55c0ee2edb4563c90bc8f1a83a09984a1fda86d1d3sewardj#include "main/vex_globals.h" 56c0ee2edb4563c90bc8f1a83a09984a1fda86d1d3sewardj#include "main/vex_util.h" 57c0ee2edb4563c90bc8f1a83a09984a1fda86d1d3sewardj#include "host-generic/h_generic_regs.h" 582a9ad023890d3b34cf45e429df2a8ae88b419128sewardj#include "ir/iropt.h" 592a9ad023890d3b34cf45e429df2a8ae88b419128sewardj 60c0ee2edb4563c90bc8f1a83a09984a1fda86d1d3sewardj#include "host-x86/hdefs.h" 61c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj#include "host-amd64/hdefs.h" 62d0eae2d5b6d8224bf1f075098e044b23ecffd9aecerion#include "host-ppc/hdefs.h" 632a9ad023890d3b34cf45e429df2a8ae88b419128sewardj 649e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj#include "guest-generic/bb_to_IR.h" 65c0ee2edb4563c90bc8f1a83a09984a1fda86d1d3sewardj#include "guest-x86/gdefs.h" 6644d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj#include "guest-amd64/gdefs.h" 672a9ad023890d3b34cf45e429df2a8ae88b419128sewardj#include "guest-arm/gdefs.h" 68d0eae2d5b6d8224bf1f075098e044b23ecffd9aecerion#include "guest-ppc/gdefs.h" 6935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 7035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 7135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* This file contains the top level interface to the library. */ 7235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 735117ce116f47141cb23d1b49cc826e19323add97sewardj/* --------- fwds ... --------- */ 745117ce116f47141cb23d1b49cc826e19323add97sewardj 755117ce116f47141cb23d1b49cc826e19323add97sewardjstatic Bool are_valid_hwcaps ( VexArch arch, UInt hwcaps ); 765117ce116f47141cb23d1b49cc826e19323add97sewardjstatic HChar* show_hwcaps ( VexArch arch, UInt hwcaps ); 775117ce116f47141cb23d1b49cc826e19323add97sewardj 785117ce116f47141cb23d1b49cc826e19323add97sewardj 7935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* --------- Initialise the library. --------- */ 8035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 8135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* Exported to library client. */ 8235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 83d887b8634b2c2685f528bd968459c628e8f86a34sewardjconst HChar* LibVEX_Version ( void ) 8480f5fceef55dc74b2ccca99d957699cbfc495176sewardj{ 8580f5fceef55dc74b2ccca99d957699cbfc495176sewardjreturn 8680f5fceef55dc74b2ccca99d957699cbfc495176sewardj#include "main/vex_svnversion.h" 8780f5fceef55dc74b2ccca99d957699cbfc495176sewardj ; 8880f5fceef55dc74b2ccca99d957699cbfc495176sewardj} 8980f5fceef55dc74b2ccca99d957699cbfc495176sewardj 9080f5fceef55dc74b2ccca99d957699cbfc495176sewardj 9180f5fceef55dc74b2ccca99d957699cbfc495176sewardj/* Exported to library client. */ 9280f5fceef55dc74b2ccca99d957699cbfc495176sewardj 9308613749b639323cc7582c1bbe56c6e21c69774fsewardjvoid LibVEX_default_VexControl ( /*OUT*/ VexControl* vcon ) 9408613749b639323cc7582c1bbe56c6e21c69774fsewardj{ 9508613749b639323cc7582c1bbe56c6e21c69774fsewardj vcon->iropt_verbosity = 0; 9608613749b639323cc7582c1bbe56c6e21c69774fsewardj vcon->iropt_level = 2; 9708613749b639323cc7582c1bbe56c6e21c69774fsewardj vcon->iropt_precise_memory_exns = False; 9808613749b639323cc7582c1bbe56c6e21c69774fsewardj vcon->iropt_unroll_thresh = 120; 9918b4bb706744f3d02ada9d7c2288df5ec7dc7115sewardj vcon->guest_max_insns = 60; 10008613749b639323cc7582c1bbe56c6e21c69774fsewardj vcon->guest_chase_thresh = 10; 10108613749b639323cc7582c1bbe56c6e21c69774fsewardj} 10208613749b639323cc7582c1bbe56c6e21c69774fsewardj 10308613749b639323cc7582c1bbe56c6e21c69774fsewardj 10408613749b639323cc7582c1bbe56c6e21c69774fsewardj/* Exported to library client. */ 10508613749b639323cc7582c1bbe56c6e21c69774fsewardj 106887a11a609f3e61d2ae8fe4e67f176207715da7esewardjvoid LibVEX_Init ( 10735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj /* failure exit function */ 1082b51587159d1d7c331719886d896c0a9cf217ee4sewardj __attribute__ ((noreturn)) 10935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj void (*failure_exit) ( void ), 11035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj /* logging output function */ 111d97636248eaa5ac7e5b323c5c048efafe179e5c3sewardj void (*log_bytes) ( HChar*, Int nbytes ), 11235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj /* debug paranoia level */ 11335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj Int debuglevel, 11435421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj /* Are we supporting valgrind checking? */ 11535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj Bool valgrind_support, 11608613749b639323cc7582c1bbe56c6e21c69774fsewardj /* Control ... */ 11708613749b639323cc7582c1bbe56c6e21c69774fsewardj /*READONLY*/VexControl* vcon 11835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj) 11935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj{ 12008613749b639323cc7582c1bbe56c6e21c69774fsewardj /* First off, do enough minimal setup so that the following 12108613749b639323cc7582c1bbe56c6e21c69774fsewardj assertions can fail in a sane fashion, if need be. */ 122ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vex_failure_exit = failure_exit; 123ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vex_log_bytes = log_bytes; 124ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj 125ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj /* Now it's safe to check parameters for sanity. */ 12635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj vassert(!vex_initdone); 12735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj vassert(failure_exit); 12835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj vassert(log_bytes); 12935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj vassert(debuglevel >= 0); 13008613749b639323cc7582c1bbe56c6e21c69774fsewardj 13108613749b639323cc7582c1bbe56c6e21c69774fsewardj vassert(vcon->iropt_verbosity >= 0); 13208613749b639323cc7582c1bbe56c6e21c69774fsewardj vassert(vcon->iropt_level >= 0); 13308613749b639323cc7582c1bbe56c6e21c69774fsewardj vassert(vcon->iropt_level <= 2); 13408613749b639323cc7582c1bbe56c6e21c69774fsewardj vassert(vcon->iropt_unroll_thresh >= 0); 13508613749b639323cc7582c1bbe56c6e21c69774fsewardj vassert(vcon->iropt_unroll_thresh <= 400); 13608613749b639323cc7582c1bbe56c6e21c69774fsewardj vassert(vcon->guest_max_insns >= 1); 13708613749b639323cc7582c1bbe56c6e21c69774fsewardj vassert(vcon->guest_max_insns <= 100); 13808613749b639323cc7582c1bbe56c6e21c69774fsewardj vassert(vcon->guest_chase_thresh >= 0); 13908613749b639323cc7582c1bbe56c6e21c69774fsewardj vassert(vcon->guest_chase_thresh < vcon->guest_max_insns); 140443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj 141ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj /* Check that Vex has been built with sizes of basic types as 142ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj stated in priv/libvex_basictypes.h. Failure of any of these is 143ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj a serious configuration error and should be corrected 144ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj immediately. If any of these assertions fail you can fully 145ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj expect Vex not to work properly, if at all. */ 146ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj 147ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(1 == sizeof(UChar)); 148ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(1 == sizeof(Char)); 149ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(2 == sizeof(UShort)); 150ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(2 == sizeof(Short)); 151ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(4 == sizeof(UInt)); 152ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(4 == sizeof(Int)); 153ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(8 == sizeof(ULong)); 154ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(8 == sizeof(Long)); 155ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(4 == sizeof(Float)); 156ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(8 == sizeof(Double)); 157ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(1 == sizeof(Bool)); 158ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(4 == sizeof(Addr32)); 159ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(8 == sizeof(Addr64)); 160c9a43665879a03886b27a65b68af2a2c11b04f59sewardj vassert(16 == sizeof(U128)); 161ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj 162ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(sizeof(void*) == 4 || sizeof(void*) == 8); 163ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(sizeof(void*) == sizeof(int*)); 164ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(sizeof(void*) == sizeof(HWord)); 165ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj 16697e87935760215710e2d88bd66ca77fdeefd8dd7sewardj vassert(VEX_HOST_WORDSIZE == sizeof(void*)); 16797e87935760215710e2d88bd66ca77fdeefd8dd7sewardj vassert(VEX_HOST_WORDSIZE == sizeof(HWord)); 16897e87935760215710e2d88bd66ca77fdeefd8dd7sewardj 169ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj /* Really start up .. */ 170443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj vex_debuglevel = debuglevel; 171443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj vex_valgrind_support = valgrind_support; 17208613749b639323cc7582c1bbe56c6e21c69774fsewardj vex_control = *vcon; 173443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj vex_initdone = True; 174d887b8634b2c2685f528bd968459c628e8f86a34sewardj vexSetAllocMode ( VexAllocModeTEMP ); 17535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj} 17635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 17735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 17835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* --------- Make a translation. --------- */ 17935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 18035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* Exported to library client. */ 18135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 18217c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardjVexTranslateResult LibVEX_Translate ( VexTranslateArgs* vta ) 18335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj{ 18481bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj /* This the bundle of functions we need to do the back-end stuff 18581bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj (insn selection, reg-alloc, assembly) whilst being insulated 18681bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj from the target instruction set. */ 187f13a16a82132fa2358899c7683193effecf9a56fsewardj HReg* available_real_regs; 188f13a16a82132fa2358899c7683193effecf9a56fsewardj Int n_available_real_regs; 189fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj Bool (*isMove) ( HInstr*, HReg*, HReg* ); 190fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj void (*getRegUsage) ( HRegUsage*, HInstr*, Bool ); 191fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj void (*mapRegs) ( HRegRemap*, HInstr*, Bool ); 192fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj HInstr* (*genSpill) ( HReg, Int, Bool ); 193fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj HInstr* (*genReload) ( HReg, Int, Bool ); 194fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj HInstr* (*directReload) ( HInstr*, HReg, Short ); 195fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj void (*ppInstr) ( HInstr*, Bool ); 196fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj void (*ppReg) ( HReg ); 197fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj HInstrArray* (*iselSB) ( IRSB*, VexArch, VexArchInfo*, 198fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj VexAbiInfo* ); 199fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj Int (*emit) ( UChar*, Int, HInstr*, Bool, void* ); 200fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj IRExpr* (*specHelper) ( HChar*, IRExpr** ); 2018d2291c9199adf1d0d9a5c684932d7ffe6d8e0c9sewardj Bool (*preciseMemExnsFn) ( Int, Int ); 202f13a16a82132fa2358899c7683193effecf9a56fsewardj 2039e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj DisOneInstrFn disInstrFn; 2049e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj 205eeac841fbfcadbc19e97c7ef56bfa3354ba78637sewardj VexGuestLayout* guest_layout; 206eeac841fbfcadbc19e97c7ef56bfa3354ba78637sewardj Bool host_is_bigendian = False; 207dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj IRSB* irsb; 208eeac841fbfcadbc19e97c7ef56bfa3354ba78637sewardj HInstrArray* vcode; 209eeac841fbfcadbc19e97c7ef56bfa3354ba78637sewardj HInstrArray* rcode; 210eeac841fbfcadbc19e97c7ef56bfa3354ba78637sewardj Int i, j, k, out_used, guest_sizeB; 211c716aea1cafe66ee431dc7d6909c98f18788a028sewardj Int offB_TISTART, offB_TILEN; 212eeac841fbfcadbc19e97c7ef56bfa3354ba78637sewardj UChar insn_bytes[32]; 213cf7879021370aabcccb1a9347244fcc7d5680141sewardj IRType guest_word_type; 214cf7879021370aabcccb1a9347244fcc7d5680141sewardj IRType host_word_type; 21592b643609c5fa432b11fc726c2706ae3f3296eb4cerion Bool mode64; 216f13a16a82132fa2358899c7683193effecf9a56fsewardj 21749651f4b59b1ab7e0e70cccd34001630eafbe957sewardj guest_layout = NULL; 21836ca51378f8851635df814230fa23f2c409b9eddsewardj available_real_regs = NULL; 21936ca51378f8851635df814230fa23f2c409b9eddsewardj n_available_real_regs = 0; 22036ca51378f8851635df814230fa23f2c409b9eddsewardj isMove = NULL; 22136ca51378f8851635df814230fa23f2c409b9eddsewardj getRegUsage = NULL; 22236ca51378f8851635df814230fa23f2c409b9eddsewardj mapRegs = NULL; 22336ca51378f8851635df814230fa23f2c409b9eddsewardj genSpill = NULL; 22436ca51378f8851635df814230fa23f2c409b9eddsewardj genReload = NULL; 225fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj directReload = NULL; 22636ca51378f8851635df814230fa23f2c409b9eddsewardj ppInstr = NULL; 22736ca51378f8851635df814230fa23f2c409b9eddsewardj ppReg = NULL; 228dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj iselSB = NULL; 22936ca51378f8851635df814230fa23f2c409b9eddsewardj emit = NULL; 23084ff0657940e62f38e618ea18bac6f27ce0e741fsewardj specHelper = NULL; 2318d2291c9199adf1d0d9a5c684932d7ffe6d8e0c9sewardj preciseMemExnsFn = NULL; 2329e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj disInstrFn = NULL; 233cf7879021370aabcccb1a9347244fcc7d5680141sewardj guest_word_type = Ity_INVALID; 234cf7879021370aabcccb1a9347244fcc7d5680141sewardj host_word_type = Ity_INVALID; 235db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj offB_TISTART = 0; 236db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj offB_TILEN = 0; 23792b643609c5fa432b11fc726c2706ae3f3296eb4cerion mode64 = False; 23836ca51378f8851635df814230fa23f2c409b9eddsewardj 23917c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vex_traceflags = vta->traceflags; 24058800ff1f3bc35d5cae9885c9d8a51a8d9d33016sewardj 24135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj vassert(vex_initdone); 2422d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexSetAllocModeTEMP_and_clear(); 2432d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexAllocSanityCheck(); 2442a9ad023890d3b34cf45e429df2a8ae88b419128sewardj 245f13a16a82132fa2358899c7683193effecf9a56fsewardj /* First off, check that the guest and host insn sets 246f13a16a82132fa2358899c7683193effecf9a56fsewardj are supported. */ 2472a9ad023890d3b34cf45e429df2a8ae88b419128sewardj 24817c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj switch (vta->arch_host) { 2492a9ad023890d3b34cf45e429df2a8ae88b419128sewardj 250bef170b7e84713d1e2181b9204d9415d29de3d65sewardj case VexArchX86: 251fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj mode64 = False; 252f13a16a82132fa2358899c7683193effecf9a56fsewardj getAllocableRegs_X86 ( &n_available_real_regs, 253f13a16a82132fa2358899c7683193effecf9a56fsewardj &available_real_regs ); 254fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj isMove = (Bool(*)(HInstr*,HReg*,HReg*)) isMove_X86Instr; 255fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj getRegUsage = (void(*)(HRegUsage*,HInstr*, Bool)) getRegUsage_X86Instr; 256fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj mapRegs = (void(*)(HRegRemap*,HInstr*, Bool)) mapRegs_X86Instr; 257fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj genSpill = (HInstr*(*)(HReg,Int, Bool)) genSpill_X86; 258fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj genReload = (HInstr*(*)(HReg,Int, Bool)) genReload_X86; 259fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj directReload = (HInstr*(*)(HInstr*,HReg,Short)) directReload_X86; 260fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj ppInstr = (void(*)(HInstr*, Bool)) ppX86Instr; 261fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj ppReg = (void(*)(HReg)) ppHRegX86; 262fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj iselSB = iselSB_X86; 263fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj emit = (Int(*)(UChar*,Int,HInstr*,Bool,void*)) emit_X86Instr; 26472c72814ab82c51d8ee8accad1a00f2d37942545sewardj host_is_bigendian = False; 265cf7879021370aabcccb1a9347244fcc7d5680141sewardj host_word_type = Ity_I32; 2665117ce116f47141cb23d1b49cc826e19323add97sewardj vassert(are_valid_hwcaps(VexArchX86, vta->archinfo_host.hwcaps)); 26717c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vassert(vta->dispatch != NULL); /* jump-to-dispatcher scheme */ 268f13a16a82132fa2358899c7683193effecf9a56fsewardj break; 2692a9ad023890d3b34cf45e429df2a8ae88b419128sewardj 270c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj case VexArchAMD64: 27192b643609c5fa432b11fc726c2706ae3f3296eb4cerion mode64 = True; 272c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj getAllocableRegs_AMD64 ( &n_available_real_regs, 273c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj &available_real_regs ); 274c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj isMove = (Bool(*)(HInstr*,HReg*,HReg*)) isMove_AMD64Instr; 27592b643609c5fa432b11fc726c2706ae3f3296eb4cerion getRegUsage = (void(*)(HRegUsage*,HInstr*, Bool)) getRegUsage_AMD64Instr; 27692b643609c5fa432b11fc726c2706ae3f3296eb4cerion mapRegs = (void(*)(HRegRemap*,HInstr*, Bool)) mapRegs_AMD64Instr; 27792b643609c5fa432b11fc726c2706ae3f3296eb4cerion genSpill = (HInstr*(*)(HReg,Int, Bool)) genSpill_AMD64; 27892b643609c5fa432b11fc726c2706ae3f3296eb4cerion genReload = (HInstr*(*)(HReg,Int, Bool)) genReload_AMD64; 27992b643609c5fa432b11fc726c2706ae3f3296eb4cerion ppInstr = (void(*)(HInstr*, Bool)) ppAMD64Instr; 280c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj ppReg = (void(*)(HReg)) ppHRegAMD64; 281dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj iselSB = iselSB_AMD64; 2820528bb5bd879eed0e8fa7e2bc9bc8debea00bf5fsewardj emit = (Int(*)(UChar*,Int,HInstr*,Bool,void*)) emit_AMD64Instr; 283c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj host_is_bigendian = False; 284c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj host_word_type = Ity_I64; 2855117ce116f47141cb23d1b49cc826e19323add97sewardj vassert(are_valid_hwcaps(VexArchAMD64, vta->archinfo_host.hwcaps)); 28617c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vassert(vta->dispatch != NULL); /* jump-to-dispatcher scheme */ 287c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj break; 288c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj 289487e4c9a453dfd32d87dbd4a51fac8aec054d563cerion case VexArchPPC32: 29092b643609c5fa432b11fc726c2706ae3f3296eb4cerion mode64 = False; 2915b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion getAllocableRegs_PPC ( &n_available_real_regs, 2925b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion &available_real_regs, mode64 ); 2935b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion isMove = (Bool(*)(HInstr*,HReg*,HReg*)) isMove_PPCInstr; 2945b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion getRegUsage = (void(*)(HRegUsage*,HInstr*,Bool)) getRegUsage_PPCInstr; 2955b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion mapRegs = (void(*)(HRegRemap*,HInstr*,Bool)) mapRegs_PPCInstr; 2965b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion genSpill = (HInstr*(*)(HReg,Int,Bool)) genSpill_PPC; 2975b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion genReload = (HInstr*(*)(HReg,Int,Bool)) genReload_PPC; 2985b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion ppInstr = (void(*)(HInstr*,Bool)) ppPPCInstr; 2995b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion ppReg = (void(*)(HReg)) ppHRegPPC; 300dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj iselSB = iselSB_PPC; 3015b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion emit = (Int(*)(UChar*,Int,HInstr*,Bool,void*)) emit_PPCInstr; 302487e4c9a453dfd32d87dbd4a51fac8aec054d563cerion host_is_bigendian = True; 303487e4c9a453dfd32d87dbd4a51fac8aec054d563cerion host_word_type = Ity_I32; 3045117ce116f47141cb23d1b49cc826e19323add97sewardj vassert(are_valid_hwcaps(VexArchPPC32, vta->archinfo_host.hwcaps)); 30517c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vassert(vta->dispatch == NULL); /* return-to-dispatcher scheme */ 306487e4c9a453dfd32d87dbd4a51fac8aec054d563cerion break; 307487e4c9a453dfd32d87dbd4a51fac8aec054d563cerion 308f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion case VexArchPPC64: 309f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion mode64 = True; 3105b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion getAllocableRegs_PPC ( &n_available_real_regs, 3115b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion &available_real_regs, mode64 ); 3125b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion isMove = (Bool(*)(HInstr*,HReg*,HReg*)) isMove_PPCInstr; 3135b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion getRegUsage = (void(*)(HRegUsage*,HInstr*, Bool)) getRegUsage_PPCInstr; 3145b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion mapRegs = (void(*)(HRegRemap*,HInstr*, Bool)) mapRegs_PPCInstr; 3155b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion genSpill = (HInstr*(*)(HReg,Int, Bool)) genSpill_PPC; 3165b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion genReload = (HInstr*(*)(HReg,Int, Bool)) genReload_PPC; 3175b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion ppInstr = (void(*)(HInstr*, Bool)) ppPPCInstr; 3185b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion ppReg = (void(*)(HReg)) ppHRegPPC; 319dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj iselSB = iselSB_PPC; 3205b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion emit = (Int(*)(UChar*,Int,HInstr*,Bool,void*)) emit_PPCInstr; 321f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion host_is_bigendian = True; 322f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion host_word_type = Ity_I64; 3235117ce116f47141cb23d1b49cc826e19323add97sewardj vassert(are_valid_hwcaps(VexArchPPC64, vta->archinfo_host.hwcaps)); 32417c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vassert(vta->dispatch == NULL); /* return-to-dispatcher scheme */ 325f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion break; 326f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion 327f13a16a82132fa2358899c7683193effecf9a56fsewardj default: 328887a11a609f3e61d2ae8fe4e67f176207715da7esewardj vpanic("LibVEX_Translate: unsupported target insn set"); 329f13a16a82132fa2358899c7683193effecf9a56fsewardj } 330f13a16a82132fa2358899c7683193effecf9a56fsewardj 3312a9ad023890d3b34cf45e429df2a8ae88b419128sewardj 33217c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj switch (vta->arch_guest) { 3332a9ad023890d3b34cf45e429df2a8ae88b419128sewardj 334bef170b7e84713d1e2181b9204d9415d29de3d65sewardj case VexArchX86: 3358d2291c9199adf1d0d9a5c684932d7ffe6d8e0c9sewardj preciseMemExnsFn = guest_x86_state_requires_precise_mem_exns; 3369e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj disInstrFn = disInstr_X86; 3372a9ad023890d3b34cf45e429df2a8ae88b419128sewardj specHelper = guest_x86_spechelper; 33881ec4189e287a97256f1e0a9fa7c0be316aaefc6sewardj guest_sizeB = sizeof(VexGuestX86State); 339cf7879021370aabcccb1a9347244fcc7d5680141sewardj guest_word_type = Ity_I32; 34049651f4b59b1ab7e0e70cccd34001630eafbe957sewardj guest_layout = &x86guest_layout; 341db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj offB_TISTART = offsetof(VexGuestX86State,guest_TISTART); 342db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj offB_TILEN = offsetof(VexGuestX86State,guest_TILEN); 3435117ce116f47141cb23d1b49cc826e19323add97sewardj vassert(are_valid_hwcaps(VexArchX86, vta->archinfo_guest.hwcaps)); 344e74f6f7cb93e88b774ca3635c8969dc3314d85acsewardj vassert(0 == sizeof(VexGuestX86State) % 8); 345ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj vassert(sizeof( ((VexGuestX86State*)0)->guest_TISTART) == 4); 346ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj vassert(sizeof( ((VexGuestX86State*)0)->guest_TILEN ) == 4); 347ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj vassert(sizeof( ((VexGuestX86State*)0)->guest_NRADDR ) == 4); 348f13a16a82132fa2358899c7683193effecf9a56fsewardj break; 3492a9ad023890d3b34cf45e429df2a8ae88b419128sewardj 35044d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj case VexArchAMD64: 35144d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj preciseMemExnsFn = guest_amd64_state_requires_precise_mem_exns; 3529e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj disInstrFn = disInstr_AMD64; 35344d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj specHelper = guest_amd64_spechelper; 35444d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj guest_sizeB = sizeof(VexGuestAMD64State); 35544d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj guest_word_type = Ity_I64; 35644d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj guest_layout = &amd64guest_layout; 357db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj offB_TISTART = offsetof(VexGuestAMD64State,guest_TISTART); 358db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj offB_TILEN = offsetof(VexGuestAMD64State,guest_TILEN); 3595117ce116f47141cb23d1b49cc826e19323add97sewardj vassert(are_valid_hwcaps(VexArchAMD64, vta->archinfo_guest.hwcaps)); 360e74f6f7cb93e88b774ca3635c8969dc3314d85acsewardj vassert(0 == sizeof(VexGuestAMD64State) % 8); 361db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj vassert(sizeof( ((VexGuestAMD64State*)0)->guest_TISTART ) == 8); 362ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj vassert(sizeof( ((VexGuestAMD64State*)0)->guest_TILEN ) == 8); 363ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj vassert(sizeof( ((VexGuestAMD64State*)0)->guest_NRADDR ) == 8); 36444d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj break; 36544d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj 366bef170b7e84713d1e2181b9204d9415d29de3d65sewardj case VexArchARM: 3672a9ad023890d3b34cf45e429df2a8ae88b419128sewardj preciseMemExnsFn = guest_arm_state_requires_precise_mem_exns; 3689e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj disInstrFn = NULL; /* HACK */ 3692a9ad023890d3b34cf45e429df2a8ae88b419128sewardj specHelper = guest_arm_spechelper; 3702a9ad023890d3b34cf45e429df2a8ae88b419128sewardj guest_sizeB = sizeof(VexGuestARMState); 3712a9ad023890d3b34cf45e429df2a8ae88b419128sewardj guest_word_type = Ity_I32; 3722a9ad023890d3b34cf45e429df2a8ae88b419128sewardj guest_layout = &armGuest_layout; 373db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj offB_TISTART = 0; /* hack ... arm has bitrot */ 374db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj offB_TILEN = 0; /* hack ... arm has bitrot */ 3755117ce116f47141cb23d1b49cc826e19323add97sewardj vassert(are_valid_hwcaps(VexArchARM, vta->archinfo_guest.hwcaps)); 3762a9ad023890d3b34cf45e429df2a8ae88b419128sewardj break; 3772a9ad023890d3b34cf45e429df2a8ae88b419128sewardj 378aabdfbf4193a965a8c50c643e536129d1d33661bcerion case VexArchPPC32: 379aabdfbf4193a965a8c50c643e536129d1d33661bcerion preciseMemExnsFn = guest_ppc32_state_requires_precise_mem_exns; 3805b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion disInstrFn = disInstr_PPC; 381aabdfbf4193a965a8c50c643e536129d1d33661bcerion specHelper = guest_ppc32_spechelper; 382aabdfbf4193a965a8c50c643e536129d1d33661bcerion guest_sizeB = sizeof(VexGuestPPC32State); 383aabdfbf4193a965a8c50c643e536129d1d33661bcerion guest_word_type = Ity_I32; 384aabdfbf4193a965a8c50c643e536129d1d33661bcerion guest_layout = &ppc32Guest_layout; 385db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj offB_TISTART = offsetof(VexGuestPPC32State,guest_TISTART); 386db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj offB_TILEN = offsetof(VexGuestPPC32State,guest_TILEN); 3875117ce116f47141cb23d1b49cc826e19323add97sewardj vassert(are_valid_hwcaps(VexArchPPC32, vta->archinfo_guest.hwcaps)); 388e74f6f7cb93e88b774ca3635c8969dc3314d85acsewardj vassert(0 == sizeof(VexGuestPPC32State) % 8); 389db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj vassert(sizeof( ((VexGuestPPC32State*)0)->guest_TISTART ) == 4); 390ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj vassert(sizeof( ((VexGuestPPC32State*)0)->guest_TILEN ) == 4); 391ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj vassert(sizeof( ((VexGuestPPC32State*)0)->guest_NRADDR ) == 4); 392aabdfbf4193a965a8c50c643e536129d1d33661bcerion break; 393aabdfbf4193a965a8c50c643e536129d1d33661bcerion 394f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion case VexArchPPC64: 395f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion preciseMemExnsFn = guest_ppc64_state_requires_precise_mem_exns; 3965b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion disInstrFn = disInstr_PPC; 397f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion specHelper = guest_ppc64_spechelper; 398f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion guest_sizeB = sizeof(VexGuestPPC64State); 399f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion guest_word_type = Ity_I64; 400f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion guest_layout = &ppc64Guest_layout; 401f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion offB_TISTART = offsetof(VexGuestPPC64State,guest_TISTART); 402f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion offB_TILEN = offsetof(VexGuestPPC64State,guest_TILEN); 4035117ce116f47141cb23d1b49cc826e19323add97sewardj vassert(are_valid_hwcaps(VexArchPPC64, vta->archinfo_guest.hwcaps)); 404f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion vassert(0 == sizeof(VexGuestPPC64State) % 16); 4053fd3967db856eb90b2030ebeb42b685d45bc3276sewardj vassert(sizeof( ((VexGuestPPC64State*)0)->guest_TISTART ) == 8); 4063fd3967db856eb90b2030ebeb42b685d45bc3276sewardj vassert(sizeof( ((VexGuestPPC64State*)0)->guest_TILEN ) == 8); 4073fd3967db856eb90b2030ebeb42b685d45bc3276sewardj vassert(sizeof( ((VexGuestPPC64State*)0)->guest_NRADDR ) == 8); 4083fd3967db856eb90b2030ebeb42b685d45bc3276sewardj vassert(sizeof( ((VexGuestPPC64State*)0)->guest_NRADDR_GPR2) == 8); 409f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion break; 410f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion 411f13a16a82132fa2358899c7683193effecf9a56fsewardj default: 412887a11a609f3e61d2ae8fe4e67f176207715da7esewardj vpanic("LibVEX_Translate: unsupported guest insn set"); 413f13a16a82132fa2358899c7683193effecf9a56fsewardj } 414f13a16a82132fa2358899c7683193effecf9a56fsewardj 4159df271d97c0f79a58a8eabdcfbe6f8bf4d17876asewardj /* yet more sanity checks ... */ 41617c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj if (vta->arch_guest == vta->arch_host) { 4179df271d97c0f79a58a8eabdcfbe6f8bf4d17876asewardj /* doesn't necessarily have to be true, but if it isn't it means 4180ec57c595719a395e71b48792a4d62c5b896b6d3sewardj we are simulating one flavour of an architecture a different 4190ec57c595719a395e71b48792a4d62c5b896b6d3sewardj flavour of the same architecture, which is pretty strange. */ 4205117ce116f47141cb23d1b49cc826e19323add97sewardj vassert(vta->archinfo_guest.hwcaps == vta->archinfo_host.hwcaps); 4219df271d97c0f79a58a8eabdcfbe6f8bf4d17876asewardj } 4222a9ad023890d3b34cf45e429df2a8ae88b419128sewardj 4232d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexAllocSanityCheck(); 4242d6b14aa64df2ff85f8da143516779d5d43574cbsewardj 425f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj if (vex_traceflags & VEX_TRACE_FE) 426f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_printf("\n------------------------" 427f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj " Front end " 428f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj "------------------------\n\n"); 429f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj 430dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj irsb = bb_to_IR ( vta->guest_extents, 431c716aea1cafe66ee431dc7d6909c98f18788a028sewardj vta->callback_opaque, 4329e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj disInstrFn, 43317c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vta->guest_bytes, 43417c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vta->guest_bytes_addr, 43517c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vta->chase_into_ok, 4369e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj host_is_bigendian, 437a5f55da7e956978fddad927436da5fab9568f3f1sewardj vta->arch_guest, 43817c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj &vta->archinfo_guest, 439dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj &vta->abiinfo_both, 440db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj guest_word_type, 44117c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vta->do_self_check, 442c716aea1cafe66ee431dc7d6909c98f18788a028sewardj vta->preamble_function, 443db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj offB_TISTART, 444c716aea1cafe66ee431dc7d6909c98f18788a028sewardj offB_TILEN ); 445f13a16a82132fa2358899c7683193effecf9a56fsewardj 4462d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexAllocSanityCheck(); 4472d6b14aa64df2ff85f8da143516779d5d43574cbsewardj 448dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj if (irsb == NULL) { 449f13a16a82132fa2358899c7683193effecf9a56fsewardj /* Access failure. */ 4502d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexSetAllocModeTEMP_and_clear(); 451f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_traceflags = 0; 452d887b8634b2c2685f528bd968459c628e8f86a34sewardj return VexTransAccessFail; 453f13a16a82132fa2358899c7683193effecf9a56fsewardj } 454aa59f942f729b5c98703d84321265313daeb32b8sewardj 45517c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vassert(vta->guest_extents->n_used >= 1 && vta->guest_extents->n_used <= 3); 45617c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vassert(vta->guest_extents->base[0] == vta->guest_bytes_addr); 45717c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj for (i = 0; i < vta->guest_extents->n_used; i++) { 45817c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vassert(vta->guest_extents->len[i] < 10000); /* sanity */ 45972c72814ab82c51d8ee8accad1a00f2d37942545sewardj } 46072c72814ab82c51d8ee8accad1a00f2d37942545sewardj 461aa59f942f729b5c98703d84321265313daeb32b8sewardj /* If debugging, show the raw guest bytes for this bb. */ 462109ffdbb31ff652ae83d0ad400966f68c46cd4f1sewardj if (0 || (vex_traceflags & VEX_TRACE_FE)) { 46317c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj if (vta->guest_extents->n_used > 1) { 46472c72814ab82c51d8ee8accad1a00f2d37942545sewardj vex_printf("can't show code due to extents > 1\n"); 46572c72814ab82c51d8ee8accad1a00f2d37942545sewardj } else { 46672c72814ab82c51d8ee8accad1a00f2d37942545sewardj /* HACK */ 46717c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj UChar* p = (UChar*)vta->guest_bytes; 46817c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj UInt guest_bytes_read = (UInt)vta->guest_extents->len[0]; 46917c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vex_printf(". 0 %llx %u\n.", vta->guest_bytes_addr, guest_bytes_read ); 47072c72814ab82c51d8ee8accad1a00f2d37942545sewardj for (i = 0; i < guest_bytes_read; i++) 471f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion vex_printf(" %02x", (Int)p[i] ); 47272c72814ab82c51d8ee8accad1a00f2d37942545sewardj vex_printf("\n\n"); 47372c72814ab82c51d8ee8accad1a00f2d37942545sewardj } 474aa59f942f729b5c98703d84321265313daeb32b8sewardj } 475aa59f942f729b5c98703d84321265313daeb32b8sewardj 476aa59f942f729b5c98703d84321265313daeb32b8sewardj /* Sanity check the initial IR. */ 477dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj sanityCheckIRSB( irsb, "initial IR", 478b92307503d4fb9265136e182d10c42ebb9dd8272sewardj False/*can be non-flat*/, guest_word_type ); 479e8e9d73817f92d295f45b1c6c823c613bc2e90aesewardj 4802d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexAllocSanityCheck(); 4812d6b14aa64df2ff85f8da143516779d5d43574cbsewardj 482edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj /* Clean it up, hopefully a lot. */ 483dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj irsb = do_iropt_BB ( irsb, specHelper, preciseMemExnsFn, 48417c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vta->guest_bytes_addr ); 485dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj sanityCheckIRSB( irsb, "after initial iropt", 486b92307503d4fb9265136e182d10c42ebb9dd8272sewardj True/*must be flat*/, guest_word_type ); 487edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj 488f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj if (vex_traceflags & VEX_TRACE_OPT1) { 489f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_printf("\n------------------------" 490f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj " After pre-instr IR optimisation " 491f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj "------------------------\n\n"); 492dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj ppIRSB ( irsb ); 493edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj vex_printf("\n"); 494edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj } 495edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj 4962d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexAllocSanityCheck(); 4972d6b14aa64df2ff85f8da143516779d5d43574cbsewardj 498f13a16a82132fa2358899c7683193effecf9a56fsewardj /* Get the thing instrumented. */ 49917c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj if (vta->instrument1) 500dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj irsb = vta->instrument1(vta->callback_opaque, 501dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj irsb, guest_layout, 50217c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vta->guest_extents, 50317c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj guest_word_type, host_word_type); 5042d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexAllocSanityCheck(); 5052d6b14aa64df2ff85f8da143516779d5d43574cbsewardj 50617c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj if (vta->instrument2) 507dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj irsb = vta->instrument2(vta->callback_opaque, 508dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj irsb, guest_layout, 50917c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vta->guest_extents, 51017c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj guest_word_type, host_word_type); 51149651f4b59b1ab7e0e70cccd34001630eafbe957sewardj 512f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj if (vex_traceflags & VEX_TRACE_INST) { 513f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_printf("\n------------------------" 514f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj " After instrumentation " 515f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj "------------------------\n\n"); 516dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj ppIRSB ( irsb ); 517f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_printf("\n"); 518f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj } 519f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj 52017c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj if (vta->instrument1 || vta->instrument2) 521dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj sanityCheckIRSB( irsb, "after instrumentation", 522b92307503d4fb9265136e182d10c42ebb9dd8272sewardj True/*must be flat*/, guest_word_type ); 523f13a16a82132fa2358899c7683193effecf9a56fsewardj 5249578a8bf6159d81eeadeb771c3214109cfee3715sewardj /* Do a post-instrumentation cleanup pass. */ 52517c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj if (vta->instrument1 || vta->instrument2) { 526dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj do_deadcode_BB( irsb ); 527dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj irsb = cprop_BB( irsb ); 528dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj do_deadcode_BB( irsb ); 529dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj sanityCheckIRSB( irsb, "after post-instrumentation cleanup", 530b92307503d4fb9265136e182d10c42ebb9dd8272sewardj True/*must be flat*/, guest_word_type ); 5319578a8bf6159d81eeadeb771c3214109cfee3715sewardj } 5329578a8bf6159d81eeadeb771c3214109cfee3715sewardj 5332d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexAllocSanityCheck(); 5342d6b14aa64df2ff85f8da143516779d5d43574cbsewardj 5359578a8bf6159d81eeadeb771c3214109cfee3715sewardj if (vex_traceflags & VEX_TRACE_OPT2) { 5369578a8bf6159d81eeadeb771c3214109cfee3715sewardj vex_printf("\n------------------------" 5379578a8bf6159d81eeadeb771c3214109cfee3715sewardj " After post-instr IR optimisation " 5389578a8bf6159d81eeadeb771c3214109cfee3715sewardj "------------------------\n\n"); 539dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj ppIRSB ( irsb ); 5409578a8bf6159d81eeadeb771c3214109cfee3715sewardj vex_printf("\n"); 5419578a8bf6159d81eeadeb771c3214109cfee3715sewardj } 5429578a8bf6159d81eeadeb771c3214109cfee3715sewardj 543f9517d0d452899780e8c34f02bef004ef7c5a163sewardj /* Turn it into virtual-registerised code. Build trees -- this 544f9517d0d452899780e8c34f02bef004ef7c5a163sewardj also throws away any dead bindings. */ 545dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj ado_treebuild_BB( irsb ); 546f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj 547be1b6ff6cdb576c59734762fb778ae48eb8e7a10sewardj if (vta->finaltidy) { 548be1b6ff6cdb576c59734762fb778ae48eb8e7a10sewardj irsb = vta->finaltidy(irsb); 549be1b6ff6cdb576c59734762fb778ae48eb8e7a10sewardj } 550be1b6ff6cdb576c59734762fb778ae48eb8e7a10sewardj 5512d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexAllocSanityCheck(); 5522d6b14aa64df2ff85f8da143516779d5d43574cbsewardj 553f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj if (vex_traceflags & VEX_TRACE_TREES) { 554f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_printf("\n------------------------" 555f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj " After tree-building " 556f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj "------------------------\n\n"); 557dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj ppIRSB ( irsb ); 558f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_printf("\n"); 559f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj } 560f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj 561e908c426bc9991611a1731ee881208d148e913fbsewardj /* HACK */ 56217c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj if (0) { *(vta->host_bytes_used) = 0; return VexTransOK; } 563e908c426bc9991611a1731ee881208d148e913fbsewardj /* end HACK */ 564c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj 565f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj if (vex_traceflags & VEX_TRACE_VCODE) 566f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_printf("\n------------------------" 567f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj " Instruction selection " 568f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj "------------------------\n"); 569f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj 570dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj vcode = iselSB ( irsb, vta->arch_host, &vta->archinfo_host, 571dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj &vta->abiinfo_both ); 572f13a16a82132fa2358899c7683193effecf9a56fsewardj 5732d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexAllocSanityCheck(); 5742d6b14aa64df2ff85f8da143516779d5d43574cbsewardj 575f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj if (vex_traceflags & VEX_TRACE_VCODE) 576f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_printf("\n"); 577f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj 578f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj if (vex_traceflags & VEX_TRACE_VCODE) { 5791f40a0a104034009e253675288ebefdcccf30da8sewardj for (i = 0; i < vcode->arr_used; i++) { 5801f40a0a104034009e253675288ebefdcccf30da8sewardj vex_printf("%3d ", i); 58192b643609c5fa432b11fc726c2706ae3f3296eb4cerion ppInstr(vcode->arr[i], mode64); 5821f40a0a104034009e253675288ebefdcccf30da8sewardj vex_printf("\n"); 5831f40a0a104034009e253675288ebefdcccf30da8sewardj } 584fbcaf3312f39fb73d54821636c6168db76245f61sewardj vex_printf("\n"); 585fbcaf3312f39fb73d54821636c6168db76245f61sewardj } 586fbcaf3312f39fb73d54821636c6168db76245f61sewardj 587f13a16a82132fa2358899c7683193effecf9a56fsewardj /* Register allocate. */ 588f13a16a82132fa2358899c7683193effecf9a56fsewardj rcode = doRegisterAllocation ( vcode, available_real_regs, 589f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion n_available_real_regs, 59072c72814ab82c51d8ee8accad1a00f2d37942545sewardj isMove, getRegUsage, mapRegs, 591fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj genSpill, genReload, directReload, 592fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj guest_sizeB, 59392b643609c5fa432b11fc726c2706ae3f3296eb4cerion ppInstr, ppReg, mode64 ); 594f13a16a82132fa2358899c7683193effecf9a56fsewardj 5952d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexAllocSanityCheck(); 5962d6b14aa64df2ff85f8da143516779d5d43574cbsewardj 597f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj if (vex_traceflags & VEX_TRACE_RCODE) { 598f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_printf("\n------------------------" 599f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj " Register-allocated code " 600f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj "------------------------\n\n"); 6011f40a0a104034009e253675288ebefdcccf30da8sewardj for (i = 0; i < rcode->arr_used; i++) { 6021f40a0a104034009e253675288ebefdcccf30da8sewardj vex_printf("%3d ", i); 60392b643609c5fa432b11fc726c2706ae3f3296eb4cerion ppInstr(rcode->arr[i], mode64); 6041f40a0a104034009e253675288ebefdcccf30da8sewardj vex_printf("\n"); 6051f40a0a104034009e253675288ebefdcccf30da8sewardj } 606fbcaf3312f39fb73d54821636c6168db76245f61sewardj vex_printf("\n"); 607fbcaf3312f39fb73d54821636c6168db76245f61sewardj } 608fbcaf3312f39fb73d54821636c6168db76245f61sewardj 609e908c426bc9991611a1731ee881208d148e913fbsewardj /* HACK */ 61017c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj if (0) { *(vta->host_bytes_used) = 0; return VexTransOK; } 611e908c426bc9991611a1731ee881208d148e913fbsewardj /* end HACK */ 612e908c426bc9991611a1731ee881208d148e913fbsewardj 61381bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj /* Assemble */ 614f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj if (vex_traceflags & VEX_TRACE_ASM) { 615f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_printf("\n------------------------" 616f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj " Assembly " 617f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj "------------------------\n\n"); 618f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj } 619f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj 62081bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj out_used = 0; /* tracks along the host_bytes array */ 62181bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj for (i = 0; i < rcode->arr_used; i++) { 622f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj if (vex_traceflags & VEX_TRACE_ASM) { 62392b643609c5fa432b11fc726c2706ae3f3296eb4cerion ppInstr(rcode->arr[i], mode64); 624bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj vex_printf("\n"); 625bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj } 62617c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj j = (*emit)( insn_bytes, 32, rcode->arr[i], mode64, vta->dispatch ); 627f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj if (vex_traceflags & VEX_TRACE_ASM) { 628bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj for (k = 0; k < j; k++) 62972c72814ab82c51d8ee8accad1a00f2d37942545sewardj if (insn_bytes[k] < 16) 63086898e8e1501f624d49b1cc43561c7a2a3b104f4sewardj vex_printf("0%x ", (UInt)insn_bytes[k]); 63186898e8e1501f624d49b1cc43561c7a2a3b104f4sewardj else 63286898e8e1501f624d49b1cc43561c7a2a3b104f4sewardj vex_printf("%x ", (UInt)insn_bytes[k]); 633bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj vex_printf("\n\n"); 634bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj } 63517c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj if (out_used + j > vta->host_bytes_size) { 6362d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexSetAllocModeTEMP_and_clear(); 637f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_traceflags = 0; 638d887b8634b2c2685f528bd968459c628e8f86a34sewardj return VexTransOutputFull; 63981bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj } 64081bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj for (k = 0; k < j; k++) { 64117c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vta->host_bytes[out_used] = insn_bytes[k]; 64281bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj out_used++; 64381bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj } 64417c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vassert(out_used <= vta->host_bytes_size); 64581bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj } 64617c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj *(vta->host_bytes_used) = out_used; 64781bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj 6482d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexAllocSanityCheck(); 6492d6b14aa64df2ff85f8da143516779d5d43574cbsewardj 6502d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexSetAllocModeTEMP_and_clear(); 651f13a16a82132fa2358899c7683193effecf9a56fsewardj 652f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_traceflags = 0; 653d887b8634b2c2685f528bd968459c628e8f86a34sewardj return VexTransOK; 65435421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj} 65535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 65635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 657893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj/* --------- Emulation warnings. --------- */ 658893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj 659893aadad7f29f7801ce26cb7575c16e90bd3767fsewardjHChar* LibVEX_EmWarn_string ( VexEmWarn ew ) 660893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj{ 661893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj switch (ew) { 662893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj case EmWarn_NONE: 663893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj return "none"; 664893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj case EmWarn_X86_x87exns: 665893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj return "Unmasking x87 FP exceptions"; 666893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj case EmWarn_X86_x87precision: 667893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj return "Selection of non-80-bit x87 FP precision"; 668893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj case EmWarn_X86_sseExns: 6695edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj return "Unmasking SSE FP exceptions"; 6705edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj case EmWarn_X86_fz: 6715edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj return "Setting %mxcsr.fz (SSE flush-underflows-to-zero mode)"; 6725edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj case EmWarn_X86_daz: 6735edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj return "Setting %mxcsr.daz (SSE treat-denormals-as-zero mode)"; 6746d26984a0df6a7d20b658bac6edf869eb872cca3sewardj case EmWarn_X86_acFlag: 6756d26984a0df6a7d20b658bac6edf869eb872cca3sewardj return "Setting %eflags.ac (setting noted but ignored)"; 6769dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj case EmWarn_PPCexns: 6779dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj return "Unmasking PPC32/64 FP exceptions"; 6789dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj case EmWarn_PPC64_redir_overflow: 6799dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj return "PPC64 function redirection stack overflow"; 6809dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj case EmWarn_PPC64_redir_underflow: 6819dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj return "PPC64 function redirection stack underflow"; 682893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj default: 683893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj vpanic("LibVEX_EmWarn_string: unknown warning"); 684893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj } 685893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj} 68635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 6875117ce116f47141cb23d1b49cc826e19323add97sewardj/* ------------------ Arch/HwCaps stuff. ------------------ */ 688bef170b7e84713d1e2181b9204d9415d29de3d65sewardj 689bef170b7e84713d1e2181b9204d9415d29de3d65sewardjconst HChar* LibVEX_ppVexArch ( VexArch arch ) 690bef170b7e84713d1e2181b9204d9415d29de3d65sewardj{ 691bef170b7e84713d1e2181b9204d9415d29de3d65sewardj switch (arch) { 692bef170b7e84713d1e2181b9204d9415d29de3d65sewardj case VexArch_INVALID: return "INVALID"; 693bef170b7e84713d1e2181b9204d9415d29de3d65sewardj case VexArchX86: return "X86"; 694bef170b7e84713d1e2181b9204d9415d29de3d65sewardj case VexArchAMD64: return "AMD64"; 695bef170b7e84713d1e2181b9204d9415d29de3d65sewardj case VexArchARM: return "ARM"; 6960ec57c595719a395e71b48792a4d62c5b896b6d3sewardj case VexArchPPC32: return "PPC32"; 697f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion case VexArchPPC64: return "PPC64"; 698bef170b7e84713d1e2181b9204d9415d29de3d65sewardj default: return "VexArch???"; 699bef170b7e84713d1e2181b9204d9415d29de3d65sewardj } 700bef170b7e84713d1e2181b9204d9415d29de3d65sewardj} 701bef170b7e84713d1e2181b9204d9415d29de3d65sewardj 7025117ce116f47141cb23d1b49cc826e19323add97sewardjconst HChar* LibVEX_ppVexHwCaps ( VexArch arch, UInt hwcaps ) 703bef170b7e84713d1e2181b9204d9415d29de3d65sewardj{ 7045117ce116f47141cb23d1b49cc826e19323add97sewardj HChar* str = show_hwcaps(arch,hwcaps); 7055117ce116f47141cb23d1b49cc826e19323add97sewardj return str ? str : "INVALID"; 706bef170b7e84713d1e2181b9204d9415d29de3d65sewardj} 707bef170b7e84713d1e2181b9204d9415d29de3d65sewardj 7085117ce116f47141cb23d1b49cc826e19323add97sewardj 70927e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj/* Write default settings info *vai. */ 71027e1dd6317760f3222f8a82185fa0e8ba138c85bsewardjvoid LibVEX_default_VexArchInfo ( /*OUT*/VexArchInfo* vai ) 71127e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj{ 7125117ce116f47141cb23d1b49cc826e19323add97sewardj vai->hwcaps = 0; 7135b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion vai->ppc_cache_line_szB = 0; 71427e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj} 71527e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj 716dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj/* Write default settings info *vbi. */ 717dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardjvoid LibVEX_default_VexAbiInfo ( /*OUT*/VexAbiInfo* vbi ) 718aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj{ 719dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj vbi->guest_stack_redzone_size = 0; 720dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj vbi->guest_ppc_zap_RZ_at_blr = False; 721dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj vbi->guest_ppc_zap_RZ_at_bl = NULL; 722dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj vbi->guest_ppc_sc_continues_at_LR = False; 723dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj vbi->host_ppc_calls_use_fndescrs = False; 724dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj vbi->host_ppc32_regalign_int64_args = False; 725aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj} 726aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj 72727e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj 7285117ce116f47141cb23d1b49cc826e19323add97sewardj/* Return a string showing the hwcaps in a nice way. The string will 7295117ce116f47141cb23d1b49cc826e19323add97sewardj be NULL for invalid combinations of flags, so these functions also 7305117ce116f47141cb23d1b49cc826e19323add97sewardj serve as a way to validate hwcaps values. */ 7315117ce116f47141cb23d1b49cc826e19323add97sewardj 7325117ce116f47141cb23d1b49cc826e19323add97sewardjstatic HChar* show_hwcaps_x86 ( UInt hwcaps ) 7335117ce116f47141cb23d1b49cc826e19323add97sewardj{ 7345117ce116f47141cb23d1b49cc826e19323add97sewardj /* Monotonic, SSE3 > SSE2 > SSE1 > baseline. */ 7355117ce116f47141cb23d1b49cc826e19323add97sewardj if (hwcaps == 0) 7365117ce116f47141cb23d1b49cc826e19323add97sewardj return "x86-sse0"; 7375117ce116f47141cb23d1b49cc826e19323add97sewardj if (hwcaps == VEX_HWCAPS_X86_SSE1) 7385117ce116f47141cb23d1b49cc826e19323add97sewardj return "x86-sse1"; 7395117ce116f47141cb23d1b49cc826e19323add97sewardj if (hwcaps == (VEX_HWCAPS_X86_SSE1 | VEX_HWCAPS_X86_SSE2)) 7405117ce116f47141cb23d1b49cc826e19323add97sewardj return "x86-sse1-sse2"; 7415117ce116f47141cb23d1b49cc826e19323add97sewardj if (hwcaps == (VEX_HWCAPS_X86_SSE1 7425117ce116f47141cb23d1b49cc826e19323add97sewardj | VEX_HWCAPS_X86_SSE2 | VEX_HWCAPS_X86_SSE3)) 7435117ce116f47141cb23d1b49cc826e19323add97sewardj return "x86-sse1-sse2-sse3"; 7445117ce116f47141cb23d1b49cc826e19323add97sewardj 7455117ce116f47141cb23d1b49cc826e19323add97sewardj return False; 7465117ce116f47141cb23d1b49cc826e19323add97sewardj} 7475117ce116f47141cb23d1b49cc826e19323add97sewardj 7485117ce116f47141cb23d1b49cc826e19323add97sewardjstatic HChar* show_hwcaps_amd64 ( UInt hwcaps ) 7495117ce116f47141cb23d1b49cc826e19323add97sewardj{ 7505117ce116f47141cb23d1b49cc826e19323add97sewardj /* Monotonic, SSE3 > baseline. */ 7515117ce116f47141cb23d1b49cc826e19323add97sewardj if (hwcaps == 0) 7525117ce116f47141cb23d1b49cc826e19323add97sewardj return "amd64-sse2"; 7535117ce116f47141cb23d1b49cc826e19323add97sewardj if (hwcaps == VEX_HWCAPS_AMD64_SSE3) 7545117ce116f47141cb23d1b49cc826e19323add97sewardj return "amd64-sse3"; 7555117ce116f47141cb23d1b49cc826e19323add97sewardj return False; 7565117ce116f47141cb23d1b49cc826e19323add97sewardj} 7575117ce116f47141cb23d1b49cc826e19323add97sewardj 7585117ce116f47141cb23d1b49cc826e19323add97sewardjstatic HChar* show_hwcaps_ppc32 ( UInt hwcaps ) 7595117ce116f47141cb23d1b49cc826e19323add97sewardj{ 7605117ce116f47141cb23d1b49cc826e19323add97sewardj /* Monotonic with complications. Basically V > F > baseline, 7615117ce116f47141cb23d1b49cc826e19323add97sewardj but once you have F then you can have FX or GX too. */ 7625117ce116f47141cb23d1b49cc826e19323add97sewardj const UInt F = VEX_HWCAPS_PPC32_F; 7635117ce116f47141cb23d1b49cc826e19323add97sewardj const UInt V = VEX_HWCAPS_PPC32_V; 7645117ce116f47141cb23d1b49cc826e19323add97sewardj const UInt FX = VEX_HWCAPS_PPC32_FX; 7655117ce116f47141cb23d1b49cc826e19323add97sewardj const UInt GX = VEX_HWCAPS_PPC32_GX; 7665117ce116f47141cb23d1b49cc826e19323add97sewardj UInt c = hwcaps; 7675117ce116f47141cb23d1b49cc826e19323add97sewardj if (c == 0) return "ppc32-int"; 7685117ce116f47141cb23d1b49cc826e19323add97sewardj if (c == F) return "ppc32-int-flt"; 7695117ce116f47141cb23d1b49cc826e19323add97sewardj if (c == (F|FX)) return "ppc32-int-flt-FX"; 7705117ce116f47141cb23d1b49cc826e19323add97sewardj if (c == (F|GX)) return "ppc32-int-flt-GX"; 7715117ce116f47141cb23d1b49cc826e19323add97sewardj if (c == (F|FX|GX)) return "ppc32-int-flt-FX-GX"; 7725117ce116f47141cb23d1b49cc826e19323add97sewardj if (c == (F|V)) return "ppc32-int-flt-vmx"; 7735117ce116f47141cb23d1b49cc826e19323add97sewardj if (c == (F|V|FX)) return "ppc32-int-flt-vmx-FX"; 7745117ce116f47141cb23d1b49cc826e19323add97sewardj if (c == (F|V|GX)) return "ppc32-int-flt-vmx-GX"; 7755117ce116f47141cb23d1b49cc826e19323add97sewardj if (c == (F|V|FX|GX)) return "ppc32-int-flt-vmx-FX-GX"; 7765117ce116f47141cb23d1b49cc826e19323add97sewardj return NULL; 7775117ce116f47141cb23d1b49cc826e19323add97sewardj} 7785117ce116f47141cb23d1b49cc826e19323add97sewardj 7795117ce116f47141cb23d1b49cc826e19323add97sewardjstatic HChar* show_hwcaps_ppc64 ( UInt hwcaps ) 7805117ce116f47141cb23d1b49cc826e19323add97sewardj{ 7815117ce116f47141cb23d1b49cc826e19323add97sewardj /* Monotonic with complications. Basically V > baseline(==F), 7825117ce116f47141cb23d1b49cc826e19323add97sewardj but once you have F then you can have FX or GX too. */ 7833fd3967db856eb90b2030ebeb42b685d45bc3276sewardj const UInt V = VEX_HWCAPS_PPC64_V; 7843fd3967db856eb90b2030ebeb42b685d45bc3276sewardj const UInt FX = VEX_HWCAPS_PPC64_FX; 7853fd3967db856eb90b2030ebeb42b685d45bc3276sewardj const UInt GX = VEX_HWCAPS_PPC64_GX; 7865117ce116f47141cb23d1b49cc826e19323add97sewardj UInt c = hwcaps; 7875117ce116f47141cb23d1b49cc826e19323add97sewardj if (c == 0) return "ppc64-int-flt"; 7885117ce116f47141cb23d1b49cc826e19323add97sewardj if (c == FX) return "ppc64-int-flt-FX"; 7895117ce116f47141cb23d1b49cc826e19323add97sewardj if (c == GX) return "ppc64-int-flt-GX"; 7905117ce116f47141cb23d1b49cc826e19323add97sewardj if (c == (FX|GX)) return "ppc64-int-flt-FX-GX"; 7915117ce116f47141cb23d1b49cc826e19323add97sewardj if (c == V) return "ppc64-int-flt-vmx"; 7925117ce116f47141cb23d1b49cc826e19323add97sewardj if (c == (V|FX)) return "ppc64-int-flt-vmx-FX"; 7935117ce116f47141cb23d1b49cc826e19323add97sewardj if (c == (V|GX)) return "ppc64-int-flt-vmx-GX"; 7945117ce116f47141cb23d1b49cc826e19323add97sewardj if (c == (V|FX|GX)) return "ppc64-int-flt-vmx-FX-GX"; 7955117ce116f47141cb23d1b49cc826e19323add97sewardj return NULL; 7965117ce116f47141cb23d1b49cc826e19323add97sewardj} 7975117ce116f47141cb23d1b49cc826e19323add97sewardj 7985117ce116f47141cb23d1b49cc826e19323add97sewardjstatic HChar* show_hwcaps_arm ( UInt hwcaps ) 7995117ce116f47141cb23d1b49cc826e19323add97sewardj{ 8005117ce116f47141cb23d1b49cc826e19323add97sewardj if (hwcaps == 0) return "arm-baseline"; 8015117ce116f47141cb23d1b49cc826e19323add97sewardj return NULL; 8025117ce116f47141cb23d1b49cc826e19323add97sewardj} 8035117ce116f47141cb23d1b49cc826e19323add97sewardj 8045117ce116f47141cb23d1b49cc826e19323add97sewardj/* ---- */ 8055117ce116f47141cb23d1b49cc826e19323add97sewardjstatic HChar* show_hwcaps ( VexArch arch, UInt hwcaps ) 8065117ce116f47141cb23d1b49cc826e19323add97sewardj{ 8075117ce116f47141cb23d1b49cc826e19323add97sewardj switch (arch) { 8083fd3967db856eb90b2030ebeb42b685d45bc3276sewardj case VexArchX86: return show_hwcaps_x86(hwcaps); 8095117ce116f47141cb23d1b49cc826e19323add97sewardj case VexArchAMD64: return show_hwcaps_amd64(hwcaps); 8105117ce116f47141cb23d1b49cc826e19323add97sewardj case VexArchPPC32: return show_hwcaps_ppc32(hwcaps); 8115117ce116f47141cb23d1b49cc826e19323add97sewardj case VexArchPPC64: return show_hwcaps_ppc64(hwcaps); 8123fd3967db856eb90b2030ebeb42b685d45bc3276sewardj case VexArchARM: return show_hwcaps_arm(hwcaps); 8135117ce116f47141cb23d1b49cc826e19323add97sewardj default: return NULL; 8145117ce116f47141cb23d1b49cc826e19323add97sewardj } 8155117ce116f47141cb23d1b49cc826e19323add97sewardj} 8165117ce116f47141cb23d1b49cc826e19323add97sewardj 8175117ce116f47141cb23d1b49cc826e19323add97sewardjstatic Bool are_valid_hwcaps ( VexArch arch, UInt hwcaps ) 8185117ce116f47141cb23d1b49cc826e19323add97sewardj{ 8195117ce116f47141cb23d1b49cc826e19323add97sewardj return show_hwcaps(arch,hwcaps) != NULL; 8205117ce116f47141cb23d1b49cc826e19323add97sewardj} 8215117ce116f47141cb23d1b49cc826e19323add97sewardj 8225117ce116f47141cb23d1b49cc826e19323add97sewardj 82335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---------------------------------------------------------------*/ 824c0ee2edb4563c90bc8f1a83a09984a1fda86d1d3sewardj/*--- end main/vex_main.c ---*/ 82535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---------------------------------------------------------------*/ 826