1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- The core dispatch loop, for jumping to a code address.       ---*/
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---                                         dispatch-x86-linux.S ---*/
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  This file is part of Valgrind, a dynamic binary instrumentation
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  framework.
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
11663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  Copyright (C) 2000-2012 Julian Seward
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown     jseward@acm.org
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  This program is free software; you can redistribute it and/or
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  modify it under the terms of the GNU General Public License as
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  published by the Free Software Foundation; either version 2 of the
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  License, or (at your option) any later version.
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  This program is distributed in the hope that it will be useful, but
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  WITHOUT ANY WARRANTY; without even the implied warranty of
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  General Public License for more details.
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  You should have received a copy of the GNU General Public License
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  along with this program; if not, write to the Free Software
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  02111-1307, USA.
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  The GNU General Public License is contained in the file COPYING.
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGP_x86_linux)
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_basics_asm.h"
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_dispatch_asm.h"
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_transtab_asm.h"
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "libvex_guest_offsets.h"	/* for OFFSET_x86_EIP */
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---                                                      ---*/
42663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--- The dispatch loop.  VG_(disp_run_translations) is    ---*/
43663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--- used to run all translations,                        ---*/
44663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--- including no-redir ones.                             ---*/
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---                                                      ---*/
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*------------------------------------------------------------*/
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*----------------------------------------------------*/
49663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--- Entry and preamble (set everything up)       ---*/
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*----------------------------------------------------*/
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* signature:
53663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid VG_(disp_run_translations)( UWord* two_words,
54663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 void*  guest_state,
55663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 Addr   host_addr );
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.text
58663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.globl VG_(disp_run_translations)
59663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.type  VG_(disp_run_translations), @function
60663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVG_(disp_run_translations):
61663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        /* 0(%esp) holds our return address. */
62663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	/* 4(%esp) holds two_words */
63663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	/* 8(%esp) holds guest_state */
64663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	/* 12(%esp) holds host_addr */
65663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
66663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        /* The preamble */
67663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
68663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        /* Save integer registers, since this is a pseudo-function. */
69663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        pushl   %eax
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushl	%ebx
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushl	%ecx
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushl	%edx
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushl	%esi
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushl	%edi
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushl	%ebp
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
77663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	/* 28+4(%esp) holds two_words */
78663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	/* 28+8(%esp) holds guest_state */
79663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	/* 28+12(%esp) holds host_addr */
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
81663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        /* Get the host CPU in the state expected by generated code. */
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* set host FPU control word to the default mode expected
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           by VEX-generated code.  See comments in libvex.h for
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown           more info. */
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	finit
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushl	$0x027F
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	fldcw	(%esp)
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addl	$4, %esp
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* set host SSE control word to the default mode expected
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	   by VEX-generated code. */
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpl	$0, VG_(machine_x86_have_mxcsr)
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jz	L1
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushl	$0x1F80
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ldmxcsr	(%esp)
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	addl	$4, %esp
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownL1:
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/* set dir flag to known value */
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cld
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	/* Set up the guest state pointer */
103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	movl	28+8(%esp), %ebp
104663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
105663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        /* and jump into the code cache.  Chained translations in
106663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           the code cache run, until for whatever reason, they can't
107663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           continue.  When that happens, the translation in question
108663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           will jump (or call) to one of the continuation points
109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           VG_(cp_...) below. */
110663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        jmpl    *28+12(%esp)
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	/*NOTREACHED*/
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*----------------------------------------------------*/
114663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--- Postamble and exit.                          ---*/
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*----------------------------------------------------*/
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengpostamble:
118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        /* At this point, %eax and %edx contain two
119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           words to be returned to the caller.  %eax
120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           holds a TRC value, and %edx optionally may
121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           hold another word (for CHAIN_ME exits, the
122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           address of the place to patch.) */
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
124663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	/* We're leaving.  Check that nobody messed with %mxcsr
125663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           or %fpucw.  We can't mess with %eax or %edx here as they
126663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	   holds the tentative return value, but any others are OK. */
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if !defined(ENABLE_INNER)
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown        /* This check fails for self-hosting, so skip in that case */
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushl	$0
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	fstcw	(%esp)
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpl	$0x027F, (%esp)
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	popl	%esi /* get rid of the word without trashing %eflags */
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jnz	invariant_violation
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
135663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#	cmpl	$0, VG_(machine_x86_have_mxcsr)
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jz	L2
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	pushl	$0
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	stmxcsr	(%esp)
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	andl	$0xFFFFFFC0, (%esp)  /* mask out status flags */
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	cmpl	$0x1F80, (%esp)
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	popl	%esi
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	jnz	invariant_violation
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownL2:	/* otherwise we're OK */
144663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	jmp	remove_frame
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browninvariant_violation:
146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	movl	$VG_TRC_INVARIANT_FAILED, %eax
147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        movl    $0, %edx
148663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengremove_frame:
150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        /* Stash return values */
151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        movl    28+4(%esp), %edi        /* two_words */
152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        movl    %eax, 0(%edi)
153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        movl    %edx, 4(%edi)
154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        /* Restore int regs and return. */
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	popl	%ebp
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	popl	%edi
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	popl	%esi
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	popl	%edx
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	popl	%ecx
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	popl	%ebx
161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	popl	%eax
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	ret
163663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*----------------------------------------------------*/
165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--- Continuation points                          ---*/
166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*----------------------------------------------------*/
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* ------ Chain me to slow entry point ------ */
169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.global VG_(disp_cp_chain_me_to_slowEP)
170663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVG_(disp_cp_chain_me_to_slowEP):
171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        /* We got called.  The return address indicates
172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           where the patching needs to happen.  Collect
173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           the return address and, exit back to C land,
174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           handing the caller the pair (Chain_me_S, RA) */
175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        movl    $VG_TRC_CHAIN_ME_TO_SLOW_EP, %eax
176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        popl    %edx
177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        /* 5 = movl $VG_(disp_chain_me_to_slowEP), %edx;
178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           2 = call *%edx */
179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        subl    $5+2, %edx
180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        jmp     postamble
181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* ------ Chain me to fast entry point ------ */
183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.global VG_(disp_cp_chain_me_to_fastEP)
184663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVG_(disp_cp_chain_me_to_fastEP):
185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        /* We got called.  The return address indicates
186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           where the patching needs to happen.  Collect
187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           the return address and, exit back to C land,
188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           handing the caller the pair (Chain_me_F, RA) */
189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        movl    $VG_TRC_CHAIN_ME_TO_FAST_EP, %eax
190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        popl    %edx
191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        /* 5 = movl $VG_(disp_chain_me_to_fastEP), %edx;
192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng           2 = call *%edx */
193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        subl    $5+2, %edx
194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        jmp     postamble
195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* ------ Indirect but boring jump ------ */
197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.global VG_(disp_cp_xindir)
198663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVG_(disp_cp_xindir):
199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	/* Where are we going? */
200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	movl	OFFSET_x86_EIP(%ebp), %eax
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        /* stats only */
203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        addl    $1, VG_(stats__n_xindirs_32)
204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        /* try a fast lookup in the translation cache */
206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        movl    %eax, %ebx                      /* next guest addr */
207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        andl    $VG_TT_FAST_MASK, %ebx          /* entry# */
208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        movl    0+VG_(tt_fast)(,%ebx,8), %esi   /* .guest */
209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        movl    4+VG_(tt_fast)(,%ebx,8), %edi   /* .host */
210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        cmpl    %eax, %esi
211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        jnz     fast_lookup_failed
212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        /* Found a match.  Jump to .host. */
214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	jmp 	*%edi
215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	ud2	/* persuade insn decoders not to speculate past here */
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengfast_lookup_failed:
218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        /* stats only */
219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        addl    $1, VG_(stats__n_xindir_misses_32)
220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	movl	$VG_TRC_INNER_FASTMISS, %eax
222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        movl    $0, %edx
223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	jmp	postamble
224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* ------ Assisted jump ------ */
226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.global VG_(disp_cp_xassisted)
227663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVG_(disp_cp_xassisted):
228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        /* %ebp contains the TRC */
229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        movl    %ebp, %eax
230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        movl    $0, %edx
231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        jmp     postamble
232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* ------ Event check failed ------ */
234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.global VG_(disp_cp_evcheck_fail)
235663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengVG_(disp_cp_evcheck_fail):
236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       	movl	$VG_TRC_INNER_COUNTERZERO, %eax
237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        movl    $0, %edx
238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng	jmp	postamble
239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng.size VG_(disp_run_translations), .-VG_(disp_run_translations)
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Let the linker know we don't need an executable stack */
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown.section .note.GNU-stack,"",@progbits
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // defined(VGP_x86_linux)
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end                                                          ---*/
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
251