evoasm 0.0.2.pre7 → 0.1.0.pre2
Sign up to get free protection for your applications and to get access to all the features.
- 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,167 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) 2016 Julian Aron Prenner <jap@polyadic.com>
|
3
|
+
*
|
4
|
+
* This program is free software: you can redistribute it and/or modify
|
5
|
+
* it under the terms of the GNU Affero General Public License as published by
|
6
|
+
* the Free Software Foundation, either version 3 of the License, or
|
7
|
+
* (at your option) any later version.
|
8
|
+
*
|
9
|
+
* This program is distributed in the hope that it will be useful,
|
10
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
* GNU Affero General Public License for more details.
|
13
|
+
*
|
14
|
+
* You should have received a copy of the GNU Affero General Public License
|
15
|
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
16
|
+
*/
|
17
|
+
|
18
|
+
#pragma once
|
19
|
+
|
20
|
+
#include "evoasm-pop-params.h"
|
21
|
+
#include "evoasm-x64.h"
|
22
|
+
#include "evoasm-program-io.h"
|
23
|
+
|
24
|
+
#define EVOASM_KERNEL_MAX_OUTPUT_REGS 254
|
25
|
+
#define EVOASM_KERNEL_MAX_INPUT_REGS 254
|
26
|
+
|
27
|
+
#define EVOASM_KERNEL_REG_INFO_N_TRANS_REGS 2
|
28
|
+
|
29
|
+
typedef struct {
|
30
|
+
bool input : 1;
|
31
|
+
bool written : 1;
|
32
|
+
bool output : 1;
|
33
|
+
/*registers in following kernels whose input is this register */
|
34
|
+
} evoasm_kernel_x64_reg_info_reg_t;
|
35
|
+
|
36
|
+
typedef struct {
|
37
|
+
evoasm_kernel_x64_reg_info_reg_t regs[EVOASM_X64_REG_NONE];
|
38
|
+
|
39
|
+
/* trans_regs[trans_idx][reg_id] stores the register in this kernel that is used
|
40
|
+
* to initialize reg_id in the trans_idx'th transition kernel.
|
41
|
+
* Right now, trans_idx=0 is the next kernel in line,
|
42
|
+
* while trans_idx=1 is the kernel jumped to using the programs jmp_offs table.
|
43
|
+
*/
|
44
|
+
evoasm_x64_reg_id_t trans_regs[EVOASM_KERNEL_REG_INFO_N_TRANS_REGS][EVOASM_X64_REG_NONE];
|
45
|
+
unsigned written_flags : EVOASM_X64_RFLAGS_FLAGS_BITSIZE;
|
46
|
+
} evoasm_kernel_x64_reg_info_t;
|
47
|
+
|
48
|
+
typedef union {
|
49
|
+
evoasm_kernel_x64_reg_info_t x64;
|
50
|
+
} evoasm_kernel_reg_info_t;
|
51
|
+
|
52
|
+
|
53
|
+
typedef struct {
|
54
|
+
uint16_t size;
|
55
|
+
evoasm_inst_id_t *insts;
|
56
|
+
union {
|
57
|
+
evoasm_x64_basic_params_t *x64;
|
58
|
+
} params;
|
59
|
+
evoasm_kernel_reg_info_t reg_info;
|
60
|
+
|
61
|
+
union {
|
62
|
+
evoasm_x64_reg_id_t x64[EVOASM_KERNEL_MAX_OUTPUT_REGS];
|
63
|
+
} output_regs;
|
64
|
+
|
65
|
+
uint_fast8_t n_input_regs;
|
66
|
+
uint_fast8_t n_output_regs;
|
67
|
+
uint16_t idx;
|
68
|
+
uint16_t buf_start;
|
69
|
+
uint16_t buf_end;
|
70
|
+
|
71
|
+
#ifdef EVOASM_ENABLE_PARANOID_MODE
|
72
|
+
evoasm_program_io_val_t rand_vals[EVOASM_X64_REG_NONE];
|
73
|
+
#endif
|
74
|
+
|
75
|
+
} evoasm_kernel_t;
|
76
|
+
|
77
|
+
|
78
|
+
typedef enum {
|
79
|
+
EVOASM_PROGRAM_ERROR_CODE_NO_OUTPUT
|
80
|
+
} evoasm_program_error_code_t;
|
81
|
+
|
82
|
+
typedef enum {
|
83
|
+
EVOASM_PROGRAM_EMIT_FLAG_PREPARE = (1 << 0),
|
84
|
+
EVOASM_PROGRAM_EMIT_FLAG_EMIT_KERNELS = (1 << 1),
|
85
|
+
EVOASM_PROGRAM_EMIT_FLAG_EMIT_IO_LOAD_STORE = (1 << 2),
|
86
|
+
EVOASM_PROGRAM_EMIT_FLAG_SET_IO_MAPPING = (1 << 3)
|
87
|
+
} evoasm_program_emit_flags_t;
|
88
|
+
|
89
|
+
#define EVOASM_PROGRAM_MAX_SIZE 256
|
90
|
+
#define EVOASM_KERNEL_MAX_SIZE 2048
|
91
|
+
|
92
|
+
typedef struct {
|
93
|
+
evoasm_arch_info_t *arch_info;
|
94
|
+
evoasm_buf_t *buf;
|
95
|
+
evoasm_buf_t *body_buf;
|
96
|
+
bool reset_rflags : 1;
|
97
|
+
bool shallow : 1;
|
98
|
+
uint32_t recur_limit;
|
99
|
+
uint16_t size;
|
100
|
+
uint16_t max_tuples;
|
101
|
+
uint32_t exception_mask;
|
102
|
+
evoasm_program_io_val_type_t types[EVOASM_PROGRAM_OUTPUT_MAX_ARITY];
|
103
|
+
evoasm_program_io_val_t *output_vals;
|
104
|
+
evoasm_kernel_t *kernels;
|
105
|
+
int16_t *jmp_offs;
|
106
|
+
uint8_t *jmp_conds;
|
107
|
+
uint32_t *recur_counters;
|
108
|
+
|
109
|
+
/* these two are incomplete (values missig)
|
110
|
+
* We only need arity and types */
|
111
|
+
evoasm_program_input_t _input;
|
112
|
+
evoasm_program_output_t _output;
|
113
|
+
|
114
|
+
evoasm_reg_id_t output_regs[EVOASM_PROGRAM_IO_MAX_ARITY];
|
115
|
+
evoasm_buf_t _buf;
|
116
|
+
evoasm_buf_t _body_buf;
|
117
|
+
|
118
|
+
union {
|
119
|
+
/* register at index i has _input i % input_arity */
|
120
|
+
uint8_t x64[EVOASM_X64_REG_NONE];
|
121
|
+
} reg_inputs;
|
122
|
+
|
123
|
+
} evoasm_program_t;
|
124
|
+
|
125
|
+
evoasm_success_t
|
126
|
+
evoasm_program_clone(evoasm_program_t *program, evoasm_program_t *cloned_program);
|
127
|
+
|
128
|
+
evoasm_success_t
|
129
|
+
evoasm_program_init(evoasm_program_t *program,
|
130
|
+
evoasm_arch_info_t *arch_info,
|
131
|
+
size_t program_size,
|
132
|
+
size_t kernel_size,
|
133
|
+
size_t max_tuples,
|
134
|
+
size_t recur_limit,
|
135
|
+
bool shallow);
|
136
|
+
|
137
|
+
|
138
|
+
evoasm_program_output_t *
|
139
|
+
evoasm_program_run(evoasm_program_t *program,
|
140
|
+
evoasm_program_input_t *input);
|
141
|
+
|
142
|
+
|
143
|
+
evoasm_success_t
|
144
|
+
evoasm_program_destroy(evoasm_program_t *program);
|
145
|
+
|
146
|
+
evoasm_success_t
|
147
|
+
evoasm_program_eliminate_introns(evoasm_program_t *program, evoasm_program_t *dest_program);
|
148
|
+
|
149
|
+
evoasm_success_t
|
150
|
+
evoasm_program_emit(evoasm_program_t *program,
|
151
|
+
evoasm_program_input_t *input,
|
152
|
+
evoasm_program_emit_flags_t emit_flags);
|
153
|
+
|
154
|
+
evoasm_loss_t
|
155
|
+
evoasm_program_eval(evoasm_program_t *program,
|
156
|
+
evoasm_program_output_t *output);
|
157
|
+
|
158
|
+
evoasm_success_t
|
159
|
+
evoasm_program_detach(evoasm_program_t *program,
|
160
|
+
evoasm_program_io_t *input,
|
161
|
+
evoasm_program_io_t *output);
|
162
|
+
|
163
|
+
|
164
|
+
void
|
165
|
+
evoasm_program_log(evoasm_program_t *program, evoasm_log_level_t log_level);
|
166
|
+
|
167
|
+
EVOASM_DECL_ALLOC_FREE_FUNCS(program)
|
@@ -0,0 +1,65 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) 2016 Julian Aron Prenner <jap@polyadic.com>
|
3
|
+
*
|
4
|
+
* This program is free software: you can redistribute it and/or modify
|
5
|
+
* it under the terms of the GNU Affero General Public License as published by
|
6
|
+
* the Free Software Foundation, either version 3 of the License, or
|
7
|
+
* (at your option) any later version.
|
8
|
+
*
|
9
|
+
* This program is distributed in the hope that it will be useful,
|
10
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
* GNU Affero General Public License for more details.
|
13
|
+
*
|
14
|
+
* You should have received a copy of the GNU Affero General Public License
|
15
|
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
16
|
+
*/
|
17
|
+
|
18
|
+
#include "evoasm.h"
|
19
|
+
#include "evoasm-util.h"
|
20
|
+
#include "evoasm-rand.h"
|
21
|
+
|
22
|
+
EVOASM_DEF_LOG_TAG("rand")
|
23
|
+
|
24
|
+
EVOASM_DEF_ALLOC_FREE_FUNCS(prng)
|
25
|
+
|
26
|
+
void
|
27
|
+
evoasm_prng_init(evoasm_prng_t *prng, evoasm_prng_state_t *seed) {
|
28
|
+
prng->state = *seed;
|
29
|
+
prng->p = 0;
|
30
|
+
}
|
31
|
+
|
32
|
+
void
|
33
|
+
evoasm_prng_destroy(evoasm_prng_t *prng) {
|
34
|
+
}
|
35
|
+
|
36
|
+
uint64_t
|
37
|
+
evoasm_prng_rand64(evoasm_prng_t *prng) {
|
38
|
+
return evoasm_prng_rand64_(prng);
|
39
|
+
}
|
40
|
+
|
41
|
+
uint32_t
|
42
|
+
evoasm_prng_rand32(evoasm_prng_t *prng) {
|
43
|
+
return evoasm_prng_rand32_(prng);
|
44
|
+
}
|
45
|
+
|
46
|
+
uint16_t
|
47
|
+
evoasm_prng_rand16(evoasm_prng_t *prng) {
|
48
|
+
return evoasm_prng_rand16_(prng);
|
49
|
+
}
|
50
|
+
|
51
|
+
uint8_t
|
52
|
+
evoasm_prng_rand8(evoasm_prng_t *prng) {
|
53
|
+
return evoasm_prng_rand8_(prng);
|
54
|
+
}
|
55
|
+
|
56
|
+
float
|
57
|
+
evoasm_prng_randf(evoasm_prng_t *prng) {
|
58
|
+
return evoasm_prng_randf_(prng);
|
59
|
+
}
|
60
|
+
|
61
|
+
int64_t
|
62
|
+
evoasm_prng_rand_between(evoasm_prng_t *prng, int64_t min, int64_t max) {
|
63
|
+
return evoasm_prng_rand_between_(prng, min, max);
|
64
|
+
}
|
65
|
+
|
@@ -0,0 +1,76 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) 2016 Julian Aron Prenner <jap@polyadic.com>
|
3
|
+
*
|
4
|
+
* This program is free software: you can redistribute it and/or modify
|
5
|
+
* it under the terms of the GNU Affero General Public License as published by
|
6
|
+
* the Free Software Foundation, either version 3 of the License, or
|
7
|
+
* (at your option) any later version.
|
8
|
+
*
|
9
|
+
* This program is distributed in the hope that it will be useful,
|
10
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
* GNU Affero General Public License for more details.
|
13
|
+
*
|
14
|
+
* You should have received a copy of the GNU Affero General Public License
|
15
|
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
16
|
+
*/
|
17
|
+
|
18
|
+
#pragma once
|
19
|
+
|
20
|
+
#include "evoasm-error.h"
|
21
|
+
#include "evoasm-log.h"
|
22
|
+
|
23
|
+
#define EVOASM_PRNG_SEED_LEN 16
|
24
|
+
|
25
|
+
typedef struct {
|
26
|
+
uint64_t data[EVOASM_PRNG_SEED_LEN];
|
27
|
+
} evoasm_prng_state_t;
|
28
|
+
|
29
|
+
typedef struct evoasm_prng64 {
|
30
|
+
/* xorshift1024star */
|
31
|
+
evoasm_prng_state_t state;
|
32
|
+
int p;
|
33
|
+
} evoasm_prng_t;
|
34
|
+
|
35
|
+
void
|
36
|
+
evoasm_prng_init(evoasm_prng_t *prng, evoasm_prng_state_t *seed);
|
37
|
+
|
38
|
+
void
|
39
|
+
evoasm_prng_destroy(evoasm_prng_t *prng);
|
40
|
+
|
41
|
+
|
42
|
+
/* From: https://en.wikipedia.org/wiki/Xorshift */
|
43
|
+
static inline uint64_t
|
44
|
+
evoasm_prng_rand64_(evoasm_prng_t *prng) {
|
45
|
+
uint64_t *s = prng->state.data;
|
46
|
+
const uint64_t s0 = s[prng->p];
|
47
|
+
uint64_t s1 = s[prng->p = (prng->p + 1) & 15];
|
48
|
+
s1 ^= s1 << 31; // a
|
49
|
+
s[prng->p] = s1 ^ s0 ^ (s1 >> 11) ^ (s0 >> 30); // b,c
|
50
|
+
return (s[prng->p] * UINT64_C(1181783497276652981)) - 1;
|
51
|
+
}
|
52
|
+
|
53
|
+
static inline uint32_t
|
54
|
+
evoasm_prng_rand32_(evoasm_prng_t *prng) {
|
55
|
+
return (uint32_t) (evoasm_prng_rand64_(prng) & UINT32_MAX);
|
56
|
+
}
|
57
|
+
|
58
|
+
static inline uint16_t
|
59
|
+
evoasm_prng_rand16_(evoasm_prng_t *prng) {
|
60
|
+
return (uint16_t) (evoasm_prng_rand64_(prng) & UINT16_MAX);
|
61
|
+
}
|
62
|
+
|
63
|
+
static inline uint8_t
|
64
|
+
evoasm_prng_rand8_(evoasm_prng_t *prng) {
|
65
|
+
return (uint8_t) (evoasm_prng_rand64_(prng) & UINT8_MAX);
|
66
|
+
}
|
67
|
+
|
68
|
+
static inline float
|
69
|
+
evoasm_prng_randf_(evoasm_prng_t *prng) {
|
70
|
+
return (float) evoasm_prng_rand32_(prng) / (float) UINT32_MAX;
|
71
|
+
}
|
72
|
+
|
73
|
+
static inline int64_t
|
74
|
+
evoasm_prng_rand_between_(evoasm_prng_t *prng, int64_t min, int64_t max) {
|
75
|
+
return min + (int64_t)(evoasm_prng_rand64_(prng) % (uint64_t)(max - min + 1ll));
|
76
|
+
}
|
@@ -0,0 +1,106 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) 2016 Julian Aron Prenner <jap@polyadic.com>
|
3
|
+
*
|
4
|
+
* This program is free software: you can redistribute it and/or modify
|
5
|
+
* it under the terms of the GNU Affero General Public License as published by
|
6
|
+
* the Free Software Foundation, either version 3 of the License, or
|
7
|
+
* (at your option) any later version.
|
8
|
+
*
|
9
|
+
* This program is distributed in the hope that it will be useful,
|
10
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
* GNU Affero General Public License for more details.
|
13
|
+
*
|
14
|
+
* You should have received a copy of the GNU Affero General Public License
|
15
|
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
16
|
+
*/
|
17
|
+
|
18
|
+
#include "evoasm-signal.h"
|
19
|
+
|
20
|
+
#ifdef EVOASM_UNIX
|
21
|
+
|
22
|
+
#define EVOASM_SIGNAL_EXCEPTION_MASK_GET(exc) (_evoasm_signal_ctx.exception_mask & (1u << exc))
|
23
|
+
|
24
|
+
_Thread_local evoasm_signal_ctx_t _evoasm_signal_ctx;
|
25
|
+
|
26
|
+
static void
|
27
|
+
evoasm_signal_handler(int sig, siginfo_t *siginfo, void *ctx) {
|
28
|
+
bool handle = false;
|
29
|
+
|
30
|
+
switch(_evoasm_signal_ctx.arch_id) {
|
31
|
+
case EVOASM_ARCH_X64: {
|
32
|
+
switch(sig) {
|
33
|
+
case SIGFPE: {
|
34
|
+
int exception = EVOASM_X64_EXCEPTION_DE;
|
35
|
+
bool catch_div_by_zero = siginfo->si_code == FPE_INTDIV &&
|
36
|
+
EVOASM_SIGNAL_EXCEPTION_MASK_GET(exception);
|
37
|
+
_evoasm_signal_ctx.last_exception = exception;
|
38
|
+
handle = catch_div_by_zero;
|
39
|
+
break;
|
40
|
+
}
|
41
|
+
default:
|
42
|
+
break;
|
43
|
+
}
|
44
|
+
break;
|
45
|
+
}
|
46
|
+
default:
|
47
|
+
evoasm_assert_not_reached();
|
48
|
+
}
|
49
|
+
|
50
|
+
if(handle) {
|
51
|
+
siglongjmp(_evoasm_signal_ctx.env, 1);
|
52
|
+
} else {
|
53
|
+
evoasm_signal_uninstall();
|
54
|
+
raise(sig);
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
static struct sigaction prev_action;
|
59
|
+
|
60
|
+
void
|
61
|
+
evoasm_signal_install() {
|
62
|
+
struct sigaction action = {0};
|
63
|
+
|
64
|
+
evoasm_arch_id_t arch_id = evoasm_get_current_arch();
|
65
|
+
assert(arch_id != EVOASM_ARCH_NONE);
|
66
|
+
|
67
|
+
_evoasm_signal_ctx.arch_id = (volatile evoasm_arch_id_t) arch_id;
|
68
|
+
_evoasm_signal_ctx.exception_mask = 0;
|
69
|
+
_evoasm_signal_ctx.last_exception = 0;
|
70
|
+
|
71
|
+
action.sa_sigaction = evoasm_signal_handler;
|
72
|
+
sigemptyset(&action.sa_mask);
|
73
|
+
action.sa_flags = SA_SIGINFO;
|
74
|
+
|
75
|
+
if(sigaction(SIGFPE, &action, &prev_action) < 0) {
|
76
|
+
perror("sigaction");
|
77
|
+
exit(1);
|
78
|
+
}
|
79
|
+
}
|
80
|
+
|
81
|
+
void
|
82
|
+
evoasm_signal_set_exception_mask(uint64_t exception_mask) {
|
83
|
+
_evoasm_signal_ctx.exception_mask = exception_mask;
|
84
|
+
}
|
85
|
+
|
86
|
+
void
|
87
|
+
evoasm_signal_clear_exception_mask() {
|
88
|
+
_evoasm_signal_ctx.exception_mask = 0;
|
89
|
+
}
|
90
|
+
|
91
|
+
int
|
92
|
+
evoasm_signal_get_last_exception() {
|
93
|
+
return _evoasm_signal_ctx.last_exception;
|
94
|
+
}
|
95
|
+
|
96
|
+
void
|
97
|
+
evoasm_signal_uninstall() {
|
98
|
+
if(sigaction(SIGFPE, &prev_action, NULL) < 0) {
|
99
|
+
perror("sigaction");
|
100
|
+
exit(1);
|
101
|
+
}
|
102
|
+
}
|
103
|
+
|
104
|
+
#else
|
105
|
+
#error
|
106
|
+
#endif
|
@@ -0,0 +1,58 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) 2016 Julian Aron Prenner <jap@polyadic.com>
|
3
|
+
*
|
4
|
+
* This program is free software: you can redistribute it and/or modify
|
5
|
+
* it under the terms of the GNU Affero General Public License as published by
|
6
|
+
* the Free Software Foundation, either version 3 of the License, or
|
7
|
+
* (at your option) any later version.
|
8
|
+
*
|
9
|
+
* This program is distributed in the hope that it will be useful,
|
10
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
* GNU Affero General Public License for more details.
|
13
|
+
*
|
14
|
+
* You should have received a copy of the GNU Affero General Public License
|
15
|
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
16
|
+
*/
|
17
|
+
|
18
|
+
#pragma once
|
19
|
+
|
20
|
+
#include "evoasm-util.h"
|
21
|
+
#include "evoasm-arch.h"
|
22
|
+
#include <stdint.h>
|
23
|
+
|
24
|
+
#ifdef EVOASM_UNIX
|
25
|
+
|
26
|
+
#include <setjmp.h>
|
27
|
+
#include <signal.h>
|
28
|
+
|
29
|
+
typedef struct {
|
30
|
+
volatile uint64_t exception_mask;
|
31
|
+
volatile evoasm_arch_id_t arch_id;
|
32
|
+
sigjmp_buf env;
|
33
|
+
int last_exception;
|
34
|
+
} evoasm_signal_ctx_t;
|
35
|
+
|
36
|
+
extern _Thread_local evoasm_signal_ctx_t _evoasm_signal_ctx;
|
37
|
+
|
38
|
+
#define EVOASM_SIGNAL_TRY() (sigsetjmp(_evoasm_signal_ctx.env, 1) == 0)
|
39
|
+
#else
|
40
|
+
#error
|
41
|
+
#endif
|
42
|
+
|
43
|
+
#include "evoasm-arch.h"
|
44
|
+
|
45
|
+
int
|
46
|
+
evoasm_signal_get_last_exception();
|
47
|
+
|
48
|
+
void
|
49
|
+
evoasm_signal_uninstall();
|
50
|
+
|
51
|
+
void
|
52
|
+
evoasm_signal_install();
|
53
|
+
|
54
|
+
void
|
55
|
+
evoasm_signal_set_exception_mask(uint64_t exception_mask);
|
56
|
+
|
57
|
+
void
|
58
|
+
evoasm_signal_clear_exception_mask();
|