]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/valgrind/src/valgrind-3.6.0-svn/VEX/priv/guest_s390_defs.h
update
[l4.git] / l4 / pkg / valgrind / src / valgrind-3.6.0-svn / VEX / priv / guest_s390_defs.h
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"
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 /* Convert one s390 insn to IR.  See the type DisOneInstrFn in
42    bb_to_IR.h. */
43 extern
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 extern
59 IRExpr* guest_s390x_spechelper ( HChar   *function_name,
60                                  IRExpr **args,
61                                  IRStmt **precedingStmts,
62                                  Int n_precedingStmts);
63
64
65 /* Describes to the optimser which part of the guest state require
66    precise memory exceptions.  This is logically part of the guest
67    state description. */
68 extern
69 Bool guest_s390x_state_requires_precise_mem_exns ( Int, Int );
70
71 extern
72 VexGuestLayout s390xGuest_layout;
73
74
75 UInt s390_decode_and_irgen(UChar *, UInt, DisResult *);
76
77 #define S390_GUEST_OFFSET(x)  offsetof(VexGuestS390XState, x)
78
79 /*------------------------------------------------------------*/
80 /*--- Dirty Helper functions.                              ---*/
81 /*------------------------------------------------------------*/
82 void s390x_dirtyhelper_EX(ULong torun);
83 ULong s390x_dirtyhelper_STCK(ULong *addr);
84 ULong s390x_dirtyhelper_STCKF(ULong *addr);
85 ULong s390x_dirtyhelper_STCKE(ULong *addr);
86
87 /*------------------------------------------------------------*/
88 /*--- IR generators for special opcodes.                   ---*/
89 /*------------------------------------------------------------*/
90 void s390_irgen_client_request(void);
91 void s390_irgen_guest_NRADDR(void);
92 void s390_irgen_call_noredir(void);
93 void s390_irgen_internal_return(void);
94
95 #include "libvex_basictypes.h"
96 #include "libvex_ir.h"
97
98 /* The various ways to compute the condition code. */
99
100 enum {
101    S390_CC_OP_BITWISE = 0,
102    S390_CC_OP_SIGNED_COMPARE = 1,
103    S390_CC_OP_UNSIGNED_COMPARE = 2,
104    S390_CC_OP_SIGNED_ADD_32 = 3,
105    S390_CC_OP_SIGNED_ADD_64 = 4,
106    S390_CC_OP_UNSIGNED_ADD_32 = 5,
107    S390_CC_OP_UNSIGNED_ADD_64 = 6,
108    S390_CC_OP_UNSIGNED_ADDC_32 = 7,
109    S390_CC_OP_UNSIGNED_ADDC_64 = 8,
110    S390_CC_OP_SIGNED_SUB_32 = 9,
111    S390_CC_OP_SIGNED_SUB_64 = 10,
112    S390_CC_OP_UNSIGNED_SUB_32 = 11,
113    S390_CC_OP_UNSIGNED_SUB_64 = 12,
114    S390_CC_OP_UNSIGNED_SUBB_32 = 13,
115    S390_CC_OP_UNSIGNED_SUBB_64 = 14,
116    S390_CC_OP_LOAD_AND_TEST = 15,
117    S390_CC_OP_LOAD_POSITIVE_32 = 16,
118    S390_CC_OP_LOAD_POSITIVE_64 = 17,
119    S390_CC_OP_TEST_AND_SET = 18,
120    S390_CC_OP_TEST_UNDER_MASK_8 = 19,
121    S390_CC_OP_TEST_UNDER_MASK_16 = 20,
122    S390_CC_OP_SHIFT_LEFT_32 = 21,
123    S390_CC_OP_SHIFT_LEFT_64 = 22,
124    S390_CC_OP_INSERT_CHAR_MASK_32 = 23,
125    S390_CC_OP_BFP_RESULT_32 = 24,
126    S390_CC_OP_BFP_RESULT_64 = 25,
127    S390_CC_OP_BFP_RESULT_128 = 26,
128    S390_CC_OP_BFP_32_TO_INT_32 = 27,
129    S390_CC_OP_BFP_64_TO_INT_32 = 28,
130    S390_CC_OP_BFP_128_TO_INT_32 = 29,
131    S390_CC_OP_BFP_32_TO_INT_64 = 30,
132    S390_CC_OP_BFP_64_TO_INT_64 = 31,
133    S390_CC_OP_BFP_128_TO_INT_64 = 32,
134    S390_CC_OP_BFP_TDC_32 = 33,
135    S390_CC_OP_BFP_TDC_64 = 34,
136    S390_CC_OP_BFP_TDC_128 = 35,
137    S390_CC_OP_SET = 36
138 };
139
140 /*------------------------------------------------------------*/
141 /*--- Thunk layout                                         ---*/
142 /*------------------------------------------------------------*/
143
144 /*
145    Z -- value is zero extended to 32 / 64 bit
146    S -- value is sign extended to 32 / 64 bit
147    F -- a binary floating point value
148
149    +--------------------------------+-----------------------+----------------------+-------------+
150    | op                             |   cc_dep1             |   cc_dep2            |   cc_ndep   |
151    +--------------------------------+-----------------------+----------------------+-------------+
152    | S390_CC_OP_BITWISE             | Z result              |                      |             |
153    | S390_CC_OP_SIGNED_COMPARE      | S 1st operand         | S 2nd operand        |             |
154    | S390_CC_OP_UNSIGNED_COMPARE    | Z 1st operand         | Z 2nd operand        |             |
155    | S390_CC_OP_SIGNED_ADD_32       | S 1st operand         | S 2nd operand        |             |
156    | S390_CC_OP_SIGNED_ADD_64       | S 1st operand         | S 2nd operand        |             |
157    | S390_CC_OP_UNSIGNED_ADD_32     | Z 1st operand         | Z 2nd operand        |             |
158    | S390_CC_OP_UNSIGNED_ADD_64     | Z 1st operand         | Z 2nd operand        |             |
159    | S390_CC_OP_UNSIGNED_ADDC_32    | Z 1st operand         | Z 2nd operand        | Z carry in  |
160    | S390_CC_OP_UNSIGNED_ADDC_64    | Z 1st operand         | Z 2nd operand        | Z carry in  |
161    | S390_CC_OP_SIGNED_SUB_32       | S left operand        | S right operand      |             |
162    | S390_CC_OP_SIGNED_SUB_64       | S left operand        | S right operand      |             |
163    | S390_CC_OP_UNSIGNED_SUB_32     | Z left operand        | Z right operand      |             |
164    | S390_CC_OP_UNSIGNED_SUB_64     | Z left operand        | Z right operand      |             |
165    | S390_CC_OP_UNSIGNED_SUBB_32    | Z left operand        | Z right operand      | Z borrow in |
166    | S390_CC_OP_UNSIGNED_SUBB_64    | Z left operand        | Z right operand      | Z borrow in |
167    | S390_CC_OP_LOAD_AND_TEST       | S loaded value        |                      |             |
168    | S390_CC_OP_LOAD_POSITIVE_32    | S loaded value        |                      |             |
169    | S390_CC_OP_LOAD_POSITIVE_64    | S loaded value        |                      |             |
170    | S390_CC_OP_TEST_AND_SET        | Z tested value        |                      |             |
171    | S390_CC_OP_TEST_UNDER_MASK_8   | Z tested value        | Z mask               |             |
172    | S390_CC_OP_TEST_UNDER_MASK_16  | Z tested value        | Z mask               |             |
173    | S390_CC_OP_SHIFT_LEFT_32       | Z value to be shifted | Z shift amount       |             |
174    | S390_CC_OP_SHIFT_LEFT_64       | Z value to be shifted | Z shift amount       |             |
175    | S390_CC_OP_INSERT_CHAR_MASK_32 | Z result              | Z mask               |             |
176    | S390_CC_OP_BFP_RESULT_32       | F result              |                      |             |
177    | S390_CC_OP_BFP_RESULT_64       | F result              |                      |             |
178    | S390_CC_OP_BFP_RESULT_128      | F result hi 64 bits   | F result low 64 bits |             |
179    | S390_CC_OP_BFP_32_TO_INT_32    | F source              |                      |             |
180    | S390_CC_OP_BFP_64_TO_INT_32    | F source              |                      |             |
181    | S390_CC_OP_BFP_128_TO_INT_32   | F source hi 64 bits   |                      |             |
182    | S390_CC_OP_BFP_32_TO_INT_64    | F source              |                      |             |
183    | S390_CC_OP_BFP_64_TO_INT_64    | F source              |                      |             |
184    | S390_CC_OP_BFP_128_TO_INT_64   | F source hi 64 bits   |                      |             |
185    | S390_CC_OP_BFP_TDC_32          | F value               | Z class              |             |
186    | S390_CC_OP_BFP_TDC_64          | F value               | Z class              |             |
187    | S390_CC_OP_BFP_TDC_128         | F value hi 64 bits    | F value low 64 bits  | Z class     |
188    | S390_CC_OP_SET                 | Z condition code      |                      |             |
189    +--------------------------------+-----------------------+----------------------+-------------+
190 */
191
192 /*------------------------------------------------------------*/
193 /*--- condition code helpers.                             ---*/
194 /*------------------------------------------------------------*/
195 UInt s390_calculate_cc(ULong cc_op, ULong cc_dep1, ULong cc_dep2,
196                        ULong cc_ndep);
197 UInt s390_calculate_icc(ULong op, ULong dep1, ULong dep2);
198 UInt s390_calculate_cond(ULong mask, ULong op, ULong dep1, ULong dep2,
199                          ULong ndep);
200
201 /* Size of special instruction preamble */
202 #define S390_SPECIAL_OP_PREAMBLE_SIZE 8
203
204 /* Size of special instructions */
205 #define S390_SPECIAL_OP_SIZE 2
206
207 /* Last target instruction for the EX helper */
208 extern ULong last_execute_target;
209
210 /*---------------------------------------------------------------*/
211 /*--- end                                   guest_s390_defs.h ---*/
212 /*---------------------------------------------------------------*/
213
214 #endif /* __VEX_GUEST_S390_DEFS_H */