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.
Files changed (168) hide show
  1. checksums.yaml +4 -4
  2. data/.gdbinit +41 -0
  3. data/.gitignore +1 -2
  4. data/.gitmodules +3 -0
  5. data/.rubocop.yml +8 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.md +660 -0
  8. data/Makefile +1 -1
  9. data/README.md +17 -9
  10. data/Rakefile +39 -107
  11. data/bin/gdb +1 -1
  12. data/bin/gdb_loop +4 -0
  13. data/docs/FindingInstructions.md +17 -0
  14. data/docs/JIT.md +14 -0
  15. data/docs/SymbolicRegression.md +102 -0
  16. data/docs/Visualization.md +29 -0
  17. data/docs/examples/bit_insts.rb +44 -0
  18. data/docs/examples/jit.rb +26 -0
  19. data/docs/examples/loss.gif +0 -0
  20. data/docs/examples/program.png +0 -0
  21. data/docs/examples/sym_reg.rb +64 -0
  22. data/docs/examples/vis.rb +38 -0
  23. data/evoasm.gemspec +21 -15
  24. data/ext/evoasm_ext/Rakefile +3 -0
  25. data/ext/evoasm_ext/compile.rake +35 -0
  26. data/ext/evoasm_ext/libevoasm/src/evoasm-alloc.c +226 -0
  27. data/ext/evoasm_ext/libevoasm/src/evoasm-alloc.h +84 -0
  28. data/ext/evoasm_ext/libevoasm/src/evoasm-arch.c +52 -0
  29. data/ext/evoasm_ext/libevoasm/src/evoasm-arch.h +101 -0
  30. data/ext/evoasm_ext/libevoasm/src/evoasm-bitmap.h +158 -0
  31. data/ext/evoasm_ext/libevoasm/src/evoasm-buf.c +204 -0
  32. data/ext/evoasm_ext/libevoasm/src/evoasm-buf.h +109 -0
  33. data/ext/evoasm_ext/libevoasm/src/evoasm-domain.c +124 -0
  34. data/ext/evoasm_ext/libevoasm/src/evoasm-domain.h +279 -0
  35. data/ext/evoasm_ext/libevoasm/src/evoasm-error.c +65 -0
  36. data/ext/evoasm_ext/libevoasm/src/evoasm-error.h +108 -0
  37. data/ext/evoasm_ext/{evoasm-log.c → libevoasm/src/evoasm-log.c} +36 -18
  38. data/ext/evoasm_ext/libevoasm/src/evoasm-log.h +93 -0
  39. data/ext/evoasm_ext/libevoasm/src/evoasm-param.c +22 -0
  40. data/ext/evoasm_ext/libevoasm/src/evoasm-param.h +33 -0
  41. data/ext/evoasm_ext/libevoasm/src/evoasm-pop-params.c +192 -0
  42. data/ext/evoasm_ext/libevoasm/src/evoasm-pop-params.h +60 -0
  43. data/ext/evoasm_ext/libevoasm/src/evoasm-pop.c +1323 -0
  44. data/ext/evoasm_ext/libevoasm/src/evoasm-pop.h +107 -0
  45. data/ext/evoasm_ext/libevoasm/src/evoasm-program-io.c +116 -0
  46. data/ext/evoasm_ext/libevoasm/src/evoasm-program-io.h +60 -0
  47. data/ext/evoasm_ext/libevoasm/src/evoasm-program.c +1827 -0
  48. data/ext/evoasm_ext/libevoasm/src/evoasm-program.h +167 -0
  49. data/ext/evoasm_ext/libevoasm/src/evoasm-rand.c +65 -0
  50. data/ext/evoasm_ext/libevoasm/src/evoasm-rand.h +76 -0
  51. data/ext/evoasm_ext/libevoasm/src/evoasm-signal.c +106 -0
  52. data/ext/evoasm_ext/libevoasm/src/evoasm-signal.h +58 -0
  53. data/ext/evoasm_ext/libevoasm/src/evoasm-util.h +112 -0
  54. data/ext/evoasm_ext/libevoasm/src/evoasm-x64.c +925 -0
  55. data/ext/evoasm_ext/libevoasm/src/evoasm-x64.h +277 -0
  56. data/ext/evoasm_ext/libevoasm/src/evoasm.c +28 -0
  57. data/ext/evoasm_ext/libevoasm/src/evoasm.h +35 -0
  58. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-enums.h +2077 -0
  59. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-insts.c +191203 -0
  60. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-insts.h +1713 -0
  61. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-misc.c +348 -0
  62. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-misc.h +93 -0
  63. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-params.c +51 -0
  64. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-params.h +509 -0
  65. data/lib/evoasm.rb +28 -11
  66. data/lib/evoasm/buffer.rb +105 -0
  67. data/lib/evoasm/capstone.rb +100 -0
  68. data/lib/evoasm/domain.rb +116 -0
  69. data/lib/evoasm/error.rb +37 -16
  70. data/lib/evoasm/exception_error.rb +19 -0
  71. data/lib/evoasm/ffi_ext.rb +53 -0
  72. data/lib/evoasm/libevoasm.rb +286 -0
  73. data/lib/evoasm/libevoasm/x64_enums.rb +1967 -0
  74. data/lib/evoasm/parameter.rb +20 -0
  75. data/lib/evoasm/population.rb +145 -0
  76. data/lib/evoasm/population/parameters.rb +227 -0
  77. data/lib/evoasm/population/plotter.rb +89 -0
  78. data/lib/evoasm/prng.rb +64 -0
  79. data/lib/evoasm/program.rb +195 -12
  80. data/lib/evoasm/program/io.rb +144 -0
  81. data/lib/evoasm/test.rb +8 -0
  82. data/lib/evoasm/version.rb +1 -1
  83. data/lib/evoasm/x64.rb +115 -0
  84. data/lib/evoasm/x64/cpu_state.rb +95 -0
  85. data/lib/evoasm/x64/instruction.rb +109 -0
  86. data/lib/evoasm/x64/operand.rb +156 -0
  87. data/lib/evoasm/x64/parameters.rb +211 -0
  88. data/test/helpers/population_helper.rb +128 -0
  89. data/test/helpers/test_helper.rb +1 -0
  90. data/test/helpers/x64_helper.rb +24 -0
  91. data/test/integration/bitwise_reverse_test.rb +41 -0
  92. data/test/integration/gcd_test.rb +52 -0
  93. data/test/integration/popcnt_test.rb +46 -0
  94. data/test/integration/sym_reg_test.rb +68 -0
  95. data/test/unit/evoasm/buffer_test.rb +48 -0
  96. data/test/unit/evoasm/capstone_test.rb +18 -0
  97. data/test/unit/evoasm/domain_test.rb +55 -0
  98. data/test/unit/evoasm/population/parameters_test.rb +106 -0
  99. data/test/unit/evoasm/population_test.rb +96 -0
  100. data/test/unit/evoasm/prng_test.rb +47 -0
  101. data/test/unit/evoasm/x64/cpu_state_test.rb +73 -0
  102. data/test/unit/evoasm/x64/encoding_test.rb +320 -0
  103. data/test/unit/evoasm/x64/instruction_access_test.rb +177 -0
  104. data/test/unit/evoasm/x64/instruction_encoding_test.rb +780 -0
  105. data/test/unit/evoasm/x64/instruction_test.rb +62 -0
  106. data/test/unit/evoasm/x64/parameters_test.rb +65 -0
  107. data/test/unit/evoasm/x64_test.rb +52 -0
  108. metadata +195 -89
  109. data/Gemfile.rake +0 -8
  110. data/Gemfile.rake.lock +0 -51
  111. data/LICENSE.txt +0 -373
  112. data/data/tables/README.md +0 -19
  113. data/data/tables/x64.csv +0 -1684
  114. data/data/templates/evoasm-x64.c.erb +0 -319
  115. data/data/templates/evoasm-x64.h.erb +0 -126
  116. data/examples/abs.yml +0 -20
  117. data/examples/popcnt.yml +0 -17
  118. data/examples/sym_reg.yml +0 -26
  119. data/exe/evoasm-search +0 -13
  120. data/ext/evoasm_ext/evoasm-alloc.c +0 -145
  121. data/ext/evoasm_ext/evoasm-alloc.h +0 -59
  122. data/ext/evoasm_ext/evoasm-arch.c +0 -44
  123. data/ext/evoasm_ext/evoasm-arch.h +0 -161
  124. data/ext/evoasm_ext/evoasm-bitmap.h +0 -114
  125. data/ext/evoasm_ext/evoasm-buf.c +0 -130
  126. data/ext/evoasm_ext/evoasm-buf.h +0 -47
  127. data/ext/evoasm_ext/evoasm-error.c +0 -31
  128. data/ext/evoasm_ext/evoasm-error.h +0 -75
  129. data/ext/evoasm_ext/evoasm-free-list.c.tmpl +0 -121
  130. data/ext/evoasm_ext/evoasm-free-list.h.tmpl +0 -86
  131. data/ext/evoasm_ext/evoasm-log.h +0 -69
  132. data/ext/evoasm_ext/evoasm-misc.c +0 -23
  133. data/ext/evoasm_ext/evoasm-misc.h +0 -282
  134. data/ext/evoasm_ext/evoasm-param.h +0 -37
  135. data/ext/evoasm_ext/evoasm-search.c +0 -2145
  136. data/ext/evoasm_ext/evoasm-search.h +0 -214
  137. data/ext/evoasm_ext/evoasm-util.h +0 -40
  138. data/ext/evoasm_ext/evoasm-x64.c +0 -275624
  139. data/ext/evoasm_ext/evoasm-x64.h +0 -5436
  140. data/ext/evoasm_ext/evoasm.c +0 -7
  141. data/ext/evoasm_ext/evoasm.h +0 -23
  142. data/ext/evoasm_ext/evoasm_ext.c +0 -1757
  143. data/ext/evoasm_ext/extconf.rb +0 -31
  144. data/lib/evoasm/cli.rb +0 -6
  145. data/lib/evoasm/cli/search.rb +0 -127
  146. data/lib/evoasm/core_ext.rb +0 -1
  147. data/lib/evoasm/core_ext/array.rb +0 -9
  148. data/lib/evoasm/core_ext/integer.rb +0 -10
  149. data/lib/evoasm/core_ext/kwstruct.rb +0 -13
  150. data/lib/evoasm/core_ext/range.rb +0 -5
  151. data/lib/evoasm/examples.rb +0 -27
  152. data/lib/evoasm/gen.rb +0 -8
  153. data/lib/evoasm/gen/enum.rb +0 -169
  154. data/lib/evoasm/gen/name_util.rb +0 -80
  155. data/lib/evoasm/gen/state.rb +0 -176
  156. data/lib/evoasm/gen/state_dsl.rb +0 -152
  157. data/lib/evoasm/gen/strio.rb +0 -27
  158. data/lib/evoasm/gen/translator.rb +0 -1102
  159. data/lib/evoasm/gen/version.rb +0 -5
  160. data/lib/evoasm/gen/x64.rb +0 -237
  161. data/lib/evoasm/gen/x64/funcs.rb +0 -495
  162. data/lib/evoasm/gen/x64/inst.rb +0 -781
  163. data/lib/evoasm/search.rb +0 -40
  164. data/lib/evoasm/tasks/gen_task.rb +0 -86
  165. data/lib/evoasm/tasks/template_task.rb +0 -52
  166. data/test/test_helper.rb +0 -1
  167. data/test/x64/test_helper.rb +0 -19
  168. data/test/x64/x64_test.rb +0 -87
