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