1 /* -*- mode: C; c-basic-offset: 3; -*- */
2 
3 /*---------------------------------------------------------------*/
4 /*--- begin                                     s390_disasm.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 #ifndef __VEX_S390_DISASM_H
32 #define __VEX_S390_DISASM_H
33 
34 #include "libvex_basictypes.h"
35 
36 /* Macros to encode a command for s390_disasm. */
37 #undef  P
38 #define P(a) (S390_ARG_##a)
39 #undef  ENC1
40 #define ENC1(a) ((P(DONE) << 4) | P(a))
41 #undef  ENC2
42 #define ENC2(a,b) ((P(DONE) << 8) | (P(b) << 4) | P(a))
43 #undef  ENC3
44 #define ENC3(a,b,c) ((P(DONE) << 12) | (P(c) << 8) | (P(b) << 4) | P(a))
45 #undef  ENC4
46 #define ENC4(a,b,c,d) ((P(DONE) << 16) | (P(d) << 12) | (P(c) << 8) | \
47                        (P(b) << 4) | P(a))
48 #undef  ENC5
49 #define ENC5(a,b,c,d,e) ((P(DONE) << 20) | (P(e) << 16) | (P(d) << 12) | \
50                          (P(c) << 8) | (P(b) << 4) | P(a))
51 #undef  ENC6
52 #define ENC6(a,b,c,d,e,f) ((P(DONE) << 24) | (P(f) << 20) | (P(e) << 16) | \
53                            (P(d) << 12) | (P(c) << 8) | (P(b) << 4) | P(a))
54 #undef  ENC7
55 #define ENC7(a,b,c,d,e,f,g) ((P(DONE) << 28) | (P(g) << 24) | (P(f) << 20) | \
56                              (P(e) << 16) | (P(d) << 12) | (P(c) << 8) | \
57                              (P(b) << 4) | P(a))
58 
59 /* The different kinds of operands in an asm insn */
60 enum {
61    S390_ARG_DONE = 0,
62    S390_ARG_GPR = 1,
63    S390_ARG_FPR = 2,
64    S390_ARG_AR = 3,
65    S390_ARG_INT = 4,
66    S390_ARG_UINT = 5,
67    S390_ARG_PCREL = 6,
68    S390_ARG_SDXB = 7,
69    S390_ARG_UDXB = 8,
70    S390_ARG_UDLB = 9,
71    S390_ARG_CABM = 10,
72    S390_ARG_MNM = 11,
73    S390_ARG_XMNM = 12,
74    S390_ARG_VR = 13,
75    S390_ARG_UDVB = 14,
76 };
77 
78 /* The different kinds of extended mnemonics */
79 enum {
80    S390_XMNM_CAB = 0,
81    S390_XMNM_BCR = 1,
82    S390_XMNM_BC = 2,
83    S390_XMNM_BRC = 3,
84    S390_XMNM_BRCL = 4,
85    S390_XMNM_LOCR = 5,
86    S390_XMNM_LOCGR = 6,
87    S390_XMNM_LOC = 7,
88    S390_XMNM_LOCG = 8,
89    S390_XMNM_STOC = 9,
90    S390_XMNM_STOCG = 10,
91    S390_XMNM_STOCFH = 11,
92    S390_XMNM_LOCFH = 12,
93    S390_XMNM_LOCFHR = 13,
94    S390_XMNM_LOCHI = 14,
95    S390_XMNM_LOCGHI = 15,
96    S390_XMNM_LOCHHI = 16
97 };
98 
99 void s390_disasm(UInt command, ...);
100 
101 /*---------------------------------------------------------------*/
102 /*--- end                                       s390_disasm.h ---*/
103 /*---------------------------------------------------------------*/
104 
105 #endif /* __VEX_S390_DISASM_H */
106