1 /* -*- mode: C; c-basic-offset: 3; -*- */ 2 3 /*---------------------------------------------------------------*/ 4 /*--- begin guest_s390_defs.h ---*/ 5 /*---------------------------------------------------------------*/ 6 7 /* 8 This file is part of Valgrind, a dynamic binary instrumentation 9 framework. 10 11 Copyright IBM Corp. 2010-2017 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 31 /* Contributed by Florian Krohm */ 32 33 #ifndef __VEX_GUEST_S390_DEFS_H 34 #define __VEX_GUEST_S390_DEFS_H 35 36 #include "libvex_basictypes.h" // offsetof 37 #include "guest_generic_bb_to_IR.h" // DisResult 38 #include "libvex_guest_s390x.h" // VexGuestS390XState 39 40 41 /* Convert one s390 insn to IR. See the type DisOneInstrFn in 42 guest_generic_bb_to_IR.h. */ 43 DisResult disInstr_S390 ( IRSB* irbb, 44 Bool (*resteerOkFn) ( void*, Addr ), 45 Bool resteerCisOk, 46 void* callback_opaque, 47 const UChar* guest_code, 48 Long delta, 49 Addr guest_IP, 50 VexArch guest_arch, 51 const VexArchInfo* archinfo, 52 const VexAbiInfo* abiinfo, 53 VexEndness host_endness, 54 Bool sigill_diag ); 55 56 /* Used by the optimiser to specialise calls to helpers. */ 57 IRExpr* guest_s390x_spechelper ( const HChar *function_name, 58 IRExpr **args, 59 IRStmt **precedingStmts, 60 Int n_precedingStmts); 61 62 63 /* Describes to the optimiser which part of the guest state require 64 precise memory exceptions. This is logically part of the guest 65 state description. */ 66 Bool guest_s390x_state_requires_precise_mem_exns ( Int, Int, 67 VexRegisterUpdates ); 68 69 extern VexGuestLayout s390xGuest_layout; 70 71 72 #define S390X_GUEST_OFFSET(x) offsetof(VexGuestS390XState, x) 73 74 /*------------------------------------------------------------*/ 75 /*--- Helper functions. ---*/ 76 /*------------------------------------------------------------*/ 77 void s390x_dirtyhelper_EX(ULong torun); 78 ULong s390x_dirtyhelper_STCK(ULong *addr); 79 ULong s390x_dirtyhelper_STCKF(ULong *addr); 80 ULong s390x_dirtyhelper_STCKE(ULong *addr); 81 ULong s390x_dirtyhelper_STFLE(VexGuestS390XState *guest_state, ULong *addr); 82 void s390x_dirtyhelper_CUxy(UChar *addr, ULong data, ULong num_bytes); 83 84 ULong s390_do_cu12_cu14_helper1(UInt byte1, UInt etf3_and_m3_is_1); 85 ULong s390_do_cu12_helper2(UInt byte1, UInt byte2, UInt byte3, UInt byte4, 86 ULong stuff); 87 ULong s390_do_cu14_helper2(UInt byte1, UInt byte2, UInt byte3, UInt byte4, 88 ULong stuff); 89 ULong s390_do_cu21(UInt srcvalue, UInt low_surrogate); 90 ULong s390_do_cu24(UInt srcvalue, UInt low_surrogate); 91 ULong s390_do_cu41(UInt srcvalue); 92 ULong s390_do_cu42(UInt srcvalue); 93 UInt s390_do_cvb(ULong decimal); 94 ULong s390_do_cvd(ULong binary); 95 ULong s390_do_ecag(ULong op2addr); 96 UInt s390_do_pfpo(UInt gpr0); 97 98 /* The various ways to compute the condition code. */ 99 enum { 100 S390_CC_OP_BITWISE = 0, 101 S390_CC_OP_SIGNED_COMPARE = 1, 102 S390_CC_OP_UNSIGNED_COMPARE = 2, 103 S390_CC_OP_SIGNED_ADD_32 = 3, 104 S390_CC_OP_SIGNED_ADD_64 = 4, 105 S390_CC_OP_UNSIGNED_ADD_32 = 5, 106 S390_CC_OP_UNSIGNED_ADD_64 = 6, 107 S390_CC_OP_UNSIGNED_ADDC_32 = 7, 108 S390_CC_OP_UNSIGNED_ADDC_64 = 8, 109 S390_CC_OP_SIGNED_SUB_32 = 9, 110 S390_CC_OP_SIGNED_SUB_64 = 10, 111 S390_CC_OP_UNSIGNED_SUB_32 = 11, 112 S390_CC_OP_UNSIGNED_SUB_64 = 12, 113 S390_CC_OP_UNSIGNED_SUBB_32 = 13, 114 S390_CC_OP_UNSIGNED_SUBB_64 = 14, 115 S390_CC_OP_LOAD_AND_TEST = 15, 116 S390_CC_OP_LOAD_POSITIVE_32 = 16, 117 S390_CC_OP_LOAD_POSITIVE_64 = 17, 118 S390_CC_OP_TEST_UNDER_MASK_8 = 18, 119 S390_CC_OP_TEST_UNDER_MASK_16 = 19, 120 S390_CC_OP_SHIFT_LEFT_32 = 20, 121 S390_CC_OP_SHIFT_LEFT_64 = 21, 122 S390_CC_OP_INSERT_CHAR_MASK_32 = 22, 123 S390_CC_OP_BFP_RESULT_32 = 23, 124 S390_CC_OP_BFP_RESULT_64 = 24, 125 S390_CC_OP_BFP_RESULT_128 = 25, 126 S390_CC_OP_BFP_32_TO_INT_32 = 26, 127 S390_CC_OP_BFP_64_TO_INT_32 = 27, 128 S390_CC_OP_BFP_128_TO_INT_32 = 28, 129 S390_CC_OP_BFP_32_TO_INT_64 = 29, 130 S390_CC_OP_BFP_64_TO_INT_64 = 30, 131 S390_CC_OP_BFP_128_TO_INT_64 = 31, 132 S390_CC_OP_BFP_TDC_32 = 32, 133 S390_CC_OP_BFP_TDC_64 = 33, 134 S390_CC_OP_BFP_TDC_128 = 34, 135 S390_CC_OP_SET = 35, 136 S390_CC_OP_BFP_32_TO_UINT_32 = 36, 137 S390_CC_OP_BFP_64_TO_UINT_32 = 37, 138 S390_CC_OP_BFP_128_TO_UINT_32 = 38, 139 S390_CC_OP_BFP_32_TO_UINT_64 = 39, 140 S390_CC_OP_BFP_64_TO_UINT_64 = 40, 141 S390_CC_OP_BFP_128_TO_UINT_64 = 41, 142 S390_CC_OP_DFP_RESULT_64 = 42, 143 S390_CC_OP_DFP_RESULT_128 = 43, 144 S390_CC_OP_DFP_TDC_32 = 44, 145 S390_CC_OP_DFP_TDC_64 = 45, 146 S390_CC_OP_DFP_TDC_128 = 46, 147 S390_CC_OP_DFP_TDG_32 = 47, 148 S390_CC_OP_DFP_TDG_64 = 48, 149 S390_CC_OP_DFP_TDG_128 = 49, 150 S390_CC_OP_DFP_64_TO_UINT_32 = 50, 151 S390_CC_OP_DFP_128_TO_UINT_32 = 51, 152 S390_CC_OP_DFP_64_TO_UINT_64 = 52, 153 S390_CC_OP_DFP_128_TO_UINT_64 = 53, 154 S390_CC_OP_DFP_64_TO_INT_32 = 54, 155 S390_CC_OP_DFP_128_TO_INT_32 = 55, 156 S390_CC_OP_DFP_64_TO_INT_64 = 56, 157 S390_CC_OP_DFP_128_TO_INT_64 = 57, 158 S390_CC_OP_PFPO_32 = 58, 159 S390_CC_OP_PFPO_64 = 59, 160 S390_CC_OP_PFPO_128 = 60 161 }; 162 163 /*------------------------------------------------------------*/ 164 /*--- Thunk layout ---*/ 165 /*------------------------------------------------------------*/ 166 167 /* 168 Z -- value is zero extended to 32 / 64 bit 169 S -- value is sign extended to 32 / 64 bit 170 F -- a binary floating point value 171 D -- a decimal floating point value 172 173 +--------------------------------+-----------------------+----------------------+-----------------+ 174 | op | cc_dep1 | cc_dep2 | cc_ndep | 175 +--------------------------------+-----------------------+----------------------+-----------------+ 176 | S390_CC_OP_BITWISE | Z result | | | 177 | S390_CC_OP_SIGNED_COMPARE | S 1st operand | S 2nd operand | | 178 | S390_CC_OP_UNSIGNED_COMPARE | Z 1st operand | Z 2nd operand | | 179 | S390_CC_OP_SIGNED_ADD_32 | S 1st operand | S 2nd operand | | 180 | S390_CC_OP_SIGNED_ADD_64 | S 1st operand | S 2nd operand | | 181 | S390_CC_OP_UNSIGNED_ADD_32 | Z 1st operand | Z 2nd operand | | 182 | S390_CC_OP_UNSIGNED_ADD_64 | Z 1st operand | Z 2nd operand | | 183 | S390_CC_OP_UNSIGNED_ADDC_32 | Z 1st operand | Z 2nd operand | Z carry in | 184 | S390_CC_OP_UNSIGNED_ADDC_64 | Z 1st operand | Z 2nd operand | Z carry in | 185 | S390_CC_OP_SIGNED_SUB_32 | S left operand | S right operand | | 186 | S390_CC_OP_SIGNED_SUB_64 | S left operand | S right operand | | 187 | S390_CC_OP_UNSIGNED_SUB_32 | Z left operand | Z right operand | | 188 | S390_CC_OP_UNSIGNED_SUB_64 | Z left operand | Z right operand | | 189 | S390_CC_OP_UNSIGNED_SUBB_32 | Z left operand | Z right operand | Z borrow in | 190 | S390_CC_OP_UNSIGNED_SUBB_64 | Z left operand | Z right operand | Z borrow in | 191 | S390_CC_OP_LOAD_AND_TEST | S loaded value | | | 192 | S390_CC_OP_LOAD_POSITIVE_32 | S loaded value | | | 193 | S390_CC_OP_LOAD_POSITIVE_64 | S loaded value | | | 194 | S390_CC_OP_TEST_UNDER_MASK_8 | Z tested value | Z mask | | 195 | S390_CC_OP_TEST_UNDER_MASK_16 | Z tested value | Z mask | | 196 | S390_CC_OP_SHIFT_LEFT_32 | Z value to be shifted | Z shift amount | | 197 | S390_CC_OP_SHIFT_LEFT_64 | Z value to be shifted | Z shift amount | | 198 | S390_CC_OP_INSERT_CHAR_MASK_32 | Z result | Z mask | | 199 | S390_CC_OP_BFP_RESULT_32 | F result | | | 200 | S390_CC_OP_BFP_RESULT_64 | F result | | | 201 | S390_CC_OP_BFP_RESULT_128 | F result hi 64 bits | F result low 64 bits | | 202 | S390_CC_OP_BFP_32_TO_INT_32 | F source | Z rounding mode | | 203 | S390_CC_OP_BFP_64_TO_INT_32 | F source | Z rounding mode | | 204 | S390_CC_OP_BFP_128_TO_INT_32 | F source hi 64 bits | F source low 64 bits | Z rounding mode | 205 | S390_CC_OP_BFP_32_TO_INT_64 | F source | Z rounding mode | | 206 | S390_CC_OP_BFP_64_TO_INT_64 | F source | Z rounding mode | | 207 | S390_CC_OP_BFP_128_TO_INT_64 | F source hi 64 bits | F source low 64 bits | Z rounding mode | 208 | S390_CC_OP_BFP_TDC_32 | F value | Z class | | 209 | S390_CC_OP_BFP_TDC_64 | F value | Z class | | 210 | S390_CC_OP_BFP_TDC_128 | F value hi 64 bits | F value low 64 bits | Z class | 211 | S390_CC_OP_SET | Z condition code | | | 212 | S390_CC_OP_BFP_32_TO_UINT_32 | F source | Z rounding mode | | 213 | S390_CC_OP_BFP_64_TO_UINT_32 | F source | Z rounding mode | | 214 | S390_CC_OP_BFP_128_TO_UINT_32 | F source hi 64 bits | F source low 64 bits | Z rounding mode | 215 | S390_CC_OP_BFP_32_TO_UINT_64 | F source | Z rounding mode | | 216 | S390_CC_OP_BFP_64_TO_UINT_64 | F source | Z rounding mode | | 217 | S390_CC_OP_BFP_128_TO_UINT_64 | F source hi 64 bits | F source low 64 bits | Z rounding mode | 218 | S390_CC_OP_DFP_RESULT_64 | D result | | | 219 | S390_CC_OP_DFP_RESULT_128 | D result hi 64 bits | D result low 64 bits | | 220 | S390_CC_OP_DFP_TDC_32 | D value | Z class | | 221 | S390_CC_OP_DFP_TDC_64 | D value | Z class | | 222 | S390_CC_OP_DFP_TDC_128 | D value hi 64 bits | D value low 64 bits | Z class | 223 | S390_CC_OP_DFP_TDG_32 | D value | Z group | | 224 | S390_CC_OP_DFP_TDG_64 | D value | Z group | | 225 | S390_CC_OP_DFP_TDG_128 | D value hi 64 bits | D value low 64 bits | Z group | 226 | S390_CC_OP_DFP_64_TO_UINT_32 | D source | Z rounding mode | | 227 | S390_CC_OP_DFP_128_TO_UINT_32 | D source hi 64 bits | D source low 64 bits | Z rounding mode | 228 | S390_CC_OP_DFP_64_TO_UINT_64 | D source | Z rounding mode | | 229 | S390_CC_OP_DFP_128_TO_UINT_64 | D source hi 64 bits | D source low 64 bits | Z rounding mode | 230 | S390_CC_OP_DFP_64_TO_INT_32 | D source | Z rounding mode | | 231 | S390_CC_OP_DFP_128_TO_INT_32 | D source hi 64 bits | D source low 64 bits | Z rounding mode | 232 | S390_CC_OP_DFP_64_TO_INT_64 | D source | Z rounding mode | | 233 | S390_CC_OP_DFP_128_TO_INT_64 | D source hi 64 bits | D source low 64 bits | Z rounding mode | 234 | S390_CC_OP_PFPO_32 | F|D source | Z GR0 low 32 bits | | 235 | S390_CC_OP_PFPO_64 | F|D source | Z GR0 low 32 bits | | 236 | S390_CC_OP_PFPO_128 | F|D source hi 64 bits | F|D src low 64 bits | Z GR0 low 32 bits | 237 +--------------------------------+-----------------------+----------------------+-----------------+ 238 */ 239 240 /*------------------------------------------------------------*/ 241 /*--- Condition code helpers. ---*/ 242 /*------------------------------------------------------------*/ 243 UInt s390_calculate_cc(ULong cc_op, ULong cc_dep1, ULong cc_dep2, 244 ULong cc_ndep); 245 UInt s390_calculate_cond(ULong mask, ULong op, ULong dep1, ULong dep2, 246 ULong ndep); 247 248 /* Size of special instruction preamble */ 249 #define S390_SPECIAL_OP_PREAMBLE_SIZE 8 250 251 /* Size of special instructions */ 252 #define S390_SPECIAL_OP_SIZE 2 253 254 /* Last target instruction for the EX helper */ 255 extern ULong last_execute_target; 256 257 /*---------------------------------------------------------------*/ 258 /*--- end guest_s390_defs.h ---*/ 259 /*---------------------------------------------------------------*/ 260 261 #endif /* __VEX_GUEST_S390_DEFS_H */ 262