1f3652c97c20265d3410ea75d9817e8323b6df5c8florian/* -*- mode: C; c-basic-offset: 3; -*- */ 235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---------------------------------------------------------------*/ 41f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll/*--- Begin main_main.c ---*/ 535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---------------------------------------------------------------*/ 635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 7f8ed9d874a7b8651654591c68c6d431c758d787csewardj/* 8752f90673ebbb6b2f55fc5e46606dea371313713sewardj This file is part of Valgrind, a dynamic binary instrumentation 9752f90673ebbb6b2f55fc5e46606dea371313713sewardj framework. 10f8ed9d874a7b8651654591c68c6d431c758d787csewardj 1189ae8477745fd2a15453557d729a50e627325ee2sewardj Copyright (C) 2004-2013 OpenWorks LLP 12752f90673ebbb6b2f55fc5e46606dea371313713sewardj info@open-works.net 137bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj 14752f90673ebbb6b2f55fc5e46606dea371313713sewardj This program is free software; you can redistribute it and/or 15752f90673ebbb6b2f55fc5e46606dea371313713sewardj modify it under the terms of the GNU General Public License as 16752f90673ebbb6b2f55fc5e46606dea371313713sewardj published by the Free Software Foundation; either version 2 of the 17752f90673ebbb6b2f55fc5e46606dea371313713sewardj License, or (at your option) any later version. 187bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj 19752f90673ebbb6b2f55fc5e46606dea371313713sewardj This program is distributed in the hope that it will be useful, but 20752f90673ebbb6b2f55fc5e46606dea371313713sewardj WITHOUT ANY WARRANTY; without even the implied warranty of 21752f90673ebbb6b2f55fc5e46606dea371313713sewardj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 22752f90673ebbb6b2f55fc5e46606dea371313713sewardj General Public License for more details. 23752f90673ebbb6b2f55fc5e46606dea371313713sewardj 24752f90673ebbb6b2f55fc5e46606dea371313713sewardj You should have received a copy of the GNU General Public License 25752f90673ebbb6b2f55fc5e46606dea371313713sewardj along with this program; if not, write to the Free Software 26752f90673ebbb6b2f55fc5e46606dea371313713sewardj Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 277bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj 02110-1301, USA. 287bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj 29752f90673ebbb6b2f55fc5e46606dea371313713sewardj The GNU General Public License is contained in the file COPYING. 30f8ed9d874a7b8651654591c68c6d431c758d787csewardj 31f8ed9d874a7b8651654591c68c6d431c758d787csewardj Neither the names of the U.S. Department of Energy nor the 32f8ed9d874a7b8651654591c68c6d431c758d787csewardj University of California nor the names of its contributors may be 33f8ed9d874a7b8651654591c68c6d431c758d787csewardj used to endorse or promote products derived from this software 34f8ed9d874a7b8651654591c68c6d431c758d787csewardj without prior written permission. 35f8ed9d874a7b8651654591c68c6d431c758d787csewardj*/ 36f8ed9d874a7b8651654591c68c6d431c758d787csewardj 37887a11a609f3e61d2ae8fe4e67f176207715da7esewardj#include "libvex.h" 3833b024301d2311965cc68dc4cc900f3d0fdd8085florian#include "libvex_emnote.h" 3981ec4189e287a97256f1e0a9fa7c0be316aaefc6sewardj#include "libvex_guest_x86.h" 4044d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj#include "libvex_guest_amd64.h" 412a9ad023890d3b34cf45e429df2a8ae88b419128sewardj#include "libvex_guest_arm.h" 42bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj#include "libvex_guest_arm64.h" 43aabdfbf4193a965a8c50c643e536129d1d33661bcerion#include "libvex_guest_ppc32.h" 44f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion#include "libvex_guest_ppc64.h" 452019a976f07ff418dde2dfc7cc74667ef66d7764sewardj#include "libvex_guest_s390x.h" 46d0e5fe765fb79e5495206f8d0969133178b871f2sewardj#include "libvex_guest_mips32.h" 47b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj#include "libvex_guest_mips64.h" 480de80192f57cd132b31b233c65734de04939ce65sewardj#include "libvex_guest_tilegx.h" 49f13a16a82132fa2358899c7683193effecf9a56fsewardj 50cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "main_globals.h" 51cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "main_util.h" 52cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "host_generic_regs.h" 53cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "ir_opt.h" 542a9ad023890d3b34cf45e429df2a8ae88b419128sewardj 55cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "host_x86_defs.h" 56cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "host_amd64_defs.h" 57cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "host_ppc_defs.h" 586c299f3acab617581ea504e45fbb6cab24c2b29fsewardj#include "host_arm_defs.h" 59bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj#include "host_arm64_defs.h" 602019a976f07ff418dde2dfc7cc74667ef66d7764sewardj#include "host_s390_defs.h" 61d0e5fe765fb79e5495206f8d0969133178b871f2sewardj#include "host_mips_defs.h" 620de80192f57cd132b31b233c65734de04939ce65sewardj#include "host_tilegx_defs.h" 632a9ad023890d3b34cf45e429df2a8ae88b419128sewardj 64cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "guest_generic_bb_to_IR.h" 65cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "guest_x86_defs.h" 66cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "guest_amd64_defs.h" 67cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "guest_arm_defs.h" 68bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj#include "guest_arm64_defs.h" 69cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj#include "guest_ppc_defs.h" 702019a976f07ff418dde2dfc7cc74667ef66d7764sewardj#include "guest_s390_defs.h" 71d0e5fe765fb79e5495206f8d0969133178b871f2sewardj#include "guest_mips_defs.h" 720de80192f57cd132b31b233c65734de04939ce65sewardj#include "guest_tilegx_defs.h" 7335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 7469d98e3853a63e578e039894e2ef00ca6f9878c8sewardj#include "host_generic_simd128.h" 7569d98e3853a63e578e039894e2ef00ca6f9878c8sewardj 7612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe/* For each architecture <arch>, we define 2 macros: 7712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe <arch>FN that has as argument a pointer (typically to a function 7812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe or the return value of a function). 7912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe <arch>ST that has as argument a statement. 8012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe If main_main.c is compiled for <arch>, then these macros just expand 8112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe their arg. 8212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe Otherwise, the macros expand to respectively NULL and vassert(0). 8312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe These macros are used to avoid introducing dependencies to object 8412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe files not needed for the (only) architecture we are compiling for. 8512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe 8612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe To still compile the below for all supported architectures, define 8712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe VEXMULTIARCH. This is used by the file multiarch_main_main.c */ 8812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe 8912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_x86) || defined(VEXMULTIARCH) 9012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define X86FN(f) f 9112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define X86ST(f) f 9212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else 9312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define X86FN(f) NULL 9412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define X86ST(f) vassert(0) 9512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif 9612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe 9712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_amd64) || defined(VEXMULTIARCH) 9812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define AMD64FN(f) f 9912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define AMD64ST(f) f 10012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else 10112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define AMD64FN(f) NULL 10212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define AMD64ST(f) vassert(0) 10312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif 10412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe 10512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_ppc32) || defined(VEXMULTIARCH) 10612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC32FN(f) f 10712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC32ST(f) f 10812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else 10912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC32FN(f) NULL 11012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC32ST(f) vassert(0) 11112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif 11212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe 11312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_ppc64be) || defined(VGA_ppc64le) || defined(VEXMULTIARCH) 11412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC64FN(f) f 11512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC64ST(f) f 11612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else 11712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC64FN(f) NULL 11812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define PPC64ST(f) vassert(0) 11912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif 12012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe 12112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_s390x) || defined(VEXMULTIARCH) 12212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define S390FN(f) f 12312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define S390ST(f) f 12412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else 12512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define S390FN(f) NULL 12612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define S390ST(f) vassert(0) 12712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif 12812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe 12912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_arm) || defined(VEXMULTIARCH) 13012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARMFN(f) f 13112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARMST(f) f 13212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else 13312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARMFN(f) NULL 13412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARMST(f) vassert(0) 13512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif 13612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe 13712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_arm64) || defined(VEXMULTIARCH) 13812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARM64FN(f) f 13912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARM64ST(f) f 14012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else 14112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARM64FN(f) NULL 14212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define ARM64ST(f) vassert(0) 14312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif 14412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe 14512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_mips32) || defined(VEXMULTIARCH) 14612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS32FN(f) f 14712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS32ST(f) f 14812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else 14912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS32FN(f) NULL 15012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS32ST(f) vassert(0) 15112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif 15212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe 15312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#if defined(VGA_mips64) || defined(VEXMULTIARCH) 15412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS64FN(f) f 15512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS64ST(f) f 15612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#else 15712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS64FN(f) NULL 15812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#define MIPS64ST(f) vassert(0) 15912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe#endif 16035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 1610de80192f57cd132b31b233c65734de04939ce65sewardj#if defined(VGA_tilegx) || defined(VEXMULTIARCH) 1620de80192f57cd132b31b233c65734de04939ce65sewardj#define TILEGXFN(f) f 1630de80192f57cd132b31b233c65734de04939ce65sewardj#define TILEGXST(f) f 1640de80192f57cd132b31b233c65734de04939ce65sewardj#else 1650de80192f57cd132b31b233c65734de04939ce65sewardj#define TILEGXFN(f) NULL 1660de80192f57cd132b31b233c65734de04939ce65sewardj#define TILEGXST(f) vassert(0) 1670de80192f57cd132b31b233c65734de04939ce65sewardj#endif 1680de80192f57cd132b31b233c65734de04939ce65sewardj 1690de80192f57cd132b31b233c65734de04939ce65sewardj 17035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* This file contains the top level interface to the library. */ 17135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 1725117ce116f47141cb23d1b49cc826e19323add97sewardj/* --------- fwds ... --------- */ 1735117ce116f47141cb23d1b49cc826e19323add97sewardj 174f3652c97c20265d3410ea75d9817e8323b6df5c8florianstatic void check_hwcaps ( VexArch arch, UInt hwcaps ); 17555085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps ( VexArch arch, UInt hwcaps ); 1765117ce116f47141cb23d1b49cc826e19323add97sewardj 1775117ce116f47141cb23d1b49cc826e19323add97sewardj 1788bde7f1c67483371551aac0d4019c24c919063f7sewardj/* --------- helpers --------- */ 1798bde7f1c67483371551aac0d4019c24c919063f7sewardj 1808bde7f1c67483371551aac0d4019c24c919063f7sewardj__attribute__((noinline)) 1818bde7f1c67483371551aac0d4019c24c919063f7sewardjstatic UInt udiv32 ( UInt x, UInt y ) { return x/y; } 1828bde7f1c67483371551aac0d4019c24c919063f7sewardj__attribute__((noinline)) 1838bde7f1c67483371551aac0d4019c24c919063f7sewardjstatic Int sdiv32 ( Int x, Int y ) { return x/y; } 1848bde7f1c67483371551aac0d4019c24c919063f7sewardj 1858bde7f1c67483371551aac0d4019c24c919063f7sewardj 18635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* --------- Initialise the library. --------- */ 18735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 18835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* Exported to library client. */ 18935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 19008613749b639323cc7582c1bbe56c6e21c69774fsewardjvoid LibVEX_default_VexControl ( /*OUT*/ VexControl* vcon ) 19108613749b639323cc7582c1bbe56c6e21c69774fsewardj{ 19265902992da28822e4753594c7b72f7cb177fe3a6sewardj vex_bzero(vcon, sizeof(*vcon)); 193ca2c3c75784d35d136fc7c952717cdee5063c193sewardj vcon->iropt_verbosity = 0; 194ca2c3c75784d35d136fc7c952717cdee5063c193sewardj vcon->iropt_level = 2; 195ca2c3c75784d35d136fc7c952717cdee5063c193sewardj vcon->iropt_register_updates_default = VexRegUpdUnwindregsAtMemAccess; 196ca2c3c75784d35d136fc7c952717cdee5063c193sewardj vcon->iropt_unroll_thresh = 120; 197ca2c3c75784d35d136fc7c952717cdee5063c193sewardj vcon->guest_max_insns = 60; 198ca2c3c75784d35d136fc7c952717cdee5063c193sewardj vcon->guest_chase_thresh = 10; 199ca2c3c75784d35d136fc7c952717cdee5063c193sewardj vcon->guest_chase_cond = False; 20008613749b639323cc7582c1bbe56c6e21c69774fsewardj} 20108613749b639323cc7582c1bbe56c6e21c69774fsewardj 20208613749b639323cc7582c1bbe56c6e21c69774fsewardj 20308613749b639323cc7582c1bbe56c6e21c69774fsewardj/* Exported to library client. */ 20408613749b639323cc7582c1bbe56c6e21c69774fsewardj 205887a11a609f3e61d2ae8fe4e67f176207715da7esewardjvoid LibVEX_Init ( 20635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj /* failure exit function */ 2072b51587159d1d7c331719886d896c0a9cf217ee4sewardj __attribute__ ((noreturn)) 20835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj void (*failure_exit) ( void ), 20935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj /* logging output function */ 21004fc6b1eab791c7387b81b9fd820f4ae6aaf90a2florian void (*log_bytes) ( const HChar*, SizeT nbytes ), 21135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj /* debug paranoia level */ 21235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj Int debuglevel, 21308613749b639323cc7582c1bbe56c6e21c69774fsewardj /* Control ... */ 214f72c2c12a06fdfada40f8a42fac44514c2d9c181florian const VexControl* vcon 21535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj) 21635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj{ 21708613749b639323cc7582c1bbe56c6e21c69774fsewardj /* First off, do enough minimal setup so that the following 21808613749b639323cc7582c1bbe56c6e21c69774fsewardj assertions can fail in a sane fashion, if need be. */ 219ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vex_failure_exit = failure_exit; 220ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vex_log_bytes = log_bytes; 221ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj 222ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj /* Now it's safe to check parameters for sanity. */ 22335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj vassert(!vex_initdone); 22435421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj vassert(failure_exit); 22535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj vassert(log_bytes); 22635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj vassert(debuglevel >= 0); 22708613749b639323cc7582c1bbe56c6e21c69774fsewardj 22808613749b639323cc7582c1bbe56c6e21c69774fsewardj vassert(vcon->iropt_verbosity >= 0); 22908613749b639323cc7582c1bbe56c6e21c69774fsewardj vassert(vcon->iropt_level >= 0); 23008613749b639323cc7582c1bbe56c6e21c69774fsewardj vassert(vcon->iropt_level <= 2); 23108613749b639323cc7582c1bbe56c6e21c69774fsewardj vassert(vcon->iropt_unroll_thresh >= 0); 23208613749b639323cc7582c1bbe56c6e21c69774fsewardj vassert(vcon->iropt_unroll_thresh <= 400); 23308613749b639323cc7582c1bbe56c6e21c69774fsewardj vassert(vcon->guest_max_insns >= 1); 23408613749b639323cc7582c1bbe56c6e21c69774fsewardj vassert(vcon->guest_max_insns <= 100); 23508613749b639323cc7582c1bbe56c6e21c69774fsewardj vassert(vcon->guest_chase_thresh >= 0); 23608613749b639323cc7582c1bbe56c6e21c69774fsewardj vassert(vcon->guest_chase_thresh < vcon->guest_max_insns); 237984d9b164dd17f07e603c41fe1e506e641e57d18sewardj vassert(vcon->guest_chase_cond == True 238984d9b164dd17f07e603c41fe1e506e641e57d18sewardj || vcon->guest_chase_cond == False); 239443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj 240ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj /* Check that Vex has been built with sizes of basic types as 241ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj stated in priv/libvex_basictypes.h. Failure of any of these is 242ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj a serious configuration error and should be corrected 243ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj immediately. If any of these assertions fail you can fully 244ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj expect Vex not to work properly, if at all. */ 245ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj 246ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(1 == sizeof(UChar)); 247ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(1 == sizeof(Char)); 248ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(2 == sizeof(UShort)); 249ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(2 == sizeof(Short)); 250ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(4 == sizeof(UInt)); 251ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(4 == sizeof(Int)); 252ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(8 == sizeof(ULong)); 253ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(8 == sizeof(Long)); 254ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(4 == sizeof(Float)); 255ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(8 == sizeof(Double)); 256ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(1 == sizeof(Bool)); 257ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(4 == sizeof(Addr32)); 258ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(8 == sizeof(Addr64)); 259c9a43665879a03886b27a65b68af2a2c11b04f59sewardj vassert(16 == sizeof(U128)); 26069d98e3853a63e578e039894e2ef00ca6f9878c8sewardj vassert(16 == sizeof(V128)); 261c9069f2908814843e9a4da00da9c8905440195a6sewardj vassert(32 == sizeof(U256)); 262ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj 263ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(sizeof(void*) == 4 || sizeof(void*) == 8); 264ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(sizeof(void*) == sizeof(int*)); 265ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj vassert(sizeof(void*) == sizeof(HWord)); 266beac530a718fcc646bc61fe60a86f599df54e1d7florian vassert(sizeof(void*) == sizeof(Addr)); 267beac530a718fcc646bc61fe60a86f599df54e1d7florian vassert(sizeof(unsigned long) == sizeof(SizeT)); 268ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj 26997e87935760215710e2d88bd66ca77fdeefd8dd7sewardj vassert(VEX_HOST_WORDSIZE == sizeof(void*)); 27097e87935760215710e2d88bd66ca77fdeefd8dd7sewardj vassert(VEX_HOST_WORDSIZE == sizeof(HWord)); 27197e87935760215710e2d88bd66ca77fdeefd8dd7sewardj 272c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj /* These take a lot of space, so make sure we don't have 273c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj any unnoticed size regressions. */ 274c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj if (VEX_HOST_WORDSIZE == 4) { 275420bfa9e0f6bc49d7682d334aa61189b4d50f7b8florian vassert(sizeof(IRExpr) == 16); 276c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj vassert(sizeof(IRStmt) == 20 /* x86 */ 277c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj || sizeof(IRStmt) == 24 /* arm */); 278c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj } else { 279420bfa9e0f6bc49d7682d334aa61189b4d50f7b8florian vassert(sizeof(IRExpr) == 32); 280d6f38b3f822f7d57adfc0da3410995d85d6a4597florian vassert(sizeof(IRStmt) == 32); 281c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj } 282c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj 283a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj /* Ditto */ 284a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj vassert(sizeof(HReg) == 4); 285a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj /* If N_RREGUNIVERSE_REGS ever exceeds 64, the bitset fields in 286a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj RRegSet and HRegUsage will need to be changed to something 287a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj better than ULong. */ 288a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj vassert(N_RREGUNIVERSE_REGS == 64); 289a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj 2908bde7f1c67483371551aac0d4019c24c919063f7sewardj /* Check that signed integer division on the host rounds towards 2918bde7f1c67483371551aac0d4019c24c919063f7sewardj zero. If not, h_calc_sdiv32_w_arm_semantics() won't work 2928bde7f1c67483371551aac0d4019c24c919063f7sewardj correctly. */ 2938bde7f1c67483371551aac0d4019c24c919063f7sewardj /* 100.0 / 7.0 == 14.2857 */ 2948bde7f1c67483371551aac0d4019c24c919063f7sewardj vassert(udiv32(100, 7) == 14); 2958bde7f1c67483371551aac0d4019c24c919063f7sewardj vassert(sdiv32(100, 7) == 14); 2968bde7f1c67483371551aac0d4019c24c919063f7sewardj vassert(sdiv32(-100, 7) == -14); /* and not -15 */ 2978bde7f1c67483371551aac0d4019c24c919063f7sewardj vassert(sdiv32(100, -7) == -14); /* ditto */ 2988bde7f1c67483371551aac0d4019c24c919063f7sewardj vassert(sdiv32(-100, -7) == 14); /* not sure what this proves */ 2998bde7f1c67483371551aac0d4019c24c919063f7sewardj 300ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj /* Really start up .. */ 301443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj vex_debuglevel = debuglevel; 30208613749b639323cc7582c1bbe56c6e21c69774fsewardj vex_control = *vcon; 303443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj vex_initdone = True; 304d887b8634b2c2685f528bd968459c628e8f86a34sewardj vexSetAllocMode ( VexAllocModeTEMP ); 30535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj} 30635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 30735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 30835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* --------- Make a translation. --------- */ 30912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe/* KLUDGE: S390 need to know the hwcaps of the host when generating 31012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe code. But that info is not passed to emit_S390Instr. Only mode64 is 31112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe being passed. So, ideally, we want this passed as an argument, too. 31212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe Until then, we use a global variable. This variable is set as a side 31312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe effect of LibVEX_Translate. The variable is defined here rather than 31412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe in host_s390_defs.c to avoid having main_main.c dragging S390 31512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe object files in non VEXMULTIARCH. */ 31612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippeUInt s390_host_hwcaps; 31712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe 31835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 31935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* Exported to library client. */ 32035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 32117c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardjVexTranslateResult LibVEX_Translate ( VexTranslateArgs* vta ) 32235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj{ 32381bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj /* This the bundle of functions we need to do the back-end stuff 32481bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj (insn selection, reg-alloc, assembly) whilst being insulated 32581bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj from the target instruction set. */ 326d8c64e082224b2e688abdef9219cc76fd82b373bflorian Bool (*isMove) ( const HInstr*, HReg*, HReg* ); 327d8c64e082224b2e688abdef9219cc76fd82b373bflorian void (*getRegUsage) ( HRegUsage*, const HInstr*, Bool ); 328fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj void (*mapRegs) ( HRegRemap*, HInstr*, Bool ); 3296c299f3acab617581ea504e45fbb6cab24c2b29fsewardj void (*genSpill) ( HInstr**, HInstr**, HReg, Int, Bool ); 3306c299f3acab617581ea504e45fbb6cab24c2b29fsewardj void (*genReload) ( HInstr**, HInstr**, HReg, Int, Bool ); 331fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj HInstr* (*directReload) ( HInstr*, HReg, Short ); 332d8c64e082224b2e688abdef9219cc76fd82b373bflorian void (*ppInstr) ( const HInstr*, Bool ); 333fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj void (*ppReg) ( HReg ); 334cacba8e675988fbf21b08feea1f317a9c896c053florian HInstrArray* (*iselSB) ( const IRSB*, VexArch, const VexArchInfo*, 335d8c64e082224b2e688abdef9219cc76fd82b373bflorian const VexAbiInfo*, Int, Int, Bool, Bool, 336dcd6d236c9aef7d4c84369d4c51f6b92ac910127florian Addr ); 337c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj Int (*emit) ( /*MB_MOD*/Bool*, 338d8c64e082224b2e688abdef9219cc76fd82b373bflorian UChar*, Int, const HInstr*, Bool, VexEndness, 3398462d113e3efeacceb304222dada8d85f748295aflorian const void*, const void*, const void*, 3408462d113e3efeacceb304222dada8d85f748295aflorian const void* ); 3411ff4756e1731485e6bf3cd96717cd8398daec1f2florian IRExpr* (*specHelper) ( const HChar*, IRExpr**, IRStmt**, Int ); 342ca2c3c75784d35d136fc7c952717cdee5063c193sewardj Bool (*preciseMemExnsFn) ( Int, Int, VexRegisterUpdates ); 343f13a16a82132fa2358899c7683193effecf9a56fsewardj 344a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj const RRegUniverse* rRegUniv = NULL; 345a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj 3469e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj DisOneInstrFn disInstrFn; 3479e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj 348eeac841fbfcadbc19e97c7ef56bfa3354ba78637sewardj VexGuestLayout* guest_layout; 349dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj IRSB* irsb; 350eeac841fbfcadbc19e97c7ef56bfa3354ba78637sewardj HInstrArray* vcode; 351eeac841fbfcadbc19e97c7ef56bfa3354ba78637sewardj HInstrArray* rcode; 352eeac841fbfcadbc19e97c7ef56bfa3354ba78637sewardj Int i, j, k, out_used, guest_sizeB; 35305f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj Int offB_CMSTART, offB_CMLEN, offB_GUEST_IP, szB_GUEST_IP; 354c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj Int offB_HOST_EvC_COUNTER, offB_HOST_EvC_FAILADDR; 355b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj UChar insn_bytes[128]; 356cf7879021370aabcccb1a9347244fcc7d5680141sewardj IRType guest_word_type; 357cf7879021370aabcccb1a9347244fcc7d5680141sewardj IRType host_word_type; 358c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj Bool mode64, chainingAllowed; 359dcd6d236c9aef7d4c84369d4c51f6b92ac910127florian Addr max_ga; 360f13a16a82132fa2358899c7683193effecf9a56fsewardj 36149651f4b59b1ab7e0e70cccd34001630eafbe957sewardj guest_layout = NULL; 36236ca51378f8851635df814230fa23f2c409b9eddsewardj isMove = NULL; 36336ca51378f8851635df814230fa23f2c409b9eddsewardj getRegUsage = NULL; 36436ca51378f8851635df814230fa23f2c409b9eddsewardj mapRegs = NULL; 36536ca51378f8851635df814230fa23f2c409b9eddsewardj genSpill = NULL; 36636ca51378f8851635df814230fa23f2c409b9eddsewardj genReload = NULL; 367fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj directReload = NULL; 36836ca51378f8851635df814230fa23f2c409b9eddsewardj ppInstr = NULL; 36936ca51378f8851635df814230fa23f2c409b9eddsewardj ppReg = NULL; 370dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj iselSB = NULL; 37136ca51378f8851635df814230fa23f2c409b9eddsewardj emit = NULL; 37284ff0657940e62f38e618ea18bac6f27ce0e741fsewardj specHelper = NULL; 3738d2291c9199adf1d0d9a5c684932d7ffe6d8e0c9sewardj preciseMemExnsFn = NULL; 3749e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj disInstrFn = NULL; 375cf7879021370aabcccb1a9347244fcc7d5680141sewardj guest_word_type = Ity_INVALID; 376cf7879021370aabcccb1a9347244fcc7d5680141sewardj host_word_type = Ity_INVALID; 37705f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj offB_CMSTART = 0; 37805f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj offB_CMLEN = 0; 379c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj offB_GUEST_IP = 0; 380c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj szB_GUEST_IP = 0; 381c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj offB_HOST_EvC_COUNTER = 0; 382c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj offB_HOST_EvC_FAILADDR = 0; 38392b643609c5fa432b11fc726c2706ae3f3296eb4cerion mode64 = False; 384c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj chainingAllowed = False; 38536ca51378f8851635df814230fa23f2c409b9eddsewardj 38617c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vex_traceflags = vta->traceflags; 38758800ff1f3bc35d5cae9885c9d8a51a8d9d33016sewardj 38835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj vassert(vex_initdone); 389c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj vassert(vta->needs_self_check != NULL); 390c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj vassert(vta->disp_cp_xassisted != NULL); 391c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj /* Both the chainers and the indir are either NULL or non-NULL. */ 392c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj if (vta->disp_cp_chain_me_to_slowEP != NULL) { 393c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj vassert(vta->disp_cp_chain_me_to_fastEP != NULL); 394c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj vassert(vta->disp_cp_xindir != NULL); 395c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj chainingAllowed = True; 396c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj } else { 397c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj vassert(vta->disp_cp_chain_me_to_fastEP == NULL); 398c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj vassert(vta->disp_cp_xindir == NULL); 399c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj } 4002eeeb9bc9367c26449deaa632e9f8eafa60c4685florian 4012d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexSetAllocModeTEMP_and_clear(); 4022d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexAllocSanityCheck(); 4032a9ad023890d3b34cf45e429df2a8ae88b419128sewardj 404f13a16a82132fa2358899c7683193effecf9a56fsewardj /* First off, check that the guest and host insn sets 405f13a16a82132fa2358899c7683193effecf9a56fsewardj are supported. */ 4062a9ad023890d3b34cf45e429df2a8ae88b419128sewardj 40717c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj switch (vta->arch_host) { 4082a9ad023890d3b34cf45e429df2a8ae88b419128sewardj 409bef170b7e84713d1e2181b9204d9415d29de3d65sewardj case VexArchX86: 410fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj mode64 = False; 41112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe rRegUniv = X86FN(getRRegUniverse_X86()); 41212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe isMove = (__typeof__(isMove)) X86FN(isMove_X86Instr); 41312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe getRegUsage 41412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe = (__typeof__(getRegUsage)) X86FN(getRegUsage_X86Instr); 41512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe mapRegs = (__typeof__(mapRegs)) X86FN(mapRegs_X86Instr); 41612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe genSpill = (__typeof__(genSpill)) X86FN(genSpill_X86); 41712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe genReload = (__typeof__(genReload)) X86FN(genReload_X86); 41812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe directReload = (__typeof__(directReload)) X86FN(directReload_X86); 41912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ppInstr = (__typeof__(ppInstr)) X86FN(ppX86Instr); 42012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ppReg = (__typeof__(ppReg)) X86FN(ppHRegX86); 42112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe iselSB = X86FN(iselSB_X86); 42212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe emit = (__typeof__(emit)) X86FN(emit_X86Instr); 423a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj host_word_type = Ity_I32; 4249b76916dcc1628e133d57db001563429c6e3a590sewardj vassert(vta->archinfo_host.endness == VexEndnessLE); 425f13a16a82132fa2358899c7683193effecf9a56fsewardj break; 4262a9ad023890d3b34cf45e429df2a8ae88b419128sewardj 427c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj case VexArchAMD64: 428a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj mode64 = True; 42912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe rRegUniv = AMD64FN(getRRegUniverse_AMD64()); 43012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe isMove = (__typeof__(isMove)) AMD64FN(isMove_AMD64Instr); 43112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe getRegUsage 43212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe = (__typeof__(getRegUsage)) AMD64FN(getRegUsage_AMD64Instr); 43312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe mapRegs = (__typeof__(mapRegs)) AMD64FN(mapRegs_AMD64Instr); 43412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe genSpill = (__typeof__(genSpill)) AMD64FN(genSpill_AMD64); 43512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe genReload = (__typeof__(genReload)) AMD64FN(genReload_AMD64); 43612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ppInstr = (__typeof__(ppInstr)) AMD64FN(ppAMD64Instr); 43712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ppReg = (__typeof__(ppReg)) AMD64FN(ppHRegAMD64); 43812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe iselSB = AMD64FN(iselSB_AMD64); 43912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe emit = (__typeof__(emit)) AMD64FN(emit_AMD64Instr); 440a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj host_word_type = Ity_I64; 4419b76916dcc1628e133d57db001563429c6e3a590sewardj vassert(vta->archinfo_host.endness == VexEndnessLE); 442c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj break; 443c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj 444487e4c9a453dfd32d87dbd4a51fac8aec054d563cerion case VexArchPPC32: 445a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj mode64 = False; 44612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe rRegUniv = PPC32FN(getRRegUniverse_PPC(mode64)); 44712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe isMove = (__typeof__(isMove)) PPC32FN(isMove_PPCInstr); 44812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe getRegUsage 44912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe = (__typeof__(getRegUsage)) PPC32FN(getRegUsage_PPCInstr); 45012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe mapRegs = (__typeof__(mapRegs)) PPC32FN(mapRegs_PPCInstr); 45112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe genSpill = (__typeof__(genSpill)) PPC32FN(genSpill_PPC); 45212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe genReload = (__typeof__(genReload)) PPC32FN(genReload_PPC); 45312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ppInstr = (__typeof__(ppInstr)) PPC32FN(ppPPCInstr); 45412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ppReg = (__typeof__(ppReg)) PPC32FN(ppHRegPPC); 45512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe iselSB = PPC32FN(iselSB_PPC); 45612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe emit = (__typeof__(emit)) PPC32FN(emit_PPCInstr); 457a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj host_word_type = Ity_I32; 4589b76916dcc1628e133d57db001563429c6e3a590sewardj vassert(vta->archinfo_host.endness == VexEndnessBE); 459487e4c9a453dfd32d87dbd4a51fac8aec054d563cerion break; 460487e4c9a453dfd32d87dbd4a51fac8aec054d563cerion 461f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion case VexArchPPC64: 462a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj mode64 = True; 46312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe rRegUniv = PPC64FN(getRRegUniverse_PPC(mode64)); 46412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe isMove = (__typeof__(isMove)) PPC64FN(isMove_PPCInstr); 46512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe getRegUsage 46612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe = (__typeof__(getRegUsage)) PPC64FN(getRegUsage_PPCInstr); 46712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe mapRegs = (__typeof__(mapRegs)) PPC64FN(mapRegs_PPCInstr); 46812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe genSpill = (__typeof__(genSpill)) PPC64FN(genSpill_PPC); 46912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe genReload = (__typeof__(genReload)) PPC64FN(genReload_PPC); 47012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ppInstr = (__typeof__(ppInstr)) PPC64FN(ppPPCInstr); 47112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ppReg = (__typeof__(ppReg)) PPC64FN(ppHRegPPC); 47212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe iselSB = PPC64FN(iselSB_PPC); 47312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe emit = (__typeof__(emit)) PPC64FN(emit_PPCInstr); 474a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj host_word_type = Ity_I64; 4751f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll vassert(vta->archinfo_host.endness == VexEndnessBE || 4761f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll vta->archinfo_host.endness == VexEndnessLE ); 477f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion break; 478f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion 4792019a976f07ff418dde2dfc7cc74667ef66d7764sewardj case VexArchS390X: 480a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj mode64 = True; 4813eb7babfeab2edfba2dc13dd1b86444b0c2674c2florian /* KLUDGE: export hwcaps. */ 4823eb7babfeab2edfba2dc13dd1b86444b0c2674c2florian s390_host_hwcaps = vta->archinfo_host.hwcaps; 48312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe rRegUniv = S390FN(getRRegUniverse_S390()); 48412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe isMove = (__typeof__(isMove)) S390FN(isMove_S390Instr); 48512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe getRegUsage 48612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe = (__typeof__(getRegUsage)) S390FN(getRegUsage_S390Instr); 48712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe mapRegs = (__typeof__(mapRegs)) S390FN(mapRegs_S390Instr); 48812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe genSpill = (__typeof__(genSpill)) S390FN(genSpill_S390); 48912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe genReload = (__typeof__(genReload)) S390FN(genReload_S390); 490017c0d529daefd1f76c7d00a90b8cc810cc8e410florian // fixs390: consider implementing directReload_S390 49112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ppInstr = (__typeof__(ppInstr)) S390FN(ppS390Instr); 49212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ppReg = (__typeof__(ppReg)) S390FN(ppHRegS390); 49312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe iselSB = S390FN(iselSB_S390); 49412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe emit = (__typeof__(emit)) S390FN(emit_S390Instr); 495a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj host_word_type = Ity_I64; 4969b76916dcc1628e133d57db001563429c6e3a590sewardj vassert(vta->archinfo_host.endness == VexEndnessBE); 4972019a976f07ff418dde2dfc7cc74667ef66d7764sewardj break; 4982019a976f07ff418dde2dfc7cc74667ef66d7764sewardj 4996c299f3acab617581ea504e45fbb6cab24c2b29fsewardj case VexArchARM: 500a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj mode64 = False; 50112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe rRegUniv = ARMFN(getRRegUniverse_ARM()); 50212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe isMove = (__typeof__(isMove)) ARMFN(isMove_ARMInstr); 50312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe getRegUsage 50412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe = (__typeof__(getRegUsage)) ARMFN(getRegUsage_ARMInstr); 50512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe mapRegs = (__typeof__(mapRegs)) ARMFN(mapRegs_ARMInstr); 50612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe genSpill = (__typeof__(genSpill)) ARMFN(genSpill_ARM); 50712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe genReload = (__typeof__(genReload)) ARMFN(genReload_ARM); 50812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ppInstr = (__typeof__(ppInstr)) ARMFN(ppARMInstr); 50912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ppReg = (__typeof__(ppReg)) ARMFN(ppHRegARM); 51012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe iselSB = ARMFN(iselSB_ARM); 51112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe emit = (__typeof__(emit)) ARMFN(emit_ARMInstr); 512a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj host_word_type = Ity_I32; 5139b76916dcc1628e133d57db001563429c6e3a590sewardj vassert(vta->archinfo_host.endness == VexEndnessLE); 5146c299f3acab617581ea504e45fbb6cab24c2b29fsewardj break; 5156c299f3acab617581ea504e45fbb6cab24c2b29fsewardj 516bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj case VexArchARM64: 517a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj mode64 = True; 51812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe rRegUniv = ARM64FN(getRRegUniverse_ARM64()); 51912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe isMove = (__typeof__(isMove)) ARM64FN(isMove_ARM64Instr); 52012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe getRegUsage 52112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe = (__typeof__(getRegUsage)) ARM64FN(getRegUsage_ARM64Instr); 52212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe mapRegs = (__typeof__(mapRegs)) ARM64FN(mapRegs_ARM64Instr); 52312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe genSpill = (__typeof__(genSpill)) ARM64FN(genSpill_ARM64); 52412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe genReload = (__typeof__(genReload)) ARM64FN(genReload_ARM64); 52512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ppInstr = (__typeof__(ppInstr)) ARM64FN(ppARM64Instr); 52612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ppReg = (__typeof__(ppReg)) ARM64FN(ppHRegARM64); 52712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe iselSB = ARM64FN(iselSB_ARM64); 52812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe emit = (__typeof__(emit)) ARM64FN(emit_ARM64Instr); 529a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj host_word_type = Ity_I64; 5309b76916dcc1628e133d57db001563429c6e3a590sewardj vassert(vta->archinfo_host.endness == VexEndnessLE); 531bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj break; 532bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj 533d0e5fe765fb79e5495206f8d0969133178b871f2sewardj case VexArchMIPS32: 534a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj mode64 = False; 53512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe rRegUniv = MIPS32FN(getRRegUniverse_MIPS(mode64)); 53612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe isMove = (__typeof__(isMove)) MIPS32FN(isMove_MIPSInstr); 53712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe getRegUsage 53812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe = (__typeof__(getRegUsage)) MIPS32FN(getRegUsage_MIPSInstr); 53912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe mapRegs = (__typeof__(mapRegs)) MIPS32FN(mapRegs_MIPSInstr); 54012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe genSpill = (__typeof__(genSpill)) MIPS32FN(genSpill_MIPS); 54112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe genReload = (__typeof__(genReload)) MIPS32FN(genReload_MIPS); 54212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ppInstr = (__typeof__(ppInstr)) MIPS32FN(ppMIPSInstr); 54312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ppReg = (__typeof__(ppReg)) MIPS32FN(ppHRegMIPS); 54412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe iselSB = MIPS32FN(iselSB_MIPS); 54512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe emit = (__typeof__(emit)) MIPS32FN(emit_MIPSInstr); 546a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj host_word_type = Ity_I32; 5479b76916dcc1628e133d57db001563429c6e3a590sewardj vassert(vta->archinfo_host.endness == VexEndnessLE 5489b76916dcc1628e133d57db001563429c6e3a590sewardj || vta->archinfo_host.endness == VexEndnessBE); 549d0e5fe765fb79e5495206f8d0969133178b871f2sewardj break; 550d0e5fe765fb79e5495206f8d0969133178b871f2sewardj 551b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj case VexArchMIPS64: 552a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj mode64 = True; 55312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe rRegUniv = MIPS64FN(getRRegUniverse_MIPS(mode64)); 55412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe isMove = (__typeof__(isMove)) MIPS64FN(isMove_MIPSInstr); 55512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe getRegUsage 55612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe = (__typeof__(getRegUsage)) MIPS64FN(getRegUsage_MIPSInstr); 55712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe mapRegs = (__typeof__(mapRegs)) MIPS64FN(mapRegs_MIPSInstr); 55812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe genSpill = (__typeof__(genSpill)) MIPS64FN(genSpill_MIPS); 55912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe genReload = (__typeof__(genReload)) MIPS64FN(genReload_MIPS); 56012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ppInstr = (__typeof__(ppInstr)) MIPS64FN(ppMIPSInstr); 56112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ppReg = (__typeof__(ppReg)) MIPS64FN(ppHRegMIPS); 56212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe iselSB = MIPS64FN(iselSB_MIPS); 56312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe emit = (__typeof__(emit)) MIPS64FN(emit_MIPSInstr); 564a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj host_word_type = Ity_I64; 5659b76916dcc1628e133d57db001563429c6e3a590sewardj vassert(vta->archinfo_host.endness == VexEndnessLE 5669b76916dcc1628e133d57db001563429c6e3a590sewardj || vta->archinfo_host.endness == VexEndnessBE); 567b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj break; 568b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj 5690de80192f57cd132b31b233c65734de04939ce65sewardj case VexArchTILEGX: 5700de80192f57cd132b31b233c65734de04939ce65sewardj mode64 = True; 5710de80192f57cd132b31b233c65734de04939ce65sewardj rRegUniv = TILEGXFN(getRRegUniverse_TILEGX()); 5720de80192f57cd132b31b233c65734de04939ce65sewardj isMove = (__typeof__(isMove)) TILEGXFN(isMove_TILEGXInstr); 5730de80192f57cd132b31b233c65734de04939ce65sewardj getRegUsage = 5740de80192f57cd132b31b233c65734de04939ce65sewardj (__typeof__(getRegUsage)) TILEGXFN(getRegUsage_TILEGXInstr); 5750de80192f57cd132b31b233c65734de04939ce65sewardj mapRegs = (__typeof__(mapRegs)) TILEGXFN(mapRegs_TILEGXInstr); 5760de80192f57cd132b31b233c65734de04939ce65sewardj genSpill = (__typeof__(genSpill)) TILEGXFN(genSpill_TILEGX); 5770de80192f57cd132b31b233c65734de04939ce65sewardj genReload = (__typeof__(genReload)) TILEGXFN(genReload_TILEGX); 5780de80192f57cd132b31b233c65734de04939ce65sewardj ppInstr = (__typeof__(ppInstr)) TILEGXFN(ppTILEGXInstr); 5790de80192f57cd132b31b233c65734de04939ce65sewardj ppReg = (__typeof__(ppReg)) TILEGXFN(ppHRegTILEGX); 5800de80192f57cd132b31b233c65734de04939ce65sewardj iselSB = TILEGXFN(iselSB_TILEGX); 5810de80192f57cd132b31b233c65734de04939ce65sewardj emit = (__typeof__(emit)) TILEGXFN(emit_TILEGXInstr); 5820de80192f57cd132b31b233c65734de04939ce65sewardj host_word_type = Ity_I64; 5830de80192f57cd132b31b233c65734de04939ce65sewardj vassert(vta->archinfo_host.endness == VexEndnessLE); 5840de80192f57cd132b31b233c65734de04939ce65sewardj break; 5850de80192f57cd132b31b233c65734de04939ce65sewardj 586f13a16a82132fa2358899c7683193effecf9a56fsewardj default: 5876c299f3acab617581ea504e45fbb6cab24c2b29fsewardj vpanic("LibVEX_Translate: unsupported host insn set"); 588f13a16a82132fa2358899c7683193effecf9a56fsewardj } 589f13a16a82132fa2358899c7683193effecf9a56fsewardj 590f3652c97c20265d3410ea75d9817e8323b6df5c8florian // Are the host's hardware capabilities feasible. The function will 591f3652c97c20265d3410ea75d9817e8323b6df5c8florian // not return if hwcaps are infeasible in some sense. 592f3652c97c20265d3410ea75d9817e8323b6df5c8florian check_hwcaps(vta->arch_host, vta->archinfo_host.hwcaps); 5932a9ad023890d3b34cf45e429df2a8ae88b419128sewardj 59417c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj switch (vta->arch_guest) { 5952a9ad023890d3b34cf45e429df2a8ae88b419128sewardj 596bef170b7e84713d1e2181b9204d9415d29de3d65sewardj case VexArchX86: 59712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe preciseMemExnsFn 59812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe = X86FN(guest_x86_state_requires_precise_mem_exns); 59912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disInstrFn = X86FN(disInstr_X86); 60012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe specHelper = X86FN(guest_x86_spechelper); 601c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj guest_sizeB = sizeof(VexGuestX86State); 602c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj guest_word_type = Ity_I32; 60312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe guest_layout = X86FN(&x86guest_layout); 60405f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj offB_CMSTART = offsetof(VexGuestX86State,guest_CMSTART); 60505f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj offB_CMLEN = offsetof(VexGuestX86State,guest_CMLEN); 606c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj offB_GUEST_IP = offsetof(VexGuestX86State,guest_EIP); 607c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj szB_GUEST_IP = sizeof( ((VexGuestX86State*)0)->guest_EIP ); 608c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj offB_HOST_EvC_COUNTER = offsetof(VexGuestX86State,host_EvC_COUNTER); 609c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj offB_HOST_EvC_FAILADDR = offsetof(VexGuestX86State,host_EvC_FAILADDR); 6109b76916dcc1628e133d57db001563429c6e3a590sewardj vassert(vta->archinfo_guest.endness == VexEndnessLE); 6115074b493ae4af5e6017fac208f823d283c6123c0florian vassert(0 == sizeof(VexGuestX86State) % LibVEX_GUEST_STATE_ALIGN); 61205f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj vassert(sizeof( ((VexGuestX86State*)0)->guest_CMSTART) == 4); 61305f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj vassert(sizeof( ((VexGuestX86State*)0)->guest_CMLEN ) == 4); 614ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj vassert(sizeof( ((VexGuestX86State*)0)->guest_NRADDR ) == 4); 615f13a16a82132fa2358899c7683193effecf9a56fsewardj break; 6162a9ad023890d3b34cf45e429df2a8ae88b419128sewardj 61744d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj case VexArchAMD64: 61812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe preciseMemExnsFn 61912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe = AMD64FN(guest_amd64_state_requires_precise_mem_exns); 62012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disInstrFn = AMD64FN(disInstr_AMD64); 62112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe specHelper = AMD64FN(guest_amd64_spechelper); 622c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj guest_sizeB = sizeof(VexGuestAMD64State); 623c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj guest_word_type = Ity_I64; 62412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe guest_layout = AMD64FN(&amd64guest_layout); 62505f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj offB_CMSTART = offsetof(VexGuestAMD64State,guest_CMSTART); 62605f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj offB_CMLEN = offsetof(VexGuestAMD64State,guest_CMLEN); 627c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj offB_GUEST_IP = offsetof(VexGuestAMD64State,guest_RIP); 628c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj szB_GUEST_IP = sizeof( ((VexGuestAMD64State*)0)->guest_RIP ); 629c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj offB_HOST_EvC_COUNTER = offsetof(VexGuestAMD64State,host_EvC_COUNTER); 630c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj offB_HOST_EvC_FAILADDR = offsetof(VexGuestAMD64State,host_EvC_FAILADDR); 6319b76916dcc1628e133d57db001563429c6e3a590sewardj vassert(vta->archinfo_guest.endness == VexEndnessLE); 6325074b493ae4af5e6017fac208f823d283c6123c0florian vassert(0 == sizeof(VexGuestAMD64State) % LibVEX_GUEST_STATE_ALIGN); 63305f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj vassert(sizeof( ((VexGuestAMD64State*)0)->guest_CMSTART ) == 8); 63405f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj vassert(sizeof( ((VexGuestAMD64State*)0)->guest_CMLEN ) == 8); 635ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj vassert(sizeof( ((VexGuestAMD64State*)0)->guest_NRADDR ) == 8); 63644d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj break; 63744d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj 638aabdfbf4193a965a8c50c643e536129d1d33661bcerion case VexArchPPC32: 63912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe preciseMemExnsFn 64012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe = PPC32FN(guest_ppc32_state_requires_precise_mem_exns); 64112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disInstrFn = PPC32FN(disInstr_PPC); 64212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe specHelper = PPC32FN(guest_ppc32_spechelper); 6433dee849ec7c38746749065e67dc53b75daa7617dsewardj guest_sizeB = sizeof(VexGuestPPC32State); 6443dee849ec7c38746749065e67dc53b75daa7617dsewardj guest_word_type = Ity_I32; 64512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe guest_layout = PPC32FN(&ppc32Guest_layout); 64605f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj offB_CMSTART = offsetof(VexGuestPPC32State,guest_CMSTART); 64705f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj offB_CMLEN = offsetof(VexGuestPPC32State,guest_CMLEN); 6483dee849ec7c38746749065e67dc53b75daa7617dsewardj offB_GUEST_IP = offsetof(VexGuestPPC32State,guest_CIA); 6493dee849ec7c38746749065e67dc53b75daa7617dsewardj szB_GUEST_IP = sizeof( ((VexGuestPPC32State*)0)->guest_CIA ); 6503dee849ec7c38746749065e67dc53b75daa7617dsewardj offB_HOST_EvC_COUNTER = offsetof(VexGuestPPC32State,host_EvC_COUNTER); 6513dee849ec7c38746749065e67dc53b75daa7617dsewardj offB_HOST_EvC_FAILADDR = offsetof(VexGuestPPC32State,host_EvC_FAILADDR); 6529b76916dcc1628e133d57db001563429c6e3a590sewardj vassert(vta->archinfo_guest.endness == VexEndnessBE); 6535074b493ae4af5e6017fac208f823d283c6123c0florian vassert(0 == sizeof(VexGuestPPC32State) % LibVEX_GUEST_STATE_ALIGN); 65405f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj vassert(sizeof( ((VexGuestPPC32State*)0)->guest_CMSTART ) == 4); 65505f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj vassert(sizeof( ((VexGuestPPC32State*)0)->guest_CMLEN ) == 4); 656ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj vassert(sizeof( ((VexGuestPPC32State*)0)->guest_NRADDR ) == 4); 657aabdfbf4193a965a8c50c643e536129d1d33661bcerion break; 658aabdfbf4193a965a8c50c643e536129d1d33661bcerion 659f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion case VexArchPPC64: 66012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe preciseMemExnsFn 66112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe = PPC64FN(guest_ppc64_state_requires_precise_mem_exns); 66212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disInstrFn = PPC64FN(disInstr_PPC); 66312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe specHelper = PPC64FN(guest_ppc64_spechelper); 6649e1cf1522d17dd5ca8a0599168a4d38ead0b71eesewardj guest_sizeB = sizeof(VexGuestPPC64State); 6659e1cf1522d17dd5ca8a0599168a4d38ead0b71eesewardj guest_word_type = Ity_I64; 66612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe guest_layout = PPC64FN(&ppc64Guest_layout); 66705f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj offB_CMSTART = offsetof(VexGuestPPC64State,guest_CMSTART); 66805f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj offB_CMLEN = offsetof(VexGuestPPC64State,guest_CMLEN); 6699e1cf1522d17dd5ca8a0599168a4d38ead0b71eesewardj offB_GUEST_IP = offsetof(VexGuestPPC64State,guest_CIA); 6709e1cf1522d17dd5ca8a0599168a4d38ead0b71eesewardj szB_GUEST_IP = sizeof( ((VexGuestPPC64State*)0)->guest_CIA ); 6719e1cf1522d17dd5ca8a0599168a4d38ead0b71eesewardj offB_HOST_EvC_COUNTER = offsetof(VexGuestPPC64State,host_EvC_COUNTER); 6729e1cf1522d17dd5ca8a0599168a4d38ead0b71eesewardj offB_HOST_EvC_FAILADDR = offsetof(VexGuestPPC64State,host_EvC_FAILADDR); 6731f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll vassert(vta->archinfo_guest.endness == VexEndnessBE || 6741f5fe1fc3a37ca729925e8eec25aa1025b4a6cdbcarll vta->archinfo_guest.endness == VexEndnessLE ); 6755074b493ae4af5e6017fac208f823d283c6123c0florian vassert(0 == sizeof(VexGuestPPC64State) % LibVEX_GUEST_STATE_ALIGN); 67605f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj vassert(sizeof( ((VexGuestPPC64State*)0)->guest_CMSTART ) == 8); 67705f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj vassert(sizeof( ((VexGuestPPC64State*)0)->guest_CMLEN ) == 8); 6783fd3967db856eb90b2030ebeb42b685d45bc3276sewardj vassert(sizeof( ((VexGuestPPC64State*)0)->guest_NRADDR ) == 8); 6793fd3967db856eb90b2030ebeb42b685d45bc3276sewardj vassert(sizeof( ((VexGuestPPC64State*)0)->guest_NRADDR_GPR2) == 8); 680f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion break; 681f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion 6822019a976f07ff418dde2dfc7cc74667ef66d7764sewardj case VexArchS390X: 68312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe preciseMemExnsFn 68412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe = S390FN(guest_s390x_state_requires_precise_mem_exns); 68512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disInstrFn = S390FN(disInstr_S390); 68612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe specHelper = S390FN(guest_s390x_spechelper); 6872019a976f07ff418dde2dfc7cc74667ef66d7764sewardj guest_sizeB = sizeof(VexGuestS390XState); 6882019a976f07ff418dde2dfc7cc74667ef66d7764sewardj guest_word_type = Ity_I64; 68912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe guest_layout = S390FN(&s390xGuest_layout); 69005f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj offB_CMSTART = offsetof(VexGuestS390XState,guest_CMSTART); 69105f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj offB_CMLEN = offsetof(VexGuestS390XState,guest_CMLEN); 6928844a6329d275814456e3a2a5a7bffac75da0957florian offB_GUEST_IP = offsetof(VexGuestS390XState,guest_IA); 6938844a6329d275814456e3a2a5a7bffac75da0957florian szB_GUEST_IP = sizeof( ((VexGuestS390XState*)0)->guest_IA); 6948844a6329d275814456e3a2a5a7bffac75da0957florian offB_HOST_EvC_COUNTER = offsetof(VexGuestS390XState,host_EvC_COUNTER); 6958844a6329d275814456e3a2a5a7bffac75da0957florian offB_HOST_EvC_FAILADDR = offsetof(VexGuestS390XState,host_EvC_FAILADDR); 6969b76916dcc1628e133d57db001563429c6e3a590sewardj vassert(vta->archinfo_guest.endness == VexEndnessBE); 6975074b493ae4af5e6017fac208f823d283c6123c0florian vassert(0 == sizeof(VexGuestS390XState) % LibVEX_GUEST_STATE_ALIGN); 69805f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj vassert(sizeof( ((VexGuestS390XState*)0)->guest_CMSTART ) == 8); 69905f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj vassert(sizeof( ((VexGuestS390XState*)0)->guest_CMLEN ) == 8); 7002019a976f07ff418dde2dfc7cc74667ef66d7764sewardj vassert(sizeof( ((VexGuestS390XState*)0)->guest_NRADDR ) == 8); 7012019a976f07ff418dde2dfc7cc74667ef66d7764sewardj break; 7022019a976f07ff418dde2dfc7cc74667ef66d7764sewardj 7036c299f3acab617581ea504e45fbb6cab24c2b29fsewardj case VexArchARM: 70412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe preciseMemExnsFn 70512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe = ARMFN(guest_arm_state_requires_precise_mem_exns); 70612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disInstrFn = ARMFN(disInstr_ARM); 70712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe specHelper = ARMFN(guest_arm_spechelper); 708c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj guest_sizeB = sizeof(VexGuestARMState); 709c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj guest_word_type = Ity_I32; 71012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe guest_layout = ARMFN(&armGuest_layout); 71105f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj offB_CMSTART = offsetof(VexGuestARMState,guest_CMSTART); 71205f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj offB_CMLEN = offsetof(VexGuestARMState,guest_CMLEN); 713c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj offB_GUEST_IP = offsetof(VexGuestARMState,guest_R15T); 714c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj szB_GUEST_IP = sizeof( ((VexGuestARMState*)0)->guest_R15T ); 715c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj offB_HOST_EvC_COUNTER = offsetof(VexGuestARMState,host_EvC_COUNTER); 716c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj offB_HOST_EvC_FAILADDR = offsetof(VexGuestARMState,host_EvC_FAILADDR); 7179b76916dcc1628e133d57db001563429c6e3a590sewardj vassert(vta->archinfo_guest.endness == VexEndnessLE); 7185074b493ae4af5e6017fac208f823d283c6123c0florian vassert(0 == sizeof(VexGuestARMState) % LibVEX_GUEST_STATE_ALIGN); 71905f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj vassert(sizeof( ((VexGuestARMState*)0)->guest_CMSTART) == 4); 72005f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj vassert(sizeof( ((VexGuestARMState*)0)->guest_CMLEN ) == 4); 7216c299f3acab617581ea504e45fbb6cab24c2b29fsewardj vassert(sizeof( ((VexGuestARMState*)0)->guest_NRADDR ) == 4); 7226c299f3acab617581ea504e45fbb6cab24c2b29fsewardj break; 7236c299f3acab617581ea504e45fbb6cab24c2b29fsewardj 724bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj case VexArchARM64: 72512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe preciseMemExnsFn 72612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe = ARM64FN(guest_arm64_state_requires_precise_mem_exns); 72712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disInstrFn = ARM64FN(disInstr_ARM64); 72812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe specHelper = ARM64FN(guest_arm64_spechelper); 729bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj guest_sizeB = sizeof(VexGuestARM64State); 730bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj guest_word_type = Ity_I64; 73112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe guest_layout = ARM64FN(&arm64Guest_layout); 73205f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj offB_CMSTART = offsetof(VexGuestARM64State,guest_CMSTART); 73305f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj offB_CMLEN = offsetof(VexGuestARM64State,guest_CMLEN); 734bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj offB_GUEST_IP = offsetof(VexGuestARM64State,guest_PC); 735bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj szB_GUEST_IP = sizeof( ((VexGuestARM64State*)0)->guest_PC ); 736bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj offB_HOST_EvC_COUNTER = offsetof(VexGuestARM64State,host_EvC_COUNTER); 737bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj offB_HOST_EvC_FAILADDR = offsetof(VexGuestARM64State,host_EvC_FAILADDR); 7389b76916dcc1628e133d57db001563429c6e3a590sewardj vassert(vta->archinfo_guest.endness == VexEndnessLE); 7395074b493ae4af5e6017fac208f823d283c6123c0florian vassert(0 == sizeof(VexGuestARM64State) % LibVEX_GUEST_STATE_ALIGN); 74005f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj vassert(sizeof( ((VexGuestARM64State*)0)->guest_CMSTART) == 8); 74105f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj vassert(sizeof( ((VexGuestARM64State*)0)->guest_CMLEN ) == 8); 742bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj vassert(sizeof( ((VexGuestARM64State*)0)->guest_NRADDR ) == 8); 743bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj break; 744bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj 745d0e5fe765fb79e5495206f8d0969133178b871f2sewardj case VexArchMIPS32: 74612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe preciseMemExnsFn 74712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe = MIPS32FN(guest_mips32_state_requires_precise_mem_exns); 74812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disInstrFn = MIPS32FN(disInstr_MIPS); 74912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe specHelper = MIPS32FN(guest_mips32_spechelper); 750d0e5fe765fb79e5495206f8d0969133178b871f2sewardj guest_sizeB = sizeof(VexGuestMIPS32State); 751d0e5fe765fb79e5495206f8d0969133178b871f2sewardj guest_word_type = Ity_I32; 75212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe guest_layout = MIPS32FN(&mips32Guest_layout); 75305f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj offB_CMSTART = offsetof(VexGuestMIPS32State,guest_CMSTART); 75405f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj offB_CMLEN = offsetof(VexGuestMIPS32State,guest_CMLEN); 755d0e5fe765fb79e5495206f8d0969133178b871f2sewardj offB_GUEST_IP = offsetof(VexGuestMIPS32State,guest_PC); 756d0e5fe765fb79e5495206f8d0969133178b871f2sewardj szB_GUEST_IP = sizeof( ((VexGuestMIPS32State*)0)->guest_PC ); 757d0e5fe765fb79e5495206f8d0969133178b871f2sewardj offB_HOST_EvC_COUNTER = offsetof(VexGuestMIPS32State,host_EvC_COUNTER); 758d0e5fe765fb79e5495206f8d0969133178b871f2sewardj offB_HOST_EvC_FAILADDR = offsetof(VexGuestMIPS32State,host_EvC_FAILADDR); 7599b76916dcc1628e133d57db001563429c6e3a590sewardj vassert(vta->archinfo_guest.endness == VexEndnessLE 7609b76916dcc1628e133d57db001563429c6e3a590sewardj || vta->archinfo_guest.endness == VexEndnessBE); 7615074b493ae4af5e6017fac208f823d283c6123c0florian vassert(0 == sizeof(VexGuestMIPS32State) % LibVEX_GUEST_STATE_ALIGN); 76205f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj vassert(sizeof( ((VexGuestMIPS32State*)0)->guest_CMSTART) == 4); 76305f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj vassert(sizeof( ((VexGuestMIPS32State*)0)->guest_CMLEN ) == 4); 764d0e5fe765fb79e5495206f8d0969133178b871f2sewardj vassert(sizeof( ((VexGuestMIPS32State*)0)->guest_NRADDR ) == 4); 765d0e5fe765fb79e5495206f8d0969133178b871f2sewardj break; 766d0e5fe765fb79e5495206f8d0969133178b871f2sewardj 767b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj case VexArchMIPS64: 76812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe preciseMemExnsFn 76912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe = MIPS64FN(guest_mips64_state_requires_precise_mem_exns); 77012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disInstrFn = MIPS64FN(disInstr_MIPS); 77112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe specHelper = MIPS64FN(guest_mips64_spechelper); 772b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj guest_sizeB = sizeof(VexGuestMIPS64State); 773b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj guest_word_type = Ity_I64; 77412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe guest_layout = MIPS64FN(&mips64Guest_layout); 77505f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj offB_CMSTART = offsetof(VexGuestMIPS64State,guest_CMSTART); 77605f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj offB_CMLEN = offsetof(VexGuestMIPS64State,guest_CMLEN); 777b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj offB_GUEST_IP = offsetof(VexGuestMIPS64State,guest_PC); 778b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj szB_GUEST_IP = sizeof( ((VexGuestMIPS64State*)0)->guest_PC ); 779b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj offB_HOST_EvC_COUNTER = offsetof(VexGuestMIPS64State,host_EvC_COUNTER); 780b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj offB_HOST_EvC_FAILADDR = offsetof(VexGuestMIPS64State,host_EvC_FAILADDR); 7819b76916dcc1628e133d57db001563429c6e3a590sewardj vassert(vta->archinfo_guest.endness == VexEndnessLE 7829b76916dcc1628e133d57db001563429c6e3a590sewardj || vta->archinfo_guest.endness == VexEndnessBE); 7835074b493ae4af5e6017fac208f823d283c6123c0florian vassert(0 == sizeof(VexGuestMIPS64State) % LibVEX_GUEST_STATE_ALIGN); 78405f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj vassert(sizeof( ((VexGuestMIPS64State*)0)->guest_CMSTART) == 8); 78505f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj vassert(sizeof( ((VexGuestMIPS64State*)0)->guest_CMLEN ) == 8); 786b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj vassert(sizeof( ((VexGuestMIPS64State*)0)->guest_NRADDR ) == 8); 787b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj break; 788b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj 7890de80192f57cd132b31b233c65734de04939ce65sewardj case VexArchTILEGX: 7900de80192f57cd132b31b233c65734de04939ce65sewardj preciseMemExnsFn = 7910de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXFN(guest_tilegx_state_requires_precise_mem_exns); 7920de80192f57cd132b31b233c65734de04939ce65sewardj disInstrFn = TILEGXFN(disInstr_TILEGX); 7930de80192f57cd132b31b233c65734de04939ce65sewardj specHelper = TILEGXFN(guest_tilegx_spechelper); 7940de80192f57cd132b31b233c65734de04939ce65sewardj guest_sizeB = sizeof(VexGuestTILEGXState); 7950de80192f57cd132b31b233c65734de04939ce65sewardj guest_word_type = Ity_I64; 7960de80192f57cd132b31b233c65734de04939ce65sewardj guest_layout = TILEGXFN(&tilegxGuest_layout); 7970de80192f57cd132b31b233c65734de04939ce65sewardj offB_CMSTART = offsetof(VexGuestTILEGXState,guest_CMSTART); 7980de80192f57cd132b31b233c65734de04939ce65sewardj offB_CMLEN = offsetof(VexGuestTILEGXState,guest_CMLEN); 7990de80192f57cd132b31b233c65734de04939ce65sewardj offB_GUEST_IP = offsetof(VexGuestTILEGXState,guest_pc); 8000de80192f57cd132b31b233c65734de04939ce65sewardj szB_GUEST_IP = sizeof( ((VexGuestTILEGXState*)0)->guest_pc ); 8010de80192f57cd132b31b233c65734de04939ce65sewardj offB_HOST_EvC_COUNTER = offsetof(VexGuestTILEGXState,host_EvC_COUNTER); 8020de80192f57cd132b31b233c65734de04939ce65sewardj offB_HOST_EvC_FAILADDR = offsetof(VexGuestTILEGXState,host_EvC_FAILADDR); 8030de80192f57cd132b31b233c65734de04939ce65sewardj vassert(vta->archinfo_guest.endness == VexEndnessLE); 8040de80192f57cd132b31b233c65734de04939ce65sewardj vassert(0 == 80580d145c3b1b74f880ab64415e0c6d0585eb3cadcflorian sizeof(VexGuestTILEGXState) % LibVEX_GUEST_STATE_ALIGN); 8060de80192f57cd132b31b233c65734de04939ce65sewardj vassert(sizeof( ((VexGuestTILEGXState*)0)->guest_CMSTART ) == 8); 8070de80192f57cd132b31b233c65734de04939ce65sewardj vassert(sizeof( ((VexGuestTILEGXState*)0)->guest_CMLEN ) == 8); 8080de80192f57cd132b31b233c65734de04939ce65sewardj vassert(sizeof( ((VexGuestTILEGXState*)0)->guest_NRADDR ) == 8); 8090de80192f57cd132b31b233c65734de04939ce65sewardj break; 8100de80192f57cd132b31b233c65734de04939ce65sewardj 811f13a16a82132fa2358899c7683193effecf9a56fsewardj default: 812887a11a609f3e61d2ae8fe4e67f176207715da7esewardj vpanic("LibVEX_Translate: unsupported guest insn set"); 813f13a16a82132fa2358899c7683193effecf9a56fsewardj } 814f13a16a82132fa2358899c7683193effecf9a56fsewardj 815f3652c97c20265d3410ea75d9817e8323b6df5c8florian // Are the guest's hardware capabilities feasible. The function will 816f3652c97c20265d3410ea75d9817e8323b6df5c8florian // not return if hwcaps are infeasible in some sense. 817f3652c97c20265d3410ea75d9817e8323b6df5c8florian // FIXME: how can we know the guest's hardware capabilities? 818f3652c97c20265d3410ea75d9817e8323b6df5c8florian check_hwcaps(vta->arch_guest, vta->archinfo_guest.hwcaps); 819f3652c97c20265d3410ea75d9817e8323b6df5c8florian 820bc161a407b3cbd722821812afb8fb47420ae538fsewardj /* Set up result struct. */ 821bc161a407b3cbd722821812afb8fb47420ae538fsewardj VexTranslateResult res; 822fadbbe2870ffba4e4565563f21fc20b9ab89fd8fsewardj res.status = VexTransOK; 823fadbbe2870ffba4e4565563f21fc20b9ab89fd8fsewardj res.n_sc_extents = 0; 824fadbbe2870ffba4e4565563f21fc20b9ab89fd8fsewardj res.offs_profInc = -1; 825fadbbe2870ffba4e4565563f21fc20b9ab89fd8fsewardj res.n_guest_instrs = 0; 826bc161a407b3cbd722821812afb8fb47420ae538fsewardj 8279df271d97c0f79a58a8eabdcfbe6f8bf4d17876asewardj /* yet more sanity checks ... */ 82817c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj if (vta->arch_guest == vta->arch_host) { 8299df271d97c0f79a58a8eabdcfbe6f8bf4d17876asewardj /* doesn't necessarily have to be true, but if it isn't it means 8300ec57c595719a395e71b48792a4d62c5b896b6d3sewardj we are simulating one flavour of an architecture a different 8310ec57c595719a395e71b48792a4d62c5b896b6d3sewardj flavour of the same architecture, which is pretty strange. */ 8325117ce116f47141cb23d1b49cc826e19323add97sewardj vassert(vta->archinfo_guest.hwcaps == vta->archinfo_host.hwcaps); 8339b76916dcc1628e133d57db001563429c6e3a590sewardj /* ditto */ 8349b76916dcc1628e133d57db001563429c6e3a590sewardj vassert(vta->archinfo_guest.endness == vta->archinfo_host.endness); 8359df271d97c0f79a58a8eabdcfbe6f8bf4d17876asewardj } 8362a9ad023890d3b34cf45e429df2a8ae88b419128sewardj 8372d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexAllocSanityCheck(); 8382d6b14aa64df2ff85f8da143516779d5d43574cbsewardj 839f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj if (vex_traceflags & VEX_TRACE_FE) 840f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_printf("\n------------------------" 841f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj " Front end " 842f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj "------------------------\n\n"); 843f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj 844ca2c3c75784d35d136fc7c952717cdee5063c193sewardj VexRegisterUpdates pxControl = vex_control.iropt_register_updates_default; 845ca2c3c75784d35d136fc7c952717cdee5063c193sewardj vassert(pxControl >= VexRegUpdSpAtMemAccess 846ca2c3c75784d35d136fc7c952717cdee5063c193sewardj && pxControl <= VexRegUpdAllregsAtEachInsn); 847ca2c3c75784d35d136fc7c952717cdee5063c193sewardj 848dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj irsb = bb_to_IR ( vta->guest_extents, 849bc161a407b3cbd722821812afb8fb47420ae538fsewardj &res.n_sc_extents, 850fadbbe2870ffba4e4565563f21fc20b9ab89fd8fsewardj &res.n_guest_instrs, 851ca2c3c75784d35d136fc7c952717cdee5063c193sewardj &pxControl, 852c716aea1cafe66ee431dc7d6909c98f18788a028sewardj vta->callback_opaque, 8539e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj disInstrFn, 85417c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vta->guest_bytes, 85517c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vta->guest_bytes_addr, 85617c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vta->chase_into_ok, 8579b76916dcc1628e133d57db001563429c6e3a590sewardj vta->archinfo_host.endness, 858442e51a26cf3bc7f243167a4ff3fbfb02206f6e6sewardj vta->sigill_diag, 859a5f55da7e956978fddad927436da5fab9568f3f1sewardj vta->arch_guest, 86017c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj &vta->archinfo_guest, 861dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj &vta->abiinfo_both, 862db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj guest_word_type, 863bc161a407b3cbd722821812afb8fb47420ae538fsewardj vta->needs_self_check, 864c716aea1cafe66ee431dc7d6909c98f18788a028sewardj vta->preamble_function, 86505f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj offB_CMSTART, 86605f5e0172384dd2983fb16fbb7deebd74d71cd35sewardj offB_CMLEN, 867c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj offB_GUEST_IP, 868c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj szB_GUEST_IP ); 869f13a16a82132fa2358899c7683193effecf9a56fsewardj 8702d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexAllocSanityCheck(); 8712d6b14aa64df2ff85f8da143516779d5d43574cbsewardj 872dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj if (irsb == NULL) { 873f13a16a82132fa2358899c7683193effecf9a56fsewardj /* Access failure. */ 8742d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexSetAllocModeTEMP_and_clear(); 875f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_traceflags = 0; 876bc161a407b3cbd722821812afb8fb47420ae538fsewardj res.status = VexTransAccessFail; return res; 877f13a16a82132fa2358899c7683193effecf9a56fsewardj } 878aa59f942f729b5c98703d84321265313daeb32b8sewardj 87917c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vassert(vta->guest_extents->n_used >= 1 && vta->guest_extents->n_used <= 3); 88017c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vassert(vta->guest_extents->base[0] == vta->guest_bytes_addr); 88117c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj for (i = 0; i < vta->guest_extents->n_used; i++) { 88217c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vassert(vta->guest_extents->len[i] < 10000); /* sanity */ 88372c72814ab82c51d8ee8accad1a00f2d37942545sewardj } 88472c72814ab82c51d8ee8accad1a00f2d37942545sewardj 885ca2c3c75784d35d136fc7c952717cdee5063c193sewardj /* bb_to_IR() could have caused pxControl to change. */ 886ca2c3c75784d35d136fc7c952717cdee5063c193sewardj vassert(pxControl >= VexRegUpdSpAtMemAccess 887ca2c3c75784d35d136fc7c952717cdee5063c193sewardj && pxControl <= VexRegUpdAllregsAtEachInsn); 888ca2c3c75784d35d136fc7c952717cdee5063c193sewardj 889aa59f942f729b5c98703d84321265313daeb32b8sewardj /* If debugging, show the raw guest bytes for this bb. */ 890109ffdbb31ff652ae83d0ad400966f68c46cd4f1sewardj if (0 || (vex_traceflags & VEX_TRACE_FE)) { 89117c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj if (vta->guest_extents->n_used > 1) { 89272c72814ab82c51d8ee8accad1a00f2d37942545sewardj vex_printf("can't show code due to extents > 1\n"); 89372c72814ab82c51d8ee8accad1a00f2d37942545sewardj } else { 89472c72814ab82c51d8ee8accad1a00f2d37942545sewardj /* HACK */ 8958462d113e3efeacceb304222dada8d85f748295aflorian const UChar* p = vta->guest_bytes; 89601f8cce97179cf4363240784a26adde19287a3a6sewardj UInt sum = 0; 89717c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj UInt guest_bytes_read = (UInt)vta->guest_extents->len[0]; 898d4cc0deec55ec0be1f2ac3b20f0d340265341f83florian vex_printf("GuestBytes %lx %u ", vta->guest_bytes_addr, 899d4cc0deec55ec0be1f2ac3b20f0d340265341f83florian guest_bytes_read ); 90001f8cce97179cf4363240784a26adde19287a3a6sewardj for (i = 0; i < guest_bytes_read; i++) { 90101f8cce97179cf4363240784a26adde19287a3a6sewardj UInt b = (UInt)p[i]; 90201f8cce97179cf4363240784a26adde19287a3a6sewardj vex_printf(" %02x", b ); 90301f8cce97179cf4363240784a26adde19287a3a6sewardj sum = (sum << 1) ^ b; 90401f8cce97179cf4363240784a26adde19287a3a6sewardj } 90501f8cce97179cf4363240784a26adde19287a3a6sewardj vex_printf(" %08x\n\n", sum); 90672c72814ab82c51d8ee8accad1a00f2d37942545sewardj } 907aa59f942f729b5c98703d84321265313daeb32b8sewardj } 908aa59f942f729b5c98703d84321265313daeb32b8sewardj 909aa59f942f729b5c98703d84321265313daeb32b8sewardj /* Sanity check the initial IR. */ 910dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj sanityCheckIRSB( irsb, "initial IR", 911b92307503d4fb9265136e182d10c42ebb9dd8272sewardj False/*can be non-flat*/, guest_word_type ); 912e8e9d73817f92d295f45b1c6c823c613bc2e90aesewardj 9132d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexAllocSanityCheck(); 9142d6b14aa64df2ff85f8da143516779d5d43574cbsewardj 915edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj /* Clean it up, hopefully a lot. */ 916ca2c3c75784d35d136fc7c952717cdee5063c193sewardj irsb = do_iropt_BB ( irsb, specHelper, preciseMemExnsFn, pxControl, 917ec0d9a028955060c5216341c6fc37400ec0cb4besewardj vta->guest_bytes_addr, 918ec0d9a028955060c5216341c6fc37400ec0cb4besewardj vta->arch_guest ); 919dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj sanityCheckIRSB( irsb, "after initial iropt", 920b92307503d4fb9265136e182d10c42ebb9dd8272sewardj True/*must be flat*/, guest_word_type ); 921edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj 922f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj if (vex_traceflags & VEX_TRACE_OPT1) { 923f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_printf("\n------------------------" 924f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj " After pre-instr IR optimisation " 925f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj "------------------------\n\n"); 926dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj ppIRSB ( irsb ); 927edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj vex_printf("\n"); 928edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj } 929edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj 9302d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexAllocSanityCheck(); 9312d6b14aa64df2ff85f8da143516779d5d43574cbsewardj 932f13a16a82132fa2358899c7683193effecf9a56fsewardj /* Get the thing instrumented. */ 93317c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj if (vta->instrument1) 934dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj irsb = vta->instrument1(vta->callback_opaque, 935dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj irsb, guest_layout, 93617c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vta->guest_extents, 93750481921c3c61054b5629c4dcebf5ec680dbf6e9florian &vta->archinfo_host, 93817c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj guest_word_type, host_word_type); 9392d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexAllocSanityCheck(); 9402d6b14aa64df2ff85f8da143516779d5d43574cbsewardj 94117c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj if (vta->instrument2) 942dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj irsb = vta->instrument2(vta->callback_opaque, 943dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj irsb, guest_layout, 94417c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj vta->guest_extents, 94550481921c3c61054b5629c4dcebf5ec680dbf6e9florian &vta->archinfo_host, 94617c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj guest_word_type, host_word_type); 94749651f4b59b1ab7e0e70cccd34001630eafbe957sewardj 948f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj if (vex_traceflags & VEX_TRACE_INST) { 949f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_printf("\n------------------------" 950f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj " After instrumentation " 951f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj "------------------------\n\n"); 952dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj ppIRSB ( irsb ); 953f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_printf("\n"); 954f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj } 955f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj 95617c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj if (vta->instrument1 || vta->instrument2) 957dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj sanityCheckIRSB( irsb, "after instrumentation", 958b92307503d4fb9265136e182d10c42ebb9dd8272sewardj True/*must be flat*/, guest_word_type ); 959f13a16a82132fa2358899c7683193effecf9a56fsewardj 9609578a8bf6159d81eeadeb771c3214109cfee3715sewardj /* Do a post-instrumentation cleanup pass. */ 96117c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj if (vta->instrument1 || vta->instrument2) { 962dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj do_deadcode_BB( irsb ); 963dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj irsb = cprop_BB( irsb ); 964dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj do_deadcode_BB( irsb ); 965dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj sanityCheckIRSB( irsb, "after post-instrumentation cleanup", 966b92307503d4fb9265136e182d10c42ebb9dd8272sewardj True/*must be flat*/, guest_word_type ); 9679578a8bf6159d81eeadeb771c3214109cfee3715sewardj } 9689578a8bf6159d81eeadeb771c3214109cfee3715sewardj 9692d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexAllocSanityCheck(); 9702d6b14aa64df2ff85f8da143516779d5d43574cbsewardj 9719578a8bf6159d81eeadeb771c3214109cfee3715sewardj if (vex_traceflags & VEX_TRACE_OPT2) { 9729578a8bf6159d81eeadeb771c3214109cfee3715sewardj vex_printf("\n------------------------" 9739578a8bf6159d81eeadeb771c3214109cfee3715sewardj " After post-instr IR optimisation " 9749578a8bf6159d81eeadeb771c3214109cfee3715sewardj "------------------------\n\n"); 975dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj ppIRSB ( irsb ); 9769578a8bf6159d81eeadeb771c3214109cfee3715sewardj vex_printf("\n"); 9779578a8bf6159d81eeadeb771c3214109cfee3715sewardj } 9789578a8bf6159d81eeadeb771c3214109cfee3715sewardj 979f9517d0d452899780e8c34f02bef004ef7c5a163sewardj /* Turn it into virtual-registerised code. Build trees -- this 980f9517d0d452899780e8c34f02bef004ef7c5a163sewardj also throws away any dead bindings. */ 981ca2c3c75784d35d136fc7c952717cdee5063c193sewardj max_ga = ado_treebuild_BB( irsb, preciseMemExnsFn, pxControl ); 982f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj 983be1b6ff6cdb576c59734762fb778ae48eb8e7a10sewardj if (vta->finaltidy) { 984be1b6ff6cdb576c59734762fb778ae48eb8e7a10sewardj irsb = vta->finaltidy(irsb); 985be1b6ff6cdb576c59734762fb778ae48eb8e7a10sewardj } 986be1b6ff6cdb576c59734762fb778ae48eb8e7a10sewardj 9872d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexAllocSanityCheck(); 9882d6b14aa64df2ff85f8da143516779d5d43574cbsewardj 989f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj if (vex_traceflags & VEX_TRACE_TREES) { 990f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_printf("\n------------------------" 991f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj " After tree-building " 992f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj "------------------------\n\n"); 993dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj ppIRSB ( irsb ); 994f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_printf("\n"); 995f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj } 996f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj 997e908c426bc9991611a1731ee881208d148e913fbsewardj /* HACK */ 998bc161a407b3cbd722821812afb8fb47420ae538fsewardj if (0) { 999bc161a407b3cbd722821812afb8fb47420ae538fsewardj *(vta->host_bytes_used) = 0; 1000bc161a407b3cbd722821812afb8fb47420ae538fsewardj res.status = VexTransOK; return res; 1001bc161a407b3cbd722821812afb8fb47420ae538fsewardj } 1002e908c426bc9991611a1731ee881208d148e913fbsewardj /* end HACK */ 1003c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj 1004f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj if (vex_traceflags & VEX_TRACE_VCODE) 1005f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_printf("\n------------------------" 1006f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj " Instruction selection " 1007f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj "------------------------\n"); 1008f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj 1009c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj /* No guest has its IP field at offset zero. If this fails it 1010c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj means some transformation pass somewhere failed to update/copy 1011c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj irsb->offsIP properly. */ 1012c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj vassert(irsb->offsIP >= 16); 1013c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj 1014c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj vcode = iselSB ( irsb, vta->arch_host, 1015c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj &vta->archinfo_host, 1016c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj &vta->abiinfo_both, 1017c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj offB_HOST_EvC_COUNTER, 1018c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj offB_HOST_EvC_FAILADDR, 1019c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj chainingAllowed, 1020c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj vta->addProfInc, 1021c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj max_ga ); 1022f13a16a82132fa2358899c7683193effecf9a56fsewardj 10232d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexAllocSanityCheck(); 10242d6b14aa64df2ff85f8da143516779d5d43574cbsewardj 1025f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj if (vex_traceflags & VEX_TRACE_VCODE) 1026f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_printf("\n"); 1027f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj 1028f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj if (vex_traceflags & VEX_TRACE_VCODE) { 10291f40a0a104034009e253675288ebefdcccf30da8sewardj for (i = 0; i < vcode->arr_used; i++) { 10301f40a0a104034009e253675288ebefdcccf30da8sewardj vex_printf("%3d ", i); 103192b643609c5fa432b11fc726c2706ae3f3296eb4cerion ppInstr(vcode->arr[i], mode64); 10321f40a0a104034009e253675288ebefdcccf30da8sewardj vex_printf("\n"); 10331f40a0a104034009e253675288ebefdcccf30da8sewardj } 1034fbcaf3312f39fb73d54821636c6168db76245f61sewardj vex_printf("\n"); 1035fbcaf3312f39fb73d54821636c6168db76245f61sewardj } 1036fbcaf3312f39fb73d54821636c6168db76245f61sewardj 1037f13a16a82132fa2358899c7683193effecf9a56fsewardj /* Register allocate. */ 1038a5b502299bfc9d97f4c2c9f61cdc1a0a65e1da61sewardj rcode = doRegisterAllocation ( vcode, rRegUniv, 103972c72814ab82c51d8ee8accad1a00f2d37942545sewardj isMove, getRegUsage, mapRegs, 1040fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj genSpill, genReload, directReload, 1041fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj guest_sizeB, 104292b643609c5fa432b11fc726c2706ae3f3296eb4cerion ppInstr, ppReg, mode64 ); 1043f13a16a82132fa2358899c7683193effecf9a56fsewardj 10442d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexAllocSanityCheck(); 10452d6b14aa64df2ff85f8da143516779d5d43574cbsewardj 1046f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj if (vex_traceflags & VEX_TRACE_RCODE) { 1047f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_printf("\n------------------------" 1048f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj " Register-allocated code " 1049f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj "------------------------\n\n"); 10501f40a0a104034009e253675288ebefdcccf30da8sewardj for (i = 0; i < rcode->arr_used; i++) { 10511f40a0a104034009e253675288ebefdcccf30da8sewardj vex_printf("%3d ", i); 105292b643609c5fa432b11fc726c2706ae3f3296eb4cerion ppInstr(rcode->arr[i], mode64); 10531f40a0a104034009e253675288ebefdcccf30da8sewardj vex_printf("\n"); 10541f40a0a104034009e253675288ebefdcccf30da8sewardj } 1055fbcaf3312f39fb73d54821636c6168db76245f61sewardj vex_printf("\n"); 1056fbcaf3312f39fb73d54821636c6168db76245f61sewardj } 1057fbcaf3312f39fb73d54821636c6168db76245f61sewardj 1058e908c426bc9991611a1731ee881208d148e913fbsewardj /* HACK */ 1059bc161a407b3cbd722821812afb8fb47420ae538fsewardj if (0) { 1060bc161a407b3cbd722821812afb8fb47420ae538fsewardj *(vta->host_bytes_used) = 0; 1061bc161a407b3cbd722821812afb8fb47420ae538fsewardj res.status = VexTransOK; return res; 1062bc161a407b3cbd722821812afb8fb47420ae538fsewardj } 1063e908c426bc9991611a1731ee881208d148e913fbsewardj /* end HACK */ 1064e908c426bc9991611a1731ee881208d148e913fbsewardj 106581bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj /* Assemble */ 1066f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj if (vex_traceflags & VEX_TRACE_ASM) { 1067f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_printf("\n------------------------" 1068f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj " Assembly " 1069f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj "------------------------\n\n"); 1070f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj } 1071f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj 107281bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj out_used = 0; /* tracks along the host_bytes array */ 107381bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj for (i = 0; i < rcode->arr_used; i++) { 1074c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj HInstr* hi = rcode->arr[i]; 1075c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj Bool hi_isProfInc = False; 1076c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) { 1077c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj ppInstr(hi, mode64); 1078bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj vex_printf("\n"); 1079bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj } 1080c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj j = emit( &hi_isProfInc, 10819b76916dcc1628e133d57db001563429c6e3a590sewardj insn_bytes, sizeof insn_bytes, hi, 10829b76916dcc1628e133d57db001563429c6e3a590sewardj mode64, vta->archinfo_host.endness, 1083c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj vta->disp_cp_chain_me_to_slowEP, 1084c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj vta->disp_cp_chain_me_to_fastEP, 1085c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj vta->disp_cp_xindir, 1086c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj vta->disp_cp_xassisted ); 1087c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj if (UNLIKELY(vex_traceflags & VEX_TRACE_ASM)) { 1088bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj for (k = 0; k < j; k++) 1089e554042a0d0211287313a7d20a66baf7f6d1c9a8florian vex_printf("%02x ", (UInt)insn_bytes[k]); 1090bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj vex_printf("\n\n"); 1091bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj } 1092c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj if (UNLIKELY(out_used + j > vta->host_bytes_size)) { 10932d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexSetAllocModeTEMP_and_clear(); 1094f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_traceflags = 0; 1095bc161a407b3cbd722821812afb8fb47420ae538fsewardj res.status = VexTransOutputFull; 1096bc161a407b3cbd722821812afb8fb47420ae538fsewardj return res; 109781bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj } 1098c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj if (UNLIKELY(hi_isProfInc)) { 1099c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj vassert(vta->addProfInc); /* else where did it come from? */ 1100c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj vassert(res.offs_profInc == -1); /* there can be only one (tm) */ 1101c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj vassert(out_used >= 0); 1102c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj res.offs_profInc = out_used; 1103c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj } 1104c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj { UChar* dst = &vta->host_bytes[out_used]; 1105c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj for (k = 0; k < j; k++) { 1106c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj dst[k] = insn_bytes[k]; 1107c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj } 1108c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj out_used += j; 110981bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj } 111081bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj } 111117c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj *(vta->host_bytes_used) = out_used; 111281bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj 11132d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexAllocSanityCheck(); 11142d6b14aa64df2ff85f8da143516779d5d43574cbsewardj 11152d6b14aa64df2ff85f8da143516779d5d43574cbsewardj vexSetAllocModeTEMP_and_clear(); 1116f13a16a82132fa2358899c7683193effecf9a56fsewardj 111765ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj if (vex_traceflags) { 111865ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj /* Print the expansion ratio for this SB. */ 111965ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj j = 0; /* total guest bytes */ 112065ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj for (i = 0; i < vta->guest_extents->n_used; i++) { 112165ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj j += vta->guest_extents->len[i]; 112265ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj } 112365ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj if (1) vex_printf("VexExpansionRatio %d %d %d :10\n\n", 112465ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj j, out_used, (10 * out_used) / (j == 0 ? 1 : j)); 112565ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj } 112665ea17e33e244e3615a6e0d9c9a388a12d758f06sewardj 1127f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj vex_traceflags = 0; 1128bc161a407b3cbd722821812afb8fb47420ae538fsewardj res.status = VexTransOK; 1129bc161a407b3cbd722821812afb8fb47420ae538fsewardj return res; 113035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj} 113135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 113235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 1133c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj/* --------- Chain/Unchain XDirects. --------- */ 1134c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj 11357d6f81de12e6d8deb3e119ab318f361d97a10a65florianVexInvalRange LibVEX_Chain ( VexArch arch_host, 11367d6f81de12e6d8deb3e119ab318f361d97a10a65florian VexEndness endness_host, 11377d6f81de12e6d8deb3e119ab318f361d97a10a65florian void* place_to_chain, 11387d6f81de12e6d8deb3e119ab318f361d97a10a65florian const void* disp_cp_chain_me_EXPECTED, 11397d6f81de12e6d8deb3e119ab318f361d97a10a65florian const void* place_to_jump_to ) 1140c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj{ 1141c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj switch (arch_host) { 1142c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj case VexArchX86: 114312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe X86ST(return chainXDirect_X86(endness_host, 114412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_chain, 114512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disp_cp_chain_me_EXPECTED, 114612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_jump_to)); 1147c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj case VexArchAMD64: 114812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe AMD64ST(return chainXDirect_AMD64(endness_host, 114912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_chain, 115012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disp_cp_chain_me_EXPECTED, 115112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_jump_to)); 1152c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj case VexArchARM: 115312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ARMST(return chainXDirect_ARM(endness_host, 115412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_chain, 115512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disp_cp_chain_me_EXPECTED, 115612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_jump_to)); 1157bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj case VexArchARM64: 115812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ARM64ST(return chainXDirect_ARM64(endness_host, 115912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_chain, 116012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disp_cp_chain_me_EXPECTED, 116112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_jump_to)); 11628844a6329d275814456e3a2a5a7bffac75da0957florian case VexArchS390X: 116312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe S390ST(return chainXDirect_S390(endness_host, 116412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_chain, 116512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disp_cp_chain_me_EXPECTED, 116612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_jump_to)); 11673dee849ec7c38746749065e67dc53b75daa7617dsewardj case VexArchPPC32: 116812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe PPC32ST(return chainXDirect_PPC(endness_host, 116912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_chain, 117012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disp_cp_chain_me_EXPECTED, 117112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_jump_to, False/*!mode64*/)); 1172f252de5ec83a5cc72f96fe4decf662cfbb28df8bsewardj case VexArchPPC64: 117312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe PPC64ST(return chainXDirect_PPC(endness_host, 117412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_chain, 117512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disp_cp_chain_me_EXPECTED, 117612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_jump_to, True/*mode64*/)); 1177d0e5fe765fb79e5495206f8d0969133178b871f2sewardj case VexArchMIPS32: 117812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe MIPS32ST(return chainXDirect_MIPS(endness_host, 117912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_chain, 118012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disp_cp_chain_me_EXPECTED, 118112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_jump_to, False/*!mode64*/)); 1182b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj case VexArchMIPS64: 118312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe MIPS64ST(return chainXDirect_MIPS(endness_host, 118412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_chain, 118512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disp_cp_chain_me_EXPECTED, 118612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_jump_to, True/*!mode64*/)); 11870de80192f57cd132b31b233c65734de04939ce65sewardj 11880de80192f57cd132b31b233c65734de04939ce65sewardj case VexArchTILEGX: 11890de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXST(return chainXDirect_TILEGX(endness_host, 11900de80192f57cd132b31b233c65734de04939ce65sewardj place_to_chain, 11910de80192f57cd132b31b233c65734de04939ce65sewardj disp_cp_chain_me_EXPECTED, 11920de80192f57cd132b31b233c65734de04939ce65sewardj place_to_jump_to, True/*!mode64*/)); 1193c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj default: 1194c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj vassert(0); 1195c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj } 1196c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj} 1197c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj 11987d6f81de12e6d8deb3e119ab318f361d97a10a65florianVexInvalRange LibVEX_UnChain ( VexArch arch_host, 11997d6f81de12e6d8deb3e119ab318f361d97a10a65florian VexEndness endness_host, 12007d6f81de12e6d8deb3e119ab318f361d97a10a65florian void* place_to_unchain, 12017d6f81de12e6d8deb3e119ab318f361d97a10a65florian const void* place_to_jump_to_EXPECTED, 12027d6f81de12e6d8deb3e119ab318f361d97a10a65florian const void* disp_cp_chain_me ) 1203c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj{ 1204c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj switch (arch_host) { 1205c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj case VexArchX86: 120612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe X86ST(return unchainXDirect_X86(endness_host, 120712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_unchain, 120812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_jump_to_EXPECTED, 120912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disp_cp_chain_me)); 1210c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj case VexArchAMD64: 121112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe AMD64ST(return unchainXDirect_AMD64(endness_host, 121212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_unchain, 121312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_jump_to_EXPECTED, 121412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disp_cp_chain_me)); 1215c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj case VexArchARM: 121612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ARMST(return unchainXDirect_ARM(endness_host, 121712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_unchain, 121812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_jump_to_EXPECTED, 121912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disp_cp_chain_me)); 1220c6acaa420e6f1c60e1d46f52c1e9b79c0490ce09sewardj case VexArchARM64: 122112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ARM64ST(return unchainXDirect_ARM64(endness_host, 122212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_unchain, 122312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_jump_to_EXPECTED, 122412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disp_cp_chain_me)); 12258844a6329d275814456e3a2a5a7bffac75da0957florian case VexArchS390X: 122612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe S390ST(return unchainXDirect_S390(endness_host, 122712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_unchain, 122812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_jump_to_EXPECTED, 122912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disp_cp_chain_me)); 12303dee849ec7c38746749065e67dc53b75daa7617dsewardj case VexArchPPC32: 123112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe PPC32ST(return unchainXDirect_PPC(endness_host, 123212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_unchain, 123312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_jump_to_EXPECTED, 123412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disp_cp_chain_me, False/*!mode64*/)); 1235f252de5ec83a5cc72f96fe4decf662cfbb28df8bsewardj case VexArchPPC64: 123612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe PPC64ST(return unchainXDirect_PPC(endness_host, 123712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_unchain, 123812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_jump_to_EXPECTED, 123912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disp_cp_chain_me, True/*mode64*/)); 1240d0e5fe765fb79e5495206f8d0969133178b871f2sewardj case VexArchMIPS32: 124112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe MIPS32ST(return unchainXDirect_MIPS(endness_host, 124212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_unchain, 124312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_jump_to_EXPECTED, 124412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disp_cp_chain_me, False/*!mode64*/)); 1245b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj case VexArchMIPS64: 124612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe MIPS64ST(return unchainXDirect_MIPS(endness_host, 124712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_unchain, 124812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe place_to_jump_to_EXPECTED, 124912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe disp_cp_chain_me, True/*!mode64*/)); 12500de80192f57cd132b31b233c65734de04939ce65sewardj 12510de80192f57cd132b31b233c65734de04939ce65sewardj case VexArchTILEGX: 12520de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXST(return unchainXDirect_TILEGX(endness_host, 12530de80192f57cd132b31b233c65734de04939ce65sewardj place_to_unchain, 12540de80192f57cd132b31b233c65734de04939ce65sewardj place_to_jump_to_EXPECTED, 12550de80192f57cd132b31b233c65734de04939ce65sewardj disp_cp_chain_me, True/*!mode64*/)); 12560de80192f57cd132b31b233c65734de04939ce65sewardj 1257c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj default: 1258c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj vassert(0); 1259c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj } 1260c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj} 1261c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj 12627ce2cc883c5b36586babec833838951ecf9f2a76florianInt LibVEX_evCheckSzB ( VexArch arch_host ) 1263c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj{ 1264c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj static Int cached = 0; /* DO NOT MAKE NON-STATIC */ 1265c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj if (UNLIKELY(cached == 0)) { 1266c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj switch (arch_host) { 1267c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj case VexArchX86: 126812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe X86ST(cached = evCheckSzB_X86()); break; 1269c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj case VexArchAMD64: 127012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe AMD64ST(cached = evCheckSzB_AMD64()); break; 1271c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj case VexArchARM: 127212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ARMST(cached = evCheckSzB_ARM()); break; 1273bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj case VexArchARM64: 127412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ARM64ST(cached = evCheckSzB_ARM64()); break; 12758844a6329d275814456e3a2a5a7bffac75da0957florian case VexArchS390X: 127612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe S390ST(cached = evCheckSzB_S390()); break; 12773dee849ec7c38746749065e67dc53b75daa7617dsewardj case VexArchPPC32: 127812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe PPC32ST(cached = evCheckSzB_PPC()); break; 1279f252de5ec83a5cc72f96fe4decf662cfbb28df8bsewardj case VexArchPPC64: 128012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe PPC64ST(cached = evCheckSzB_PPC()); break; 1281d0e5fe765fb79e5495206f8d0969133178b871f2sewardj case VexArchMIPS32: 128212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe MIPS32ST(cached = evCheckSzB_MIPS()); break; 1283b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj case VexArchMIPS64: 128412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe MIPS64ST(cached = evCheckSzB_MIPS()); break; 12850de80192f57cd132b31b233c65734de04939ce65sewardj case VexArchTILEGX: 12860de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXST(cached = evCheckSzB_TILEGX()); break; 1287c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj default: 1288c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj vassert(0); 1289c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj } 1290c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj } 1291c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj return cached; 1292c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj} 1293c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj 12949b76916dcc1628e133d57db001563429c6e3a590sewardjVexInvalRange LibVEX_PatchProfInc ( VexArch arch_host, 12959b76916dcc1628e133d57db001563429c6e3a590sewardj VexEndness endness_host, 12969b76916dcc1628e133d57db001563429c6e3a590sewardj void* place_to_patch, 12977d6f81de12e6d8deb3e119ab318f361d97a10a65florian const ULong* location_of_counter ) 1298c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj{ 1299c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj switch (arch_host) { 1300c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj case VexArchX86: 130112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe X86ST(return patchProfInc_X86(endness_host, place_to_patch, 130212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe location_of_counter)); 1303c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj case VexArchAMD64: 130412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe AMD64ST(return patchProfInc_AMD64(endness_host, place_to_patch, 130512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe location_of_counter)); 1306c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj case VexArchARM: 130712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ARMST(return patchProfInc_ARM(endness_host, place_to_patch, 130812b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe location_of_counter)); 13090ad37a9e5936c15460f067bee8948b900cdab036sewardj case VexArchARM64: 131012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe ARM64ST(return patchProfInc_ARM64(endness_host, place_to_patch, 131112b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe location_of_counter)); 13128844a6329d275814456e3a2a5a7bffac75da0957florian case VexArchS390X: 131312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe S390ST(return patchProfInc_S390(endness_host, place_to_patch, 131412b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe location_of_counter)); 13153dee849ec7c38746749065e67dc53b75daa7617dsewardj case VexArchPPC32: 131612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe PPC32ST(return patchProfInc_PPC(endness_host, place_to_patch, 131712b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe location_of_counter, False/*!mode64*/)); 1318f252de5ec83a5cc72f96fe4decf662cfbb28df8bsewardj case VexArchPPC64: 131912b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe PPC64ST(return patchProfInc_PPC(endness_host, place_to_patch, 132012b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe location_of_counter, True/*mode64*/)); 1321d0e5fe765fb79e5495206f8d0969133178b871f2sewardj case VexArchMIPS32: 132212b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe MIPS32ST(return patchProfInc_MIPS(endness_host, place_to_patch, 132312b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe location_of_counter, False/*!mode64*/)); 1324b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj case VexArchMIPS64: 132512b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe MIPS64ST(return patchProfInc_MIPS(endness_host, place_to_patch, 132612b2b5b44516d8b77a308e7ac258a16ec1c9c959philippe location_of_counter, True/*!mode64*/)); 13270de80192f57cd132b31b233c65734de04939ce65sewardj case VexArchTILEGX: 13280de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXST(return patchProfInc_TILEGX(endness_host, place_to_patch, 13290de80192f57cd132b31b233c65734de04939ce65sewardj location_of_counter, 13300de80192f57cd132b31b233c65734de04939ce65sewardj True/*!mode64*/)); 1331c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj default: 1332c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj vassert(0); 1333c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj } 1334c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj} 1335c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj 1336c6f970f1fadb640d69c78ac2669efab5c08f1e8dsewardj 1337893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj/* --------- Emulation warnings. --------- */ 1338893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj 13391ff4756e1731485e6bf3cd96717cd8398daec1f2florianconst HChar* LibVEX_EmNote_string ( VexEmNote ew ) 1340893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj{ 1341893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj switch (ew) { 13426ef84bed9bb3af22060eb1759788034602bbcc88florian case EmNote_NONE: 1343893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj return "none"; 1344893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj case EmWarn_X86_x87exns: 1345893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj return "Unmasking x87 FP exceptions"; 1346893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj case EmWarn_X86_x87precision: 1347893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj return "Selection of non-80-bit x87 FP precision"; 1348893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj case EmWarn_X86_sseExns: 13495edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj return "Unmasking SSE FP exceptions"; 13505edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj case EmWarn_X86_fz: 13515edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj return "Setting %mxcsr.fz (SSE flush-underflows-to-zero mode)"; 13525edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj case EmWarn_X86_daz: 13535edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj return "Setting %mxcsr.daz (SSE treat-denormals-as-zero mode)"; 13546d26984a0df6a7d20b658bac6edf869eb872cca3sewardj case EmWarn_X86_acFlag: 13556d26984a0df6a7d20b658bac6edf869eb872cca3sewardj return "Setting %eflags.ac (setting noted but ignored)"; 13569dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj case EmWarn_PPCexns: 13579dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj return "Unmasking PPC32/64 FP exceptions"; 13589dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj case EmWarn_PPC64_redir_overflow: 13599dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj return "PPC64 function redirection stack overflow"; 13609dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj case EmWarn_PPC64_redir_underflow: 13619dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj return "PPC64 function redirection stack underflow"; 13624b8efad55c1c7f9941b605b2f171b71a094c1f33florian case EmWarn_S390X_fpext_rounding: 13634b8efad55c1c7f9941b605b2f171b71a094c1f33florian return "The specified rounding mode cannot be supported. That\n" 13642a4de0bb56f33835bab59c0e483acc8410baed98florian " feature requires the floating point extension facility\n" 13654b8efad55c1c7f9941b605b2f171b71a094c1f33florian " which is not available on this host. Continuing using\n" 13664b8efad55c1c7f9941b605b2f171b71a094c1f33florian " the rounding mode from FPC. Results may differ!"; 1367f0fa1be734f2bcbc20ac638cc61dc149deb8b644florian case EmWarn_S390X_invalid_rounding: 1368f0fa1be734f2bcbc20ac638cc61dc149deb8b644florian return "The specified rounding mode is invalid.\n" 1369f0fa1be734f2bcbc20ac638cc61dc149deb8b644florian " Continuing using 'round to nearest'. Results may differ!"; 1370e75dafa8ecce0a5cc64cf4b91b32b192250894dcflorian case EmFail_S390X_stfle: 13714e0083ee421db6d2900eaa00dc70c86ee829e28bflorian return "Instruction stfle is not supported on this host"; 1372e75dafa8ecce0a5cc64cf4b91b32b192250894dcflorian case EmFail_S390X_stckf: 1373c5c669b461e3cbcd89d6bdbb4ecb9bcfd2ad23f5florian return "Instruction stckf is not supported on this host"; 1374e75dafa8ecce0a5cc64cf4b91b32b192250894dcflorian case EmFail_S390X_ecag: 13758c88cb6ae821021e1e00be18f5a8bea3c557080aflorian return "Instruction ecag is not supported on this host"; 1376ad00ea9f40f930d98bb2d278291a6c4c6636d6d6florian case EmFail_S390X_pfpo: 1377ad00ea9f40f930d98bb2d278291a6c4c6636d6d6florian return "Instruction pfpo is not supported on this host"; 1378fb5966040a32f9da5be84e63ca23d848f6766faeflorian case EmFail_S390X_DFP_insn: 1379fb5966040a32f9da5be84e63ca23d848f6766faeflorian return "DFP instructions are not supported on this host"; 1380e75dafa8ecce0a5cc64cf4b91b32b192250894dcflorian case EmFail_S390X_fpext: 1381e75dafa8ecce0a5cc64cf4b91b32b192250894dcflorian return "Encountered an instruction that requires the floating " 1382e75dafa8ecce0a5cc64cf4b91b32b192250894dcflorian "point extension facility.\n" 1383e75dafa8ecce0a5cc64cf4b91b32b192250894dcflorian " That facility is not available on this host"; 138478d5ef75d89e5aa6c629a2d47f7e04ddbf1253c3florian case EmFail_S390X_invalid_PFPO_rounding_mode: 13852a4de0bb56f33835bab59c0e483acc8410baed98florian return "The rounding mode in GPR 0 for the PFPO instruction" 138678d5ef75d89e5aa6c629a2d47f7e04ddbf1253c3florian " is invalid"; 138778d5ef75d89e5aa6c629a2d47f7e04ddbf1253c3florian case EmFail_S390X_invalid_PFPO_function: 13882a4de0bb56f33835bab59c0e483acc8410baed98florian return "The function code in GPR 0 for the PFPO instruction" 138978d5ef75d89e5aa6c629a2d47f7e04ddbf1253c3florian " is invalid"; 1390893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj default: 13916ef84bed9bb3af22060eb1759788034602bbcc88florian vpanic("LibVEX_EmNote_string: unknown warning"); 1392893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj } 1393893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj} 139435421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 13955117ce116f47141cb23d1b49cc826e19323add97sewardj/* ------------------ Arch/HwCaps stuff. ------------------ */ 1396bef170b7e84713d1e2181b9204d9415d29de3d65sewardj 1397bef170b7e84713d1e2181b9204d9415d29de3d65sewardjconst HChar* LibVEX_ppVexArch ( VexArch arch ) 1398bef170b7e84713d1e2181b9204d9415d29de3d65sewardj{ 1399bef170b7e84713d1e2181b9204d9415d29de3d65sewardj switch (arch) { 1400bef170b7e84713d1e2181b9204d9415d29de3d65sewardj case VexArch_INVALID: return "INVALID"; 1401bef170b7e84713d1e2181b9204d9415d29de3d65sewardj case VexArchX86: return "X86"; 1402bef170b7e84713d1e2181b9204d9415d29de3d65sewardj case VexArchAMD64: return "AMD64"; 1403bef170b7e84713d1e2181b9204d9415d29de3d65sewardj case VexArchARM: return "ARM"; 1404bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj case VexArchARM64: return "ARM64"; 14050ec57c595719a395e71b48792a4d62c5b896b6d3sewardj case VexArchPPC32: return "PPC32"; 1406f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion case VexArchPPC64: return "PPC64"; 14072019a976f07ff418dde2dfc7cc74667ef66d7764sewardj case VexArchS390X: return "S390X"; 1408d0e5fe765fb79e5495206f8d0969133178b871f2sewardj case VexArchMIPS32: return "MIPS32"; 1409b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj case VexArchMIPS64: return "MIPS64"; 14100de80192f57cd132b31b233c65734de04939ce65sewardj case VexArchTILEGX: return "TILEGX"; 1411bef170b7e84713d1e2181b9204d9415d29de3d65sewardj default: return "VexArch???"; 1412bef170b7e84713d1e2181b9204d9415d29de3d65sewardj } 1413bef170b7e84713d1e2181b9204d9415d29de3d65sewardj} 1414bef170b7e84713d1e2181b9204d9415d29de3d65sewardj 14159b76916dcc1628e133d57db001563429c6e3a590sewardjconst HChar* LibVEX_ppVexEndness ( VexEndness endness ) 14169b76916dcc1628e133d57db001563429c6e3a590sewardj{ 14179b76916dcc1628e133d57db001563429c6e3a590sewardj switch (endness) { 14189b76916dcc1628e133d57db001563429c6e3a590sewardj case VexEndness_INVALID: return "INVALID"; 14199b76916dcc1628e133d57db001563429c6e3a590sewardj case VexEndnessLE: return "LittleEndian"; 14209b76916dcc1628e133d57db001563429c6e3a590sewardj case VexEndnessBE: return "BigEndian"; 14219b76916dcc1628e133d57db001563429c6e3a590sewardj default: return "VexEndness???"; 14229b76916dcc1628e133d57db001563429c6e3a590sewardj } 14239b76916dcc1628e133d57db001563429c6e3a590sewardj} 14249b76916dcc1628e133d57db001563429c6e3a590sewardj 1425f3652c97c20265d3410ea75d9817e8323b6df5c8florian/* Return a string with the hardware capabilities to the extent as 1426f3652c97c20265d3410ea75d9817e8323b6df5c8florian they pertain to the translation process. No attempt is made, to 1427f3652c97c20265d3410ea75d9817e8323b6df5c8florian detect *all* capabilities an architecture may have. */ 14285117ce116f47141cb23d1b49cc826e19323add97sewardjconst HChar* LibVEX_ppVexHwCaps ( VexArch arch, UInt hwcaps ) 1429bef170b7e84713d1e2181b9204d9415d29de3d65sewardj{ 1430f3652c97c20265d3410ea75d9817e8323b6df5c8florian return show_hwcaps(arch, hwcaps); 1431bef170b7e84713d1e2181b9204d9415d29de3d65sewardj} 1432bef170b7e84713d1e2181b9204d9415d29de3d65sewardj 14335117ce116f47141cb23d1b49cc826e19323add97sewardj 143427e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj/* Write default settings info *vai. */ 143527e1dd6317760f3222f8a82185fa0e8ba138c85bsewardjvoid LibVEX_default_VexArchInfo ( /*OUT*/VexArchInfo* vai ) 143627e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj{ 143765902992da28822e4753594c7b72f7cb177fe3a6sewardj vex_bzero(vai, sizeof(*vai)); 14389b76916dcc1628e133d57db001563429c6e3a590sewardj vai->hwcaps = 0; 14399b76916dcc1628e133d57db001563429c6e3a590sewardj vai->endness = VexEndness_INVALID; 14409b76916dcc1628e133d57db001563429c6e3a590sewardj vai->ppc_icache_line_szB = 0; 14419b76916dcc1628e133d57db001563429c6e3a590sewardj vai->ppc_dcbz_szB = 0; 14429b76916dcc1628e133d57db001563429c6e3a590sewardj vai->ppc_dcbzl_szB = 0; 144365902992da28822e4753594c7b72f7cb177fe3a6sewardj vai->arm64_dMinLine_lg2_szB = 0; 144465902992da28822e4753594c7b72f7cb177fe3a6sewardj vai->arm64_iMinLine_lg2_szB = 0; 1445f192a391bc556ff6e074ec055df5b883895e5b52florian vai->hwcache_info.num_levels = 0; 1446f192a391bc556ff6e074ec055df5b883895e5b52florian vai->hwcache_info.num_caches = 0; 144765902992da28822e4753594c7b72f7cb177fe3a6sewardj vai->hwcache_info.caches = NULL; 1448f192a391bc556ff6e074ec055df5b883895e5b52florian vai->hwcache_info.icaches_maintain_coherence = True; // whatever 144927e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj} 145027e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj 1451dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj/* Write default settings info *vbi. */ 1452dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardjvoid LibVEX_default_VexAbiInfo ( /*OUT*/VexAbiInfo* vbi ) 1453aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj{ 145465902992da28822e4753594c7b72f7cb177fe3a6sewardj vex_bzero(vbi, sizeof(*vbi)); 1455dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj vbi->guest_stack_redzone_size = 0; 1456e2cc4defff3eec3be8e38ccc21df5ee460f930e9philippe vbi->guest_amd64_assume_fs_is_const = False; 1457e2cc4defff3eec3be8e38ccc21df5ee460f930e9philippe vbi->guest_amd64_assume_gs_is_const = False; 1458dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj vbi->guest_ppc_zap_RZ_at_blr = False; 1459dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj vbi->guest_ppc_zap_RZ_at_bl = NULL; 1460dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj vbi->host_ppc_calls_use_fndescrs = False; 1461aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj} 1462aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj 146327e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj 1464f3652c97c20265d3410ea75d9817e8323b6df5c8florian/* Convenience macro to be used in show_hwcaps_ARCH functions */ 1465f3652c97c20265d3410ea75d9817e8323b6df5c8florian#define NUM_HWCAPS (sizeof hwcaps_list / sizeof hwcaps_list[0]) 1466f3652c97c20265d3410ea75d9817e8323b6df5c8florian 14675117ce116f47141cb23d1b49cc826e19323add97sewardj/* Return a string showing the hwcaps in a nice way. The string will 1468f3652c97c20265d3410ea75d9817e8323b6df5c8florian be NULL for unrecognised hardware capabilities. */ 14695117ce116f47141cb23d1b49cc826e19323add97sewardj 147055085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps_x86 ( UInt hwcaps ) 14715117ce116f47141cb23d1b49cc826e19323add97sewardj{ 1472f3652c97c20265d3410ea75d9817e8323b6df5c8florian static const HChar prefix[] = "x86"; 1473f3652c97c20265d3410ea75d9817e8323b6df5c8florian static const struct { 1474f3652c97c20265d3410ea75d9817e8323b6df5c8florian UInt hwcaps_bit; 1475f3652c97c20265d3410ea75d9817e8323b6df5c8florian HChar name[7]; 1476f3652c97c20265d3410ea75d9817e8323b6df5c8florian } hwcaps_list[] = { 1477f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_X86_MMXEXT, "mmxext" }, 1478f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_X86_SSE1, "sse1" }, 1479f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_X86_SSE2, "sse2" }, 1480f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_X86_SSE3, "sse3" }, 1481f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_X86_LZCNT, "lzcnt" }, 1482f3652c97c20265d3410ea75d9817e8323b6df5c8florian }; 1483f3652c97c20265d3410ea75d9817e8323b6df5c8florian /* Allocate a large enough buffer */ 1484f3652c97c20265d3410ea75d9817e8323b6df5c8florian static HChar buf[sizeof prefix + 1485f3652c97c20265d3410ea75d9817e8323b6df5c8florian NUM_HWCAPS * (sizeof hwcaps_list[0].name + 1) + 1]; // '\0' 1486f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (buf[0] != '\0') return buf; /* already constructed */ 1487f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1488f3652c97c20265d3410ea75d9817e8323b6df5c8florian HChar *p = buf + vex_sprintf(buf, "%s", prefix); 1489f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1490f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (hwcaps == 0) { 1491f3652c97c20265d3410ea75d9817e8323b6df5c8florian vex_sprintf(p, "-%s", "sse0"); 1492f3652c97c20265d3410ea75d9817e8323b6df5c8florian } else { 1493f3652c97c20265d3410ea75d9817e8323b6df5c8florian UInt i; 1494f3652c97c20265d3410ea75d9817e8323b6df5c8florian for (i = 0 ; i < NUM_HWCAPS; ++i) { 1495f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (hwcaps & hwcaps_list[i].hwcaps_bit) 1496f3652c97c20265d3410ea75d9817e8323b6df5c8florian p = p + vex_sprintf(p, "-%s", hwcaps_list[i].name); 1497f3652c97c20265d3410ea75d9817e8323b6df5c8florian } 1498536fbabcc3770f42bb7370efd75e8e30e9a841c8sewardj } 1499f3652c97c20265d3410ea75d9817e8323b6df5c8florian return buf; 15005117ce116f47141cb23d1b49cc826e19323add97sewardj} 15015117ce116f47141cb23d1b49cc826e19323add97sewardj 150255085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps_amd64 ( UInt hwcaps ) 15035117ce116f47141cb23d1b49cc826e19323add97sewardj{ 1504f3652c97c20265d3410ea75d9817e8323b6df5c8florian static const HChar prefix[] = "amd64"; 1505f3652c97c20265d3410ea75d9817e8323b6df5c8florian static const struct { 1506f3652c97c20265d3410ea75d9817e8323b6df5c8florian UInt hwcaps_bit; 1507f3652c97c20265d3410ea75d9817e8323b6df5c8florian HChar name[7]; 1508f3652c97c20265d3410ea75d9817e8323b6df5c8florian } hwcaps_list[] = { 1509f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_AMD64_CX16, "cx16" }, 1510f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_AMD64_LZCNT, "lzcnt" }, 1511f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_AMD64_RDTSCP, "rdtscp" }, 1512f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_AMD64_SSE3, "sse3" }, 1513f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_AMD64_AVX, "avx" }, 1514f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_AMD64_AVX2, "avx2" }, 1515f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_AMD64_BMI, "bmi" }, 1516f3652c97c20265d3410ea75d9817e8323b6df5c8florian }; 1517f3652c97c20265d3410ea75d9817e8323b6df5c8florian /* Allocate a large enough buffer */ 1518f3652c97c20265d3410ea75d9817e8323b6df5c8florian static HChar buf[sizeof prefix + 1519f3652c97c20265d3410ea75d9817e8323b6df5c8florian NUM_HWCAPS * (sizeof hwcaps_list[0].name + 1) + 1]; // '\0' 1520f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (buf[0] != '\0') return buf; /* already constructed */ 1521f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1522f3652c97c20265d3410ea75d9817e8323b6df5c8florian HChar *p = buf + vex_sprintf(buf, "%s", prefix); 1523f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1524818c730f624828ef2d5532e32e952924094b699esewardj if (hwcaps == 0) { 1525f3652c97c20265d3410ea75d9817e8323b6df5c8florian vex_sprintf(p, "-%s", "sse2"); 1526f3652c97c20265d3410ea75d9817e8323b6df5c8florian } else { 1527f3652c97c20265d3410ea75d9817e8323b6df5c8florian UInt i; 1528f3652c97c20265d3410ea75d9817e8323b6df5c8florian for (i = 0 ; i < NUM_HWCAPS; ++i) { 1529f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (hwcaps & hwcaps_list[i].hwcaps_bit) 1530f3652c97c20265d3410ea75d9817e8323b6df5c8florian p = p + vex_sprintf(p, "-%s", hwcaps_list[i].name); 1531f3652c97c20265d3410ea75d9817e8323b6df5c8florian } 1532cc3d219c3120150c9ab67f1f4850be0f39a9499csewardj } 1533818c730f624828ef2d5532e32e952924094b699esewardj return buf; 15345117ce116f47141cb23d1b49cc826e19323add97sewardj} 15355117ce116f47141cb23d1b49cc826e19323add97sewardj 153655085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps_ppc32 ( UInt hwcaps ) 15375117ce116f47141cb23d1b49cc826e19323add97sewardj{ 1538f3652c97c20265d3410ea75d9817e8323b6df5c8florian static const HChar prefix[] = "ppc32-int"; 1539f3652c97c20265d3410ea75d9817e8323b6df5c8florian static const struct { 1540f3652c97c20265d3410ea75d9817e8323b6df5c8florian UInt hwcaps_bit; 1541f3652c97c20265d3410ea75d9817e8323b6df5c8florian HChar name[8]; 1542f3652c97c20265d3410ea75d9817e8323b6df5c8florian } hwcaps_list[] = { 1543f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_PPC32_F, "flt" }, 1544f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_PPC32_V, "vmx" }, 1545f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_PPC32_FX, "FX" }, 1546f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_PPC32_GX, "GX" }, 1547f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_PPC32_VX, "VX" }, 1548f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_PPC32_DFP, "DFP" }, 1549f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_PPC32_ISA2_07, "ISA2_07" }, 1550f3652c97c20265d3410ea75d9817e8323b6df5c8florian }; 1551f3652c97c20265d3410ea75d9817e8323b6df5c8florian /* Allocate a large enough buffer */ 1552f3652c97c20265d3410ea75d9817e8323b6df5c8florian static HChar buf[sizeof prefix + 1553f3652c97c20265d3410ea75d9817e8323b6df5c8florian NUM_HWCAPS * (sizeof hwcaps_list[0].name + 1) + 1]; // '\0' 1554f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (buf[0] != '\0') return buf; /* already constructed */ 1555f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1556f3652c97c20265d3410ea75d9817e8323b6df5c8florian HChar *p = buf + vex_sprintf(buf, "%s", prefix); 1557f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1558f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (hwcaps == 0) return buf; 1559f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1560f3652c97c20265d3410ea75d9817e8323b6df5c8florian UInt i; 1561f3652c97c20265d3410ea75d9817e8323b6df5c8florian for (i = 0 ; i < NUM_HWCAPS; ++i) { 1562f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (hwcaps & hwcaps_list[i].hwcaps_bit) 1563f3652c97c20265d3410ea75d9817e8323b6df5c8florian p = p + vex_sprintf(p, "-%s", hwcaps_list[i].name); 1564f3652c97c20265d3410ea75d9817e8323b6df5c8florian } 1565f3652c97c20265d3410ea75d9817e8323b6df5c8florian return buf; 15665117ce116f47141cb23d1b49cc826e19323add97sewardj} 15675117ce116f47141cb23d1b49cc826e19323add97sewardj 156855085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps_ppc64 ( UInt hwcaps ) 15695117ce116f47141cb23d1b49cc826e19323add97sewardj{ 1570f3652c97c20265d3410ea75d9817e8323b6df5c8florian static const HChar prefix[] = "ppc64-int-flt"; 1571f3652c97c20265d3410ea75d9817e8323b6df5c8florian static const struct { 1572f3652c97c20265d3410ea75d9817e8323b6df5c8florian UInt hwcaps_bit; 1573f3652c97c20265d3410ea75d9817e8323b6df5c8florian HChar name[8]; 1574f3652c97c20265d3410ea75d9817e8323b6df5c8florian } hwcaps_list[] = { 1575f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_PPC64_FX, "FX" }, 1576f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_PPC64_GX, "GX" }, 1577f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_PPC64_V, "vmx" }, 1578f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_PPC64_DFP, "DFP" }, 1579f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_PPC64_ISA2_07, "ISA2_07" }, 1580f3652c97c20265d3410ea75d9817e8323b6df5c8florian }; 1581f3652c97c20265d3410ea75d9817e8323b6df5c8florian /* Allocate a large enough buffer */ 1582f3652c97c20265d3410ea75d9817e8323b6df5c8florian static HChar buf[sizeof prefix + 1583f3652c97c20265d3410ea75d9817e8323b6df5c8florian NUM_HWCAPS * (sizeof hwcaps_list[0].name + 1) + 1]; // '\0' 1584f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (buf[0] != '\0') return buf; /* already constructed */ 1585f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1586f3652c97c20265d3410ea75d9817e8323b6df5c8florian HChar *p = buf + vex_sprintf(buf, "%s", prefix); 1587f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1588f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (hwcaps == 0) return buf; 1589f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1590f3652c97c20265d3410ea75d9817e8323b6df5c8florian UInt i; 1591f3652c97c20265d3410ea75d9817e8323b6df5c8florian for (i = 0 ; i < NUM_HWCAPS; ++i) { 1592f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (hwcaps & hwcaps_list[i].hwcaps_bit) 1593f3652c97c20265d3410ea75d9817e8323b6df5c8florian p = p + vex_sprintf(p, "-%s", hwcaps_list[i].name); 1594f3652c97c20265d3410ea75d9817e8323b6df5c8florian } 1595f3652c97c20265d3410ea75d9817e8323b6df5c8florian return buf; 15965117ce116f47141cb23d1b49cc826e19323add97sewardj} 15975117ce116f47141cb23d1b49cc826e19323add97sewardj 159855085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps_arm ( UInt hwcaps ) 15995117ce116f47141cb23d1b49cc826e19323add97sewardj{ 1600f3652c97c20265d3410ea75d9817e8323b6df5c8florian static const HChar prefix[] = "ARM"; 1601f3652c97c20265d3410ea75d9817e8323b6df5c8florian static const struct { 1602f3652c97c20265d3410ea75d9817e8323b6df5c8florian UInt hwcaps_bit; 1603f3652c97c20265d3410ea75d9817e8323b6df5c8florian HChar name[6]; 1604f3652c97c20265d3410ea75d9817e8323b6df5c8florian } hwcaps_list[] = { 1605f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_ARM_NEON, "neon" }, 1606f3652c97c20265d3410ea75d9817e8323b6df5c8florian { VEX_HWCAPS_ARM_VFP | VEX_HWCAPS_ARM_VFP2 | VEX_HWCAPS_ARM_VFP3, "vfp" }, 1607f3652c97c20265d3410ea75d9817e8323b6df5c8florian }; 1608f3652c97c20265d3410ea75d9817e8323b6df5c8florian /* Allocate a large enough buffer */ 1609f3652c97c20265d3410ea75d9817e8323b6df5c8florian static HChar buf[sizeof prefix + 12 + // level 1610f3652c97c20265d3410ea75d9817e8323b6df5c8florian NUM_HWCAPS * (sizeof hwcaps_list[0].name + 1) + 1]; // '\0' 1611f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (buf[0] != '\0') return buf; /* already constructed */ 1612f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1613f3652c97c20265d3410ea75d9817e8323b6df5c8florian HChar *p; 1614f3652c97c20265d3410ea75d9817e8323b6df5c8florian UInt i, level; 1615f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1616f3652c97c20265d3410ea75d9817e8323b6df5c8florian level = VEX_ARM_ARCHLEVEL(hwcaps); 1617f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1618f3652c97c20265d3410ea75d9817e8323b6df5c8florian p = buf + vex_sprintf(buf, "%sv%u", prefix, level); 1619f3652c97c20265d3410ea75d9817e8323b6df5c8florian for (i = 0 ; i < NUM_HWCAPS; ++i) { 1620f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (hwcaps & hwcaps_list[i].hwcaps_bit) 1621f3652c97c20265d3410ea75d9817e8323b6df5c8florian p = p + vex_sprintf(p, "-%s", hwcaps_list[i].name); 1622ec0d9a028955060c5216341c6fc37400ec0cb4besewardj } 1623f3652c97c20265d3410ea75d9817e8323b6df5c8florian return buf; 16245117ce116f47141cb23d1b49cc826e19323add97sewardj} 16255117ce116f47141cb23d1b49cc826e19323add97sewardj 1626bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardjstatic const HChar* show_hwcaps_arm64 ( UInt hwcaps ) 1627bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj{ 1628bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj /* Since there are no variants, just insist that hwcaps is zero, 1629bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj and declare it invalid otherwise. */ 1630bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj if (hwcaps == 0) 1631bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj return "baseline"; 1632f3652c97c20265d3410ea75d9817e8323b6df5c8florian return "Unsupported"; 1633bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj} 1634bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj 163555085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps_s390x ( UInt hwcaps ) 16362019a976f07ff418dde2dfc7cc74667ef66d7764sewardj{ 1637d07b8566ab17faf70748cfce1304699f1d15c34esewardj static const HChar prefix[] = "s390x"; 16389061eb34b539df910f64354e8f3495aad47e8891florian static const struct { 16399061eb34b539df910f64354e8f3495aad47e8891florian UInt hwcaps_bit; 16409061eb34b539df910f64354e8f3495aad47e8891florian HChar name[6]; 16419061eb34b539df910f64354e8f3495aad47e8891florian } hwcaps_list[] = { 16429061eb34b539df910f64354e8f3495aad47e8891florian { VEX_HWCAPS_S390X_LDISP, "ldisp" }, 16439061eb34b539df910f64354e8f3495aad47e8891florian { VEX_HWCAPS_S390X_EIMM, "eimm" }, 16449061eb34b539df910f64354e8f3495aad47e8891florian { VEX_HWCAPS_S390X_GIE, "gie" }, 16459061eb34b539df910f64354e8f3495aad47e8891florian { VEX_HWCAPS_S390X_DFP, "dfp" }, 16469061eb34b539df910f64354e8f3495aad47e8891florian { VEX_HWCAPS_S390X_FGX, "fgx" }, 16479061eb34b539df910f64354e8f3495aad47e8891florian { VEX_HWCAPS_S390X_STFLE, "stfle" }, 16489061eb34b539df910f64354e8f3495aad47e8891florian { VEX_HWCAPS_S390X_ETF2, "etf2" }, 16499061eb34b539df910f64354e8f3495aad47e8891florian { VEX_HWCAPS_S390X_ETF3, "etf3" }, 16509061eb34b539df910f64354e8f3495aad47e8891florian { VEX_HWCAPS_S390X_STCKF, "stckf" }, 16519061eb34b539df910f64354e8f3495aad47e8891florian { VEX_HWCAPS_S390X_FPEXT, "fpext" }, 16529061eb34b539df910f64354e8f3495aad47e8891florian { VEX_HWCAPS_S390X_LSC, "lsc" }, 165378d5ef75d89e5aa6c629a2d47f7e04ddbf1253c3florian { VEX_HWCAPS_S390X_PFPO, "pfpo" }, 1654d07b8566ab17faf70748cfce1304699f1d15c34esewardj }; 1655f3652c97c20265d3410ea75d9817e8323b6df5c8florian /* Allocate a large enough buffer */ 16569061eb34b539df910f64354e8f3495aad47e8891florian static HChar buf[sizeof prefix + 1657f3652c97c20265d3410ea75d9817e8323b6df5c8florian NUM_HWCAPS * (sizeof hwcaps_list[0].name + 1) + 1]; // '\0' 1658d07b8566ab17faf70748cfce1304699f1d15c34esewardj 1659d07b8566ab17faf70748cfce1304699f1d15c34esewardj if (buf[0] != '\0') return buf; /* already constructed */ 16602019a976f07ff418dde2dfc7cc74667ef66d7764sewardj 1661f3652c97c20265d3410ea75d9817e8323b6df5c8florian HChar *p; 1662f3652c97c20265d3410ea75d9817e8323b6df5c8florian UInt i; 1663f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1664652b56aecd7af6012e82801557b3833f74b19b59sewardj hwcaps = VEX_HWCAPS_S390X(hwcaps); 1665652b56aecd7af6012e82801557b3833f74b19b59sewardj 1666d07b8566ab17faf70748cfce1304699f1d15c34esewardj p = buf + vex_sprintf(buf, "%s", prefix); 16679061eb34b539df910f64354e8f3495aad47e8891florian for (i = 0 ; i < NUM_HWCAPS; ++i) { 16689061eb34b539df910f64354e8f3495aad47e8891florian if (hwcaps & hwcaps_list[i].hwcaps_bit) 16699061eb34b539df910f64354e8f3495aad47e8891florian p = p + vex_sprintf(p, "-%s", hwcaps_list[i].name); 16709061eb34b539df910f64354e8f3495aad47e8891florian } 1671d07b8566ab17faf70748cfce1304699f1d15c34esewardj 1672d07b8566ab17faf70748cfce1304699f1d15c34esewardj /* If there are no facilities, add "zarch" */ 1673d07b8566ab17faf70748cfce1304699f1d15c34esewardj if (hwcaps == 0) 1674d07b8566ab17faf70748cfce1304699f1d15c34esewardj vex_sprintf(p, "-%s", "zarch"); 1675d07b8566ab17faf70748cfce1304699f1d15c34esewardj 1676d07b8566ab17faf70748cfce1304699f1d15c34esewardj return buf; 16772019a976f07ff418dde2dfc7cc74667ef66d7764sewardj} 16782019a976f07ff418dde2dfc7cc74667ef66d7764sewardj 167955085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps_mips32 ( UInt hwcaps ) 1680d0e5fe765fb79e5495206f8d0969133178b871f2sewardj{ 1681c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj /* MIPS baseline. */ 1682bc7d6f46346df80207c8454b35055b04f16bc1adpetarj if (VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_MIPS) { 1683c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj /* MIPS baseline with dspr2. */ 1684bc7d6f46346df80207c8454b35055b04f16bc1adpetarj if (VEX_MIPS_PROC_DSP2(hwcaps)) { 1685c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj return "MIPS-baseline-dspr2"; 1686c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj } 1687c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj /* MIPS baseline with dsp. */ 1688bc7d6f46346df80207c8454b35055b04f16bc1adpetarj if (VEX_MIPS_PROC_DSP(hwcaps)) { 1689c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj return "MIPS-baseline-dsp"; 1690c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj } 1691c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj return "MIPS-baseline"; 1692c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj } 1693c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj 1694c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj /* Broadcom baseline. */ 1695bc7d6f46346df80207c8454b35055b04f16bc1adpetarj if (VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_BROADCOM) { 1696c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj return "Broadcom-baseline"; 1697c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj } 1698c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj 1699c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj /* Netlogic baseline. */ 1700bc7d6f46346df80207c8454b35055b04f16bc1adpetarj if (VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_NETLOGIC) { 1701c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj return "Netlogic-baseline"; 1702c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj } 1703c3fee0debd7287a8c6a3b89ee6bc1ec58241938bdejanj 1704bc7d6f46346df80207c8454b35055b04f16bc1adpetarj /* Cavium baseline. */ 1705bc7d6f46346df80207c8454b35055b04f16bc1adpetarj if (VEX_MIPS_COMP_ID(hwcaps) == VEX_PRID_COMP_CAVIUM) { 1706bc7d6f46346df80207c8454b35055b04f16bc1adpetarj return "Cavium-baseline"; 1707bc7d6f46346df80207c8454b35055b04f16bc1adpetarj } 1708bc7d6f46346df80207c8454b35055b04f16bc1adpetarj 1709f3652c97c20265d3410ea75d9817e8323b6df5c8florian return "Unsupported baseline"; 1710d0e5fe765fb79e5495206f8d0969133178b871f2sewardj} 1711d0e5fe765fb79e5495206f8d0969133178b871f2sewardj 1712b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarjstatic const HChar* show_hwcaps_mips64 ( UInt hwcaps ) 1713b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj{ 1714b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj return "mips64-baseline"; 1715b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj} 1716b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj 17170de80192f57cd132b31b233c65734de04939ce65sewardjstatic const HChar* show_hwcaps_tilegx ( UInt hwcaps ) 17180de80192f57cd132b31b233c65734de04939ce65sewardj{ 17190de80192f57cd132b31b233c65734de04939ce65sewardj return "tilegx-baseline"; 17200de80192f57cd132b31b233c65734de04939ce65sewardj} 17210de80192f57cd132b31b233c65734de04939ce65sewardj 1722f3652c97c20265d3410ea75d9817e8323b6df5c8florian#undef NUM_HWCAPS 1723f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1724f3652c97c20265d3410ea75d9817e8323b6df5c8florian/* Thie function must not return NULL. */ 17250de80192f57cd132b31b233c65734de04939ce65sewardj 172655085f8680acc89d727e321f3b34cae1a8c4093aflorianstatic const HChar* show_hwcaps ( VexArch arch, UInt hwcaps ) 17275117ce116f47141cb23d1b49cc826e19323add97sewardj{ 17285117ce116f47141cb23d1b49cc826e19323add97sewardj switch (arch) { 1729d0e5fe765fb79e5495206f8d0969133178b871f2sewardj case VexArchX86: return show_hwcaps_x86(hwcaps); 1730d0e5fe765fb79e5495206f8d0969133178b871f2sewardj case VexArchAMD64: return show_hwcaps_amd64(hwcaps); 1731d0e5fe765fb79e5495206f8d0969133178b871f2sewardj case VexArchPPC32: return show_hwcaps_ppc32(hwcaps); 1732d0e5fe765fb79e5495206f8d0969133178b871f2sewardj case VexArchPPC64: return show_hwcaps_ppc64(hwcaps); 1733d0e5fe765fb79e5495206f8d0969133178b871f2sewardj case VexArchARM: return show_hwcaps_arm(hwcaps); 1734bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj case VexArchARM64: return show_hwcaps_arm64(hwcaps); 1735d0e5fe765fb79e5495206f8d0969133178b871f2sewardj case VexArchS390X: return show_hwcaps_s390x(hwcaps); 1736d0e5fe765fb79e5495206f8d0969133178b871f2sewardj case VexArchMIPS32: return show_hwcaps_mips32(hwcaps); 1737b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj case VexArchMIPS64: return show_hwcaps_mips64(hwcaps); 17380de80192f57cd132b31b233c65734de04939ce65sewardj case VexArchTILEGX: return show_hwcaps_tilegx(hwcaps); 17395117ce116f47141cb23d1b49cc826e19323add97sewardj default: return NULL; 17405117ce116f47141cb23d1b49cc826e19323add97sewardj } 17415117ce116f47141cb23d1b49cc826e19323add97sewardj} 17425117ce116f47141cb23d1b49cc826e19323add97sewardj 1743f3652c97c20265d3410ea75d9817e8323b6df5c8florian/* To be used to complain about hwcaps we cannot handle */ 1744f3652c97c20265d3410ea75d9817e8323b6df5c8florian__attribute__((noreturn)) 1745f3652c97c20265d3410ea75d9817e8323b6df5c8florianstatic void invalid_hwcaps ( VexArch arch, UInt hwcaps, const HChar *message ) 1746f3652c97c20265d3410ea75d9817e8323b6df5c8florian{ 1747f3652c97c20265d3410ea75d9817e8323b6df5c8florian vfatal("\nVEX: %s" 1748f3652c97c20265d3410ea75d9817e8323b6df5c8florian " Found: %s\n", message, show_hwcaps(arch, hwcaps)); 1749f3652c97c20265d3410ea75d9817e8323b6df5c8florian} 1750f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1751f3652c97c20265d3410ea75d9817e8323b6df5c8florian/* This function will not return iff the hwcaps don't pass the test. */ 1752f3652c97c20265d3410ea75d9817e8323b6df5c8florianstatic void check_hwcaps ( VexArch arch, UInt hwcaps ) 17535117ce116f47141cb23d1b49cc826e19323add97sewardj{ 1754f3652c97c20265d3410ea75d9817e8323b6df5c8florian switch (arch) { 1755f3652c97c20265d3410ea75d9817e8323b6df5c8florian case VexArchX86: { 1756f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (hwcaps == 0) return; // baseline 1757f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1758f3652c97c20265d3410ea75d9817e8323b6df5c8florian /* Monotonic: SSE3 > SSE2 > SSE1 > MMXEXT > baseline. */ 1759f3652c97c20265d3410ea75d9817e8323b6df5c8florian static const UInt extras[] = { 1760f3652c97c20265d3410ea75d9817e8323b6df5c8florian VEX_HWCAPS_X86_MMXEXT, VEX_HWCAPS_X86_SSE1, VEX_HWCAPS_X86_SSE2, 1761f3652c97c20265d3410ea75d9817e8323b6df5c8florian VEX_HWCAPS_X86_SSE3 1762f3652c97c20265d3410ea75d9817e8323b6df5c8florian }; 1763f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1764f3652c97c20265d3410ea75d9817e8323b6df5c8florian UInt i, caps = 0; 1765f3652c97c20265d3410ea75d9817e8323b6df5c8florian for (i = 0; i < sizeof extras / sizeof extras[0]; ++i) { 1766f3652c97c20265d3410ea75d9817e8323b6df5c8florian caps |= extras[i]; 1767f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (caps == hwcaps) return; 176875ba1300092d44f42971d3e09da93b5feca8392fflorian /* For SSE2 or later LZCNT is optional */ 1769f3652c97c20265d3410ea75d9817e8323b6df5c8florian if ((caps & VEX_HWCAPS_X86_SSE2) != 0) { 177075ba1300092d44f42971d3e09da93b5feca8392fflorian if ((caps | VEX_HWCAPS_X86_LZCNT) == hwcaps) return; 1771f3652c97c20265d3410ea75d9817e8323b6df5c8florian } 1772f3652c97c20265d3410ea75d9817e8323b6df5c8florian } 1773f3652c97c20265d3410ea75d9817e8323b6df5c8florian invalid_hwcaps(arch, hwcaps, "Cannot handle capabilities\n"); 1774f3652c97c20265d3410ea75d9817e8323b6df5c8florian } 1775f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1776f3652c97c20265d3410ea75d9817e8323b6df5c8florian case VexArchAMD64: { 1777f3652c97c20265d3410ea75d9817e8323b6df5c8florian /* SSE3 and CX16 are orthogonal and > baseline, although we really 1778f3652c97c20265d3410ea75d9817e8323b6df5c8florian don't expect to come across anything which can do SSE3 but can't 1779f3652c97c20265d3410ea75d9817e8323b6df5c8florian do CX16. Still, we can handle that case. LZCNT is similarly 1780f3652c97c20265d3410ea75d9817e8323b6df5c8florian orthogonal. */ 1781f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1782f3652c97c20265d3410ea75d9817e8323b6df5c8florian /* Throw out obviously stupid cases: */ 1783f3652c97c20265d3410ea75d9817e8323b6df5c8florian Bool have_sse3 = (hwcaps & VEX_HWCAPS_AMD64_SSE3) != 0; 1784f3652c97c20265d3410ea75d9817e8323b6df5c8florian Bool have_avx = (hwcaps & VEX_HWCAPS_AMD64_AVX) != 0; 1785f3652c97c20265d3410ea75d9817e8323b6df5c8florian Bool have_bmi = (hwcaps & VEX_HWCAPS_AMD64_BMI) != 0; 1786f3652c97c20265d3410ea75d9817e8323b6df5c8florian Bool have_avx2 = (hwcaps & VEX_HWCAPS_AMD64_AVX2) != 0; 1787f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1788f3652c97c20265d3410ea75d9817e8323b6df5c8florian /* AVX without SSE3 */ 1789f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (have_avx && !have_sse3) 1790f3652c97c20265d3410ea75d9817e8323b6df5c8florian invalid_hwcaps(arch, hwcaps, 1791f3652c97c20265d3410ea75d9817e8323b6df5c8florian "Support for AVX requires SSE3 capabilities\n"); 1792f3652c97c20265d3410ea75d9817e8323b6df5c8florian /* AVX2 or BMI without AVX */ 1793f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (have_avx2 && !have_avx) 1794f3652c97c20265d3410ea75d9817e8323b6df5c8florian invalid_hwcaps(arch, hwcaps, 1795f3652c97c20265d3410ea75d9817e8323b6df5c8florian "Support for AVX2 requires AVX capabilities\n"); 1796f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (have_bmi && !have_avx) 1797f3652c97c20265d3410ea75d9817e8323b6df5c8florian invalid_hwcaps(arch, hwcaps, 1798f3652c97c20265d3410ea75d9817e8323b6df5c8florian "Support for BMI requires AVX capabilities\n"); 1799f3652c97c20265d3410ea75d9817e8323b6df5c8florian return; 1800f3652c97c20265d3410ea75d9817e8323b6df5c8florian } 1801f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1802f3652c97c20265d3410ea75d9817e8323b6df5c8florian case VexArchPPC32: { 1803f3652c97c20265d3410ea75d9817e8323b6df5c8florian /* Monotonic with complications. Basically V > F > baseline, 1804f3652c97c20265d3410ea75d9817e8323b6df5c8florian but once you have F then you can have FX or GX too. */ 1805f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (hwcaps == 0) return; // baseline 1806f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1807f3652c97c20265d3410ea75d9817e8323b6df5c8florian if ((hwcaps & VEX_HWCAPS_PPC32_F) == 0) 1808f3652c97c20265d3410ea75d9817e8323b6df5c8florian invalid_hwcaps(arch, hwcaps, 1809f3652c97c20265d3410ea75d9817e8323b6df5c8florian "Missing floating point capability\n"); 1810f3652c97c20265d3410ea75d9817e8323b6df5c8florian /* V, FX, and GX can appear in any combination */ 1811f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1812f3652c97c20265d3410ea75d9817e8323b6df5c8florian /* DFP requires V and FX and GX */ 1813f3652c97c20265d3410ea75d9817e8323b6df5c8florian UInt v_fx_gx = VEX_HWCAPS_PPC32_V | VEX_HWCAPS_PPC32_FX | 1814f3652c97c20265d3410ea75d9817e8323b6df5c8florian VEX_HWCAPS_PPC32_GX; 1815f3652c97c20265d3410ea75d9817e8323b6df5c8florian Bool has_v_fx_gx = (hwcaps & v_fx_gx) == v_fx_gx; 1816f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1817f3652c97c20265d3410ea75d9817e8323b6df5c8florian if ((hwcaps & VEX_HWCAPS_PPC32_DFP) && ! has_v_fx_gx) 1818f3652c97c20265d3410ea75d9817e8323b6df5c8florian invalid_hwcaps(arch, hwcaps, 1819f3652c97c20265d3410ea75d9817e8323b6df5c8florian "DFP requires VMX and FX and GX capabilities\n"); 1820f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1821f3652c97c20265d3410ea75d9817e8323b6df5c8florian /* VX requires V and FX and GX */ 1822f3652c97c20265d3410ea75d9817e8323b6df5c8florian if ((hwcaps & VEX_HWCAPS_PPC32_VX) && ! has_v_fx_gx) 1823f3652c97c20265d3410ea75d9817e8323b6df5c8florian invalid_hwcaps(arch, hwcaps, 1824f3652c97c20265d3410ea75d9817e8323b6df5c8florian "VX requires VMX and FX and GX capabilities\n"); 1825f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1826f3652c97c20265d3410ea75d9817e8323b6df5c8florian /* ISA2_07 requires everything else */ 1827f3652c97c20265d3410ea75d9817e8323b6df5c8florian if ((hwcaps & VEX_HWCAPS_PPC32_ISA2_07) != 0) { 1828f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (! has_v_fx_gx) 1829f3652c97c20265d3410ea75d9817e8323b6df5c8florian invalid_hwcaps(arch, hwcaps, 1830f3652c97c20265d3410ea75d9817e8323b6df5c8florian "ISA2_07 requires VMX and FX and GX capabilities\n"); 1831f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (! (hwcaps & VEX_HWCAPS_PPC32_VX)) 1832f3652c97c20265d3410ea75d9817e8323b6df5c8florian invalid_hwcaps(arch, hwcaps, 1833f3652c97c20265d3410ea75d9817e8323b6df5c8florian "ISA2_07 requires VX capabilities\n"); 1834f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (! (hwcaps & VEX_HWCAPS_PPC32_DFP)) 1835f3652c97c20265d3410ea75d9817e8323b6df5c8florian invalid_hwcaps(arch, hwcaps, 1836f3652c97c20265d3410ea75d9817e8323b6df5c8florian "ISA2_07 requires DFP capabilities\n"); 1837f3652c97c20265d3410ea75d9817e8323b6df5c8florian } 1838f3652c97c20265d3410ea75d9817e8323b6df5c8florian return; 1839f3652c97c20265d3410ea75d9817e8323b6df5c8florian } 1840f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1841f3652c97c20265d3410ea75d9817e8323b6df5c8florian case VexArchPPC64: { 1842f3652c97c20265d3410ea75d9817e8323b6df5c8florian /* Monotonic with complications. Basically V > baseline(==F), 1843f3652c97c20265d3410ea75d9817e8323b6df5c8florian but once you have F then you can have FX or GX too. */ 1844f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (hwcaps == 0) return; // baseline 1845f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1846f3652c97c20265d3410ea75d9817e8323b6df5c8florian /* V, FX, and GX can appear in any combination */ 1847f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1848f3652c97c20265d3410ea75d9817e8323b6df5c8florian /* DFP requires V and FX and GX */ 1849f3652c97c20265d3410ea75d9817e8323b6df5c8florian UInt v_fx_gx = VEX_HWCAPS_PPC64_V | VEX_HWCAPS_PPC64_FX | 1850f3652c97c20265d3410ea75d9817e8323b6df5c8florian VEX_HWCAPS_PPC64_GX; 1851f3652c97c20265d3410ea75d9817e8323b6df5c8florian Bool has_v_fx_gx = (hwcaps & v_fx_gx) == v_fx_gx; 1852f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1853f3652c97c20265d3410ea75d9817e8323b6df5c8florian if ((hwcaps & VEX_HWCAPS_PPC64_DFP) && ! has_v_fx_gx) 1854f3652c97c20265d3410ea75d9817e8323b6df5c8florian invalid_hwcaps(arch, hwcaps, 1855f3652c97c20265d3410ea75d9817e8323b6df5c8florian "DFP requires VMX and FX and GX capabilities\n"); 1856f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1857f3652c97c20265d3410ea75d9817e8323b6df5c8florian /* VX requires V and FX and GX */ 1858f3652c97c20265d3410ea75d9817e8323b6df5c8florian if ((hwcaps & VEX_HWCAPS_PPC32_VX) && ! has_v_fx_gx) 1859f3652c97c20265d3410ea75d9817e8323b6df5c8florian invalid_hwcaps(arch, hwcaps, 1860f3652c97c20265d3410ea75d9817e8323b6df5c8florian "VX requires VMX and FX and GX capabilities\n"); 1861f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1862f3652c97c20265d3410ea75d9817e8323b6df5c8florian /* ISA2_07 requires everything else */ 1863f3652c97c20265d3410ea75d9817e8323b6df5c8florian if ((hwcaps & VEX_HWCAPS_PPC64_ISA2_07) != 0) { 1864f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (! has_v_fx_gx) 1865f3652c97c20265d3410ea75d9817e8323b6df5c8florian invalid_hwcaps(arch, hwcaps, 1866f3652c97c20265d3410ea75d9817e8323b6df5c8florian "ISA2_07 requires VMX and FX and GX capabilities\n"); 1867f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (! (hwcaps & VEX_HWCAPS_PPC64_VX)) 1868f3652c97c20265d3410ea75d9817e8323b6df5c8florian invalid_hwcaps(arch, hwcaps, 1869f3652c97c20265d3410ea75d9817e8323b6df5c8florian "ISA2_07 requires VX capabilities\n"); 1870f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (! (hwcaps & VEX_HWCAPS_PPC64_DFP)) 1871f3652c97c20265d3410ea75d9817e8323b6df5c8florian invalid_hwcaps(arch, hwcaps, 1872f3652c97c20265d3410ea75d9817e8323b6df5c8florian "ISA2_07 requires DFP capabilities\n"); 1873f3652c97c20265d3410ea75d9817e8323b6df5c8florian } 1874f3652c97c20265d3410ea75d9817e8323b6df5c8florian return; 1875f3652c97c20265d3410ea75d9817e8323b6df5c8florian } 1876f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1877f3652c97c20265d3410ea75d9817e8323b6df5c8florian case VexArchARM: { 1878f3652c97c20265d3410ea75d9817e8323b6df5c8florian Bool NEON = ((hwcaps & VEX_HWCAPS_ARM_NEON) != 0); 1879f3652c97c20265d3410ea75d9817e8323b6df5c8florian UInt level = VEX_ARM_ARCHLEVEL(hwcaps); 1880f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1881f3652c97c20265d3410ea75d9817e8323b6df5c8florian switch (level) { 1882f3652c97c20265d3410ea75d9817e8323b6df5c8florian case 5: 1883f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (NEON) 1884f3652c97c20265d3410ea75d9817e8323b6df5c8florian invalid_hwcaps(arch, hwcaps, 1885f3652c97c20265d3410ea75d9817e8323b6df5c8florian "NEON instructions are not supported for ARMv5.\n"); 1886f3652c97c20265d3410ea75d9817e8323b6df5c8florian return; 1887f3652c97c20265d3410ea75d9817e8323b6df5c8florian case 6: 1888f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (NEON) 1889f3652c97c20265d3410ea75d9817e8323b6df5c8florian invalid_hwcaps(arch, hwcaps, 1890f3652c97c20265d3410ea75d9817e8323b6df5c8florian "NEON instructions are not supported for ARMv6.\n"); 1891f3652c97c20265d3410ea75d9817e8323b6df5c8florian return; 1892f3652c97c20265d3410ea75d9817e8323b6df5c8florian case 7: 1893f3652c97c20265d3410ea75d9817e8323b6df5c8florian return; 1894f3652c97c20265d3410ea75d9817e8323b6df5c8florian default: 1895f3652c97c20265d3410ea75d9817e8323b6df5c8florian invalid_hwcaps(arch, hwcaps, 1896f3652c97c20265d3410ea75d9817e8323b6df5c8florian "ARM architecture level is not supported.\n"); 1897f3652c97c20265d3410ea75d9817e8323b6df5c8florian } 1898f3652c97c20265d3410ea75d9817e8323b6df5c8florian } 1899f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1900f3652c97c20265d3410ea75d9817e8323b6df5c8florian case VexArchARM64: 1901f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (hwcaps != 0) 1902f3652c97c20265d3410ea75d9817e8323b6df5c8florian invalid_hwcaps(arch, hwcaps, 1903f3652c97c20265d3410ea75d9817e8323b6df5c8florian "Unsupported hardware capabilities.\n"); 1904f3652c97c20265d3410ea75d9817e8323b6df5c8florian return; 1905f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1906f3652c97c20265d3410ea75d9817e8323b6df5c8florian case VexArchS390X: 1907f3652c97c20265d3410ea75d9817e8323b6df5c8florian if (! s390_host_has_ldisp) 1908f3652c97c20265d3410ea75d9817e8323b6df5c8florian invalid_hwcaps(arch, hwcaps, 1909f3652c97c20265d3410ea75d9817e8323b6df5c8florian "Host does not have long displacement facility.\n"); 1910f3652c97c20265d3410ea75d9817e8323b6df5c8florian return; 1911f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1912f3652c97c20265d3410ea75d9817e8323b6df5c8florian case VexArchMIPS32: 1913f3652c97c20265d3410ea75d9817e8323b6df5c8florian switch (VEX_MIPS_COMP_ID(hwcaps)) { 1914f3652c97c20265d3410ea75d9817e8323b6df5c8florian case VEX_PRID_COMP_MIPS: 1915f3652c97c20265d3410ea75d9817e8323b6df5c8florian case VEX_PRID_COMP_BROADCOM: 1916f3652c97c20265d3410ea75d9817e8323b6df5c8florian case VEX_PRID_COMP_NETLOGIC: 1917f3652c97c20265d3410ea75d9817e8323b6df5c8florian return; 1918f3652c97c20265d3410ea75d9817e8323b6df5c8florian default: 1919f3652c97c20265d3410ea75d9817e8323b6df5c8florian invalid_hwcaps(arch, hwcaps, "Unsupported baseline\n"); 1920f3652c97c20265d3410ea75d9817e8323b6df5c8florian } 1921f3652c97c20265d3410ea75d9817e8323b6df5c8florian 1922f3652c97c20265d3410ea75d9817e8323b6df5c8florian case VexArchMIPS64: 1923f3652c97c20265d3410ea75d9817e8323b6df5c8florian return; 1924f3652c97c20265d3410ea75d9817e8323b6df5c8florian 19250de80192f57cd132b31b233c65734de04939ce65sewardj case VexArchTILEGX: 19260de80192f57cd132b31b233c65734de04939ce65sewardj return; 19270de80192f57cd132b31b233c65734de04939ce65sewardj 1928f3652c97c20265d3410ea75d9817e8323b6df5c8florian default: 1929f3652c97c20265d3410ea75d9817e8323b6df5c8florian vpanic("unknown architecture"); 1930dc6e7479625706946f1c5a0a699141930a245fdfflorian } 19315117ce116f47141cb23d1b49cc826e19323add97sewardj} 19325117ce116f47141cb23d1b49cc826e19323add97sewardj 19335117ce116f47141cb23d1b49cc826e19323add97sewardj 193435421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---------------------------------------------------------------*/ 1935cef7d3e3df4796e35b4521158d9dc058f034aa87sewardj/*--- end main_main.c ---*/ 193635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---------------------------------------------------------------*/ 1937