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. */
43DisResult 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. */
57IRExpr* 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. */
66Bool guest_s390x_state_requires_precise_mem_exns ( Int, Int,
67                                                   VexRegisterUpdates );
68
69extern VexGuestLayout s390xGuest_layout;
70
71
72#define S390X_GUEST_OFFSET(x)  offsetof(VexGuestS390XState, x)
73
74/*------------------------------------------------------------*/
75/*--- Helper functions.                                    ---*/
76/*------------------------------------------------------------*/
77void s390x_dirtyhelper_EX(ULong torun);
78ULong s390x_dirtyhelper_STCK(ULong *addr);
79ULong s390x_dirtyhelper_STCKF(ULong *addr);
80ULong s390x_dirtyhelper_STCKE(ULong *addr);
81ULong s390x_dirtyhelper_STFLE(VexGuestS390XState *guest_state, ULong *addr);
82void  s390x_dirtyhelper_CUxy(UChar *addr, ULong data, ULong num_bytes);
83
84ULong s390_do_cu12_cu14_helper1(UInt byte1, UInt etf3_and_m3_is_1);
85ULong s390_do_cu12_helper2(UInt byte1, UInt byte2, UInt byte3, UInt byte4,
86                           ULong stuff);
87ULong s390_do_cu14_helper2(UInt byte1, UInt byte2, UInt byte3, UInt byte4,
88                           ULong stuff);
89ULong s390_do_cu21(UInt srcvalue, UInt low_surrogate);
90ULong s390_do_cu24(UInt srcvalue, UInt low_surrogate);
91ULong s390_do_cu41(UInt srcvalue);
92ULong s390_do_cu42(UInt srcvalue);
93UInt  s390_do_cvb(ULong decimal);
94ULong s390_do_cvd(ULong binary);
95ULong s390_do_ecag(ULong op2addr);
96UInt  s390_do_pfpo(UInt gpr0);
97
98/* The various ways to compute the condition code. */
99enum {
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/*------------------------------------------------------------*/
243UInt s390_calculate_cc(ULong cc_op, ULong cc_dep1, ULong cc_dep2,
244                       ULong cc_ndep);
245UInt 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 */
255extern ULong last_execute_target;
256
257/*---------------------------------------------------------------*/
258/*--- end                                   guest_s390_defs.h ---*/
259/*---------------------------------------------------------------*/
260
261#endif /* __VEX_GUEST_S390_DEFS_H */
262