evoasm 0.0.2.pre7 → 0.1.0.pre2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gdbinit +41 -0
- data/.gitignore +1 -2
- data/.gitmodules +3 -0
- data/.rubocop.yml +8 -0
- data/Gemfile +4 -0
- data/LICENSE.md +660 -0
- data/Makefile +1 -1
- data/README.md +17 -9
- data/Rakefile +39 -107
- data/bin/gdb +1 -1
- data/bin/gdb_loop +4 -0
- data/docs/FindingInstructions.md +17 -0
- data/docs/JIT.md +14 -0
- data/docs/SymbolicRegression.md +102 -0
- data/docs/Visualization.md +29 -0
- data/docs/examples/bit_insts.rb +44 -0
- data/docs/examples/jit.rb +26 -0
- data/docs/examples/loss.gif +0 -0
- data/docs/examples/program.png +0 -0
- data/docs/examples/sym_reg.rb +64 -0
- data/docs/examples/vis.rb +38 -0
- data/evoasm.gemspec +21 -15
- data/ext/evoasm_ext/Rakefile +3 -0
- data/ext/evoasm_ext/compile.rake +35 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-alloc.c +226 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-alloc.h +84 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-arch.c +52 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-arch.h +101 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-bitmap.h +158 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-buf.c +204 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-buf.h +109 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-domain.c +124 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-domain.h +279 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-error.c +65 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-error.h +108 -0
- data/ext/evoasm_ext/{evoasm-log.c → libevoasm/src/evoasm-log.c} +36 -18
- data/ext/evoasm_ext/libevoasm/src/evoasm-log.h +93 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-param.c +22 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-param.h +33 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-pop-params.c +192 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-pop-params.h +60 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-pop.c +1323 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-pop.h +107 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-program-io.c +116 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-program-io.h +60 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-program.c +1827 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-program.h +167 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-rand.c +65 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-rand.h +76 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-signal.c +106 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-signal.h +58 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-util.h +112 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-x64.c +925 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-x64.h +277 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm.c +28 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm.h +35 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-enums.h +2077 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-insts.c +191203 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-insts.h +1713 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-misc.c +348 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-misc.h +93 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-params.c +51 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-params.h +509 -0
- data/lib/evoasm.rb +28 -11
- data/lib/evoasm/buffer.rb +105 -0
- data/lib/evoasm/capstone.rb +100 -0
- data/lib/evoasm/domain.rb +116 -0
- data/lib/evoasm/error.rb +37 -16
- data/lib/evoasm/exception_error.rb +19 -0
- data/lib/evoasm/ffi_ext.rb +53 -0
- data/lib/evoasm/libevoasm.rb +286 -0
- data/lib/evoasm/libevoasm/x64_enums.rb +1967 -0
- data/lib/evoasm/parameter.rb +20 -0
- data/lib/evoasm/population.rb +145 -0
- data/lib/evoasm/population/parameters.rb +227 -0
- data/lib/evoasm/population/plotter.rb +89 -0
- data/lib/evoasm/prng.rb +64 -0
- data/lib/evoasm/program.rb +195 -12
- data/lib/evoasm/program/io.rb +144 -0
- data/lib/evoasm/test.rb +8 -0
- data/lib/evoasm/version.rb +1 -1
- data/lib/evoasm/x64.rb +115 -0
- data/lib/evoasm/x64/cpu_state.rb +95 -0
- data/lib/evoasm/x64/instruction.rb +109 -0
- data/lib/evoasm/x64/operand.rb +156 -0
- data/lib/evoasm/x64/parameters.rb +211 -0
- data/test/helpers/population_helper.rb +128 -0
- data/test/helpers/test_helper.rb +1 -0
- data/test/helpers/x64_helper.rb +24 -0
- data/test/integration/bitwise_reverse_test.rb +41 -0
- data/test/integration/gcd_test.rb +52 -0
- data/test/integration/popcnt_test.rb +46 -0
- data/test/integration/sym_reg_test.rb +68 -0
- data/test/unit/evoasm/buffer_test.rb +48 -0
- data/test/unit/evoasm/capstone_test.rb +18 -0
- data/test/unit/evoasm/domain_test.rb +55 -0
- data/test/unit/evoasm/population/parameters_test.rb +106 -0
- data/test/unit/evoasm/population_test.rb +96 -0
- data/test/unit/evoasm/prng_test.rb +47 -0
- data/test/unit/evoasm/x64/cpu_state_test.rb +73 -0
- data/test/unit/evoasm/x64/encoding_test.rb +320 -0
- data/test/unit/evoasm/x64/instruction_access_test.rb +177 -0
- data/test/unit/evoasm/x64/instruction_encoding_test.rb +780 -0
- data/test/unit/evoasm/x64/instruction_test.rb +62 -0
- data/test/unit/evoasm/x64/parameters_test.rb +65 -0
- data/test/unit/evoasm/x64_test.rb +52 -0
- metadata +195 -89
- data/Gemfile.rake +0 -8
- data/Gemfile.rake.lock +0 -51
- data/LICENSE.txt +0 -373
- data/data/tables/README.md +0 -19
- data/data/tables/x64.csv +0 -1684
- data/data/templates/evoasm-x64.c.erb +0 -319
- data/data/templates/evoasm-x64.h.erb +0 -126
- data/examples/abs.yml +0 -20
- data/examples/popcnt.yml +0 -17
- data/examples/sym_reg.yml +0 -26
- data/exe/evoasm-search +0 -13
- data/ext/evoasm_ext/evoasm-alloc.c +0 -145
- data/ext/evoasm_ext/evoasm-alloc.h +0 -59
- data/ext/evoasm_ext/evoasm-arch.c +0 -44
- data/ext/evoasm_ext/evoasm-arch.h +0 -161
- data/ext/evoasm_ext/evoasm-bitmap.h +0 -114
- data/ext/evoasm_ext/evoasm-buf.c +0 -130
- data/ext/evoasm_ext/evoasm-buf.h +0 -47
- data/ext/evoasm_ext/evoasm-error.c +0 -31
- data/ext/evoasm_ext/evoasm-error.h +0 -75
- data/ext/evoasm_ext/evoasm-free-list.c.tmpl +0 -121
- data/ext/evoasm_ext/evoasm-free-list.h.tmpl +0 -86
- data/ext/evoasm_ext/evoasm-log.h +0 -69
- data/ext/evoasm_ext/evoasm-misc.c +0 -23
- data/ext/evoasm_ext/evoasm-misc.h +0 -282
- data/ext/evoasm_ext/evoasm-param.h +0 -37
- data/ext/evoasm_ext/evoasm-search.c +0 -2145
- data/ext/evoasm_ext/evoasm-search.h +0 -214
- data/ext/evoasm_ext/evoasm-util.h +0 -40
- data/ext/evoasm_ext/evoasm-x64.c +0 -275624
- data/ext/evoasm_ext/evoasm-x64.h +0 -5436
- data/ext/evoasm_ext/evoasm.c +0 -7
- data/ext/evoasm_ext/evoasm.h +0 -23
- data/ext/evoasm_ext/evoasm_ext.c +0 -1757
- data/ext/evoasm_ext/extconf.rb +0 -31
- data/lib/evoasm/cli.rb +0 -6
- data/lib/evoasm/cli/search.rb +0 -127
- data/lib/evoasm/core_ext.rb +0 -1
- data/lib/evoasm/core_ext/array.rb +0 -9
- data/lib/evoasm/core_ext/integer.rb +0 -10
- data/lib/evoasm/core_ext/kwstruct.rb +0 -13
- data/lib/evoasm/core_ext/range.rb +0 -5
- data/lib/evoasm/examples.rb +0 -27
- data/lib/evoasm/gen.rb +0 -8
- data/lib/evoasm/gen/enum.rb +0 -169
- data/lib/evoasm/gen/name_util.rb +0 -80
- data/lib/evoasm/gen/state.rb +0 -176
- data/lib/evoasm/gen/state_dsl.rb +0 -152
- data/lib/evoasm/gen/strio.rb +0 -27
- data/lib/evoasm/gen/translator.rb +0 -1102
- data/lib/evoasm/gen/version.rb +0 -5
- data/lib/evoasm/gen/x64.rb +0 -237
- data/lib/evoasm/gen/x64/funcs.rb +0 -495
- data/lib/evoasm/gen/x64/inst.rb +0 -781
- data/lib/evoasm/search.rb +0 -40
- data/lib/evoasm/tasks/gen_task.rb +0 -86
- data/lib/evoasm/tasks/template_task.rb +0 -52
- data/test/test_helper.rb +0 -1
- data/test/x64/test_helper.rb +0 -19
- data/test/x64/x64_test.rb +0 -87
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
/* vim: set filetype=c: */
|
|
2
|
+
/* AUTOGENERATED FILE, DO NOT EDIT */
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* Copyright (C) 2016 Julian Aron Prenner <jap@polyadic.com>
|
|
6
|
+
*
|
|
7
|
+
* This program is free software: you can redistribute it and/or modify
|
|
8
|
+
* it under the terms of the GNU Affero General Public License as published by
|
|
9
|
+
* the Free Software Foundation, either version 3 of the License, or
|
|
10
|
+
* (at your option) any later version.
|
|
11
|
+
*
|
|
12
|
+
* This program is distributed in the hope that it will be useful,
|
|
13
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
* GNU Affero General Public License for more details.
|
|
16
|
+
*
|
|
17
|
+
* You should have received a copy of the GNU Affero General Public License
|
|
18
|
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
#pragma once
|
|
23
|
+
|
|
24
|
+
#include "evoasm-util.h"
|
|
25
|
+
|
|
26
|
+
typedef struct {
|
|
27
|
+
uint64_t addr_size : 1;
|
|
28
|
+
uint64_t disp_set : 1;
|
|
29
|
+
uint64_t force_disp32 : 1;
|
|
30
|
+
uint64_t force_long_vex : 1;
|
|
31
|
+
uint64_t force_rex : 1;
|
|
32
|
+
uint64_t force_sib : 1;
|
|
33
|
+
uint64_t lock : 1;
|
|
34
|
+
uint64_t reg0_high_byte : 1;
|
|
35
|
+
uint64_t reg0_set : 1;
|
|
36
|
+
uint64_t reg1_high_byte : 1;
|
|
37
|
+
uint64_t reg1_set : 1;
|
|
38
|
+
uint64_t reg_base_set : 1;
|
|
39
|
+
uint64_t reg_index_set : 1;
|
|
40
|
+
uint64_t rex_b : 1;
|
|
41
|
+
uint64_t rex_r : 1;
|
|
42
|
+
uint64_t rex_w : 1;
|
|
43
|
+
uint64_t rex_x : 1;
|
|
44
|
+
uint64_t vex_l : 1;
|
|
45
|
+
uint64_t scale : 2;
|
|
46
|
+
uint64_t legacy_prefix_order : 3;
|
|
47
|
+
uint64_t modrm_reg : 3;
|
|
48
|
+
uint64_t vex_v : 4;
|
|
49
|
+
uint64_t reg0 : 6;
|
|
50
|
+
uint64_t reg1 : 6;
|
|
51
|
+
uint64_t reg2 : 6;
|
|
52
|
+
uint64_t reg3 : 6;
|
|
53
|
+
uint64_t reg_base : 6;
|
|
54
|
+
uint64_t reg_index : 6;
|
|
55
|
+
evoasm_packed(union {
|
|
56
|
+
int8_t imm1 : 8;
|
|
57
|
+
int32_t disp : 32;
|
|
58
|
+
});
|
|
59
|
+
evoasm_packed(union {
|
|
60
|
+
int64_t imm0 : 64;
|
|
61
|
+
int64_t moffs : 64;
|
|
62
|
+
int64_t rel : 64;
|
|
63
|
+
});
|
|
64
|
+
} evoasm_x64_params_t;
|
|
65
|
+
|
|
66
|
+
typedef struct {
|
|
67
|
+
uint64_t reg0_high_byte : 1;
|
|
68
|
+
uint64_t reg0_set : 1;
|
|
69
|
+
uint64_t reg1_high_byte : 1;
|
|
70
|
+
uint64_t reg1_set : 1;
|
|
71
|
+
uint64_t reg0 : 6;
|
|
72
|
+
uint64_t reg1 : 6;
|
|
73
|
+
uint64_t reg2 : 6;
|
|
74
|
+
uint64_t reg3 : 6;
|
|
75
|
+
evoasm_packed(union {
|
|
76
|
+
int32_t imm0 : 32;
|
|
77
|
+
int32_t rel : 32;
|
|
78
|
+
});
|
|
79
|
+
} evoasm_x64_basic_params_t;
|
|
80
|
+
|
|
81
|
+
static inline void evoasm_x64_params_set_(evoasm_x64_params_t * params, evoasm_x64_param_id_t param, int64_t param_val) {
|
|
82
|
+
switch(param) {
|
|
83
|
+
case EVOASM_X64_PARAM_REG0:
|
|
84
|
+
params->reg0 = (uint64_t) (((uint64_t) param_val) & 0x3f);
|
|
85
|
+
params->reg0_set = true;
|
|
86
|
+
break;
|
|
87
|
+
case EVOASM_X64_PARAM_REG1:
|
|
88
|
+
params->reg1 = (uint64_t) (((uint64_t) param_val) & 0x3f);
|
|
89
|
+
params->reg1_set = true;
|
|
90
|
+
break;
|
|
91
|
+
case EVOASM_X64_PARAM_REG2:
|
|
92
|
+
params->reg2 = (uint64_t) (((uint64_t) param_val) & 0x3f);
|
|
93
|
+
break;
|
|
94
|
+
case EVOASM_X64_PARAM_REG3:
|
|
95
|
+
params->reg3 = (uint64_t) (((uint64_t) param_val) & 0x3f);
|
|
96
|
+
break;
|
|
97
|
+
case EVOASM_X64_PARAM_IMM0:
|
|
98
|
+
params->imm0 = (int64_t) (((uint64_t) param_val) & 0xffffffffffffffff);
|
|
99
|
+
break;
|
|
100
|
+
case EVOASM_X64_PARAM_FORCE_REX:
|
|
101
|
+
params->force_rex = (uint64_t) (((uint64_t) param_val) & 0x1);
|
|
102
|
+
break;
|
|
103
|
+
case EVOASM_X64_PARAM_REX_R:
|
|
104
|
+
params->rex_r = (uint64_t) (((uint64_t) param_val) & 0x1);
|
|
105
|
+
break;
|
|
106
|
+
case EVOASM_X64_PARAM_REX_X:
|
|
107
|
+
params->rex_x = (uint64_t) (((uint64_t) param_val) & 0x1);
|
|
108
|
+
break;
|
|
109
|
+
case EVOASM_X64_PARAM_REX_B:
|
|
110
|
+
params->rex_b = (uint64_t) (((uint64_t) param_val) & 0x1);
|
|
111
|
+
break;
|
|
112
|
+
case EVOASM_X64_PARAM_LEGACY_PREFIX_ORDER:
|
|
113
|
+
params->legacy_prefix_order = (uint64_t) (((uint64_t) param_val) & 0x7);
|
|
114
|
+
break;
|
|
115
|
+
case EVOASM_X64_PARAM_LOCK:
|
|
116
|
+
params->lock = (uint64_t) (((uint64_t) param_val) & 0x1);
|
|
117
|
+
break;
|
|
118
|
+
case EVOASM_X64_PARAM_ADDR_SIZE:
|
|
119
|
+
params->addr_size = (uint64_t) (((uint64_t) param_val) & 0x1);
|
|
120
|
+
break;
|
|
121
|
+
case EVOASM_X64_PARAM_REG_BASE:
|
|
122
|
+
params->reg_base = (uint64_t) (((uint64_t) param_val) & 0x3f);
|
|
123
|
+
params->reg_base_set = true;
|
|
124
|
+
break;
|
|
125
|
+
case EVOASM_X64_PARAM_REG_INDEX:
|
|
126
|
+
params->reg_index = (uint64_t) (((uint64_t) param_val) & 0x3f);
|
|
127
|
+
params->reg_index_set = true;
|
|
128
|
+
break;
|
|
129
|
+
case EVOASM_X64_PARAM_REX_W:
|
|
130
|
+
params->rex_w = (uint64_t) (((uint64_t) param_val) & 0x1);
|
|
131
|
+
break;
|
|
132
|
+
case EVOASM_X64_PARAM_DISP:
|
|
133
|
+
params->disp = (int32_t) (((uint64_t) param_val) & 0xffffffff);
|
|
134
|
+
params->disp_set = true;
|
|
135
|
+
break;
|
|
136
|
+
case EVOASM_X64_PARAM_SCALE:
|
|
137
|
+
params->scale = (uint64_t) (((uint64_t) param_val) & 0x3);
|
|
138
|
+
break;
|
|
139
|
+
case EVOASM_X64_PARAM_FORCE_SIB:
|
|
140
|
+
params->force_sib = (uint64_t) (((uint64_t) param_val) & 0x1);
|
|
141
|
+
break;
|
|
142
|
+
case EVOASM_X64_PARAM_FORCE_DISP32:
|
|
143
|
+
params->force_disp32 = (uint64_t) (((uint64_t) param_val) & 0x1);
|
|
144
|
+
break;
|
|
145
|
+
case EVOASM_X64_PARAM_REG0_HIGH_BYTE:
|
|
146
|
+
params->reg0_high_byte = (uint64_t) (((uint64_t) param_val) & 0x1);
|
|
147
|
+
break;
|
|
148
|
+
case EVOASM_X64_PARAM_REG1_HIGH_BYTE:
|
|
149
|
+
params->reg1_high_byte = (uint64_t) (((uint64_t) param_val) & 0x1);
|
|
150
|
+
break;
|
|
151
|
+
case EVOASM_X64_PARAM_FORCE_LONG_VEX:
|
|
152
|
+
params->force_long_vex = (uint64_t) (((uint64_t) param_val) & 0x1);
|
|
153
|
+
break;
|
|
154
|
+
case EVOASM_X64_PARAM_REL:
|
|
155
|
+
params->rel = (int64_t) (((uint64_t) param_val) & 0xffffffffffffffff);
|
|
156
|
+
break;
|
|
157
|
+
case EVOASM_X64_PARAM_IMM1:
|
|
158
|
+
params->imm1 = (int8_t) (((uint64_t) param_val) & 0xff);
|
|
159
|
+
break;
|
|
160
|
+
case EVOASM_X64_PARAM_MOFFS:
|
|
161
|
+
params->moffs = (int64_t) (((uint64_t) param_val) & 0xffffffffffffffff);
|
|
162
|
+
break;
|
|
163
|
+
case EVOASM_X64_PARAM_VEX_L:
|
|
164
|
+
params->vex_l = (uint64_t) (((uint64_t) param_val) & 0x1);
|
|
165
|
+
break;
|
|
166
|
+
case EVOASM_X64_PARAM_MODRM_REG:
|
|
167
|
+
params->modrm_reg = (uint64_t) (((uint64_t) param_val) & 0x7);
|
|
168
|
+
break;
|
|
169
|
+
case EVOASM_X64_PARAM_VEX_V:
|
|
170
|
+
params->vex_v = (uint64_t) (((uint64_t) param_val) & 0xf);
|
|
171
|
+
break;
|
|
172
|
+
default:
|
|
173
|
+
evoasm_assert_not_reached();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
static inline void evoasm_x64_basic_params_set_(evoasm_x64_basic_params_t * params, evoasm_x64_basic_param_id_t param, int64_t param_val) {
|
|
178
|
+
switch(param) {
|
|
179
|
+
case EVOASM_X64_BASIC_PARAM_REG0:
|
|
180
|
+
params->reg0 = (uint64_t) (((uint64_t) param_val) & 0x3f);
|
|
181
|
+
params->reg0_set = true;
|
|
182
|
+
break;
|
|
183
|
+
case EVOASM_X64_BASIC_PARAM_REG1:
|
|
184
|
+
params->reg1 = (uint64_t) (((uint64_t) param_val) & 0x3f);
|
|
185
|
+
params->reg1_set = true;
|
|
186
|
+
break;
|
|
187
|
+
case EVOASM_X64_BASIC_PARAM_REG2:
|
|
188
|
+
params->reg2 = (uint64_t) (((uint64_t) param_val) & 0x3f);
|
|
189
|
+
break;
|
|
190
|
+
case EVOASM_X64_BASIC_PARAM_REG3:
|
|
191
|
+
params->reg3 = (uint64_t) (((uint64_t) param_val) & 0x3f);
|
|
192
|
+
break;
|
|
193
|
+
case EVOASM_X64_BASIC_PARAM_IMM0:
|
|
194
|
+
params->imm0 = (int32_t) (((uint64_t) param_val) & 0xffffffff);
|
|
195
|
+
break;
|
|
196
|
+
case EVOASM_X64_BASIC_PARAM_REG0_HIGH_BYTE:
|
|
197
|
+
params->reg0_high_byte = (uint64_t) (((uint64_t) param_val) & 0x1);
|
|
198
|
+
break;
|
|
199
|
+
case EVOASM_X64_BASIC_PARAM_REG1_HIGH_BYTE:
|
|
200
|
+
params->reg1_high_byte = (uint64_t) (((uint64_t) param_val) & 0x1);
|
|
201
|
+
break;
|
|
202
|
+
case EVOASM_X64_BASIC_PARAM_REL:
|
|
203
|
+
params->rel = (int32_t) (((uint64_t) param_val) & 0xffffffff);
|
|
204
|
+
break;
|
|
205
|
+
default:
|
|
206
|
+
evoasm_assert_not_reached();
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
static inline int64_t evoasm_x64_params_get_(evoasm_x64_params_t * params, evoasm_x64_param_id_t param) {
|
|
210
|
+
switch(param) {
|
|
211
|
+
case EVOASM_X64_PARAM_REG0:
|
|
212
|
+
return (int64_t) params->reg0;
|
|
213
|
+
case EVOASM_X64_PARAM_REG1:
|
|
214
|
+
return (int64_t) params->reg1;
|
|
215
|
+
case EVOASM_X64_PARAM_REG2:
|
|
216
|
+
return (int64_t) params->reg2;
|
|
217
|
+
case EVOASM_X64_PARAM_REG3:
|
|
218
|
+
return (int64_t) params->reg3;
|
|
219
|
+
case EVOASM_X64_PARAM_IMM0:
|
|
220
|
+
return (int64_t) params->imm0;
|
|
221
|
+
case EVOASM_X64_PARAM_FORCE_REX:
|
|
222
|
+
return (int64_t) params->force_rex;
|
|
223
|
+
case EVOASM_X64_PARAM_REX_R:
|
|
224
|
+
return (int64_t) params->rex_r;
|
|
225
|
+
case EVOASM_X64_PARAM_REX_X:
|
|
226
|
+
return (int64_t) params->rex_x;
|
|
227
|
+
case EVOASM_X64_PARAM_REX_B:
|
|
228
|
+
return (int64_t) params->rex_b;
|
|
229
|
+
case EVOASM_X64_PARAM_LEGACY_PREFIX_ORDER:
|
|
230
|
+
return (int64_t) params->legacy_prefix_order;
|
|
231
|
+
case EVOASM_X64_PARAM_LOCK:
|
|
232
|
+
return (int64_t) params->lock;
|
|
233
|
+
case EVOASM_X64_PARAM_ADDR_SIZE:
|
|
234
|
+
return (int64_t) params->addr_size;
|
|
235
|
+
case EVOASM_X64_PARAM_REG_BASE:
|
|
236
|
+
return (int64_t) params->reg_base;
|
|
237
|
+
case EVOASM_X64_PARAM_REG_INDEX:
|
|
238
|
+
return (int64_t) params->reg_index;
|
|
239
|
+
case EVOASM_X64_PARAM_REX_W:
|
|
240
|
+
return (int64_t) params->rex_w;
|
|
241
|
+
case EVOASM_X64_PARAM_DISP:
|
|
242
|
+
return (int64_t) params->disp;
|
|
243
|
+
case EVOASM_X64_PARAM_SCALE:
|
|
244
|
+
return (int64_t) params->scale;
|
|
245
|
+
case EVOASM_X64_PARAM_FORCE_SIB:
|
|
246
|
+
return (int64_t) params->force_sib;
|
|
247
|
+
case EVOASM_X64_PARAM_FORCE_DISP32:
|
|
248
|
+
return (int64_t) params->force_disp32;
|
|
249
|
+
case EVOASM_X64_PARAM_REG0_HIGH_BYTE:
|
|
250
|
+
return (int64_t) params->reg0_high_byte;
|
|
251
|
+
case EVOASM_X64_PARAM_REG1_HIGH_BYTE:
|
|
252
|
+
return (int64_t) params->reg1_high_byte;
|
|
253
|
+
case EVOASM_X64_PARAM_FORCE_LONG_VEX:
|
|
254
|
+
return (int64_t) params->force_long_vex;
|
|
255
|
+
case EVOASM_X64_PARAM_REL:
|
|
256
|
+
return (int64_t) params->rel;
|
|
257
|
+
case EVOASM_X64_PARAM_IMM1:
|
|
258
|
+
return (int64_t) params->imm1;
|
|
259
|
+
case EVOASM_X64_PARAM_MOFFS:
|
|
260
|
+
return (int64_t) params->moffs;
|
|
261
|
+
case EVOASM_X64_PARAM_VEX_L:
|
|
262
|
+
return (int64_t) params->vex_l;
|
|
263
|
+
case EVOASM_X64_PARAM_MODRM_REG:
|
|
264
|
+
return (int64_t) params->modrm_reg;
|
|
265
|
+
case EVOASM_X64_PARAM_VEX_V:
|
|
266
|
+
return (int64_t) params->vex_v;
|
|
267
|
+
default:
|
|
268
|
+
evoasm_assert_not_reached();
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
static inline int64_t evoasm_x64_basic_params_get_(evoasm_x64_basic_params_t * params, evoasm_x64_basic_param_id_t param) {
|
|
273
|
+
switch(param) {
|
|
274
|
+
case EVOASM_X64_BASIC_PARAM_REG0:
|
|
275
|
+
return (int64_t) params->reg0;
|
|
276
|
+
case EVOASM_X64_BASIC_PARAM_REG1:
|
|
277
|
+
return (int64_t) params->reg1;
|
|
278
|
+
case EVOASM_X64_BASIC_PARAM_REG2:
|
|
279
|
+
return (int64_t) params->reg2;
|
|
280
|
+
case EVOASM_X64_BASIC_PARAM_REG3:
|
|
281
|
+
return (int64_t) params->reg3;
|
|
282
|
+
case EVOASM_X64_BASIC_PARAM_IMM0:
|
|
283
|
+
return (int64_t) params->imm0;
|
|
284
|
+
case EVOASM_X64_BASIC_PARAM_REG0_HIGH_BYTE:
|
|
285
|
+
return (int64_t) params->reg0_high_byte;
|
|
286
|
+
case EVOASM_X64_BASIC_PARAM_REG1_HIGH_BYTE:
|
|
287
|
+
return (int64_t) params->reg1_high_byte;
|
|
288
|
+
case EVOASM_X64_BASIC_PARAM_REL:
|
|
289
|
+
return (int64_t) params->rel;
|
|
290
|
+
default:
|
|
291
|
+
evoasm_assert_not_reached();
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
static inline void evoasm_x64_params_unset_(evoasm_x64_params_t * params, evoasm_x64_param_id_t param) {
|
|
295
|
+
switch(param) {
|
|
296
|
+
case EVOASM_X64_PARAM_REG0:
|
|
297
|
+
params->reg0 = 0;
|
|
298
|
+
params->reg0_set = false;
|
|
299
|
+
break;
|
|
300
|
+
case EVOASM_X64_PARAM_REG1:
|
|
301
|
+
params->reg1 = 0;
|
|
302
|
+
params->reg1_set = false;
|
|
303
|
+
break;
|
|
304
|
+
case EVOASM_X64_PARAM_REG2:
|
|
305
|
+
params->reg2 = 0;
|
|
306
|
+
break;
|
|
307
|
+
case EVOASM_X64_PARAM_REG3:
|
|
308
|
+
params->reg3 = 0;
|
|
309
|
+
break;
|
|
310
|
+
case EVOASM_X64_PARAM_IMM0:
|
|
311
|
+
params->imm0 = 0;
|
|
312
|
+
break;
|
|
313
|
+
case EVOASM_X64_PARAM_FORCE_REX:
|
|
314
|
+
params->force_rex = 0;
|
|
315
|
+
break;
|
|
316
|
+
case EVOASM_X64_PARAM_REX_R:
|
|
317
|
+
params->rex_r = 0;
|
|
318
|
+
break;
|
|
319
|
+
case EVOASM_X64_PARAM_REX_X:
|
|
320
|
+
params->rex_x = 0;
|
|
321
|
+
break;
|
|
322
|
+
case EVOASM_X64_PARAM_REX_B:
|
|
323
|
+
params->rex_b = 0;
|
|
324
|
+
break;
|
|
325
|
+
case EVOASM_X64_PARAM_LEGACY_PREFIX_ORDER:
|
|
326
|
+
params->legacy_prefix_order = 0;
|
|
327
|
+
break;
|
|
328
|
+
case EVOASM_X64_PARAM_LOCK:
|
|
329
|
+
params->lock = 0;
|
|
330
|
+
break;
|
|
331
|
+
case EVOASM_X64_PARAM_ADDR_SIZE:
|
|
332
|
+
params->addr_size = 0;
|
|
333
|
+
break;
|
|
334
|
+
case EVOASM_X64_PARAM_REG_BASE:
|
|
335
|
+
params->reg_base = 0;
|
|
336
|
+
params->reg_base_set = false;
|
|
337
|
+
break;
|
|
338
|
+
case EVOASM_X64_PARAM_REG_INDEX:
|
|
339
|
+
params->reg_index = 0;
|
|
340
|
+
params->reg_index_set = false;
|
|
341
|
+
break;
|
|
342
|
+
case EVOASM_X64_PARAM_REX_W:
|
|
343
|
+
params->rex_w = 0;
|
|
344
|
+
break;
|
|
345
|
+
case EVOASM_X64_PARAM_DISP:
|
|
346
|
+
params->disp = 0;
|
|
347
|
+
params->disp_set = false;
|
|
348
|
+
break;
|
|
349
|
+
case EVOASM_X64_PARAM_SCALE:
|
|
350
|
+
params->scale = 0;
|
|
351
|
+
break;
|
|
352
|
+
case EVOASM_X64_PARAM_FORCE_SIB:
|
|
353
|
+
params->force_sib = 0;
|
|
354
|
+
break;
|
|
355
|
+
case EVOASM_X64_PARAM_FORCE_DISP32:
|
|
356
|
+
params->force_disp32 = 0;
|
|
357
|
+
break;
|
|
358
|
+
case EVOASM_X64_PARAM_REG0_HIGH_BYTE:
|
|
359
|
+
params->reg0_high_byte = 0;
|
|
360
|
+
break;
|
|
361
|
+
case EVOASM_X64_PARAM_REG1_HIGH_BYTE:
|
|
362
|
+
params->reg1_high_byte = 0;
|
|
363
|
+
break;
|
|
364
|
+
case EVOASM_X64_PARAM_FORCE_LONG_VEX:
|
|
365
|
+
params->force_long_vex = 0;
|
|
366
|
+
break;
|
|
367
|
+
case EVOASM_X64_PARAM_REL:
|
|
368
|
+
params->rel = 0;
|
|
369
|
+
break;
|
|
370
|
+
case EVOASM_X64_PARAM_IMM1:
|
|
371
|
+
params->imm1 = 0;
|
|
372
|
+
break;
|
|
373
|
+
case EVOASM_X64_PARAM_MOFFS:
|
|
374
|
+
params->moffs = 0;
|
|
375
|
+
break;
|
|
376
|
+
case EVOASM_X64_PARAM_VEX_L:
|
|
377
|
+
params->vex_l = 0;
|
|
378
|
+
break;
|
|
379
|
+
case EVOASM_X64_PARAM_MODRM_REG:
|
|
380
|
+
params->modrm_reg = 0;
|
|
381
|
+
break;
|
|
382
|
+
case EVOASM_X64_PARAM_VEX_V:
|
|
383
|
+
params->vex_v = 0;
|
|
384
|
+
break;
|
|
385
|
+
default:
|
|
386
|
+
evoasm_assert_not_reached();
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
static inline void evoasm_x64_basic_params_unset_(evoasm_x64_basic_params_t * params, evoasm_x64_basic_param_id_t param) {
|
|
391
|
+
switch(param) {
|
|
392
|
+
case EVOASM_X64_BASIC_PARAM_REG0:
|
|
393
|
+
params->reg0 = 0;
|
|
394
|
+
params->reg0_set = false;
|
|
395
|
+
break;
|
|
396
|
+
case EVOASM_X64_BASIC_PARAM_REG1:
|
|
397
|
+
params->reg1 = 0;
|
|
398
|
+
params->reg1_set = false;
|
|
399
|
+
break;
|
|
400
|
+
case EVOASM_X64_BASIC_PARAM_REG2:
|
|
401
|
+
params->reg2 = 0;
|
|
402
|
+
break;
|
|
403
|
+
case EVOASM_X64_BASIC_PARAM_REG3:
|
|
404
|
+
params->reg3 = 0;
|
|
405
|
+
break;
|
|
406
|
+
case EVOASM_X64_BASIC_PARAM_IMM0:
|
|
407
|
+
params->imm0 = 0;
|
|
408
|
+
break;
|
|
409
|
+
case EVOASM_X64_BASIC_PARAM_REG0_HIGH_BYTE:
|
|
410
|
+
params->reg0_high_byte = 0;
|
|
411
|
+
break;
|
|
412
|
+
case EVOASM_X64_BASIC_PARAM_REG1_HIGH_BYTE:
|
|
413
|
+
params->reg1_high_byte = 0;
|
|
414
|
+
break;
|
|
415
|
+
case EVOASM_X64_BASIC_PARAM_REL:
|
|
416
|
+
params->rel = 0;
|
|
417
|
+
break;
|
|
418
|
+
default:
|
|
419
|
+
evoasm_assert_not_reached();
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
static inline evoasm_x64_param_type_t evoasm_x64_params_get_type_(evoasm_x64_param_id_t param) {
|
|
423
|
+
switch(param) {
|
|
424
|
+
case EVOASM_X64_PARAM_REG0:
|
|
425
|
+
return EVOASM_X64_PARAM_TYPE_REG;
|
|
426
|
+
case EVOASM_X64_PARAM_REG1:
|
|
427
|
+
return EVOASM_X64_PARAM_TYPE_REG;
|
|
428
|
+
case EVOASM_X64_PARAM_REG2:
|
|
429
|
+
return EVOASM_X64_PARAM_TYPE_REG;
|
|
430
|
+
case EVOASM_X64_PARAM_REG3:
|
|
431
|
+
return EVOASM_X64_PARAM_TYPE_REG;
|
|
432
|
+
case EVOASM_X64_PARAM_IMM0:
|
|
433
|
+
return EVOASM_X64_PARAM_TYPE_INT64;
|
|
434
|
+
case EVOASM_X64_PARAM_FORCE_REX:
|
|
435
|
+
return EVOASM_X64_PARAM_TYPE_BOOL;
|
|
436
|
+
case EVOASM_X64_PARAM_REX_R:
|
|
437
|
+
return EVOASM_X64_PARAM_TYPE_UINT1;
|
|
438
|
+
case EVOASM_X64_PARAM_REX_X:
|
|
439
|
+
return EVOASM_X64_PARAM_TYPE_UINT1;
|
|
440
|
+
case EVOASM_X64_PARAM_REX_B:
|
|
441
|
+
return EVOASM_X64_PARAM_TYPE_UINT1;
|
|
442
|
+
case EVOASM_X64_PARAM_LEGACY_PREFIX_ORDER:
|
|
443
|
+
return EVOASM_X64_PARAM_TYPE_INT3;
|
|
444
|
+
case EVOASM_X64_PARAM_LOCK:
|
|
445
|
+
return EVOASM_X64_PARAM_TYPE_BOOL;
|
|
446
|
+
case EVOASM_X64_PARAM_ADDR_SIZE:
|
|
447
|
+
return EVOASM_X64_PARAM_TYPE_ADDR_SIZE;
|
|
448
|
+
case EVOASM_X64_PARAM_REG_BASE:
|
|
449
|
+
return EVOASM_X64_PARAM_TYPE_REG;
|
|
450
|
+
case EVOASM_X64_PARAM_REG_INDEX:
|
|
451
|
+
return EVOASM_X64_PARAM_TYPE_REG;
|
|
452
|
+
case EVOASM_X64_PARAM_REX_W:
|
|
453
|
+
return EVOASM_X64_PARAM_TYPE_UINT1;
|
|
454
|
+
case EVOASM_X64_PARAM_DISP:
|
|
455
|
+
return EVOASM_X64_PARAM_TYPE_INT32;
|
|
456
|
+
case EVOASM_X64_PARAM_SCALE:
|
|
457
|
+
return EVOASM_X64_PARAM_TYPE_SCALE;
|
|
458
|
+
case EVOASM_X64_PARAM_FORCE_SIB:
|
|
459
|
+
return EVOASM_X64_PARAM_TYPE_BOOL;
|
|
460
|
+
case EVOASM_X64_PARAM_FORCE_DISP32:
|
|
461
|
+
return EVOASM_X64_PARAM_TYPE_BOOL;
|
|
462
|
+
case EVOASM_X64_PARAM_REG0_HIGH_BYTE:
|
|
463
|
+
return EVOASM_X64_PARAM_TYPE_BOOL;
|
|
464
|
+
case EVOASM_X64_PARAM_REG1_HIGH_BYTE:
|
|
465
|
+
return EVOASM_X64_PARAM_TYPE_BOOL;
|
|
466
|
+
case EVOASM_X64_PARAM_FORCE_LONG_VEX:
|
|
467
|
+
return EVOASM_X64_PARAM_TYPE_BOOL;
|
|
468
|
+
case EVOASM_X64_PARAM_REL:
|
|
469
|
+
return EVOASM_X64_PARAM_TYPE_INT64;
|
|
470
|
+
case EVOASM_X64_PARAM_IMM1:
|
|
471
|
+
return EVOASM_X64_PARAM_TYPE_INT8;
|
|
472
|
+
case EVOASM_X64_PARAM_MOFFS:
|
|
473
|
+
return EVOASM_X64_PARAM_TYPE_INT64;
|
|
474
|
+
case EVOASM_X64_PARAM_VEX_L:
|
|
475
|
+
return EVOASM_X64_PARAM_TYPE_UINT1;
|
|
476
|
+
case EVOASM_X64_PARAM_MODRM_REG:
|
|
477
|
+
return EVOASM_X64_PARAM_TYPE_INT3;
|
|
478
|
+
case EVOASM_X64_PARAM_VEX_V:
|
|
479
|
+
return EVOASM_X64_PARAM_TYPE_INT4;
|
|
480
|
+
default:
|
|
481
|
+
evoasm_assert_not_reached();
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
static inline evoasm_x64_param_type_t evoasm_x64_basic_params_get_type_(evoasm_x64_basic_param_id_t param) {
|
|
486
|
+
switch(param) {
|
|
487
|
+
case EVOASM_X64_BASIC_PARAM_REG0:
|
|
488
|
+
return EVOASM_X64_PARAM_TYPE_REG;
|
|
489
|
+
case EVOASM_X64_BASIC_PARAM_REG1:
|
|
490
|
+
return EVOASM_X64_PARAM_TYPE_REG;
|
|
491
|
+
case EVOASM_X64_BASIC_PARAM_REG2:
|
|
492
|
+
return EVOASM_X64_PARAM_TYPE_REG;
|
|
493
|
+
case EVOASM_X64_BASIC_PARAM_REG3:
|
|
494
|
+
return EVOASM_X64_PARAM_TYPE_REG;
|
|
495
|
+
case EVOASM_X64_BASIC_PARAM_IMM0:
|
|
496
|
+
return EVOASM_X64_PARAM_TYPE_INT32;
|
|
497
|
+
case EVOASM_X64_BASIC_PARAM_REG0_HIGH_BYTE:
|
|
498
|
+
return EVOASM_X64_PARAM_TYPE_BOOL;
|
|
499
|
+
case EVOASM_X64_BASIC_PARAM_REG1_HIGH_BYTE:
|
|
500
|
+
return EVOASM_X64_PARAM_TYPE_BOOL;
|
|
501
|
+
case EVOASM_X64_BASIC_PARAM_REL:
|
|
502
|
+
return EVOASM_X64_PARAM_TYPE_INT32;
|
|
503
|
+
default:
|
|
504
|
+
evoasm_assert_not_reached();
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
|
|
509
|
+
_Static_assert(sizeof(evoasm_x64_basic_params_t) <= sizeof(uint64_t), "basic parameters should bit into 64 bits");
|