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
data/examples/popcnt.yml
DELETED
data/examples/sym_reg.yml
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
instructions:
|
|
2
|
-
reg_types: [xmm]
|
|
3
|
-
grep: (add|mul|sqrt).*?sd
|
|
4
|
-
# sqrt(x**3 + 2 * x)
|
|
5
|
-
examples:
|
|
6
|
-
0.0: 0.0
|
|
7
|
-
0.5: 1.0606601717798212
|
|
8
|
-
1.0: 1.7320508075688772
|
|
9
|
-
1.5: 2.5248762345905194
|
|
10
|
-
2.0: 3.4641016151377544
|
|
11
|
-
2.5: 4.541475531146237
|
|
12
|
-
3.0: 5.744562646538029
|
|
13
|
-
3.5: 7.0622234459127675
|
|
14
|
-
4.0: 8.48528137423857
|
|
15
|
-
4.5: 10.00624804809475
|
|
16
|
-
5.0: 11.61895003862225
|
|
17
|
-
kernel_size: 5..15
|
|
18
|
-
program_size: 1
|
|
19
|
-
population_size: 1600
|
|
20
|
-
max_loss: 0.0
|
|
21
|
-
parameters: [reg0, reg1, reg2, reg3]
|
|
22
|
-
domains:
|
|
23
|
-
reg0: ®s [XMM0, XMM1, XMM2, XMM3]
|
|
24
|
-
reg1: *regs
|
|
25
|
-
reg2: *regs
|
|
26
|
-
reg3: *regs
|
data/exe/evoasm-search
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
# filetype=ruby
|
|
3
|
-
|
|
4
|
-
begin
|
|
5
|
-
require 'evoasm'
|
|
6
|
-
require 'evoasm/cli'
|
|
7
|
-
rescue LoadError
|
|
8
|
-
$LOAD_PATH.unshift File.expand_path File.join(__dir__, '../lib')
|
|
9
|
-
retry
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
search = Evoasm::Cli::Search.new ARGV[0], ARGV[1..-1]
|
|
13
|
-
search.start!
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
#include "evoasm-alloc.h"
|
|
2
|
-
|
|
3
|
-
#include <stdlib.h>
|
|
4
|
-
#include <errno.h>
|
|
5
|
-
|
|
6
|
-
void *
|
|
7
|
-
evoasm_malloc(size_t size) {
|
|
8
|
-
void *ptr = malloc(size);
|
|
9
|
-
if(EVOASM_UNLIKELY(!ptr)) {
|
|
10
|
-
evoasm_set_error(EVOASM_ERROR_TYPE_MEMORY, EVOASM_ERROR_CODE_NONE,
|
|
11
|
-
NULL, "Allocationg %zu bytes via malloc failed", size);
|
|
12
|
-
return NULL;
|
|
13
|
-
}
|
|
14
|
-
return ptr;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
void *
|
|
18
|
-
evoasm_calloc(size_t n, size_t size) {
|
|
19
|
-
void *ptr = calloc(n, size);
|
|
20
|
-
|
|
21
|
-
if(EVOASM_UNLIKELY(!ptr)) {
|
|
22
|
-
evoasm_set_error(EVOASM_ERROR_TYPE_MEMORY, EVOASM_ERROR_CODE_NONE,
|
|
23
|
-
NULL, "Allocationg %zux%zu () bytes via calloc failed", n, size, n * size);
|
|
24
|
-
return NULL;
|
|
25
|
-
}
|
|
26
|
-
return ptr;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
void *
|
|
30
|
-
evoasm_realloc(void *ptr, size_t size) {
|
|
31
|
-
void *new_ptr = realloc(ptr, size);
|
|
32
|
-
|
|
33
|
-
if(EVOASM_UNLIKELY(!ptr)) {
|
|
34
|
-
evoasm_set_error(EVOASM_ERROR_TYPE_MEMORY, EVOASM_ERROR_CODE_NONE,
|
|
35
|
-
NULL, "Allocating %zu bytes via realloc failed", size);
|
|
36
|
-
return NULL;
|
|
37
|
-
}
|
|
38
|
-
return new_ptr;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
void
|
|
42
|
-
evoasm_free(void *ptr) {
|
|
43
|
-
free(ptr);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
void *
|
|
47
|
-
evoasm_mmap(size_t size, void *p) {
|
|
48
|
-
/* Note that mmap considers the pointer passed soley as a hint address
|
|
49
|
-
* and returns a valid address (possibly at a different address) in any case.
|
|
50
|
-
* VirtualAlloc, on the other hand, will return NULL if the address is
|
|
51
|
-
* not available
|
|
52
|
-
*/
|
|
53
|
-
void *mem;
|
|
54
|
-
|
|
55
|
-
#if defined(_WIN32)
|
|
56
|
-
retry:
|
|
57
|
-
mem = VirtualAlloc(p, size, MEM_COMMIT, PAGE_READWRITE);
|
|
58
|
-
if(mem == NULL) {
|
|
59
|
-
if(p != NULL) {
|
|
60
|
-
goto retry;
|
|
61
|
-
} else {
|
|
62
|
-
goto error;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return mem;
|
|
66
|
-
#elif defined(_POSIX_VERSION)
|
|
67
|
-
mem = mmap(p, size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
|
|
68
|
-
if(mem == MAP_FAILED) {
|
|
69
|
-
goto error;
|
|
70
|
-
}
|
|
71
|
-
#else
|
|
72
|
-
#error
|
|
73
|
-
#endif
|
|
74
|
-
return mem;
|
|
75
|
-
|
|
76
|
-
error:
|
|
77
|
-
evoasm_set_error(EVOASM_ERROR_TYPE_MEMORY, EVOASM_ERROR_CODE_NONE,
|
|
78
|
-
NULL, "Allocationg %zu bytes via mmap failed: %s", size, strerror(errno));
|
|
79
|
-
return NULL;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
evoasm_success
|
|
83
|
-
evoasm_munmap(void *p, size_t size) {
|
|
84
|
-
bool ret;
|
|
85
|
-
#if defined(_WIN32)
|
|
86
|
-
ret = VirtualFree(p, size, MEM_DECOMMIT);
|
|
87
|
-
#elif defined(_POSIX_VERSION)
|
|
88
|
-
ret = (munmap(p, size) == 0);
|
|
89
|
-
#else
|
|
90
|
-
# error
|
|
91
|
-
#endif
|
|
92
|
-
|
|
93
|
-
if(!ret) {
|
|
94
|
-
evoasm_set_error(EVOASM_ERROR_TYPE_MEMORY, EVOASM_ERROR_CODE_NONE,
|
|
95
|
-
NULL, "Unmapping %zu bytes via munmap failed: %s", size, strerror(errno));
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
return ret;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
evoasm_success
|
|
102
|
-
evoasm_mprot(void *p, size_t size, int mode)
|
|
103
|
-
{
|
|
104
|
-
|
|
105
|
-
#if defined(_WIN32)
|
|
106
|
-
if(VirtualProtect(p, size, mode, NULL) != 0) {
|
|
107
|
-
goto error;
|
|
108
|
-
}
|
|
109
|
-
#elif defined(_POSIX_VERSION)
|
|
110
|
-
if(mprotect(p, size, mode) != 0) {
|
|
111
|
-
goto error;
|
|
112
|
-
}
|
|
113
|
-
#else
|
|
114
|
-
#error
|
|
115
|
-
#endif
|
|
116
|
-
return true;
|
|
117
|
-
|
|
118
|
-
error:
|
|
119
|
-
evoasm_set_error(EVOASM_ERROR_TYPE_MEMORY, EVOASM_ERROR_CODE_NONE,
|
|
120
|
-
NULL, "Changing memory protection failed: %s", strerror(errno));
|
|
121
|
-
return false;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
static long _evoasm_page_size = -1;
|
|
125
|
-
|
|
126
|
-
static long
|
|
127
|
-
evoasm_query_page_size() {
|
|
128
|
-
#if defined(_WIN32)
|
|
129
|
-
SYSTEM_INFO si;
|
|
130
|
-
GetSystemInfo(&si);
|
|
131
|
-
return si.dwPageSize;
|
|
132
|
-
#elif defined(_POSIX_VERSION)
|
|
133
|
-
return sysconf(_SC_PAGESIZE);
|
|
134
|
-
#else
|
|
135
|
-
#error
|
|
136
|
-
#endif
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
long
|
|
140
|
-
evoasm_page_size() {
|
|
141
|
-
if(_evoasm_page_size == -1) {
|
|
142
|
-
_evoasm_page_size = evoasm_query_page_size();
|
|
143
|
-
}
|
|
144
|
-
return _evoasm_page_size;
|
|
145
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#if defined (__unix__) || (defined (__APPLE__) && defined (__MACH__))
|
|
4
|
-
# if !defined(_DEFAULT_SOURCE)
|
|
5
|
-
# define _DEFAULT_SOURCE
|
|
6
|
-
# endif
|
|
7
|
-
# include <unistd.h>
|
|
8
|
-
# include <sys/mman.h>
|
|
9
|
-
# if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
|
|
10
|
-
# define MAP_ANONYMOUS MAP_ANON
|
|
11
|
-
# endif
|
|
12
|
-
#endif
|
|
13
|
-
|
|
14
|
-
#include <string.h>
|
|
15
|
-
#include <alloca.h>
|
|
16
|
-
|
|
17
|
-
#if defined(_WIN32)
|
|
18
|
-
# include <malloc.h>
|
|
19
|
-
#endif
|
|
20
|
-
|
|
21
|
-
#include "evoasm-error.h"
|
|
22
|
-
|
|
23
|
-
#ifdef __GNUC__
|
|
24
|
-
# define EVOASM_MALLOC_ATTRS __attribute__((malloc))
|
|
25
|
-
# define EVOASM_CALLOC_ATTRS __attribute__((malloc))
|
|
26
|
-
# define EVOASM_REALLOC_ATTRS __attribute__((malloc))
|
|
27
|
-
#else
|
|
28
|
-
# define EVOASM_MALLOC_ATTRS
|
|
29
|
-
# define EVOASM_CALLOC_ATTRS
|
|
30
|
-
# define EVOASM_REALLOC_ATTRS
|
|
31
|
-
#endif
|
|
32
|
-
|
|
33
|
-
#if defined(_WIN32)
|
|
34
|
-
#define EVOASM_MPROT_RW PAGE_READWRITE
|
|
35
|
-
#define EVOASM_MPROT_RX PAGE_EXECUTE_READ
|
|
36
|
-
#define EVOASM_MPROT_RWX PAGE_EXECUTE_READWRITE
|
|
37
|
-
#elif defined(_POSIX_VERSION)
|
|
38
|
-
#define EVOASM_MPROT_RW (PROT_READ|PROT_WRITE)
|
|
39
|
-
#define EVOASM_MPROT_RX (PROT_READ|PROT_EXEC)
|
|
40
|
-
#define EVOASM_MPROT_RWX (PROT_READ|PROT_WRITE|PROT_EXEC)
|
|
41
|
-
#else
|
|
42
|
-
#error
|
|
43
|
-
#endif
|
|
44
|
-
|
|
45
|
-
void *evoasm_malloc(size_t) EVOASM_MALLOC_ATTRS;
|
|
46
|
-
void *evoasm_calloc(size_t, size_t) EVOASM_CALLOC_ATTRS;
|
|
47
|
-
void *evoasm_realloc(void *, size_t) EVOASM_REALLOC_ATTRS;
|
|
48
|
-
void evoasm_free(void *);
|
|
49
|
-
|
|
50
|
-
void *evoasm_mmap(size_t size, void *p);
|
|
51
|
-
evoasm_success evoasm_munmap(void *p, size_t size);
|
|
52
|
-
evoasm_success evoasm_mprot(void *p, size_t size, int mode);
|
|
53
|
-
long evoasm_page_size();
|
|
54
|
-
|
|
55
|
-
#if defined(_WIN32)
|
|
56
|
-
#define evoasm_alloca(s) _malloca(s);
|
|
57
|
-
#else
|
|
58
|
-
#define evoasm_alloca(s) alloca(s);
|
|
59
|
-
#endif
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
#include "evoasm-arch.h"
|
|
2
|
-
#include "evoasm-util.h"
|
|
3
|
-
#include <string.h>
|
|
4
|
-
#include <inttypes.h>
|
|
5
|
-
|
|
6
|
-
EVOASM_DECL_LOG_TAG("arch")
|
|
7
|
-
|
|
8
|
-
evoasm_success
|
|
9
|
-
evoasm_inst_encode(evoasm_inst *inst, evoasm_arch *arch, evoasm_arch_param_val *param_vals, evoasm_bitmap *set_params) {
|
|
10
|
-
return inst->encode_func(arch, param_vals, set_params);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
uint16_t
|
|
14
|
-
evoasm_arch_insts(evoasm_arch *arch, const evoasm_inst **insts) {
|
|
15
|
-
return arch->cls->insts_func(arch, insts);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
void
|
|
19
|
-
evoasm_arch_reset(evoasm_arch *arch) {
|
|
20
|
-
arch->buf_start = EVOASM_ARCH_BUF_CAPA / 2;
|
|
21
|
-
arch->buf_end = EVOASM_ARCH_BUF_CAPA / 2;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
void
|
|
25
|
-
evoasm_arch_init(evoasm_arch *arch, evoasm_arch_cls *cls) {
|
|
26
|
-
static evoasm_arch zero_arch = {0};
|
|
27
|
-
*arch = zero_arch;
|
|
28
|
-
evoasm_arch_reset(arch);
|
|
29
|
-
arch->cls = cls;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
void
|
|
33
|
-
evoasm_arch_destroy(evoasm_arch *arch) {
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
void
|
|
37
|
-
evoasm_arch_save(evoasm_arch *arch, evoasm_buf *buf) {
|
|
38
|
-
uint8_t len = (uint8_t)(arch->buf_end - arch->buf_start);
|
|
39
|
-
|
|
40
|
-
memcpy(buf->data + buf->pos, arch->buf + arch->buf_start, len);
|
|
41
|
-
buf->pos += len;
|
|
42
|
-
|
|
43
|
-
evoasm_arch_reset(arch);
|
|
44
|
-
}
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include <stdint.h>
|
|
4
|
-
#include "evoasm-error.h"
|
|
5
|
-
#include "evoasm-param.h"
|
|
6
|
-
#include "evoasm-buf.h"
|
|
7
|
-
#include "evoasm-log.h"
|
|
8
|
-
|
|
9
|
-
#define EVOASM_ARCH_BUF_CAPA 32
|
|
10
|
-
#define EVOASM_ARCH_MAX_PARAMS 64
|
|
11
|
-
|
|
12
|
-
typedef uint8_t evoasm_reg_id;
|
|
13
|
-
#define EVOASM_REG_ID_MAX UINT8_MAX
|
|
14
|
-
typedef uint16_t evoasm_inst_id;
|
|
15
|
-
|
|
16
|
-
typedef enum {
|
|
17
|
-
EVOASM_OPERAND_SIZE_1,
|
|
18
|
-
EVOASM_OPERAND_SIZE_8,
|
|
19
|
-
EVOASM_OPERAND_SIZE_16,
|
|
20
|
-
EVOASM_OPERAND_SIZE_32,
|
|
21
|
-
EVOASM_OPERAND_SIZE_64,
|
|
22
|
-
EVOASM_OPERAND_SIZE_128,
|
|
23
|
-
EVOASM_OPERAND_SIZE_256,
|
|
24
|
-
EVOASM_OPERAND_SIZE_512,
|
|
25
|
-
EVOASM_N_OPERAND_SIZES,
|
|
26
|
-
} evoasm_operand_size;
|
|
27
|
-
|
|
28
|
-
#define EVOASM_OPERAND_SIZE_BITSIZE 3
|
|
29
|
-
#define EVOASM_OPERAND_SIZE_BITSIZE_WITH_N 4
|
|
30
|
-
|
|
31
|
-
struct evoasm_arch;
|
|
32
|
-
struct evoasm_inst;
|
|
33
|
-
|
|
34
|
-
typedef uint16_t (*evoasm_arch_insts_func)(struct evoasm_arch *arch, const struct evoasm_inst **insts);
|
|
35
|
-
|
|
36
|
-
typedef enum {
|
|
37
|
-
EVOASM_ARCH_X64
|
|
38
|
-
} evoasm_arch_id;
|
|
39
|
-
|
|
40
|
-
typedef struct {
|
|
41
|
-
evoasm_arch_id id : 8;
|
|
42
|
-
uint16_t n_insts;
|
|
43
|
-
uint8_t n_params;
|
|
44
|
-
uint8_t max_inst_len;
|
|
45
|
-
evoasm_arch_insts_func insts_func;
|
|
46
|
-
} evoasm_arch_cls;
|
|
47
|
-
|
|
48
|
-
typedef enum {
|
|
49
|
-
EVOASM_ARCH_ERROR_CODE_NOT_ENCODABLE = EVOASM_N_ERROR_CODES,
|
|
50
|
-
EVOASM_ARCH_ERROR_CODE_MISSING_PARAM,
|
|
51
|
-
EVOASM_ARCH_ERROR_CODE_INVALID_ACCESS,
|
|
52
|
-
EVOASM_ARCH_ERROR_CODE_MISSING_FEATURE,
|
|
53
|
-
} evoasm_arch_error_code;
|
|
54
|
-
|
|
55
|
-
struct evoasm_arch;
|
|
56
|
-
|
|
57
|
-
typedef struct {
|
|
58
|
-
struct evoasm_arch *arch;
|
|
59
|
-
uint8_t reg;
|
|
60
|
-
uint8_t param;
|
|
61
|
-
uint16_t inst;
|
|
62
|
-
} evoasm_arch_error_data;
|
|
63
|
-
|
|
64
|
-
_Static_assert(sizeof(evoasm_error_data) >= sizeof(evoasm_arch_error_data), "evoasm_arch_error_data exceeds evoasm_error_data size limit");
|
|
65
|
-
|
|
66
|
-
typedef struct {
|
|
67
|
-
EVOASM_ERROR_HEADER
|
|
68
|
-
evoasm_arch_error_data data;
|
|
69
|
-
} evoasm_arch_error;
|
|
70
|
-
|
|
71
|
-
typedef struct evoasm_arch {
|
|
72
|
-
evoasm_arch_cls *cls;
|
|
73
|
-
uint8_t buf_end;
|
|
74
|
-
uint8_t buf_start;
|
|
75
|
-
uint8_t buf[EVOASM_ARCH_BUF_CAPA];
|
|
76
|
-
void *user_data;
|
|
77
|
-
/* must have a bit for every
|
|
78
|
-
* writable register */
|
|
79
|
-
evoasm_bitmap128 acc;
|
|
80
|
-
} evoasm_arch;
|
|
81
|
-
|
|
82
|
-
typedef bool (*evoasm_inst_encode_func)(evoasm_arch *arch, evoasm_arch_param_val *param_vals, evoasm_bitmap *set_params);
|
|
83
|
-
|
|
84
|
-
typedef struct evoasm_inst {
|
|
85
|
-
evoasm_inst_id id;
|
|
86
|
-
uint16_t params_len;
|
|
87
|
-
evoasm_arch_param *params;
|
|
88
|
-
evoasm_inst_encode_func encode_func;
|
|
89
|
-
} evoasm_inst;
|
|
90
|
-
|
|
91
|
-
uint16_t
|
|
92
|
-
evoasm_arch_insts(evoasm_arch *arch, const evoasm_inst **insts);
|
|
93
|
-
|
|
94
|
-
evoasm_success
|
|
95
|
-
evoasm_inst_encode(evoasm_inst *inst, evoasm_arch *arch, evoasm_arch_param_val *param_vals, evoasm_bitmap *set_params);
|
|
96
|
-
|
|
97
|
-
void
|
|
98
|
-
evoasm_arch_reset(evoasm_arch *arch);
|
|
99
|
-
|
|
100
|
-
void
|
|
101
|
-
evoasm_arch_init(evoasm_arch *arch, evoasm_arch_cls *cls);
|
|
102
|
-
|
|
103
|
-
void
|
|
104
|
-
evoasm_arch_destroy(evoasm_arch *arch);
|
|
105
|
-
|
|
106
|
-
void
|
|
107
|
-
evoasm_arch_save(evoasm_arch *arch, evoasm_buf *buf);
|
|
108
|
-
|
|
109
|
-
static inline void
|
|
110
|
-
evoasm_arch_write8(evoasm_arch *arch, int64_t datum) {
|
|
111
|
-
uint8_t new_end = (uint8_t)(arch->buf_end + 1);
|
|
112
|
-
*((uint8_t *)(arch->buf + arch->buf_end)) = (uint8_t) datum;
|
|
113
|
-
arch->buf_end = new_end;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
static inline void
|
|
117
|
-
evoasm_arch_write16(evoasm_arch *arch, int64_t datum) {
|
|
118
|
-
uint8_t new_end = (uint8_t)(arch->buf_end + 2);
|
|
119
|
-
*((int16_t *)(arch->buf + arch->buf_end)) = (int16_t) datum;
|
|
120
|
-
arch->buf_end = new_end;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
static inline void
|
|
124
|
-
evoasm_arch_write32(evoasm_arch *arch, int64_t datum) {
|
|
125
|
-
uint8_t new_end = (uint8_t)(arch->buf_end + 4);
|
|
126
|
-
*((int32_t *)(arch->buf + arch->buf_end)) = (int32_t) datum;
|
|
127
|
-
arch->buf_end = new_end;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
static inline void
|
|
131
|
-
evoasm_arch_write64(evoasm_arch *arch, int64_t datum) {
|
|
132
|
-
uint8_t new_end = (uint8_t)(arch->buf_end + 8);
|
|
133
|
-
*((int64_t *)(arch->buf + arch->buf_end)) = (int64_t) datum;
|
|
134
|
-
arch->buf_end = new_end;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
static inline void
|
|
138
|
-
evoasm_arch_write_access(evoasm_arch *arch, evoasm_bitmap *acc, evoasm_reg_id reg) {
|
|
139
|
-
evoasm_bitmap_set(acc, (unsigned) reg);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
static inline void
|
|
143
|
-
evoasm_arch_undefined_access(evoasm_arch *arch, evoasm_bitmap *acc, evoasm_reg_id reg) {
|
|
144
|
-
evoasm_bitmap_unset(acc, (unsigned) reg);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
static inline evoasm_success
|
|
148
|
-
_evoasm_arch_read_access(evoasm_arch *arch, evoasm_bitmap *acc, evoasm_reg_id reg, evoasm_inst_id inst, const char *file, unsigned line) {
|
|
149
|
-
if(!evoasm_bitmap_get(acc, (unsigned) reg)) {
|
|
150
|
-
evoasm_arch_error_data error_data = {
|
|
151
|
-
.reg = (uint8_t) reg,
|
|
152
|
-
.inst = (uint16_t) inst,
|
|
153
|
-
.arch = arch
|
|
154
|
-
};
|
|
155
|
-
evoasm_set_error(EVOASM_ERROR_TYPE_ARCH, EVOASM_ARCH_ERROR_CODE_INVALID_ACCESS, &error_data, file, line, "read access violation");
|
|
156
|
-
return false;
|
|
157
|
-
}
|
|
158
|
-
return true;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
#define evoasm_arch_read_access(arch, acc, reg, inst) _evoasm_arch_read_access(arch, acc, reg, inst, __FILE__, __LINE__)
|