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-2011 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 "libvex_ir.h" // IRSB (needed by bb_to_IR.h) 38 #include "libvex.h" // VexArch (needed by bb_to_IR.h) 39 #include "guest_generic_bb_to_IR.h" // DisResult 40 41 42 /* Convert one s390 insn to IR. See the type DisOneInstrFn in 43 bb_to_IR.h. */ 44 DisResult disInstr_S390 ( IRSB* irbb, 45 Bool put_IP, 46 Bool (*resteerOkFn) ( void*, Addr64 ), 47 Bool resteerCisOk, 48 void* callback_opaque, 49 UChar* guest_code, 50 Long delta, 51 Addr64 guest_IP, 52 VexArch guest_arch, 53 VexArchInfo* archinfo, 54 VexAbiInfo* abiinfo, 55 Bool host_bigendian ); 56 57 /* Used by the optimiser to specialise calls to helpers. */ 58 IRExpr* guest_s390x_spechelper ( HChar *function_name, 59 IRExpr **args, 60 IRStmt **precedingStmts, 61 Int n_precedingStmts); 62 63 64 /* Describes to the optimser which part of the guest state require 65 precise memory exceptions. This is logically part of the guest 66 state description. */ 67 Bool guest_s390x_state_requires_precise_mem_exns ( Int, Int ); 68 69 extern VexGuestLayout s390xGuest_layout; 70 71 72 #define S390X_GUEST_OFFSET(x) offsetof(VexGuestS390XState, x) 73 74 /*------------------------------------------------------------*/ 75 /*--- Dirty Helper functions. ---*/ 76 /*------------------------------------------------------------*/ 77 void s390x_dirtyhelper_00(VexGuestS390XState *guest_state); 78 void s390x_dirtyhelper_EX(ULong torun); 79 ULong s390x_dirtyhelper_STCK(ULong *addr); 80 ULong s390x_dirtyhelper_STCKF(ULong *addr); 81 ULong s390x_dirtyhelper_STCKE(ULong *addr); 82 ULong s390x_dirtyhelper_STFLE(VexGuestS390XState *guest_state, HWord addr); 83 84 /* The various ways to compute the condition code. */ 85 enum { 86 S390_CC_OP_BITWISE = 0, 87 S390_CC_OP_SIGNED_COMPARE = 1, 88 S390_CC_OP_UNSIGNED_COMPARE = 2, 89 S390_CC_OP_SIGNED_ADD_32 = 3, 90 S390_CC_OP_SIGNED_ADD_64 = 4, 91 S390_CC_OP_UNSIGNED_ADD_32 = 5, 92 S390_CC_OP_UNSIGNED_ADD_64 = 6, 93 S390_CC_OP_UNSIGNED_ADDC_32 = 7, 94 S390_CC_OP_UNSIGNED_ADDC_64 = 8, 95 S390_CC_OP_SIGNED_SUB_32 = 9, 96 S390_CC_OP_SIGNED_SUB_64 = 10, 97 S390_CC_OP_UNSIGNED_SUB_32 = 11, 98 S390_CC_OP_UNSIGNED_SUB_64 = 12, 99 S390_CC_OP_UNSIGNED_SUBB_32 = 13, 100 S390_CC_OP_UNSIGNED_SUBB_64 = 14, 101 S390_CC_OP_LOAD_AND_TEST = 15, 102 S390_CC_OP_LOAD_POSITIVE_32 = 16, 103 S390_CC_OP_LOAD_POSITIVE_64 = 17, 104 S390_CC_OP_TEST_AND_SET = 18, 105 S390_CC_OP_TEST_UNDER_MASK_8 = 19, 106 S390_CC_OP_TEST_UNDER_MASK_16 = 20, 107 S390_CC_OP_SHIFT_LEFT_32 = 21, 108 S390_CC_OP_SHIFT_LEFT_64 = 22, 109 S390_CC_OP_INSERT_CHAR_MASK_32 = 23, 110 S390_CC_OP_BFP_RESULT_32 = 24, 111 S390_CC_OP_BFP_RESULT_64 = 25, 112 S390_CC_OP_BFP_RESULT_128 = 26, 113 S390_CC_OP_BFP_32_TO_INT_32 = 27, 114 S390_CC_OP_BFP_64_TO_INT_32 = 28, 115 S390_CC_OP_BFP_128_TO_INT_32 = 29, 116 S390_CC_OP_BFP_32_TO_INT_64 = 30, 117 S390_CC_OP_BFP_64_TO_INT_64 = 31, 118 S390_CC_OP_BFP_128_TO_INT_64 = 32, 119 S390_CC_OP_BFP_TDC_32 = 33, 120 S390_CC_OP_BFP_TDC_64 = 34, 121 S390_CC_OP_BFP_TDC_128 = 35, 122 S390_CC_OP_SET = 36 123 }; 124 125 /*------------------------------------------------------------*/ 126 /*--- Thunk layout ---*/ 127 /*------------------------------------------------------------*/ 128 129 /* 130 Z -- value is zero extended to 32 / 64 bit 131 S -- value is sign extended to 32 / 64 bit 132 F -- a binary floating point value 133 134 +--------------------------------+-----------------------+----------------------+-------------+ 135 | op | cc_dep1 | cc_dep2 | cc_ndep | 136 +--------------------------------+-----------------------+----------------------+-------------+ 137 | S390_CC_OP_BITWISE | Z result | | | 138 | S390_CC_OP_SIGNED_COMPARE | S 1st operand | S 2nd operand | | 139 | S390_CC_OP_UNSIGNED_COMPARE | Z 1st operand | Z 2nd operand | | 140 | S390_CC_OP_SIGNED_ADD_32 | S 1st operand | S 2nd operand | | 141 | S390_CC_OP_SIGNED_ADD_64 | S 1st operand | S 2nd operand | | 142 | S390_CC_OP_UNSIGNED_ADD_32 | Z 1st operand | Z 2nd operand | | 143 | S390_CC_OP_UNSIGNED_ADD_64 | Z 1st operand | Z 2nd operand | | 144 | S390_CC_OP_UNSIGNED_ADDC_32 | Z 1st operand | Z 2nd operand | Z carry in | 145 | S390_CC_OP_UNSIGNED_ADDC_64 | Z 1st operand | Z 2nd operand | Z carry in | 146 | S390_CC_OP_SIGNED_SUB_32 | S left operand | S right operand | | 147 | S390_CC_OP_SIGNED_SUB_64 | S left operand | S right operand | | 148 | S390_CC_OP_UNSIGNED_SUB_32 | Z left operand | Z right operand | | 149 | S390_CC_OP_UNSIGNED_SUB_64 | Z left operand | Z right operand | | 150 | S390_CC_OP_UNSIGNED_SUBB_32 | Z left operand | Z right operand | Z borrow in | 151 | S390_CC_OP_UNSIGNED_SUBB_64 | Z left operand | Z right operand | Z borrow in | 152 | S390_CC_OP_LOAD_AND_TEST | S loaded value | | | 153 | S390_CC_OP_LOAD_POSITIVE_32 | S loaded value | | | 154 | S390_CC_OP_LOAD_POSITIVE_64 | S loaded value | | | 155 | S390_CC_OP_TEST_AND_SET | Z tested value | | | 156 | S390_CC_OP_TEST_UNDER_MASK_8 | Z tested value | Z mask | | 157 | S390_CC_OP_TEST_UNDER_MASK_16 | Z tested value | Z mask | | 158 | S390_CC_OP_SHIFT_LEFT_32 | Z value to be shifted | Z shift amount | | 159 | S390_CC_OP_SHIFT_LEFT_64 | Z value to be shifted | Z shift amount | | 160 | S390_CC_OP_INSERT_CHAR_MASK_32 | Z result | Z mask | | 161 | S390_CC_OP_BFP_RESULT_32 | F result | | | 162 | S390_CC_OP_BFP_RESULT_64 | F result | | | 163 | S390_CC_OP_BFP_RESULT_128 | F result hi 64 bits | F result low 64 bits | | 164 | S390_CC_OP_BFP_32_TO_INT_32 | F source | | | 165 | S390_CC_OP_BFP_64_TO_INT_32 | F source | | | 166 | S390_CC_OP_BFP_128_TO_INT_32 | F source hi 64 bits | | | 167 | S390_CC_OP_BFP_32_TO_INT_64 | F source | | | 168 | S390_CC_OP_BFP_64_TO_INT_64 | F source | | | 169 | S390_CC_OP_BFP_128_TO_INT_64 | F source hi 64 bits | | | 170 | S390_CC_OP_BFP_TDC_32 | F value | Z class | | 171 | S390_CC_OP_BFP_TDC_64 | F value | Z class | | 172 | S390_CC_OP_BFP_TDC_128 | F value hi 64 bits | F value low 64 bits | Z class | 173 | S390_CC_OP_SET | Z condition code | | | 174 +--------------------------------+-----------------------+----------------------+-------------+ 175 */ 176 177 /*------------------------------------------------------------*/ 178 /*--- Condition code helpers. ---*/ 179 /*------------------------------------------------------------*/ 180 UInt s390_calculate_cc(ULong cc_op, ULong cc_dep1, ULong cc_dep2, 181 ULong cc_ndep); 182 UInt s390_calculate_icc(ULong op, ULong dep1, ULong dep2); 183 UInt s390_calculate_cond(ULong mask, ULong op, ULong dep1, ULong dep2, 184 ULong ndep); 185 186 /* Size of special instruction preamble */ 187 #define S390_SPECIAL_OP_PREAMBLE_SIZE 8 188 189 /* Size of special instructions */ 190 #define S390_SPECIAL_OP_SIZE 2 191 192 /* Last target instruction for the EX helper */ 193 extern ULong last_execute_target; 194 195 /*---------------------------------------------------------------*/ 196 /*--- end guest_s390_defs.h ---*/ 197 /*---------------------------------------------------------------*/ 198 199 #endif /* __VEX_GUEST_S390_DEFS_H */ 200