@@ -0,0 +1,84 @@
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
+
22
+ #ifdef EVOASM_UNIX
23
+ # include <unistd.h>
24
+ # include <sys/mman.h>
25
+ # if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
26
+ # define MAP_ANONYMOUS MAP_ANON
27
+ # endif
28
+ #endif
29
+
30
+ #include <string.h>
31
+ #include <alloca.h>
32
+
33
+ #if defined(_WIN32)
34
+ # include <malloc.h>
35
+ #endif
36
+
37
+ #include "evoasm-error.h"
38
+
39
+ #ifdef __GNUC__
40
+ # define EVOASM_MALLOC_ATTRS __attribute__((malloc))
41
+ # define EVOASM_CALLOC_ATTRS __attribute__((malloc))
42
+ # define EVOASM_REALLOC_ATTRS __attribute__((malloc))
43
+ # define EVOASM_ALIGNED_ALLOC_ATTRS __attribute__((malloc))
44
+ # define EVOASM_ALIGNED_CALLOC_ATTRS __attribute__((malloc))
45
+ #else
46
+ # define EVOASM_MALLOC_ATTRS
47
+ # define EVOASM_CALLOC_ATTRS
48
+ # define EVOASM_REALLOC_ATTRS
49
+ # define EVOASM_ALIGNED_ALLOC_ATTRS
50
+ # define EVOASM_ALIGNED_CALLOC_ATTRS
51
+ #endif
52
+
53
+ typedef enum {
54
+ EVOASM_MPROT_MODE_RW,
55
+ EVOASM_MPROT_MODE_RX,
56
+ EVOASM_MPROT_MODE_RWX,
57
+ } evoasm_mprot_mode_t;
58
+
59
+ void *evoasm_malloc(size_t) EVOASM_MALLOC_ATTRS;
60
+ void *evoasm_calloc(size_t, size_t) EVOASM_CALLOC_ATTRS;
61
+ void *evoasm_realloc(void *, size_t) EVOASM_REALLOC_ATTRS;
62
+ void *evoasm_aligned_alloc(size_t, size_t) EVOASM_ALIGNED_ALLOC_ATTRS;
63
+ void *evoasm_aligned_calloc(size_t align, size_t n, size_t size) EVOASM_ALIGNED_CALLOC_ATTRS;
64
+ void evoasm_free(void *);
65
+
66
+ void *evoasm_mmap(size_t size, void *p);
67
+ evoasm_success_t evoasm_munmap(void *p, size_t size);
68
+ evoasm_success_t evoasm_mprot(void *p, size_t size, evoasm_mprot_mode_t mode);
69
+ size_t evoasm_get_page_size();
70
+
71
+ #define EVOASM_TRY_ALLOC(label, func, var, ...) \
72
+ do { \
73
+ if(!(var = evoasm_##func(__VA_ARGS__))) goto label; \
74
+ } while(0);
75
+
76
+ #if defined(_WIN32)
77
+ #define evoasm_alloca(s) _malloca(s);
78
+ #else
79
+ #define evoasm_alloca(s) alloca(s);
80
+ #endif
81
+
82
+ #ifndef EVOASM_CACHE_LINE_SIZE
83
+ #define EVOASM_CACHE_LINE_SIZE 64
84
+ #endif
@@ -0,0 +1,52 @@
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-arch.h"
19
+
20
+ EVOASM_DEF_LOG_TAG("arch")
21
+
22
+ evoasm_arch_info_t _evoasm_arch_infos[] = {
23
+ {
24
+ EVOASM_ARCH_X64,
25
+ EVOASM_X64_PARAM_NONE,
26
+ 15,
27
+ EVOASM_X64_INST_NONE,
28
+ 0ull
29
+ }
30
+ };
31
+
32
+ evoasm_arch_id_t _evoasm_current_arch = EVOASM_ARCH_NONE;
33
+
34
+ evoasm_arch_info_t *
35
+ evoasm_get_arch_info(evoasm_arch_id_t arch_id) {
36
+ return &_evoasm_arch_infos[arch_id];
37
+ }
38
+
39
+ evoasm_arch_id_t
40
+ evoasm_get_current_arch() {
41
+ return _evoasm_current_arch;
42
+ }
43
+
44
+ #define EVOASM_ARCH_INFO_DEF_GETTER(field, type) EVOASM_DEF_GETTER(arch_info, field, type)
45
+
46
+ EVOASM_ARCH_INFO_DEF_GETTER(id, evoasm_arch_id_t)
47
+ EVOASM_ARCH_INFO_DEF_GETTER(n_params, size_t)
48
+ EVOASM_ARCH_INFO_DEF_GETTER(max_inst_len, size_t)
49
+ EVOASM_ARCH_INFO_DEF_GETTER(n_insts, size_t)
50
+ EVOASM_ARCH_INFO_DEF_GETTER(features, uint64_t)
51
+
52
+
@@ -0,0 +1,101 @@
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 <stdint.h>
21
+ #include <gen/evoasm-x64-enums.h>
22
+
23
+ #include "evoasm-error.h"
24
+ #include "evoasm-param.h"
25
+ #include "evoasm-buf.h"
26
+ #include "evoasm-log.h"
27
+
28
+ #define EVOASM_ARCH_MAX_PARAMS 32
29
+
30
+ typedef uint8_t evoasm_reg_id_t;
31
+ #define EVOASM_REG_ID_MAX UINT8_MAX
32
+
33
+ typedef uint16_t evoasm_inst_id_t;
34
+
35
+ typedef enum {
36
+ EVOASM_ARCH_X64,
37
+ EVOASM_ARCH_NONE
38
+ } evoasm_arch_id_t;
39
+
40
+ typedef struct {
41
+ uint8_t id;
42
+ uint8_t n_params;
43
+ uint8_t max_inst_len;
44
+ uint16_t n_insts;
45
+ uint64_t features;
46
+ } evoasm_arch_info_t;
47
+
48
+
49
+ typedef enum {
50
+ EVOASM_ARCH_ERROR_CODE_NOT_ENCODABLE,
51
+ EVOASM_ARCH_ERROR_CODE_MISSING_PARAM,
52
+ EVOASM_ARCH_ERROR_CODE_MISSING_FEATURE,
53
+ } evoasm_arch_error_code_t;
54
+
55
+ typedef struct {
56
+ uint8_t reg;
57
+ uint8_t param;
58
+ uint16_t inst;
59
+ } evoasm_enc_error_data_t;
60
+
61
+ typedef struct {
62
+ EVOASM_ERROR_HEADER
63
+ evoasm_enc_error_data_t data;
64
+ } evoasm_enc_error_t;
65
+
66
+ _Static_assert(sizeof(evoasm_error_data_t) >= sizeof(evoasm_enc_error_data_t), "evoasm_enc_error_data_t exceeds evoasm_error_data_t size limit");
67
+
68
+ evoasm_arch_info_t *
69
+ evoasm_get_arch_info(evoasm_arch_id_t arch_id);
70
+
71
+ evoasm_arch_id_t
72
+ evoasm_get_current_arch();
73
+
74
+ #if 0
75
+ static inline void
76
+ evoasm_enc_ctx_write_access(evoasm_buf_ref_t *arch_id, evoasm_bitmap_t *acc, evoasm_reg_id_t reg) {
77
+ evoasm_bitmap_set(acc, (size_t) reg);
78
+ }
79
+
80
+ static inline void
81
+ evoasm_enc_ctx_undefined_access(evoasm_buf_ref_t *arch_id, evoasm_bitmap_t *acc, evoasm_reg_id_t reg) {
82
+ evoasm_bitmap_unset(acc, (size_t) reg);
83
+ }
84
+
85
+ static inline evoasm_success_t
86
+ evoasm_enc_ctx_read_access_(evoasm_buf_ref_t *arch_id, evoasm_bitmap_t *acc, evoasm_reg_id_t reg,
87
+ evoasm_inst_id_t inst, const char *file, unsigned line) {
88
+ if(!evoasm_bitmap_get(acc, (size_t) reg)) {
89
+ evoasm_enc_error_data_t error_data = {
90
+ .reg = (uint8_t) reg,
91
+ .inst = (uint16_t) inst,
92
+ .arch = arch_id
93
+ };
94
+ evoasm_error(EVOASM_ERROR_TYPE_ENC, EVOASM_ENC_ERROR_CODE_INVALID_ACCESS, &error_data, file, line, "read access violation");
95
+ return false;
96
+ }
97
+ return true;
98
+ }
99
+ #define evoasm_arch_read_access(arch, acc, reg, inst) evoasm_arch_read_access_(arch, acc, reg, inst, __FILE__, __LINE__)
100
+ #endif
101
+
@@ -0,0 +1,158 @@
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 <stdint.h>
21
+ #include <stdbool.h>
22
+ #include <stdlib.h>
23
+
24
+ #define EVOASM_BITMAP_IDX_DECLS(key) \
25
+ size_t size = sizeof(uint64_t) * 8;\
26
+ size_t ary_idx = ((size_t) key) / size;\
27
+ size_t bit_idx = ((size_t) key) % size;
28
+
29
+ typedef struct {
30
+ uint64_t data[1];
31
+ } evoasm_bitmap64_t;
32
+
33
+ typedef struct {
34
+ uint64_t data[2];
35
+ } evoasm_bitmap128_t;
36
+
37
+ typedef struct {
38
+ uint64_t data[4];
39
+ } evoasm_bitmap256_t;
40
+
41
+ typedef struct {
42
+ uint64_t data[8];
43
+ } evoasm_bitmap512_t;
44
+
45
+ typedef struct {
46
+ uint64_t data[16];
47
+ } evoasm_bitmap1024_t;
48
+
49
+ typedef uint64_t evoasm_bitmap_t;
50
+
51
+ static inline void
52
+ evoasm_bitmap_set(evoasm_bitmap_t *bitmap, size_t idx) {
53
+ EVOASM_BITMAP_IDX_DECLS(idx);
54
+ bitmap[ary_idx] |= (1ull << bit_idx);
55
+ }
56
+
57
+ static inline void
58
+ evoasm_bitmap_unset(evoasm_bitmap_t *bitmap, size_t idx) {
59
+ EVOASM_BITMAP_IDX_DECLS(idx);
60
+ /* unset values must be 0*/
61
+ bitmap[ary_idx] &= ~(1ull << bit_idx);
62
+ }
63
+
64
+ static inline bool
65
+ evoasm_bitmap_get(evoasm_bitmap_t *bitmap, size_t idx) {
66
+ EVOASM_BITMAP_IDX_DECLS(idx);
67
+ return (bitmap[ary_idx] & (1ull << bit_idx)) != 0;
68
+ }
69
+
70
+ static inline void
71
+ evoasm_bitmap_set64(evoasm_bitmap_t *bitmap, size_t idx, uint64_t bits) {
72
+ EVOASM_BITMAP_IDX_DECLS(idx);
73
+ (void) bit_idx;
74
+ bitmap[ary_idx] = bits;
75
+ }
76
+
77
+ static inline void
78
+ evoasm_bitmap_or64(evoasm_bitmap_t *bitmap, size_t idx, uint64_t bits) {
79
+ EVOASM_BITMAP_IDX_DECLS(idx);
80
+ (void) bit_idx;
81
+ bitmap[ary_idx] |= bits;
82
+ }
83
+
84
+
85
+ #define EVOASM_BITMAP_DECL_IS_ZERO(width) \
86
+ static inline bool evoasm_bitmap ## width ## _is_zero(evoasm_bitmap##width##_t *bitmap) { \
87
+ size_t i;\
88
+ for(i = 0; i < width / 64; i++) {\
89
+ if(bitmap->data[i] != 0) return false;\
90
+ }\
91
+ return true;\
92
+ }
93
+
94
+ #define EVOASM_BITMAP_DECL_UNOP(name, width, op) \
95
+ static inline void evoasm_bitmap ## width ## _ ## name (evoasm_bitmap##width##_t *bitmap, evoasm_bitmap##width##_t *result) { \
96
+ size_t i;\
97
+ for(i = 0; i < width / 64; i++) {\
98
+ result->data[i] = op bitmap->data[i];\
99
+ }\
100
+ }
101
+
102
+ #define EVOASM_BITMAP_DECL_BINOP(name, width, op) \
103
+ static inline void evoasm_bitmap ## width ## _ ## name (evoasm_bitmap##width##_t *bitmap1, evoasm_bitmap##width##_t *bitmap2, evoasm_bitmap##width##_t *result) { \
104
+ size_t i;\
105
+ for(i = 0; i < width / 64; i++) {\
106
+ result->data[i] = bitmap1->data[i] op bitmap2->data[i];\
107
+ }\
108
+ }
109
+
110
+ #define EVOASM_BITMAP_DECL_EQL(width) \
111
+ static inline bool evoasm_bitmap ## width ## _ ## eql (evoasm_bitmap##width##_t *bitmap1, evoasm_bitmap##width##_t *bitmap2) { \
112
+ size_t i;\
113
+ for(i = 0; i < width / 64; i++) {\
114
+ if(bitmap1->data[i] != bitmap2->data[i]) return false;\
115
+ } \
116
+ return true;\
117
+ }
118
+
119
+
120
+ #ifdef __GNUC__
121
+ # define EVOASM_BITMAP_DECL_POPCOUNT(width) \
122
+ static inline size_t evoasm_bitmap ## width ## _ ## popcount (evoasm_bitmap##width##_t *bitmap) { \
123
+ size_t c = 0; \
124
+ size_t i;\
125
+ for(i = 0; i < width / 64; i++) {\
126
+ c += (size_t) __builtin_popcountll(bitmap->data[i]);\
127
+ } \
128
+ return c;\
129
+ }
130
+ #else
131
+ # define EVOASM_BITMAP_DECL_POPCOUNT(width) \
132
+ static inline size_t evoasm_bitmap_t ## width ## _ ## popcount (evoasm_bitmap##width##_t *bitmap) { \
133
+ size_t c = 0, i;\
134
+ for(i = 0; i < width / 64; i++) {\
135
+ uint64_t x = bitmap->data[i]; \
136
+ for(; x > 0; x &= x - 1) c++;\
137
+ } \
138
+ return c;\
139
+ }
140
+ #endif
141
+
142
+ EVOASM_BITMAP_DECL_UNOP(not, 128, ~)
143
+ EVOASM_BITMAP_DECL_BINOP(and, 128, &)
144
+ EVOASM_BITMAP_DECL_BINOP(or, 128, |)
145
+ EVOASM_BITMAP_DECL_BINOP(andn, 128, &~)
146
+ EVOASM_BITMAP_DECL_POPCOUNT(128)
147
+ EVOASM_BITMAP_DECL_EQL(128)
148
+
149
+ EVOASM_BITMAP_DECL_UNOP(not, 64, ~)
150
+ EVOASM_BITMAP_DECL_BINOP(and, 64, &)
151
+ EVOASM_BITMAP_DECL_BINOP(or, 64, |)
152
+ EVOASM_BITMAP_DECL_POPCOUNT(64)
153
+ EVOASM_BITMAP_DECL_EQL(64)
154
+
155
+ EVOASM_BITMAP_DECL_BINOP(andn, 512, &~)
156
+ EVOASM_BITMAP_DECL_IS_ZERO(512)
157
+
158
+ EVOASM_BITMAP_DECL_EQL(1024)
@@ -0,0 +1,204 @@
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 <string.h>
19
+
20
+ #include "evoasm-buf.h"
21
+ #include "evoasm-alloc.h"
22
+ #include "evoasm-util.h"
23
+ #include "evoasm-signal.h"
24
+ #include "evoasm.h"
25
+
26
+ EVOASM_DEF_LOG_TAG("buf")
27
+
28
+ static evoasm_success_t
29
+ evoasm_buf_init_mmap(evoasm_buf_t *buf, size_t size) {
30
+ uint8_t *mem;
31
+
32
+ //size = EVOASM_ALIGN_UP(size, evoasm_get_page_size());
33
+ mem = evoasm_mmap(size, NULL);
34
+
35
+ if(mem) {
36
+ buf->capa = size;
37
+ buf->data = mem;
38
+ buf->pos = 0;
39
+ return true;
40
+ } else {
41
+ return false;
42
+ }
43
+ }
44
+
45
+ static evoasm_success_t
46
+ evoasm_buf_init_malloc(evoasm_buf_t *buf, size_t size) {
47
+ uint8_t *mem;
48
+
49
+ mem = malloc(size);
50
+
51
+ if(mem) {
52
+ buf->capa = size;
53
+ buf->data = mem;
54
+ buf->pos = 0;
55
+ return true;
56
+ } else {
57
+ return false;
58
+ }
59
+ }
60
+
61
+ evoasm_success_t
62
+ evoasm_buf_init(evoasm_buf_t *buf, evoasm_buf_type_t buf_type, size_t size) {
63
+ buf->type = buf_type;
64
+ switch(buf_type) {
65
+ case EVOASM_BUF_TYPE_MMAP:
66
+ return evoasm_buf_init_mmap(buf, size);
67
+ case EVOASM_BUF_TYPE_MALLOC:
68
+ return evoasm_buf_init_malloc(buf, size);
69
+ default:
70
+ evoasm_assert_not_reached();
71
+ }
72
+ }
73
+
74
+ static evoasm_success_t
75
+ evoasm_buf_destroy_mmap(evoasm_buf_t *buf) {
76
+ if(buf->data != NULL) {
77
+ return evoasm_munmap(buf->data, buf->capa);
78
+ }
79
+ return true;
80
+ }
81
+
82
+ static evoasm_success_t
83
+ evoasm_buf_destroy_malloc(evoasm_buf_t *buf) {
84
+ evoasm_free(buf->data);
85
+ return true;
86
+ }
87
+
88
+ evoasm_success_t
89
+ evoasm_buf_destroy(evoasm_buf_t *buf) {
90
+ switch(buf->type) {
91
+ case EVOASM_BUF_TYPE_MMAP:
92
+ return evoasm_buf_destroy_mmap(buf);
93
+ case EVOASM_BUF_TYPE_MALLOC:
94
+ return evoasm_buf_destroy_malloc(buf);
95
+ default:
96
+ evoasm_assert_not_reached();
97
+ }
98
+ }
99
+
100
+ void
101
+ evoasm_buf_reset(evoasm_buf_t *buf) {
102
+ memset(buf->data, 0, buf->pos);
103
+ buf->pos = 0;
104
+ }
105
+
106
+ evoasm_success_t
107
+ evoasm_buf_protect(evoasm_buf_t *buf, evoasm_mprot_mode_t mode) {
108
+ return evoasm_mprot(buf->data, buf->capa, mode);
109
+ }
110
+
111
+ intptr_t
112
+ evoasm_buf_exec(evoasm_buf_t *buf) {
113
+ intptr_t (*func)(void);
114
+ intptr_t result = 0;
115
+ *(void **) (&func) = buf->data;
116
+ result = func();
117
+ return result;
118
+ }
119
+
120
+ evoasm_success_t
121
+ evoasm_buf_safe_exec(evoasm_buf_t *buf, uint64_t exception_mask, intptr_t *retval) {
122
+ bool success;
123
+
124
+ evoasm_signal_set_exception_mask(exception_mask);
125
+
126
+ if(EVOASM_SIGNAL_TRY()) {
127
+ *retval = evoasm_buf_exec(buf);
128
+ success = true;
129
+ } else {
130
+ *retval = evoasm_signal_get_last_exception();
131
+ success = false;
132
+ }
133
+
134
+ evoasm_signal_clear_exception_mask();
135
+
136
+ return success;
137
+ }
138
+
139
+ void
140
+ evoasm_buf_log(evoasm_buf_t *buf, evoasm_log_level_t log_level) {
141
+ if(_evoasm_log_level > log_level) return;
142
+
143
+ evoasm_log(log_level, EVOASM_LOG_TAG, "Evoasm::Buffer: capa: %zu, pos: %zu, addr: %p\n",
144
+ buf->capa, buf->pos, (void *) buf->data);
145
+ for(size_t i = 0; i < buf->pos; i++) {
146
+ if(i > 0) evoasm_log(log_level, EVOASM_LOG_TAG, " ");
147
+ evoasm_log(log_level, EVOASM_LOG_TAG, " %02X ", buf->data[i]);
148
+ }
149
+ evoasm_log(log_level, EVOASM_LOG_TAG, " \n ");
150
+ }
151
+
152
+ void
153
+ evoasm_buf_to_buf_ref(evoasm_buf_t *buf, evoasm_buf_ref_t *buf_ref) {
154
+ buf_ref->data = buf->data;
155
+ buf_ref->pos = &buf->pos;
156
+ }
157
+
158
+ size_t
159
+ evoasm_buf_write(evoasm_buf_t *buf, uint8_t *data, size_t len) {
160
+ size_t free = buf->capa - buf->pos;
161
+ if(len > free) {
162
+ evoasm_error(EVOASM_ERROR_TYPE_BUF, EVOASM_BUF_ERROR_CODE_NO_SPACE,
163
+ "buffer does not fit (need %zu bytes but only %zu free)", len, free);
164
+ return len - free;
165
+ }
166
+ memcpy(buf->data + buf->pos, data, len);
167
+ buf->pos += len;
168
+ return 0;
169
+ }
170
+
171
+ size_t
172
+ evoasm_buf_append(evoasm_buf_t *restrict dst, evoasm_buf_t *restrict src) {
173
+ return evoasm_buf_write(dst, src->data, src->pos);
174
+ }
175
+
176
+ evoasm_success_t
177
+ evoasm_buf_clone(evoasm_buf_t *restrict buf, evoasm_buf_t *restrict cloned_buf) {
178
+ if(!evoasm_buf_init(cloned_buf, (evoasm_buf_type_t) buf->type, buf->capa)) {
179
+ return false;
180
+ }
181
+ return evoasm_buf_append(cloned_buf, buf) == 0;
182
+ }
183
+
184
+ uint8_t *
185
+ evoasm_buf_data(evoasm_buf_t *buf) {
186
+ return buf->data;
187
+ }
188
+
189
+
190
+ EVOASM_DEF_ALLOC_FREE_FUNCS(buf_ref)
191
+
192
+ EVOASM_DEF_ALLOC_FREE_FUNCS(buf)
193
+
194
+ EVOASM_DEF_GETTER(buf, capa, size_t)
195
+ EVOASM_DEF_GETTER(buf, pos, size_t)
196
+ EVOASM_DEF_GETTER(buf, type, evoasm_buf_type_t)
197
+ EVOASM_DEF_GETTER(buf, data, const uint8_t *)
198
+
199
+ void
200
+ evoasm_buf_ref_init(evoasm_buf_ref_t *buf_ref, uint8_t *data, size_t *pos) {
201
+ buf_ref->data = data;
202
+ buf_ref->pos = pos;
203
+ }
204
+