18eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
28eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*--------------------------------------------------------------------*/
38eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*--- The core dispatch loop, for jumping to a code address.       ---*/
48eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*---                                     dispatch-amd64-solaris.S ---*/
58eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*--------------------------------------------------------------------*/
68eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
78eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*
88eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  This file is part of Valgrind, a dynamic binary instrumentation
98eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  framework.
108eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
11b3a1e4bffbdbbf38304f216af405009868f43628sewardj  Copyright (C) 2000-2015 Julian Seward
128eb8bab992e3998c33770b0cdb16059a8b918a06sewardj     jseward@acm.org
138eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
148eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  This program is free software; you can redistribute it and/or
158eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  modify it under the terms of the GNU General Public License as
168eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  published by the Free Software Foundation; either version 2 of the
178eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  License, or (at your option) any later version.
188eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
198eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  This program is distributed in the hope that it will be useful, but
208eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  WITHOUT ANY WARRANTY; without even the implied warranty of
218eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
228eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  General Public License for more details.
238eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
248eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  You should have received a copy of the GNU General Public License
258eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  along with this program; if not, write to the Free Software
268eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
278eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  02111-1307, USA.
288eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
298eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  The GNU General Public License is contained in the file COPYING.
308eb8bab992e3998c33770b0cdb16059a8b918a06sewardj*/
318eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
323f1d6138db68f2aa74c5d005c3333cbe94788c7bflorian#include "pub_core_basics_asm.h"
333f1d6138db68f2aa74c5d005c3333cbe94788c7bflorian
348eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#if defined(VGP_amd64_solaris)
358eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
368eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#include "pub_core_dispatch_asm.h"
378eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#include "pub_core_transtab_asm.h"
388eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#include "libvex_guest_offsets.h"	/* for OFFSET_amd64_RIP */
398eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
408eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
418eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*------------------------------------------------------------*/
428eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*---                                                      ---*/
438eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*--- The dispatch loop.  VG_(disp_run_translations) is    ---*/
448eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*--- used to run all translations,                        ---*/
458eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*--- including no-redir ones.                             ---*/
468eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*---                                                      ---*/
478eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*------------------------------------------------------------*/
488eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
498eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*----------------------------------------------------*/
508eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*--- Entry and preamble (set everything up)       ---*/
518eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*----------------------------------------------------*/
528eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
538eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/* signature:
548eb8bab992e3998c33770b0cdb16059a8b918a06sewardjvoid VG_(disp_run_translations)( UWord* two_words,
558eb8bab992e3998c33770b0cdb16059a8b918a06sewardj                                 void*  guest_state,
568eb8bab992e3998c33770b0cdb16059a8b918a06sewardj                                 Addr   host_addr );
578eb8bab992e3998c33770b0cdb16059a8b918a06sewardj*/
588eb8bab992e3998c33770b0cdb16059a8b918a06sewardj.text
598eb8bab992e3998c33770b0cdb16059a8b918a06sewardj.globl VG_(disp_run_translations)
608eb8bab992e3998c33770b0cdb16059a8b918a06sewardj.type  VG_(disp_run_translations), @function
618eb8bab992e3998c33770b0cdb16059a8b918a06sewardjVG_(disp_run_translations):
628eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        /* %rdi holds two_words    */
638eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	/* %rsi holds guest_state  */
648eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	/* %rdx holds host_addr    */
658eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
668eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        /* The preamble */
678eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
688eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        /* Save integer registers, since this is a pseudo-function. */
698eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        pushq   %rax
708eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	pushq	%rbx
718eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	pushq	%rcx
728eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        pushq   %rdx
738eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	pushq	%rsi
748eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	pushq	%rbp
758eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	pushq	%r8
768eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	pushq	%r9
778eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	pushq	%r10
788eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	pushq	%r11
798eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	pushq	%r12
808eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	pushq	%r13
818eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	pushq	%r14
828eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	pushq	%r15
838eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        /* %rdi must be saved last */
848eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	pushq	%rdi
858eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
868eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        /* Get the host CPU in the state expected by generated code. */
878eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
888eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	/* set host FPU control word to the default mode expected
898eb8bab992e3998c33770b0cdb16059a8b918a06sewardj           by VEX-generated code.  See comments in libvex.h for
908eb8bab992e3998c33770b0cdb16059a8b918a06sewardj           more info. */
918eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	finit
928eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	pushq	$0x027F
938eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	fldcw	(%rsp)
948eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	addq	$8, %rsp
958eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
968eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	/* set host SSE control word to the default mode expected
978eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	   by VEX-generated code. */
988eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	pushq	$0x1F80
998eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	ldmxcsr	(%rsp)
1008eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	addq	$8, %rsp
1018eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1028eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	/* set dir flag to known value */
1038eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	cld
1048eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1058eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	/* Set up the guest state pointer */
1068eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	movq	%rsi, %rbp
1078eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1088eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        /* and jump into the code cache.  Chained translations in
1098eb8bab992e3998c33770b0cdb16059a8b918a06sewardj           the code cache run, until for whatever reason, they can't
1108eb8bab992e3998c33770b0cdb16059a8b918a06sewardj           continue.  When that happens, the translation in question
1118eb8bab992e3998c33770b0cdb16059a8b918a06sewardj           will jump (or call) to one of the continuation points
1128eb8bab992e3998c33770b0cdb16059a8b918a06sewardj           VG_(cp_...) below. */
1138eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        jmpq    *%rdx
1148eb8bab992e3998c33770b0cdb16059a8b918a06sewardj       	/*NOTREACHED*/
1158eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1168eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*----------------------------------------------------*/
1178eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*--- Postamble and exit.                          ---*/
1188eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*----------------------------------------------------*/
1198eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1208eb8bab992e3998c33770b0cdb16059a8b918a06sewardjpostamble:
1218eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        /* At this point, %rax and %rdx contain two
1228eb8bab992e3998c33770b0cdb16059a8b918a06sewardj           words to be returned to the caller.  %rax
1238eb8bab992e3998c33770b0cdb16059a8b918a06sewardj           holds a TRC value, and %rdx optionally may
1248eb8bab992e3998c33770b0cdb16059a8b918a06sewardj           hold another word (for CHAIN_ME exits, the
1258eb8bab992e3998c33770b0cdb16059a8b918a06sewardj           address of the place to patch.) */
1268eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1278eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	/* We're leaving.  Check that nobody messed with %mxcsr
1288eb8bab992e3998c33770b0cdb16059a8b918a06sewardj           or %fpucw.  We can't mess with %rax or %rdx here as they
1298eb8bab992e3998c33770b0cdb16059a8b918a06sewardj           hold the tentative return values, but any others are OK. */
1308eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#if !defined(ENABLE_INNER)
1318eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        /* This check fails for self-hosting, so skip in that case */
1328eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	pushq	$0
1338eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	fstcw	(%rsp)
1348eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	cmpl	$0x027F, (%rsp)
1358eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	popq	%r15 /* get rid of the word without trashing %rflags */
1368eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	jnz	invariant_violation
1378eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#endif
1388eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	pushq	$0
1398eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	stmxcsr	(%rsp)
1408eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	andl	$0xFFFFFFC0, (%rsp)  /* mask out status flags */
1418eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	cmpl	$0x1F80, (%rsp)
1428eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	popq	%r15
1438eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	jnz	invariant_violation
1448eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	/* otherwise we're OK */
1458eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	jmp	remove_frame
1468eb8bab992e3998c33770b0cdb16059a8b918a06sewardjinvariant_violation:
1478eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	movq	$VG_TRC_INVARIANT_FAILED, %rax
1488eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        movq    $0, %rdx
1498eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1508eb8bab992e3998c33770b0cdb16059a8b918a06sewardjremove_frame:
1518eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        /* Pop %rdi, stash return values */
1528eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	popq	%rdi
1538eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        movq    %rax, 0(%rdi)
1548eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        movq    %rdx, 8(%rdi)
1558eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        /* Now pop everything else */
1568eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	popq	%r15
1578eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	popq	%r14
1588eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	popq	%r13
1598eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	popq	%r12
1608eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	popq	%r11
1618eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	popq	%r10
1628eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	popq	%r9
1638eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	popq	%r8
1648eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	popq	%rbp
1658eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	popq	%rsi
1668eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	popq	%rdx
1678eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	popq	%rcx
1688eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	popq	%rbx
1698eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	popq	%rax
1708eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	ret
1718eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1728eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*----------------------------------------------------*/
1738eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*--- Continuation points                          ---*/
1748eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*----------------------------------------------------*/
1758eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1768eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/* ------ Chain me to slow entry point ------ */
1778eb8bab992e3998c33770b0cdb16059a8b918a06sewardj.global VG_(disp_cp_chain_me_to_slowEP)
1788eb8bab992e3998c33770b0cdb16059a8b918a06sewardjVG_(disp_cp_chain_me_to_slowEP):
1798eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        /* We got called.  The return address indicates
1808eb8bab992e3998c33770b0cdb16059a8b918a06sewardj           where the patching needs to happen.  Collect
1818eb8bab992e3998c33770b0cdb16059a8b918a06sewardj           the return address and, exit back to C land,
1828eb8bab992e3998c33770b0cdb16059a8b918a06sewardj           handing the caller the pair (Chain_me_S, RA) */
1838eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        movq    $VG_TRC_CHAIN_ME_TO_SLOW_EP, %rax
1848eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        popq    %rdx
1858eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        /* 10 = movabsq $VG_(disp_chain_me_to_slowEP), %r11;
1868eb8bab992e3998c33770b0cdb16059a8b918a06sewardj           3  = call *%r11 */
1878eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        subq    $10+3, %rdx
1888eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        jmp     postamble
1898eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1908eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/* ------ Chain me to fast entry point ------ */
1918eb8bab992e3998c33770b0cdb16059a8b918a06sewardj.global VG_(disp_cp_chain_me_to_fastEP)
1928eb8bab992e3998c33770b0cdb16059a8b918a06sewardjVG_(disp_cp_chain_me_to_fastEP):
1938eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        /* We got called.  The return address indicates
1948eb8bab992e3998c33770b0cdb16059a8b918a06sewardj           where the patching needs to happen.  Collect
1958eb8bab992e3998c33770b0cdb16059a8b918a06sewardj           the return address and, exit back to C land,
1968eb8bab992e3998c33770b0cdb16059a8b918a06sewardj           handing the caller the pair (Chain_me_F, RA) */
1978eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        movq    $VG_TRC_CHAIN_ME_TO_FAST_EP, %rax
1988eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        popq    %rdx
1998eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        /* 10 = movabsq $VG_(disp_chain_me_to_fastEP), %r11;
2008eb8bab992e3998c33770b0cdb16059a8b918a06sewardj           3  = call *%r11 */
2018eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        subq    $10+3, %rdx
2028eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        jmp     postamble
2038eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
2048eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/* ------ Indirect but boring jump ------ */
2058eb8bab992e3998c33770b0cdb16059a8b918a06sewardj.global VG_(disp_cp_xindir)
2068eb8bab992e3998c33770b0cdb16059a8b918a06sewardjVG_(disp_cp_xindir):
2078eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	/* Where are we going? */
2088eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	movq	OFFSET_amd64_RIP(%rbp), %rax
2098eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
2108eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        /* stats only */
2118eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        addl    $1, VG_(stats__n_xindirs_32)
2128eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
2138eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	/* try a fast lookup in the translation cache */
2148eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	movabsq $VG_(tt_fast), %rcx
2158eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	movq	%rax, %rbx		/* next guest addr */
2168eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	andq	$VG_TT_FAST_MASK, %rbx	/* entry# */
2178eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	shlq	$4, %rbx		/* entry# * sizeof(FastCacheEntry) */
2188eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	movq	0(%rcx,%rbx,1), %r10	/* .guest */
2198eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	movq	8(%rcx,%rbx,1), %r11	/* .host */
2208eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	cmpq	%rax, %r10
2218eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	jnz	fast_lookup_failed
2228eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
2238eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        /* Found a match.  Jump to .host. */
2248eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	jmp 	*%r11
2258eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	ud2	/* persuade insn decoders not to speculate past here */
2268eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
2278eb8bab992e3998c33770b0cdb16059a8b918a06sewardjfast_lookup_failed:
2288eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        /* stats only */
2298eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        addl    $1, VG_(stats__n_xindir_misses_32)
2308eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
2318eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	movq	$VG_TRC_INNER_FASTMISS, %rax
2328eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        movq    $0, %rdx
2338eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	jmp	postamble
2348eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
2358eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/* ------ Assisted jump ------ */
2368eb8bab992e3998c33770b0cdb16059a8b918a06sewardj.global VG_(disp_cp_xassisted)
2378eb8bab992e3998c33770b0cdb16059a8b918a06sewardjVG_(disp_cp_xassisted):
2388eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        /* %rbp contains the TRC */
2398eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        movq    %rbp, %rax
2408eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        movq    $0, %rdx
2418eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        jmp     postamble
2428eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
2438eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/* ------ Event check failed ------ */
2448eb8bab992e3998c33770b0cdb16059a8b918a06sewardj.global VG_(disp_cp_evcheck_fail)
2458eb8bab992e3998c33770b0cdb16059a8b918a06sewardjVG_(disp_cp_evcheck_fail):
2468eb8bab992e3998c33770b0cdb16059a8b918a06sewardj       	movq	$VG_TRC_INNER_COUNTERZERO, %rax
2478eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        movq    $0, %rdx
2488eb8bab992e3998c33770b0cdb16059a8b918a06sewardj	jmp	postamble
2498eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
2508eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
2518eb8bab992e3998c33770b0cdb16059a8b918a06sewardj.size VG_(disp_run_translations), .-VG_(disp_run_translations)
2528eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
2538eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#endif // defined(VGP_amd64_solaris)
2548eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
2553f1d6138db68f2aa74c5d005c3333cbe94788c7bflorian/* Let the linker know we don't need an executable stack */
2563f1d6138db68f2aa74c5d005c3333cbe94788c7bflorianMARK_STACK_NO_EXEC
2573f1d6138db68f2aa74c5d005c3333cbe94788c7bflorian
2588eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*--------------------------------------------------------------------*/
2598eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*--- end                                                          ---*/
2608eb8bab992e3998c33770b0cdb16059a8b918a06sewardj/*--------------------------------------------------------------------*/
261