1 #ifndef _MAGIC_COMMON_H 2 #define _MAGIC_COMMON_H 3 4 /* Magic constants. */ 5 #define MAGIC_PREFIX magic_ 6 #define MAGIC_PREFIX_STR "magic_" 7 #define MAGIC_ASR_PREFIX magic_asr_ 8 #define MAGIC_ASR_PREFIX_STR "magic_asr_" 9 #define MAGIC_NESTED_PREFIX_STR "nested_" 10 #define MAGIC_EVAL_FUNC_PREFIX "me_" 11 #define MAGIC_ANON_MEMBER_PREFIX "magic.anon" 12 #define MAGIC_STRINGREF_HAS_MAGIC_HIDDEN_PREFIX(S) \ 13 ((S).startswith(MAGIC_HIDDEN_ARRAY_PREFIX) \ 14 || (S).startswith(MAGIC_HIDDEN_STR_PREFIX)) 15 16 #define MAGIC_VOID_PTR _____magic_instr_void_ptr 17 #define MAGIC_VOID_PTR_NAME "_____magic_instr_void_ptr" 18 #define MAGIC_VOID_ARRAY _____magic_instr_void_arr 19 #define MAGIC_VOID_ARRAY_NAME "_____magic_instr_void_arr" 20 21 #define MAGIC_VOID_PTR_TYPE _magic_void_ptr_type_ptr 22 #define MAGIC_VOID_PTR_TYPE_ID 1 23 #define MAGIC_VOID_PTR_INT_CAST_TYPE _magic_void_ptr_int_cast_type_ptr 24 #define MAGIC_VOID_PTR_INT_CAST_TYPE_ID 2 25 #define MAGIC_VOID_ARRAY_TYPE _magic_void_array_type_ptr 26 #define MAGIC_VOID_ARRAY_TYPE_ID 3 27 #define MAGIC_PTRINT_TYPE _magic_ptrint_type_ptr 28 #define MAGIC_PTRINT_TYPE_ID 4 29 #define MAGIC_PTRINT_ARRAY_TYPE _magic_ptrint_array_type_ptr 30 #define MAGIC_PTRINT_ARRAY_TYPE_ID 5 31 #define MAGIC_VOID_TYPE (MAGIC_VOID_PTR_TYPE->contained_types[0]) 32 33 #ifdef __MINIX 34 #define GLOBAL_VARS_IN_SECTION 1 35 #else 36 #define GLOBAL_VARS_IN_SECTION 0 37 #endif 38 #define GLOBAL_VARS_SECTION_PREFIX ".gvars" 39 #define GLOBAL_VARS_SECTION_DATA GLOBAL_VARS_SECTION_PREFIX 40 #define GLOBAL_VARS_SECTION_RO (GLOBAL_VARS_SECTION_PREFIX "_ro") 41 42 #define MAGIC_LLVM_METADATA_SECTION "llvm.metadata" 43 #define MAGIC_DEFAULT_EXT_LIB_SECTION_REGEX "^.lib.*" 44 #define MAGIC_STATIC_FUNCTIONS_SECTION "magic_functions" 45 46 #define MAGIC_STATIC_VARS_SECTION_PREFIX "magic_data" 47 #define MAGIC_STATIC_VARS_SECTION_DATA MAGIC_STATIC_VARS_SECTION_PREFIX 48 #define MAGIC_STATIC_VARS_SECTION_RO (MAGIC_STATIC_VARS_SECTION_PREFIX "_ro") 49 50 #define MAGIC_SHADOW_VARS_SECTION_PREFIX "magic_shadow_data" 51 #define MAGIC_SHADOW_VARS_SECTION_DATA MAGIC_SHADOW_VARS_SECTION_PREFIX 52 #define MAGIC_SHADOW_VARS_SECTION_RO (MAGIC_SHADOW_VARS_SECTION_PREFIX "_ro") 53 54 #define UNBL_SECTION_PREFIX "unblockify" 55 #define MAGIC_SHADOW_VAR_PREFIX ".magic_shadow_" 56 #define MAGIC_HIDDEN_ARRAY_PREFIX ".arr.magic" 57 #define MAGIC_HIDDEN_STR_PREFIX ".str.magic" 58 59 #define MAGIC_MALLOC_VARS_SECTION_PREFIX "magic_malloc_data" 60 61 /* Magic configuration. */ 62 #ifndef MAGIC_OUTPUT_CTL 63 #define MAGIC_OUTPUT_CTL 0 64 #endif 65 /* 0=disabled, 1=force no debug output, 2=force no output (for perf. testing).*/ 66 #define MAGIC_CHECK_LEVEL 1 67 /* 2=extra checks, 1=standard checks, 0=no checks (for perf. testing). */ 68 #define MAGIC_FLATTEN_FUNCTION_ARGS 0 /* XXX was 1 but header was not included, seems to break on variadic functions */ 69 #define MAGIC_CHECK_INVARIANTS 1 70 #define MAGIC_SHRINK_TYPE_STR 1 71 #define MAGIC_MAX_NAME_LEN 64 72 #define MAGIC_MAX_TYPE_STR_LEN 256 73 #define MAGIC_MAX_RECURSIVE_TYPES 1024 74 #define MAGIC_TYPE_STR_PRINT_MAX 5000 75 #define MAGIC_TYPE_STR_PRINT_MAX_LEVEL 10 76 #define MAGIC_MAX_DEAD_DSENTRIES 10 77 #define MAGIC_MAX_DEAD_DSENTRIES_SIZE (1024 * 4 * 10) 78 #define MAGIC_NAMED_ALLOC_USE_DBG_INFO 0 79 /* 1=for more verbose dsentry naming. */ 80 #define MAGIC_FORCE_ALLOC_EXT_NAMES 0 81 /* 1=to force external names for allocations made inside library functions. */ 82 #define MAGIC_ABORT_ON_UNSUPPORTED_LOCAL_EXTERNAL_TYPE 0 83 /* 0=to resort to void* type when a local external type is not supported. */ 84 #ifndef MAGIC_MEM_USAGE_OUTPUT_CTL 85 #define MAGIC_MEM_USAGE_OUTPUT_CTL 0 86 #endif 87 /* 0=disabled, 1=use call site info 2=use stacktrace */ 88 89 #define MAGIC_INSTRUMENT_MEM_FUNCS_ASR_ONLY 0 90 #define MAGIC_INSTRUMENT_MEM_CUSTOM_WRAPPERS 1 91 #define MAGIC_INSTRUMENT_MEM_FUNCS 1 92 #define MAGIC_INSTRUMENT_STACK 1 93 #define MAGIC_FORCE_RAW_UNIONS 0 94 #define MAGIC_FORCE_RAW_BITFIELDS 0 95 #define MAGIC_FORCE_DYN_MEM_ZERO_INIT 0 96 /* 1=for accurate dsentry analysis. */ 97 #define MAGIC_INDEX_DYN_LIBS 1 98 #define MAGIC_USE_DYN_MEM_WRAPPERS 1 99 #define MAGIC_USE_DYN_DL_WRAPPERS 1 100 #define MAGIC_ALLOW_DYN_MEM_WRAPPER_NESTING 1 101 102 /* qprof-related settings */ 103 #ifdef __MINIX 104 #define MAGIC_USE_QPROF_INSTRUMENTATION 0 105 #else 106 #define MAGIC_USE_QPROF_INSTRUMENTATION 1 107 #endif 108 #define MAGIC_DEEPEST_LL_LOOP_HOOK magic_deepest_ll_loop 109 #define MAGIC_DEEPEST_LL_LIB_HOOK magic_deepest_ll_lib 110 #define MAGIC_DEEPEST_LL_LOOP_HOOK_NAME "magic_deepest_ll_loop" 111 #define MAGIC_DEEPEST_LL_LIB_HOOK_NAME "magic_deepest_ll_lib" 112 #define MAGIC_NUM_LL_TASK_CLASSES magic_num_ll_task_classes 113 #define MAGIC_NUM_LL_BLOCK_EXT_TASK_CLASSES magic_num_ll_block_ext_task_classes 114 #define MAGIC_NUM_LL_BLOCK_INT_TASK_CLASSES magic_num_ll_block_int_task_classes 115 #define MAGIC_NUM_LL_BLOCK_EXT_LIBS magic_num_ll_block_ext_libs 116 #define MAGIC_NUM_LL_BLOCK_INT_LIBS magic_num_ll_block_int_libs 117 #define MAGIC_NUM_LL_TASK_CLASSES_NAME "magic_num_ll_task_classes" 118 #define MAGIC_NUM_LL_BLOCK_EXT_TASK_CLASSES_NAME "magic_num_ll_block_ext_task_classes" 119 #define MAGIC_NUM_LL_BLOCK_INT_TASK_CLASSES_NAME "magic_num_ll_block_int_task_classes" 120 #define MAGIC_NUM_LL_BLOCK_EXT_LIBS_NAME "magic_num_ll_block_ext_libs" 121 #define MAGIC_NUM_LL_BLOCK_INT_LIBS_NAME "magic_num_ll_block_int_libs" 122 123 #define MAGIC_THREAD_SAFE 1 124 #define MAGIC_FORCE_LOCKS 0 125 #define MAGIC_LOOKUP_SENTRY 1 126 #define MAGIC_LOOKUP_DSENTRY 1 127 #define MAGIC_LOOKUP_FUNCTION 1 128 #define MAGIC_LOOKUP_DFUNCTION 1 129 #define MAGIC_LOOKUP_TYPE 1 130 #define MAGIC_LOOKUP_SENTRY_ALLOW_RANGE_INDEX 1 131 #define MAGIC_LOOKUP_SENTRY_ALLOW_NAME_HASH 1 132 #define MAGIC_LOOKUP_FUNCTION_ALLOW_ADDR_HASH 1 133 134 #define MAGIC_INDEX_INT_CAST 1 135 #define MAGIC_INDEX_FUN_PTR_INT_CAST 1 136 #define MAGIC_INDEX_STR_PTR_INT_CAST 1 137 #define MAGIC_INDEX_VOID_PTR_INT_CAST 1 138 #define MAGIC_INDEX_OTH_PTR_INT_CAST 1 139 140 #define MAGIC_INDEX_BIT_CAST 1 141 #define MAGIC_INDEX_TRANSITIVE_BIT_CASTS 0 142 #define MAGIC_INDEX_FUN_PTR_BIT_CAST 1 143 #define MAGIC_INDEX_STR_PTR_BIT_CAST 1 144 #define MAGIC_INDEX_VOID_PTR_BIT_CAST 0 145 #define MAGIC_INDEX_OTH_PTR_BIT_CAST 1 146 147 #ifdef __MINIX 148 #define MAGIC_SKIP_TOVOID_PTR_BIT_CAST 0 149 #else 150 #define MAGIC_SKIP_TOVOID_PTR_BIT_CAST 1 151 #endif 152 153 #define MAGIC_COMPACT_COMP_TYPES 0 154 155 #define MAGIC_OFF_BY_N_PROTECTION_N 0 156 157 #define MAGIC_VARSIZED_STRUCTS_SUPPORT 1 158 159 #define MAGIC_ALLOW_DEAD_DSENTRIES_DEFAULT 0 160 161 #define MAGIC_WALK_UNIONS_AS_VOID_ARRAYS_DEFAULT 1 162 163 #define MAGIC_DEBUG_SELECT(D,ND) (MAGIC_OUTPUT_CTL>=1 ? (ND) : (D)) 164 #define MAGIC_OUTPUT_SELECT(D,ND,NO) \ 165 (MAGIC_OUTPUT_CTL>=2 ? (NO) : MAGIC_DEBUG_SELECT(D,ND)) 166 #define MAGIC_DEBUG_SET(D) MAGIC_DEBUG_SELECT(D,0) 167 168 #define MAGIC_ENABLED "_magic_enabled" 169 170 #define MAGIC_ARRAY_NAME "_magic_sentries_array" 171 #define MAGIC_TYPE_ARRAY_NAME "_magic_types_array" 172 #define MAGIC_FUNC_ARRAY_NAME "_magic_functions_array" 173 #define MAGIC_DSINDEX_ARRAY_NAME "_magic_dsindexes_array" 174 175 #define MAGIC_ROOT_VAR_NAME "_magic_vars_buff" 176 #define MAGIC_RSTRUCT_FIELD_ASR_SEED "asr_seed" 177 #define MAGIC_RSTRUCT_FIELD_ASR_HEAP_MAP_DO_PERMUTATE "asr_heap_map_do_permutate" 178 #define MAGIC_RSTRUCT_FIELD_ASR_HEAP_MAX_OFFSET "asr_heap_max_offset" 179 #define MAGIC_RSTRUCT_FIELD_ASR_HEAP_MAX_PADDING "asr_heap_max_padding" 180 #define MAGIC_RSTRUCT_FIELD_ASR_MAP_MAX_OFFSET_PAGES "asr_map_max_offset_pages" 181 #define MAGIC_RSTRUCT_FIELD_ASR_MAP_MAX_PADDING_PAGES "asr_map_max_padding_pages" 182 #define MAGIC_RSTRUCT_FIELD_NO_MEM_INST "no_mem_inst" 183 #define MAGIC_RSTRUCT_FIELD_TYPES "types" 184 #define MAGIC_RSTRUCT_FIELD_TYPES_NUM "types_num" 185 #define MAGIC_RSTRUCT_FIELD_TYPES_NEXT_ID "types_next_id" 186 #define MAGIC_RSTRUCT_FIELD_FUNCTIONS "functions" 187 #define MAGIC_RSTRUCT_FIELD_FUNCTIONS_NUM "functions_num" 188 #define MAGIC_RSTRUCT_FIELD_FUNCTIONS_NEXT_ID "functions_next_id" 189 #define MAGIC_RSTRUCT_FIELD_SENTRIES "sentries" 190 #define MAGIC_RSTRUCT_FIELD_SENTRIES_NUM "sentries_num" 191 #define MAGIC_RSTRUCT_FIELD_SENTRIES_STR_NUM "sentries_str_num" 192 #define MAGIC_RSTRUCT_FIELD_SENTRIES_NEXT_ID "sentries_next_id" 193 #define MAGIC_RSTRUCT_FIELD_DSINDEXES "dsindexes" 194 #define MAGIC_RSTRUCT_FIELD_DSINDEXES_NUM "dsindexes_num" 195 #define MAGIC_RSTRUCT_FIELD_FIRST_DSENTRY "first_dsentry" 196 #define MAGIC_RSTRUCT_FIELDS \ 197 MAGIC_RSTRUCT_FIELD_ASR_SEED, \ 198 MAGIC_RSTRUCT_FIELD_ASR_HEAP_MAP_DO_PERMUTATE, \ 199 MAGIC_RSTRUCT_FIELD_ASR_HEAP_MAX_OFFSET, \ 200 MAGIC_RSTRUCT_FIELD_ASR_HEAP_MAX_PADDING, \ 201 MAGIC_RSTRUCT_FIELD_ASR_MAP_MAX_OFFSET_PAGES, \ 202 MAGIC_RSTRUCT_FIELD_ASR_MAP_MAX_PADDING_PAGES, \ 203 MAGIC_RSTRUCT_FIELD_NO_MEM_INST, \ 204 MAGIC_RSTRUCT_FIELD_TYPES, \ 205 MAGIC_RSTRUCT_FIELD_TYPES_NUM, \ 206 MAGIC_RSTRUCT_FIELD_TYPES_NEXT_ID, \ 207 MAGIC_RSTRUCT_FIELD_FUNCTIONS, \ 208 MAGIC_RSTRUCT_FIELD_FUNCTIONS_NUM, \ 209 MAGIC_RSTRUCT_FIELD_FUNCTIONS_NEXT_ID, \ 210 MAGIC_RSTRUCT_FIELD_SENTRIES, \ 211 MAGIC_RSTRUCT_FIELD_SENTRIES_NUM, \ 212 MAGIC_RSTRUCT_FIELD_SENTRIES_STR_NUM, \ 213 MAGIC_RSTRUCT_FIELD_SENTRIES_NEXT_ID, \ 214 MAGIC_RSTRUCT_FIELD_DSINDEXES, \ 215 MAGIC_RSTRUCT_FIELD_DSINDEXES_NUM, \ 216 MAGIC_RSTRUCT_FIELD_FIRST_DSENTRY 217 218 #define MAGIC_ENTRY_POINT "main" 219 #define MAGIC_INIT_FUNC_NAME "magic_init" 220 #define MAGIC_DATA_INIT_FUNC_NAME "magic_data_init" 221 222 #define MAGIC_STACK_DSENTRIES_CREATE_FUNC_NAME "magic_stack_dsentries_create" 223 #define MAGIC_STACK_DSENTRIES_DESTROY_FUNC_NAME "magic_stack_dsentries_destroy" 224 225 #define MAGIC_GET_PAGE_SIZE_FUNC_NAME "magic_get_sys_pagesize" 226 227 #define MAGIC_VOID_PTR_TYPE_PTR_NAME "_magic_void_ptr_type_ptr" 228 229 #define MAGIC_ALLOC_NAME_SUFFIX "#" 230 #define MAGIC_ALLOC_NAME_SEP "%" 231 #define MAGIC_ALLOC_NONAME "%UNKNOWN" 232 #define MAGIC_ALLOC_EXT_NAME "%EXT" 233 #define MAGIC_ALLOC_EXT_PARENT_NAME "%EXT_PARENT" 234 #define MAGIC_ALLOC_RET_ADDR_NAME "%RET_ADDR" 235 #define MAGIC_ALLOC_INITIAL_STACK_NAME "%INITIAL_STACK_AREA" 236 #define MAGIC_OBDSENTRY_DEFAULT_PARENT_NAME "%OUT_OF_BAND_PARENT" 237 #define MAGIC_DSENTRY_DATA_SEGMENT_NAME "%LIB_DATA_SEGMENT" 238 #define MAGIC_DSENTRY_ABS_NAME_SEP "~" 239 #define MAGIC_SELEMENT_SEP "/" 240 #define MAGIC_NAME_INVALID "%INVALID" 241 242 #define MAGIC_SSTRUCT_FIELD_ID "id" 243 #define MAGIC_SSTRUCT_FIELD_NAME "name" 244 #define MAGIC_SSTRUCT_FIELD_TYPE "type" 245 #define MAGIC_SSTRUCT_FIELD_FLAGS "flags" 246 #define MAGIC_SSTRUCT_FIELD_ADDRESS "address" 247 #define MAGIC_SSTRUCT_FIELD_SHADOW_ADDRESS "shadow_address" 248 #define MAGIC_SSTRUCT_FIELDS \ 249 MAGIC_SSTRUCT_FIELD_ID, \ 250 MAGIC_SSTRUCT_FIELD_NAME, \ 251 MAGIC_SSTRUCT_FIELD_TYPE, \ 252 MAGIC_SSTRUCT_FIELD_FLAGS, \ 253 MAGIC_SSTRUCT_FIELD_ADDRESS, \ 254 MAGIC_SSTRUCT_FIELD_SHADOW_ADDRESS 255 256 #define MAGIC_TSTRUCT_FIELD_ID "id" 257 #define MAGIC_TSTRUCT_FIELD_NAME "name" 258 #define MAGIC_TSTRUCT_FIELD_NAMES "names" 259 #define MAGIC_TSTRUCT_FIELD_NUM_NAMES "num_names" 260 #define MAGIC_TSTRUCT_FIELD_TYPE_STR "type_str" 261 #define MAGIC_TSTRUCT_FIELD_SIZE "size" 262 #define MAGIC_TSTRUCT_FIELD_NUM_CHILD_TYPES "num_child_types" 263 #define MAGIC_TSTRUCT_FIELD_CONTAINED_TYPES "contained_types" 264 #define MAGIC_TSTRUCT_FIELD_COMPATIBLE_TYPES "compatible_types" 265 #define MAGIC_TSTRUCT_FIELD_MEMBER_NAMES "member_names" 266 #define MAGIC_TSTRUCT_FIELD_MEMBER_OFFSETS "member_offsets" 267 #define MAGIC_TSTRUCT_FIELD_VALUE_SET "value_set" 268 #define MAGIC_TSTRUCT_FIELD_TYPE_ID "type_id" 269 #define MAGIC_TSTRUCT_FIELD_FLAGS "flags" 270 #define MAGIC_TSTRUCT_FIELD_BIT_WIDTH "bit_width" 271 #define MAGIC_TSTRUCT_FIELDS \ 272 MAGIC_TSTRUCT_FIELD_ID, \ 273 MAGIC_TSTRUCT_FIELD_NAME, \ 274 MAGIC_TSTRUCT_FIELD_NAMES, \ 275 MAGIC_TSTRUCT_FIELD_NUM_NAMES, \ 276 MAGIC_TSTRUCT_FIELD_TYPE_STR, \ 277 MAGIC_TSTRUCT_FIELD_SIZE, \ 278 MAGIC_TSTRUCT_FIELD_NUM_CHILD_TYPES, \ 279 MAGIC_TSTRUCT_FIELD_CONTAINED_TYPES, \ 280 MAGIC_TSTRUCT_FIELD_COMPATIBLE_TYPES, \ 281 MAGIC_TSTRUCT_FIELD_MEMBER_NAMES, \ 282 MAGIC_TSTRUCT_FIELD_MEMBER_OFFSETS, \ 283 MAGIC_TSTRUCT_FIELD_VALUE_SET, \ 284 MAGIC_TSTRUCT_FIELD_TYPE_ID, \ 285 MAGIC_TSTRUCT_FIELD_FLAGS, \ 286 MAGIC_TSTRUCT_FIELD_BIT_WIDTH 287 288 #define MAGIC_FSTRUCT_FIELD_ID "id" 289 #define MAGIC_FSTRUCT_FIELD_NAME "name" 290 #define MAGIC_FSTRUCT_FIELD_TYPE "type" 291 #define MAGIC_FSTRUCT_FIELD_FLAGS "flags" 292 #define MAGIC_FSTRUCT_FIELD_ADDRESS "address" 293 #define MAGIC_FSTRUCT_FIELDS \ 294 MAGIC_FSTRUCT_FIELD_ID, \ 295 MAGIC_FSTRUCT_FIELD_NAME, \ 296 MAGIC_FSTRUCT_FIELD_TYPE, \ 297 MAGIC_FSTRUCT_FIELD_FLAGS, \ 298 MAGIC_FSTRUCT_FIELD_ADDRESS 299 300 #define MAGIC_DSTRUCT_FIELD_TYPE "type" 301 #define MAGIC_DSTRUCT_FIELD_NAME "name" 302 #define MAGIC_DSTRUCT_FIELD_PARENT_NAME "parent_name" 303 #define MAGIC_DSTRUCT_FIELD_FLAGS "flags" 304 #define MAGIC_DSTRUCT_FIELDS \ 305 MAGIC_DSTRUCT_FIELD_TYPE, \ 306 MAGIC_DSTRUCT_FIELD_NAME, \ 307 MAGIC_DSTRUCT_FIELD_PARENT_NAME, \ 308 MAGIC_DSTRUCT_FIELD_FLAGS 309 310 #define MAGIC_TYPE_ISUNION 0x01 311 #define MAGIC_TYPE_ISPADDED 0x02 312 313 /* Type IDs. */ 314 #define MAGIC_TYPE_VOID 1 315 #define MAGIC_TYPE_FLOAT 2 316 #define MAGIC_TYPE_INTEGER 3 317 #define MAGIC_TYPE_FUNCTION 4 318 #define MAGIC_TYPE_ARRAY 5 319 #define MAGIC_TYPE_ENUM 6 320 #define MAGIC_TYPE_VECTOR 7 321 #define MAGIC_TYPE_UNION 8 322 #define MAGIC_TYPE_STRUCT 9 323 #define MAGIC_TYPE_POINTER 10 324 #define MAGIC_TYPE_OPAQUE 11 325 326 /* Type flags. */ 327 #define MAGIC_TYPE_EXTERNAL 0x001 328 #define MAGIC_TYPE_IS_ROOT 0x002 329 #define MAGIC_TYPE_DYNAMIC 0x004 330 #define MAGIC_TYPE_INT_CAST 0x008 331 #define MAGIC_TYPE_STRICT_VALUE_SET 0x010 332 #define MAGIC_TYPE_VARSIZE 0x020 333 #define MAGIC_TYPE_UNSIGNED 0x040 334 #define MAGIC_TYPE_NO_INNER_PTRS 0x080 335 336 /* State flags for sentries and functions. */ 337 #define MAGIC_STATE_DIRTY 0x00000001 338 #define MAGIC_STATE_CONSTANT 0x00000002 339 #define MAGIC_STATE_DYNAMIC 0x00000004 340 #define MAGIC_STATE_DETACHED 0x00000008 341 #define MAGIC_STATE_DATA 0x00000010 342 #define MAGIC_STATE_HEAP 0x00000020 343 #define MAGIC_STATE_MAP 0x00000040 344 #define MAGIC_STATE_SHM 0x00000080 345 #define MAGIC_STATE_STACK 0x00000100 346 #define MAGIC_STATE_TEXT 0x00000200 347 /* All libraries. */ 348 #define MAGIC_STATE_LIB 0x00000400 349 /* Dynamically linked libraries. */ 350 #define MAGIC_STATE_LIB_SO 0x00000800 351 /* Dynamically loaded libraries. */ 352 #define MAGIC_STATE_LIB_DSO 0x00001000 353 #define MAGIC_STATE_ADDR_NOT_TAKEN 0x00002000 354 #define MAGIC_STATE_EXT 0x00004000 355 #define MAGIC_STATE_OUT_OF_BAND 0x00008000 356 #define MAGIC_STATE_STRING 0x00010000 357 #define MAGIC_STATE_NAMED_STRING 0x00020000 358 #define MAGIC_STATE_MODE_R 0x00040000 359 #define MAGIC_STATE_MODE_W 0x00080000 360 #define MAGIC_STATE_MODE_X 0x00100000 361 #define MAGIC_STATE_THREAD_LOCAL 0x00200000 362 #define MAGIC_STATE_MEMPOOL 0x00400000 363 #define MAGIC_STATE_MEMBLOCK 0x00800000 364 #define MAGIC_STATE_EXTERNAL 0x01000000 365 #define MAGIC_STATE_TYPE_SIZE_MISMATCH 0x02000000 366 #define MAGIC_STATE_IMMUTABLE 0x04000000 367 #define MAGIC_STATE_INIT 0x08000000 368 #define MAGIC_STATE_DIRTY_PAGE 0x10000000 369 /* Skip char* and void* entries in arrays */ 370 #define MAGIC_STATE_SKIP_BYTE_INDICES 0x20000000 371 372 #define MAGIC_STATE_ANNOTATION_MASK \ 373 (MAGIC_STATE_MODE_R | MAGIC_STATE_MODE_W | MAGIC_STATE_MODE_X) 374 375 #define MAGIC_ASR_FLAG_INIT 0x40000 376 377 #define MAGIC_STATE_EXTF_MASK 0xFF000000 378 #define MAGIC_STATE_EXTF_SHIFT 24 379 380 #define MAGIC_STATE_FLAG(E,F) (((E)->flags & (F)) != 0) 381 #define MAGIC_STATE_FLAGS(E,F) (((E)->flags & (F)) == (F)) 382 #define MAGIC_STATE_FLAGS_REGION(F) \ 383 ((F) & (MAGIC_STATE_DATA | MAGIC_STATE_HEAP | MAGIC_STATE_MAP \ 384 | MAGIC_STATE_SHM | MAGIC_STATE_STACK | MAGIC_STATE_TEXT)) 385 #define MAGIC_STATE_FLAGS_LIBSPEC(F) \ 386 ((F) & (MAGIC_STATE_LIB | MAGIC_STATE_LIB_SO | MAGIC_STATE_LIB_DSO)) 387 #define MAGIC_STATE_REGION(E) MAGIC_STATE_FLAGS_REGION((E)->flags) 388 #define MAGIC_STATE_LIBSPEC(E) MAGIC_STATE_FLAGS_LIBSPEC((E)->flags) 389 #define MAGIC_STATE_FLAGS_REGION_C(F) \ 390 (((F) & MAGIC_STATE_DATA) ? 'D' : ((F) & MAGIC_STATE_HEAP) ? 'H' \ 391 : ((F) & MAGIC_STATE_SHM) ? 'X' : ((F) & MAGIC_STATE_MAP) ? 'M' \ 392 : ((F) & MAGIC_STATE_STACK) ? 'S' : ((F) & MAGIC_STATE_TEXT) ? 'T' : '?') 393 #define MAGIC_STATE_FLAGS_LIBSPEC_C(F) \ 394 (((F) & MAGIC_STATE_LIB) ? (((F) & MAGIC_STATE_LIB_SO) ? 'l' \ 395 : ((F) & MAGIC_STATE_LIB_DSO) ? 'o' : 'L') : '0') 396 #define MAGIC_STATE_REGION_C(E) MAGIC_STATE_FLAGS_REGION_C((E)->flags) 397 #define MAGIC_STATE_LIBSPEC_C(E) MAGIC_STATE_FLAGS_LIBSPEC_C((E)->flags) 398 399 #define MAGIC_STATE_IS_EXTF(F) (((F) & MAGIC_STATE_EXTF_MASK) == (F)) 400 #define MAGIC_STATE_FLAGS_TO_EXTF(F) \ 401 (((F) & MAGIC_STATE_EXTF_MASK) >> MAGIC_STATE_EXTF_SHIFT) 402 #define MAGIC_STATE_FLAGS_TO_NONEXTF(F) ((F) & (~MAGIC_STATE_EXTF_MASK)) 403 #define MAGIC_STATE_EXTF_TO_FLAGS(F) \ 404 (((F) << MAGIC_STATE_EXTF_SHIFT) & MAGIC_STATE_EXTF_MASK) 405 #define MAGIC_STATE_EXTF_FLAG(E,F) (MAGIC_STATE_EXTF_GET(E,F) != 0) 406 #define MAGIC_STATE_EXTF_GET(E,F) \ 407 ((MAGIC_STATE_FLAGS_TO_EXTF((E)->flags) & (F))) 408 #define MAGIC_STATE_EXTF_ADD(E,F) \ 409 ((E)->flags |= MAGIC_STATE_EXTF_TO_FLAGS(F)) 410 #define MAGIC_STATE_EXTF_DEL(E,F) \ 411 ((E)->flags &= ~MAGIC_STATE_EXTF_TO_FLAGS(F)) 412 #define MAGIC_STATE_EXTF_SET(E,F) \ 413 do { \ 414 MAGIC_STATE_EXTF_CLEAR(E); \ 415 (E)->flags |= MAGIC_STATE_EXTF_TO_FLAGS(F); \ 416 } while(0) 417 #define MAGIC_STATE_EXTF_CLEAR(E) ((E)->flags &= ~MAGIC_STATE_EXTF_MASK) 418 419 /* Annotations. */ 420 #define MAGIC_CALL_ANNOTATION_VAR _magic_call_annotation_var 421 #define MAGIC_CALL_ANNOTATION_VAR_NAME "_magic_call_annotation_var" 422 #define MAGIC_CALL_ANNOTATE(C, VALUE) \ 423 do { C; MAGIC_CALL_ANNOTATION_VAR = VALUE; } while(0) 424 #define MAGIC_CALL_MEM_SKIP_INSTRUMENTATION 0x01 425 426 #define MAGIC_VAR_ANNOTATION_PREFIX_NAME "_magic_var_annotation_" 427 428 #define MAGIC_VAR_ANNOTATE(T,V,A) \ 429 T V; \ 430 volatile int _magic_var_annotation_ ## V = A 431 #define MAGIC_VAR_INIT_ANNOTATE(T,V,I,A) \ 432 T V = I; \ 433 volatile int _magic_var_annotation_ ## V = A 434 435 #define MAGIC_MEMCPY_FUNC_NAME "memcpy" 436 #define MAGIC_MALLOC_FUNC_NAME "malloc" 437 438 /* Magic memory pool management functions. */ 439 #define MAGIC_MEMPOOL_BLOCK_ALLOC_TEMPLATE_FUNC_NAME \ 440 "mempool_block_alloc_template" 441 442 /* Wrapper functions. */ 443 #define MAGIC_MEMPOOL_CREATE_FUNCS \ 444 __X(magic_mempool_create_begin), __X(magic_mempool_create_end) 445 #define MAGIC_MEMPOOL_DESTROY_FUNCS \ 446 __X(magic_mempool_destroy_begin), __X(magic_mempool_destroy_end) 447 #define MAGIC_MEMPOOL_MGMT_FUNCS \ 448 __X(magic_mempool_mgmt_begin), __X(magic_mempool_mgmt_end) 449 #define MAGIC_MEMPOOL_RESET_FUNCS \ 450 __X(magic_mempool_reset_begin), __X(magic_mempool_mgmt_end) 451 #define MAGIC_MEMPOOL_FUNCS \ 452 MAGIC_MEMPOOL_CREATE_FUNCS, \ 453 MAGIC_MEMPOOL_DESTROY_FUNCS, \ 454 MAGIC_MEMPOOL_MGMT_FUNCS, \ 455 MAGIC_MEMPOOL_RESET_FUNCS 456 457 #define MAGIC_MEMPOOL_CREATE_FUNC_NAMES MAGIC_MEMPOOL_CREATE_FUNCS, "" 458 #define MAGIC_MEMPOOL_DESTROY_FUNC_NAMES MAGIC_MEMPOOL_DESTROY_FUNCS, "" 459 #define MAGIC_MEMPOOL_MGMT_FUNC_NAMES MAGIC_MEMPOOL_MGMT_FUNCS, "" 460 #define MAGIC_MEMPOOL_RESET_FUNC_NAMES MAGIC_MEMPOOL_RESET_FUNCS, "" 461 #define MAGIC_MEMPOOL_FUNC_NAMES MAGIC_MEMPOOL_FUNCS, "" 462 463 /* Flags for inlining wrapper calls. */ 464 #define MAGIC_PRE_HOOK_SIMPLE_CALL 0x0001 465 #define MAGIC_PRE_HOOK_FORWARDING_CALL 0x0002 466 #define MAGIC_POST_HOOK_SIMPLE_CALL 0x0004 467 #define MAGIC_POST_HOOK_FORWARDING_CALL 0x0008 468 #define MAGIC_PRE_HOOK_DEBUG 0x0010 469 #define MAGIC_POST_HOOK_DEBUG 0x0020 470 #define MAGIC_PRE_HOOK_FLAGS_MASK \ 471 (MAGIC_PRE_HOOK_SIMPLE_CALL | MAGIC_PRE_HOOK_FORWARDING_CALL) 472 #define MAGIC_POST_HOOK_FLAGS_MASK \ 473 (MAGIC_POST_HOOK_SIMPLE_CALL | MAGIC_POST_HOOK_FORWARDING_CALL) 474 #define MAGIC_HOOK_DEBUG_MASK \ 475 (MAGIC_PRE_HOOK_DEBUG | MAGIC_POST_HOOK_DEBUG) 476 477 #if (MAGIC_MEM_USAGE_OUTPUT_CTL == 1) 478 #define MAGIC_MEMPOOL_CREATE_FUNC_FLAGS MAGIC_PRE_HOOK_SIMPLE_CALL | MAGIC_POST_HOOK_FORWARDING_CALL | MAGIC_PRE_HOOK_DEBUG 479 #else 480 #define MAGIC_MEMPOOL_CREATE_FUNC_FLAGS MAGIC_PRE_HOOK_SIMPLE_CALL | MAGIC_POST_HOOK_FORWARDING_CALL 481 #endif 482 #define MAGIC_MEMPOOL_DESTROY_FUNC_FLAGS \ 483 MAGIC_PRE_HOOK_FORWARDING_CALL | MAGIC_POST_HOOK_SIMPLE_CALL 484 #define MAGIC_MEMPOOL_MGMT_FUNC_FLAGS \ 485 MAGIC_PRE_HOOK_FORWARDING_CALL | MAGIC_POST_HOOK_SIMPLE_CALL 486 #define MAGIC_MEMPOOL_RESET_FUNC_FLAGS \ 487 MAGIC_PRE_HOOK_FORWARDING_CALL | MAGIC_POST_HOOK_SIMPLE_CALL 488 #define MAGIC_MEMPOOL_FUNC_FLAGS \ 489 MAGIC_MEMPOOL_CREATE_FUNC_FLAGS, \ 490 MAGIC_MEMPOOL_DESTROY_FUNC_FLAGS, \ 491 MAGIC_MEMPOOL_MGMT_FUNC_FLAGS, \ 492 MAGIC_MEMPOOL_RESET_FUNC_FLAGS 493 494 #define MAGIC_CHECKPOINT_ENABLED "_magic_checkpoint_enabled" 495 #define MAGIC_CHECKPOINT_FUNC_NAME "sef_receive_status" 496 497 #define MAGIC_SHADOW_FUNC_PREFIX "llvm_shadow" 498 499 #define MAGIC_LAZY_CHECKPOINT_ENABLED "_magic_lazy_checkpoint_enabled" 500 #define MAGIC_LAZY_CHECKPOINT_CLEARDF_FUNC_NAME "sef_receive_status" 501 502 #define MAGIC_LAZY_CHECKPOINT_SHADOW_TAG "llvm_shadow" 503 504 /* Magic memory functions. */ 505 #define MAGIC_MEMA_FUNCS \ 506 __X(malloc), __X(calloc), __X(realloc), \ 507 __X(posix_memalign), __X(valloc), __X(memalign), \ 508 __X(mmap), \ 509 __X(brk), __X(sbrk), \ 510 __X(shmat), \ 511 __X(mmap64) 512 #define MAGIC_MEMA_FUNC_ALLOC_FLAGS \ 513 MAGIC_STATE_HEAP, MAGIC_STATE_HEAP, MAGIC_STATE_HEAP, \ 514 MAGIC_STATE_HEAP, MAGIC_STATE_HEAP, MAGIC_STATE_HEAP, \ 515 MAGIC_STATE_MAP, \ 516 MAGIC_STATE_HEAP, MAGIC_STATE_HEAP, \ 517 MAGIC_STATE_SHM, \ 518 MAGIC_STATE_MAP 519 520 #ifdef __MINIX 521 #define MAGIC_MEMA_EXTRA_FUNCS , __X(vm_map_cacheblock) 522 #define MAGIC_MEMA_EXTRA_FUNC_ALLOC_FLAGS , MAGIC_STATE_MAP 523 #else 524 #define MAGIC_MEMA_EXTRA_FUNCS 525 #define MAGIC_MEMA_EXTRA_FUNC_ALLOC_FLAGS 526 #endif 527 528 #define MAGIC_MEMD_FUNCS \ 529 __X(free), __X(munmap), __X(shmdt) 530 #define MAGIC_MEMD_FUNC_ALLOC_FLAGS \ 531 0, 0, 0 532 533 #define MAGIC_MEM_FUNCS MAGIC_MEMA_FUNCS MAGIC_MEMA_EXTRA_FUNCS, MAGIC_MEMD_FUNCS 534 #define MAGIC_MEM_UNS_FUNCS \ 535 __X(mmap2), __X(remap_file_pages), __X(mremap) 536 #define MAGIC_MEM_FUNC_ALLOC_FLAGS \ 537 MAGIC_MEMA_FUNC_ALLOC_FLAGS MAGIC_MEMA_EXTRA_FUNC_ALLOC_FLAGS, MAGIC_MEMD_FUNC_ALLOC_FLAGS 538 539 #ifdef __MINIX 540 /* Nested allocation functions to hook. That is, functions that are being 541 * called as part of allocation functions - in particular, malloc - and need to 542 * be intercepted for tracking purposes - in particular, so that mmap'ed malloc 543 * page directories can be unmapped in order to avoid memory leaks. MINIX3 only. 544 */ 545 #define MAGIC_MEMN_FUNCS \ 546 __X(mmap), __X(munmap) 547 #else 548 #define MAGIC_MEMN_FUNCS "" 549 #endif 550 551 #define MAGIC_DL_FUNCS \ 552 __X(dlopen), __X(dlclose) 553 554 #define MAGIC_MEMA_FUNC_NAMES MAGIC_MEMA_FUNCS MAGIC_MEMA_EXTRA_FUNCS, "" 555 #define MAGIC_MEMD_FUNC_NAMES MAGIC_MEMD_FUNCS, "" 556 #define MAGIC_MEMN_FUNC_NAMES MAGIC_MEMN_FUNCS, "" 557 #define MAGIC_MEM_FUNC_NAMES MAGIC_MEM_FUNCS, "" 558 #define MAGIC_DL_FUNC_NAMES MAGIC_DL_FUNCS, "" 559 560 #if MAGIC_INSTRUMENT_MEM_FUNCS_ASR_ONLY 561 #define MAGIC_MEM_PREFIX_STRS MAGIC_ASR_PREFIX_STR, MAGIC_PREFIX_STR, "" 562 #else 563 #define MAGIC_MEM_PREFIX_STRS MAGIC_PREFIX_STR, "" 564 #endif 565 566 #endif /* _MAGIC_COMMON_H */ 567 568