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