1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- begin                                          libvex.h ---*/
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This file is part of Valgrind, a dynamic binary instrumentation
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   framework.
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Copyright (C) 2004-2011 OpenWorks LLP
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      info@open-works.net
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is free software; you can redistribute it and/or
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   modify it under the terms of the GNU General Public License as
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   published by the Free Software Foundation; either version 2 of the
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   License, or (at your option) any later version.
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is distributed in the hope that it will be useful, but
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   WITHOUT ANY WARRANTY; without even the implied warranty of
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   General Public License for more details.
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   You should have received a copy of the GNU General Public License
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   along with this program; if not, write to the Free Software
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   02110-1301, USA.
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The GNU General Public License is contained in the file COPYING.
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Neither the names of the U.S. Department of Energy nor the
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   University of California nor the names of its contributors may be
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   used to endorse or promote products derived from this software
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   without prior written permission.
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __LIBVEX_H
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __LIBVEX_H
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "libvex_basictypes.h"
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "libvex_ir.h"
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- This file defines the top-level interface to LibVEX.    ---*/
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Architectures, variants, and other arch info    ---*/
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VexArch_INVALID,
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VexArchX86,
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VexArchAMD64,
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VexArchARM,
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VexArchPPC32,
59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VexArchPPC64,
60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      VexArchS390X
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VexArch;
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* For a given architecture, these specify extra capabilities beyond
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the minimum supported (baseline) capabilities.  They may be OR'd
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   together, although some combinations don't make sense.  (eg, SSE2
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   but not SSE1).  LibVEX_Translate will check for nonsensical
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   combinations. */
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* x86: baseline capability is Pentium-1 (FPU, MMX, but no SSE), with
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   cmpxchg8b. */
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_X86_SSE1    (1<<1)  /* SSE1 support (Pentium III) */
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_X86_SSE2    (1<<2)  /* SSE2 support (Pentium 4) */
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_X86_SSE3    (1<<3)  /* SSE3 support (>= Prescott) */
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_X86_LZCNT   (1<<4)  /* SSE4a LZCNT insn */
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* amd64: baseline capability is SSE2, with cmpxchg8b but not
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   cmpxchg16b. */
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_AMD64_SSE3  (1<<5)  /* SSE3 support */
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_AMD64_CX16  (1<<6)  /* cmpxchg16b support */
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_AMD64_LZCNT (1<<7)  /* SSE4a LZCNT insn */
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ppc32: baseline capability is integer only */
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_PPC32_F     (1<<8)  /* basic (non-optional) FP */
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_PPC32_V     (1<<9)  /* Altivec (VMX) */
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_PPC32_FX    (1<<10) /* FP extns (fsqrt, fsqrts) */
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_PPC32_GX    (1<<11) /* Graphics extns
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                          (fres,frsqrte,fsel,stfiwx) */
90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_PPC32_VX    (1<<12) /* Vector-scalar floating-point (VSX); implies ISA 2.06 or higher  */
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ppc64: baseline capability is integer and basic FP insns */
93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_PPC64_V     (1<<13) /* Altivec (VMX) */
94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_PPC64_FX    (1<<14) /* FP extns (fsqrt, fsqrts) */
95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_PPC64_GX    (1<<15) /* Graphics extns
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                          (fres,frsqrte,fsel,stfiwx) */
97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_PPC64_VX    (1<<16) /* Vector-scalar floating-point (VSX); implies ISA 2.06 or higher  */
98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* s390x: Hardware capability encoding
100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   Bits    Information
102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   [26:31] Machine model
103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   [25]    Long displacement facility
104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   [24]    Extended-immediate facility
105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   [23]    General-instruction-extension facility
106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   [22]    Decimal floating point facility
107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   [21]    FPR-GR transfer facility
108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   [0:20]  Currently unused; reserved for future use
109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov*/
110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Model numbers must be assigned in chronological order.
112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   They are used as array index. */
113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_Z900     0
114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_Z800     1
115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_Z990     2
116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_Z890     3
117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_Z9_EC    4
118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_Z9_BC    5
119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_Z10_EC   6
120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_Z10_BC   7
121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_Z196     8
122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_Z114     9
123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_INVALID  10
124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL_MASK     0x3F
125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_S390X_LDISP (1<<6)   /* Long-displacement facility */
127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_S390X_EIMM  (1<<7)   /* Extended-immediate facility */
128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_S390X_GIE   (1<<8)   /* General-instruction-extension facility */
129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_S390X_DFP   (1<<9)   /* Decimal floating point facility */
130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_S390X_FGX   (1<<10)  /* FPR-GR transfer facility */
131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Special value representing all available s390x hwcaps */
133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_S390X_ALL   (VEX_HWCAPS_S390X_LDISP | \
134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                VEX_HWCAPS_S390X_EIMM  | \
135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                VEX_HWCAPS_S390X_GIE   | \
136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                VEX_HWCAPS_S390X_DFP   | \
137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                VEX_HWCAPS_S390X_FGX)
138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_HWCAPS_S390X(x)  ((x) & ~VEX_S390X_MODEL_MASK)
140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define VEX_S390X_MODEL(x)   ((x) &  VEX_S390X_MODEL_MASK)
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* arm: baseline capability is ARMv4 */
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Bits 5:0 - architecture level (e.g. 5 for v5, 6 for v6 etc) */
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_ARM_VFP    (1<<6)  /* VFP extension */
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_ARM_VFP2   (1<<7)  /* VFPv2 */
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_ARM_VFP3   (1<<8)  /* VFPv3 */
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Bits 15:10 reserved for (possible) future VFP revisions */
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_HWCAPS_ARM_NEON   (1<<16) /* Advanced SIMD also known as NEON */
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Get an ARM architecure level from HWCAPS */
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEX_ARM_ARCHLEVEL(x) ((x) & 0x3f)
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* These return statically allocated strings. */
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern const HChar* LibVEX_ppVexArch    ( VexArch );
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern const HChar* LibVEX_ppVexHwCaps  ( VexArch, UInt );
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* This struct is a bit of a hack, but is needed to carry misc
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   important bits of info about an arch.  Fields which are meaningless
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   or ignored for the platform in question should be set to zero. */
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* This is the only mandatory field. */
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt hwcaps;
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* PPC32/PPC64 only: size of cache line */
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int ppc_cache_line_szB;
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* PPC32/PPC64 only: sizes zeroed by the dcbz/dcbzl instructions
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown       * (bug#135264) */
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt ppc_dcbz_szB;
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt ppc_dcbzl_szB; /* 0 means unsupported (SIGILL) */
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VexArchInfo;
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Write default settings info *vai. */
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid LibVEX_default_VexArchInfo ( /*OUT*/VexArchInfo* vai );
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* This struct carries guest and host ABI variant information that may
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   be needed.  Fields which are meaningless or ignored for the
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   platform in question should be set to zero.
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Settings which are believed to be correct are:
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   guest_stack_redzone_size
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is ppc32-linux                ==> 0
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is ppc64-linux                ==> 288
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is ppc32-aix5                 ==> 220
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is ppc64-aix5                 ==> unknown
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is amd64-linux                ==> 128
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is other                      ==> inapplicable
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   guest_amd64_assume_fs_is_zero
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is amd64-linux                ==> True
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is amd64-darwin               ==> False
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is other                      ==> inapplicable
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   guest_amd64_assume_gs_is_0x60
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is amd64-darwin               ==> True
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is amd64-linux                ==> False
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is other                      ==> inapplicable
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   guest_ppc_zap_RZ_at_blr
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is ppc64-linux                ==> True
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is ppc32-linux                ==> False
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is ppc64-aix5                 ==> unknown
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is ppc32-aix5                 ==> False
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is other                      ==> inapplicable
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   guest_ppc_zap_RZ_at_bl
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is ppc64-linux                ==> const True
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is ppc32-linux                ==> const False
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is ppc64-aix5                 ==> unknown
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is ppc32-aix5                 ==> True except for calls to
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                              millicode, $SAVEFn, $RESTFn
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is other                      ==> inapplicable
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   guest_ppc_sc_continues_at_LR:
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is ppc32-aix5  or ppc64-aix5  ==> True
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is ppc32-linux or ppc64-linux ==> False
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      guest is other                      ==> inapplicable
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   host_ppc_calls_use_fndescrs:
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      host is ppc32-linux                 ==> False
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      host is ppc64-linux                 ==> True
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      host is ppc32-aix5 or ppc64-aix5    ==> True
229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      host is other                       ==> inapplicable
230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   host_ppc32_regalign_int64_args:
232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      host is ppc32-linux                 ==> True
233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      host is ppc32-aix5                  ==> False
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      host is other                       ==> inapplicable
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* PPC and AMD64 GUESTS only: how many bytes below the
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         stack pointer are validly addressible? */
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int guest_stack_redzone_size;
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* AMD64 GUESTS only: should we translate %fs-prefixed
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         instructions using the assumption that %fs always contains
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         zero? */
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool guest_amd64_assume_fs_is_zero;
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* AMD64 GUESTS only: should we translate %gs-prefixed
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         instructions using the assumption that %gs always contains
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         0x60? */
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool guest_amd64_assume_gs_is_0x60;
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* PPC GUESTS only: should we zap the stack red zone at a 'blr'
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (function return) ? */
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool guest_ppc_zap_RZ_at_blr;
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* PPC GUESTS only: should we zap the stack red zone at a 'bl'
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (function call) ?  Is supplied with the guest address of the
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         target of the call since that may be significant.  If NULL,
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         is assumed equivalent to a fn which always returns False. */
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool (*guest_ppc_zap_RZ_at_bl)(Addr64);
262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* PPC32/PPC64 GUESTS only: where does the kernel resume after
264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         'sc'?  False => Linux style, at the next insn.  True => AIX
265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         style, at the address stated in the link register. */
266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool guest_ppc_sc_continues_at_LR;
267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* PPC32/PPC64 HOSTS only: does '&f' give us a pointer to a
269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         function descriptor on the host, or to the function code
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         itself?  True => descriptor, False => code. */
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool host_ppc_calls_use_fndescrs;
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* PPC32 HOSTS only: when generating code to pass a 64-bit value
274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (actual parameter) in a pair of regs, should we skip an arg
275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         reg if it is even-numbered?  True => yes, False => no. */
276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool host_ppc32_regalign_int64_args;
277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VexAbiInfo;
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Write default settings info *vbi. */
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid LibVEX_default_VexAbiInfo ( /*OUT*/VexAbiInfo* vbi );
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Control of Vex's optimiser (iropt).             ---*/
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Control of Vex's optimiser. */
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Controls verbosity of iropt.  0 = no output. */
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int iropt_verbosity;
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Control aggressiveness of iropt.  0 = no opt, 1 = simple
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         opts, 2 (default) = max optimisation. */
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int iropt_level;
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Ensure all integer registers are up to date at potential
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         memory exception points?  True(default)=yes, False=no, only
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         the guest's stack pointer. */
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool iropt_precise_memory_exns;
302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* How aggressive should iropt be in unrolling loops?  Higher
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         numbers make it more enthusiastic about loop unrolling.
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Default=120.  A setting of zero disables unrolling.  */
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int iropt_unroll_thresh;
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* What's the maximum basic block length the front end(s) allow?
307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         BBs longer than this are split up.  Default=50 (guest
308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         insns). */
309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int guest_max_insns;
310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* How aggressive should front ends be in following
311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         unconditional branches to known destinations?  Default=10,
312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         meaning that if a block contains less than 10 guest insns so
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         far, the front end(s) will attempt to chase into its
314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         successor. A setting of zero disables chasing.  */
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int guest_chase_thresh;
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* EXPERIMENTAL: chase across conditional branches?  Not all
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         front ends honour this.  Default: NO. */
318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool guest_chase_cond;
319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VexControl;
321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Write the default settings into *vcon. */
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid LibVEX_default_VexControl ( /*OUT*/ VexControl* vcon );
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Storage management control                      ---*/
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Allocate in Vex's temporary allocation area.  Be careful with this.
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   You can only call it inside an instrumentation or optimisation
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   callback that you have previously specified in a call to
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LibVEX_Translate.  The storage allocated will only stay alive until
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   translation of the current basic block is complete.
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* private_LibVEX_alloc_first;
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* private_LibVEX_alloc_curr;
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern HChar* private_LibVEX_alloc_last;
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void   private_LibVEX_alloc_OOM(void) __attribute__((noreturn));
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic inline void* LibVEX_Alloc ( Int nbytes )
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  /* Nasty debugging hack, do not use. */
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return malloc(nbytes);
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   HChar* curr;
351ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   HChar* next;
352ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int    ALIGN;
353ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ALIGN  = sizeof(void*)-1;
354ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   nbytes = (nbytes + ALIGN) & ~ALIGN;
355ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   curr   = private_LibVEX_alloc_curr;
356ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   next   = curr + nbytes;
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if (next >= private_LibVEX_alloc_last)
358ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      private_LibVEX_alloc_OOM();
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   private_LibVEX_alloc_curr = next;
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return curr;
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
362ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
363ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
364ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Show Vex allocation statistics. */
365ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void LibVEX_ShowAllocStats ( void );
366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Describing guest state layout                   ---*/
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Describe the guest state enough that the instrumentation
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   functions can work. */
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* The max number of guest state chunks which we can describe as
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   always defined (for the benefit of Memcheck). */
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define VEXGLO_N_ALWAYSDEFD  24
378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Total size of the guest state, in bytes.  Must be
382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         8-aligned. */
383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int total_sizeB;
384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Whereabouts is the stack pointer? */
385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int offset_SP;
386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int sizeof_SP; /* 4 or 8 */
387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Whereabouts is the frame pointer? */
388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int offset_FP;
389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int sizeof_FP; /* 4 or 8 */
390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Whereabouts is the instruction pointer? */
391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int offset_IP;
392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int sizeof_IP; /* 4 or 8 */
393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Describe parts of the guest state regarded as 'always
394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         defined'. */
395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int n_alwaysDefd;
396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      struct {
397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Int offset;
398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Int size;
399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      } alwaysDefd[VEXGLO_N_ALWAYSDEFD];
400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VexGuestLayout;
402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* A note about guest state layout.
404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LibVEX defines the layout for the guest state, in the file
406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   pub/libvex_guest_<arch>.h.  The struct will have an 16-aligned
407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   size.  Each translated bb is assumed to be entered with a specified
408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   register pointing at such a struct.  Beyond that is two copies of
409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the shadow state area with the same size as the struct.  Beyond
410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   that is a spill area that LibVEX may spill into.  It must have size
411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   LibVEX_N_SPILL_BYTES, and this must be a 16-aligned number.
412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   On entry, the baseblock pointer register must be 16-aligned.
414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   There must be no holes in between the primary guest state, its two
416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   copies, and the spill area.  In short, all 4 areas must have a
417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   16-aligned size and be 16-aligned, and placed back-to-back.
418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define LibVEX_N_SPILL_BYTES 4096
421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/
424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Initialisation of the library                   ---*/
425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/
426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Initialise the library.  You must call this first. */
428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void LibVEX_Init (
430b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* failure exit function */
432b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  if __cplusplus == 1 && __GNUC__ && __GNUC__ <= 3
433b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   /* g++ 3.x doesn't understand attributes on function parameters.
434b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      See #265762. */
435b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  else
436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   __attribute__ ((noreturn))
437b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#  endif
438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   void (*failure_exit) ( void ),
439b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* logging output function */
441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   void (*log_bytes) ( HChar*, Int nbytes ),
442b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* debug paranoia level */
444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Int debuglevel,
445b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Are we supporting valgrind checking? */
447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Bool valgrind_support,
448b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
449ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* Control ... */
450ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /*READONLY*/VexControl* vcon
451ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown);
452ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
453ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
454ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/
455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Make a translation                              ---*/
456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/
457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Describes the outcome of a translation attempt. */
459ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
460b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   struct {
461b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* overall status */
462b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      enum { VexTransOK,
463b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov             VexTransAccessFail, VexTransOutputFull } status;
464b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* The number of extents that have a self-check (0 to 3) */
465b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      UInt n_sc_extents;
466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VexTranslateResult;
468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Describes precisely the pieces of guest code that a translation
471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   covers.  Now that Vex can chase across BB boundaries, the old
472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   scheme of describing a chunk of guest code merely by its start
473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   address and length is inadequate.
474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Hopefully this struct is only 32 bytes long.  Space is important as
476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   clients will have to store one of these for each translation made.
477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Addr64 base[3];
481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UShort len[3];
482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UShort n_used;
483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VexGuestExtents;
485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
486ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
487ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* A structure to carry arguments for LibVEX_Translate.  There are so
488ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   many of them, it seems better to have a structure. */
489ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* IN: The instruction sets we are translating from and to.  And
492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         guest/host misc info. */
493ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VexArch      arch_guest;
494ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VexArchInfo  archinfo_guest;
495ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VexArch      arch_host;
496ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VexArchInfo  archinfo_host;
497ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VexAbiInfo   abiinfo_both;
498ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
499ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* IN: an opaque value which is passed as the first arg to all
500ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         callback functions supplied in this struct.  Vex has no idea
501ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         what's at the other end of this pointer. */
502ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      void*   callback_opaque;
503ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
504ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* IN: the block to translate, and its guest address. */
505ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* where are the actual bytes in the host's address space? */
506ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar*  guest_bytes;
507ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* where do the bytes really come from in the guest's aspace?
508ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         This is the post-redirection guest address.  Not that Vex
509ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         understands anything about redirection; that is all done on
510ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         the Valgrind side. */
511ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Addr64  guest_bytes_addr;
512ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
513ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Is it OK to chase into this guest address?  May not be
514ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 NULL. */
515ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool    (*chase_into_ok) ( /*callback_opaque*/void*, Addr64 );
516ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
517ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* OUT: which bits of guest code actually got translated */
518ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VexGuestExtents* guest_extents;
519ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
520ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* IN: a place to put the resulting code, and its size */
521ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UChar*  host_bytes;
522ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int     host_bytes_size;
523ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* OUT: how much of the output area is used. */
524ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int*    host_bytes_used;
525ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
526ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* IN: optionally, two instrumentation functions.  May be
527ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	 NULL. */
528ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      IRSB*   (*instrument1) ( /*callback_opaque*/void*,
529ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                               IRSB*,
530ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                               VexGuestLayout*,
531ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                               VexGuestExtents*,
532ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                               IRType gWordTy, IRType hWordTy );
533ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      IRSB*   (*instrument2) ( /*callback_opaque*/void*,
534ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                               IRSB*,
535ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                               VexGuestLayout*,
536ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                               VexGuestExtents*,
537ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                               IRType gWordTy, IRType hWordTy );
538ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
539ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      IRSB* (*finaltidy) ( IRSB* );
540ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
541b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* IN: a callback used to ask the caller which of the extents,
542b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         if any, a self check is required for.  Must not be NULL.
543b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         The returned value is a bitmask with a 1 in position i indicating
544b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         that the i'th extent needs a check.  Since there can be at most
545b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         3 extents, the returned values must be between 0 and 7. */
546b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      UInt (*needs_self_check)( /*callback_opaque*/void*,
547b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                                VexGuestExtents* );
548ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
549ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* IN: optionally, a callback which allows the caller to add its
550ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         own IR preamble following the self-check and any other
551ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         VEX-generated preamble, if any.  May be NULL.  If non-NULL,
552ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         the IRSB under construction is handed to this function, which
553ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         presumably adds IR statements to it.  The callback may
554ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         optionally complete the block and direct bb_to_IR not to
555ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         disassemble any instructions into it; this is indicated by
556ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         the callback returning True.
557ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      */
558ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Bool    (*preamble_function)(/*callback_opaque*/void*, IRSB*);
559ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
560ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* IN: debug: trace vex activity at various points */
561ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      Int     traceflags;
562ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
563b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      /* IN: address of the dispatcher entry points.  Describes the
564b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov         places where generated code should jump to at the end of each
565ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         bb.
566ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
567ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         At the end of each translation, the next guest address is
568ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         placed in the host's standard return register (x86: %eax,
569ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         amd64: %rax, ppc32: %r3, ppc64: %r3).  Optionally, the guest
570ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         state pointer register (on host x86: %ebp; amd64: %rbp;
571ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         ppc32/64: r31) may be set to a VEX_TRC_ value to indicate any
572ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         special action required before the next block is run.
573ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
574ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Control is then passed back to the dispatcher (beyond Vex's
575ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         control; caller supplies this) in the following way:
576ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
577ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         - On host archs which lack a link register (x86, amd64), by a
578b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           jump to the host address specified in
579b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           'dispatcher_assisted', if the guest state pointer has been
580b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           changed so as to request some action before the next block
581b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           is run, or 'dispatcher_unassisted' (the fast path), in
582b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           which it is assumed that the guest state pointer is
583b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           unchanged and we wish to continue directly with the next
584b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           translation.  Both of these must be non-NULL.
585ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
586ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         - On host archs which have a link register (ppc32, ppc64), by
587ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           a branch to the link register (which is guaranteed to be
588ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           unchanged from whatever it was at entry to the
589b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           translation).  'dispatch_assisted' and
590b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov           'dispatch_unassisted' must be NULL.
591ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
592ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         The aim is to get back and forth between translations and the
593ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         dispatcher without creating memory traffic to store return
594ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         addresses.
595ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      */
596b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      void* dispatch_unassisted;
597b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      void* dispatch_assisted;
598ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
599ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VexTranslateArgs;
600ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
601ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
602ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern
603ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownVexTranslateResult LibVEX_Translate ( VexTranslateArgs* );
604ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
605ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* A subtlety re interaction between self-checking translations and
606ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   bb-chasing.  The supplied chase_into_ok function should say NO
607ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (False) when presented with any address for which you might want to
608ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   make a self-checking translation.
609ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
610ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   If it doesn't do that, you may end up with Vex chasing from BB #1
611ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   to BB #2 (fine); but if you wanted checking for #2 and not #1, that
612ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   would not be the result.  Therefore chase_into_ok should disallow
613ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   following into #2.  That will force the caller to eventually
614ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   request a new translation starting at #2, at which point Vex will
615ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   correctly observe the make-a-self-check flag.  */
616ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
617ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
618ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/
619ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Show accumulated statistics                     ---*/
620ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/
621ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
622ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void LibVEX_ShowStats ( void );
623ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
624ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
625ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/
626ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Notes                                           ---*/
627ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*-------------------------------------------------------*/
628ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
629ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Code generation conventions that need to be recorded somewhere.
630ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
631ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
632ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   x86
633ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ~~~
634ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Generated code should be entered using a JMP instruction.  On
635ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   entry, %ebp should point to the guest state, and %esp should be a
636ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   valid stack pointer.  The generated code may change %eax, %ebx,
637ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   %ecx, %edx, %esi, %edi, all the FP registers and control state, and
638ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   all the XMM registers.
639ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
640ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   On entry, the FPU control word should be set to 0x027F, and the SSE
641ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   control word (%mxcsr) should be set to 0x1F80.  On exit, they
642ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   should still have those values (after masking off the lowest 6 bits
643ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   of %mxcsr).  If they don't, there is a bug in VEX-generated code.
644ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
645ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Generated code returns to the scheduler using a JMP instruction, to
646ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the address specified in the .dispatch field of VexTranslateArgs.
647ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   %eax (or %eax:%edx, if simulating a 64-bit target) will contain the
648ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   guest address of the next block to execute.  %ebp may be changed
649ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   to a VEX_TRC_ value, otherwise it should be as it was at entry.
650ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
651ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   CRITICAL ISSUES in x86 code generation.  The only known critical
652ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   issue is that the host FPU and SSE state is not properly saved
653ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   across calls to helper functions.  If any helper references any
654ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   such state, it is likely (1) to misbehave itself, since the FP
655ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   stack tags will not be as expected, and (2) after returning to
656ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   generated code, the generated code is likely to go wrong.  This
657ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   really should be fixed.
658ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
659ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   amd64
660ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ~~~~~
661ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Analogous to x86.
662ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
663ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ppc32
664ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ~~~~~
665ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   On entry, guest state pointer is r31.  .dispatch must be NULL.
666ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Control is returned with a branch to the link register.  Generated
667ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   code will not change lr.  At return, r3 holds the next guest addr
668ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (or r3:r4 ?).  r31 may be may be changed to a VEX_TRC_ value,
669ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   otherwise it should be as it was at entry.
670ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
671ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ppc64
672ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ~~~~~
673ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Same as ppc32.
674ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
675ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ALL GUEST ARCHITECTURES
676ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ~~~~~~~~~~~~~~~~~~~~~~~
677ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The guest state must contain two pseudo-registers, guest_TISTART
678ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   and guest_TILEN.  These are used to pass the address of areas of
679ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   guest code, translations of which are to be invalidated, back to
680ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the despatcher.  Both pseudo-regs must have size equal to the guest
681ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   word size.
682ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
683ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The architecture must a third pseudo-register, guest_NRADDR, also
684ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   guest-word-sized.  This is used to record the unredirected guest
685ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   address at the start of a translation whose start has been
686ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   redirected.  By reading this pseudo-register shortly afterwards,
687ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the translation can find out what the corresponding no-redirection
688ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   address was.  Note, this is only set for wrap-style redirects, not
689ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   for replace-style ones.
690ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
691ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* ndef __LIBVEX_H */
692ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
693ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
694ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---                                                libvex.h ---*/
695ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
696