1b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
2b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/*--------------------------------------------------------------------*/
3b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/*--- The core dispatch loop, for jumping to a code address.       ---*/
4b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/*---                                       dispatch-s390x-linux.S ---*/
5b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/*--------------------------------------------------------------------*/
6b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
7b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/*
8b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj  This file is part of Valgrind, a dynamic binary instrumentation
9b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj  framework.
10b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
110f157ddb404bcde7815a1c5bf2d7e41c114f3d73sewardj  Copyright IBM Corp. 2010-2013
120f157ddb404bcde7815a1c5bf2d7e41c114f3d73sewardj  Copyright (C) 2011-2013, Florian Krohm (britzel@acm.org)
13291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
14b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj  This program is free software; you can redistribute it and/or
15b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj  modify it under the terms of the GNU General Public License as
16b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj  published by the Free Software Foundation; either version 2 of the
17b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj  License, or (at your option) any later version.
18b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
19b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj  This program is distributed in the hope that it will be useful, but
20b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj  WITHOUT ANY WARRANTY; without even the implied warranty of
21b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
22b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj  General Public License for more details.
23b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
24b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj  You should have received a copy of the GNU General Public License
25b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj  along with this program; if not, write to the Free Software
26b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
27b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj  02111-1307, USA.
28b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
29b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj  The GNU General Public License is contained in the file COPYING.
30b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj*/
31b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
32b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/* Contributed by Florian Krohm and Christian Borntraeger */
33b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
34b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#include "pub_core_basics_asm.h"
35b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#include "pub_core_dispatch_asm.h"
36b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#include "pub_core_transtab_asm.h"
37b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#include "libvex_guest_offsets.h"
38b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#include "libvex_s390x_common.h"
39b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
40b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#if defined(VGA_s390x)
41b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
42b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/*------------------------------------------------------------*/
43b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/*---                                                      ---*/
44291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*--- The dispatch loop.  VG_(disp_run_translations) is    ---*/
45291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*--- used to run all translations,                        ---*/
46291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*--- including no-redir ones.                             ---*/
47b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/*---                                                      ---*/
48b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/*------------------------------------------------------------*/
49b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
50b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/* Convenience definitions for readability */
51b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#undef  SP
52b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define SP S390_REGNO_STACK_POINTER
53b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
54b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#undef  LR
55b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define LR S390_REGNO_LINK_REGISTER
56b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
57b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/* Location of valgrind's saved FPC register */
58b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#define S390_LOC_SAVED_FPC_V S390_OFFSET_SAVED_FPC_V(SP)
59b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
60ae2405879db67c887006364b501965583b7e397aflorian/* Location of saved R2 register */
61ae2405879db67c887006364b501965583b7e397aflorian#define S390_LOC_SAVED_R2 S390_OFFSET_SAVED_R2(SP)
62ae2405879db67c887006364b501965583b7e397aflorian
63291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
64b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/*----------------------------------------------------*/
65291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*--- Entry and preamble (set everything up)       ---*/
66b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/*----------------------------------------------------*/
67b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
68b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/* signature:
69291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjvoid VG_(disp_run_translations)( UWord* two_words,
70291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                                 void*  guest_state,
71291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                                 Addr   host_addr );
72291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
73291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        Return results are placed in two_words:
74291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
75291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        two_words[0] is set to the TRC
76291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        two_words[1] is set to the address to patch (in case two_words[0] is
77291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                     VG_TRC_CHAIN_ME_TO_{SLOW,FAST}_EP). Otherwise, it is 0.
78b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj*/
79291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .text
80291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .align   4
81291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .globl   VG_(disp_run_translations)
82291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .type    VG_(disp_run_translations), @function
83291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjVG_(disp_run_translations):
84b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
85291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* r2 holds two_words */
86291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* r3 holds pointer to guest_state */
87291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* r4 holds host_addr, i.e. the address of the translation to run */
88b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
89b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj        /* Save gprs   ABI: r6...r13 and r15 */
90291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stmg  %r6,%r15,48(SP)
91b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
92b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj        /* New stack frame */
93291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        aghi  SP,-S390_INNERLOOP_FRAME_SIZE
94b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
95b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj        /* Save fprs:   ABI: f8...f15 */
96291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std   %f8,160+0(SP)
97291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std   %f9,160+8(SP)
98291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std   %f10,160+16(SP)
99291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std   %f11,160+24(SP)
100291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std   %f12,160+32(SP)
101291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std   %f13,160+40(SP)
102291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std   %f14,160+48(SP)
103291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        std   %f15,160+56(SP)
104b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
105b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj        /* Load address of guest state into guest state register (r13) */
106291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lgr   %r13,%r3
107b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
108291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Save R2 on stack. In postamble it will be restored such that the
109291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           return values can be written */
110291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stg   %r2,S390_LOC_SAVED_R2
111291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
112291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Save valgrind's FPC on stack so postamble can restore
113b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj           it later . */
114b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj        stfpc S390_LOC_SAVED_FPC_V
115b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
116b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj        /* Load the FPC the way the client code wants it. I.e. pull the
11743acc078ebabbc5f7df533fe799d2f1c9f9467e5florian           value from the guest state. */
118291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lfpc  OFFSET_s390x_fpc(%r13)
119b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
120291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Jump into the code cache.  Chained translations in
121291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           the code cache run, until for whatever reason, they can't
122291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           continue.  When that happens, the translation in question
123291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           will jump (or call) to one of the continuation points
124291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           VG_(cp_...) below. */
125291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        br    %r4
126b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
127b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
128b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/*----------------------------------------------------*/
129291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*--- Postamble and return to C code.              ---*/
130b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/*----------------------------------------------------*/
131b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
132291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjpostamble:
133291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* At this point, %r0 and %r1 contain two
134291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           words to be returned to the caller.  %r0
135291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           holds a TRC value, and %r1 optionally may
136291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           hold another word (for CHAIN_ME exits, the
137291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           address of the place to patch.) */
138291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
139291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* We're leaving. AMD has some code here to check invariants.
140291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           We don't have (need) that, as we save and restore the FPC register
141291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           whenever we switch between valgrind proper to client code. */
142291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
143291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	/* Restore valgrind's FPC, as client code may have changed it. */
144291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lfpc S390_LOC_SAVED_FPC_V
145291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
146291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Restore %r2 from stack; holds address of two_words */
147291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lg   %r2,S390_LOC_SAVED_R2
148ae2405879db67c887006364b501965583b7e397aflorian
149291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stg  %r0,0(%r2)         /* Store %r0 to two_words[0] */
150291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        stg  %r1,8(%r2)         /* Store %r1 to two_words[1] */
151ae2405879db67c887006364b501965583b7e397aflorian
152291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Restore callee-saved registers... */
153b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
154291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Floating-point regs */
155291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        ld   %f8,160+0(SP)
156291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        ld   %f9,160+8(SP)
157291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        ld   %f10,160+16(SP)
158291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        ld   %f11,160+24(SP)
159291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        ld   %f12,160+32(SP)
160291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        ld   %f13,160+40(SP)
161291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        ld   %f14,160+48(SP)
162291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        ld   %f15,160+56(SP)
163291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
164291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Remove stack frame */
165291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        aghi SP,S390_INNERLOOP_FRAME_SIZE
166291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
167291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* General-purpose regs. This also restores the original link
168291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           register (r14) and stack pointer (r15). */
169291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lmg  %r6,%r15,48(SP)
170b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
171291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Return */
172291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        br   LR
173291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
174291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
175291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*----------------------------------------------------*/
176291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*--- Continuation points                          ---*/
177291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*----------------------------------------------------*/
178b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
179291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/* ------ Chain me to slow entry point ------ */
180291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .global VG_(disp_cp_chain_me_to_slowEP)
181291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjVG_(disp_cp_chain_me_to_slowEP):
1824b504154da1e14d08b8da51b210e971fc73f5f62florian        /* When we come here %r1 contains the address of the place to patch.
1834b504154da1e14d08b8da51b210e971fc73f5f62florian           The return values (TRC, address-to-patch) are stored here in
1844b504154da1e14d08b8da51b210e971fc73f5f62florian           %r0 and %r1, respectively */
185291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lghi    %r0,VG_TRC_CHAIN_ME_TO_SLOW_EP
186291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        j       postamble
187291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
188291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
189291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/* ------ Chain me to fast entry point ------ */
190291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .global VG_(disp_cp_chain_me_to_fastEP)
191291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjVG_(disp_cp_chain_me_to_fastEP):
192291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* Identical to VG_(disp_cp_chain_me_to_slowEP), except value of %r0. */
193291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lghi    %r0,VG_TRC_CHAIN_ME_TO_FAST_EP
194291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        j       postamble
195291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
196291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
197291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/* ------ Indirect but boring jump ------ */
198291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .global VG_(disp_cp_xindir)
199291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjVG_(disp_cp_xindir):
200291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj	/* Where are we going? */
201291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lg      %r2, OFFSET_s390x_IA(%r13)
202291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
2036e0015a333bf07b2fc34008c7e2ab8e4023ba4a5florian        /* Increment VG_(stats__n_xindirs_32) */
2046e0015a333bf07b2fc34008c7e2ab8e4023ba4a5florian        larl    %r8, VG_(stats__n_xindirs_32)
2056e0015a333bf07b2fc34008c7e2ab8e4023ba4a5florian        l       %r10,0(%r8)
2066e0015a333bf07b2fc34008c7e2ab8e4023ba4a5florian        ahi     %r10,1
2076e0015a333bf07b2fc34008c7e2ab8e4023ba4a5florian        st      %r10,0(%r8)
208b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
209b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj	/* Try a fast lookup in the translation cache:
210b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj           Compute offset (not index) into VT_(tt_fast):
211b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
212b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj           offset = VG_TT_FAST_HASH(addr) * sizeof(FastCacheEntry)
213b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
214b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj           with VG_TT_FAST_HASH(addr) == (addr >> 1) & VG_TT_FAST_MASK
215b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj           and  sizeof(FastCacheEntry) == 16
216b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
217b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj           offset = ((addr >> 1) & VG_TT_FAST_MASK) << 4
21821f8bcf6850734ebdf773f5f6a071fa99fb1b765florian           which is
21921f8bcf6850734ebdf773f5f6a071fa99fb1b765florian           offset = ((addr & (VG_TT_FAST_MASK << 1) ) << 3
220b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj        */
221291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        larl    %r8, VG_(tt_fast)
222291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        llill   %r5,(VG_TT_FAST_MASK << 1) & 0xffff
22321f8bcf6850734ebdf773f5f6a071fa99fb1b765florian#if ((( VG_TT_FAST_MASK << 1) & 0xffff0000) >> 16 != 0)
224291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        iilh    %r5,((VG_TT_FAST_MASK << 1) & 0xffff0000) >> 16
22521f8bcf6850734ebdf773f5f6a071fa99fb1b765florian#endif
226291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        ngr     %r5,%r2
227291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        sllg    %r7,%r5,3
228291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lg      %r11, 8(%r8,%r7)      /* .host */
229291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        cg      %r2,  0(%r8,%r7)      /* next guest address == .guest ? */
230291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        jne     fast_lookup_failed
231291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
232b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj        /* Found a match.  Call .host.
233b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj           r11 is an address. There we will find the instrumented client code.
2346e0015a333bf07b2fc34008c7e2ab8e4023ba4a5florian           That code may modify the guest state register r13. */
235291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        br      %r11
236291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .long   0x0   /* persuade insn decoders not to speculate past here */
237b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
238b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardjfast_lookup_failed:
2396e0015a333bf07b2fc34008c7e2ab8e4023ba4a5florian        /* Increment VG_(stats__n_xindir_misses_32) */
2406e0015a333bf07b2fc34008c7e2ab8e4023ba4a5florian        larl    %r8, VG_(stats__n_xindir_misses_32)
2416e0015a333bf07b2fc34008c7e2ab8e4023ba4a5florian        l       %r10,0(%r8)
2426e0015a333bf07b2fc34008c7e2ab8e4023ba4a5florian        ahi     %r10,1
2436e0015a333bf07b2fc34008c7e2ab8e4023ba4a5florian        st      %r10,0(%r8)
2446e0015a333bf07b2fc34008c7e2ab8e4023ba4a5florian
245291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lghi    %r0,VG_TRC_INNER_FASTMISS
246291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lghi    %r1,0
247291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        j       postamble
248b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
249291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
250291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/* ------ Assisted jump ------ */
251291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .global VG_(disp_cp_xassisted)
252291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjVG_(disp_cp_xassisted):
253291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        /* guest-state-pointer contains the TRC. Put the value into the
254291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj           return register */
255291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lgr     %r0,%r13
256291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lghi    %r1,0
257291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        j       postamble
258b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
259b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
260291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/* ------ Event check failed ------ */
261291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .global VG_(disp_cp_evcheck_fail)
262291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjVG_(disp_cp_evcheck_fail):
263291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lghi    %r0,VG_TRC_INNER_COUNTERZERO
264291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        lghi    %r1,0
265291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        j       postamble
266b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
267b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
268291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .size VG_(disp_run_translations), .-VG_(disp_run_translations)
269b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
270b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/* Let the linker know we don't need an executable stack */
271291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        .section .note.GNU-stack,"",@progbits
272b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
273b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#endif /* VGA_s390x */
274b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
275b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/*--------------------------------------------------------------------*/
276b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/*--- end                                   dispatch-s390x-linux.S ---*/
277b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj/*--------------------------------------------------------------------*/
278