1*b2ed49a5SDavid van Moolenbroek #ifndef _MAGIC_RANGE_H 2*b2ed49a5SDavid van Moolenbroek #define _MAGIC_RANGE_H 3*b2ed49a5SDavid van Moolenbroek 4*b2ed49a5SDavid van Moolenbroek #include <magic.h> 5*b2ed49a5SDavid van Moolenbroek #include <magic_def.h> 6*b2ed49a5SDavid van Moolenbroek #include <magic_common.h> 7*b2ed49a5SDavid van Moolenbroek #include <magic_structs.h> 8*b2ed49a5SDavid van Moolenbroek 9*b2ed49a5SDavid van Moolenbroek /* Magic memory ranges */ 10*b2ed49a5SDavid van Moolenbroek #define magic_null_range _magic_vars->null_range 11*b2ed49a5SDavid van Moolenbroek #define magic_data_range _magic_vars->data_range 12*b2ed49a5SDavid van Moolenbroek #define magic_heap_range _magic_vars->heap_range 13*b2ed49a5SDavid van Moolenbroek #define magic_map_range _magic_vars->map_range 14*b2ed49a5SDavid van Moolenbroek #define magic_shm_range _magic_vars->shm_range 15*b2ed49a5SDavid van Moolenbroek #define magic_stack_range _magic_vars->stack_range 16*b2ed49a5SDavid van Moolenbroek #define magic_text_range _magic_vars->text_range 17*b2ed49a5SDavid van Moolenbroek 18*b2ed49a5SDavid van Moolenbroek #define magic_sentry_range _magic_vars->sentry_range 19*b2ed49a5SDavid van Moolenbroek #define magic_function_range _magic_vars->function_range 20*b2ed49a5SDavid van Moolenbroek #define magic_dfunction_range _magic_vars->dfunction_range 21*b2ed49a5SDavid van Moolenbroek 22*b2ed49a5SDavid van Moolenbroek #define magic_heap_start _magic_vars->heap_start 23*b2ed49a5SDavid van Moolenbroek #define magic_heap_end _magic_vars->heap_end 24*b2ed49a5SDavid van Moolenbroek #define magic_update_dsentry_ranges _magic_vars->update_dsentry_ranges 25*b2ed49a5SDavid van Moolenbroek #define magic_update_dfunction_ranges _magic_vars->update_dfunction_ranges 26*b2ed49a5SDavid van Moolenbroek 27*b2ed49a5SDavid van Moolenbroek /* Magic address ranges. */ 28*b2ed49a5SDavid van Moolenbroek #define MAGIC_ADDR_IS_WITHIN(A, MIN, MAX) ((MIN) <= (A) && (A) <= (MAX)) 29*b2ed49a5SDavid van Moolenbroek #define MAGIC_ADDR_IS_IN_RANGE(A, R) \ 30*b2ed49a5SDavid van Moolenbroek MAGIC_ADDR_IS_WITHIN(A, (R)[0], (R)[1]) 31*b2ed49a5SDavid van Moolenbroek #define MAGIC_RANGE_IS_IN_RANGE(r, R) \ 32*b2ed49a5SDavid van Moolenbroek (MAGIC_ADDR_IS_IN_RANGE((r)[0], R) && MAGIC_ADDR_IS_IN_RANGE((r)[1], R)) 33*b2ed49a5SDavid van Moolenbroek #define MAGIC_RANGE_COPY(RS, RD) memcpy(RD, RS, 2 * sizeof(void *)) 34*b2ed49a5SDavid van Moolenbroek #define MAGIC_RANGE_INIT(R) MAGIC_RANGE_COPY(magic_null_range,R) 35*b2ed49a5SDavid van Moolenbroek #define MAGIC_RANGE_IS_NULL(R) \ 36*b2ed49a5SDavid van Moolenbroek ((R)[0] == magic_null_range[0] && (R)[1] == magic_null_range[1]) 37*b2ed49a5SDavid van Moolenbroek #define MAGIC_RANGE_IS_VALID(R) \ 38*b2ed49a5SDavid van Moolenbroek (MAGIC_RANGE_IS_NULL(R) || ((R)[0] <= (R)[1])) 39*b2ed49a5SDavid van Moolenbroek #define MAGIC_RANGE_UPDATE(R, MIN, MAX) \ 40*b2ed49a5SDavid van Moolenbroek do { \ 41*b2ed49a5SDavid van Moolenbroek if(MIN < (R)[0]) \ 42*b2ed49a5SDavid van Moolenbroek (R)[0] = MIN; \ 43*b2ed49a5SDavid van Moolenbroek if(MAX > (R)[1]) \ 44*b2ed49a5SDavid van Moolenbroek (R)[1] = MAX; \ 45*b2ed49a5SDavid van Moolenbroek } while(0) 46*b2ed49a5SDavid van Moolenbroek #define MAGIC_RANGE_SET_MIN(R, MIN) ((R)[0] = MIN) 47*b2ed49a5SDavid van Moolenbroek #define MAGIC_RANGE_SET_MAX(R, MAX) ((R)[1] = MAX) 48*b2ed49a5SDavid van Moolenbroek #define MAGIC_RANGE_SET(R, MIN, MAX) \ 49*b2ed49a5SDavid van Moolenbroek do { \ 50*b2ed49a5SDavid van Moolenbroek MAGIC_RANGE_SET_MIN(R, MIN); \ 51*b2ed49a5SDavid van Moolenbroek MAGIC_RANGE_SET_MAX(R, MAX); \ 52*b2ed49a5SDavid van Moolenbroek } while(0) 53*b2ed49a5SDavid van Moolenbroek #define MAGIC_RANGE_PAGE_ROUND_MIN(R) \ 54*b2ed49a5SDavid van Moolenbroek ((R)[0] = (char*)(R)[0] - (unsigned long)(R)[0] % MAGIC_PAGE_SIZE) 55*b2ed49a5SDavid van Moolenbroek #define MAGIC_RANGE_PAGE_ROUND_MAX(R) \ 56*b2ed49a5SDavid van Moolenbroek do { \ 57*b2ed49a5SDavid van Moolenbroek unsigned long diff = (unsigned long)(R)[1] % MAGIC_PAGE_SIZE; \ 58*b2ed49a5SDavid van Moolenbroek if(diff) \ 59*b2ed49a5SDavid van Moolenbroek (R)[1] = (char *)(R)[1] + MAGIC_PAGE_SIZE - diff - 1; \ 60*b2ed49a5SDavid van Moolenbroek } while(0) 61*b2ed49a5SDavid van Moolenbroek #define MAGIC_RANGE_PAGE_ROUND(R) \ 62*b2ed49a5SDavid van Moolenbroek do { \ 63*b2ed49a5SDavid van Moolenbroek MAGIC_RANGE_PAGE_ROUND_MIN(R); \ 64*b2ed49a5SDavid van Moolenbroek MAGIC_RANGE_PAGE_ROUND_MAX(R); \ 65*b2ed49a5SDavid van Moolenbroek } while(0) 66*b2ed49a5SDavid van Moolenbroek #define MAGIC_RANGE_PRINT(R) \ 67*b2ed49a5SDavid van Moolenbroek _magic_printf("RANGE %s=[0x%08x;0x%08x]", #R, (unsigned long)((R)[0]), \ 68*b2ed49a5SDavid van Moolenbroek (unsigned long)((R)[1])) 69*b2ed49a5SDavid van Moolenbroek #define MAGIC_RANGE_CHECK(R) \ 70*b2ed49a5SDavid van Moolenbroek assert(MAGIC_RANGE_IS_VALID(R) && "Invalid range " #R); 71*b2ed49a5SDavid van Moolenbroek #define MAGIC_RANGE_SIZE(R) \ 72*b2ed49a5SDavid van Moolenbroek (!MAGIC_RANGE_IS_VALID(R) || MAGIC_RANGE_IS_NULL(R) ? \ 73*b2ed49a5SDavid van Moolenbroek 0 : (char *)(R)[1] - (char *)(R)[0]) 74*b2ed49a5SDavid van Moolenbroek 75*b2ed49a5SDavid van Moolenbroek #if MAGIC_RANGE_DEBUG 76*b2ed49a5SDavid van Moolenbroek #define MAGIC_RANGE_DEBUG_ADDR(A, R) \ 77*b2ed49a5SDavid van Moolenbroek do { \ 78*b2ed49a5SDavid van Moolenbroek char *what = MAGIC_ADDR_IS_IN_RANGE(A, R) ? "" : "not "; \ 79*b2ed49a5SDavid van Moolenbroek _magic_printf("MRD: Address 0x%08x %sin ", A, what); \ 80*b2ed49a5SDavid van Moolenbroek MAGIC_RANGE_PRINT(R); \ 81*b2ed49a5SDavid van Moolenbroek _magic_printf("\n"); \ 82*b2ed49a5SDavid van Moolenbroek MAGIC_RANGE_CHECK(R); \ 83*b2ed49a5SDavid van Moolenbroek } while(0); 84*b2ed49a5SDavid van Moolenbroek #else 85*b2ed49a5SDavid van Moolenbroek #define MAGIC_RANGE_DEBUG_ADDR(A,R) MAGIC_RANGE_CHECK(R) 86*b2ed49a5SDavid van Moolenbroek #endif 87*b2ed49a5SDavid van Moolenbroek 88*b2ed49a5SDavid van Moolenbroek #define MAGIC_ADDR_LOOKUP_USE_DSENTRY_RANGES 1 89*b2ed49a5SDavid van Moolenbroek #define MAGIC_ADDR_LOOKUP_USE_DFUNCTION_RANGES 1 90*b2ed49a5SDavid van Moolenbroek 91*b2ed49a5SDavid van Moolenbroek /* Magic range functions. */ 92*b2ed49a5SDavid van Moolenbroek PUBLIC void magic_ranges_init(void); 93*b2ed49a5SDavid van Moolenbroek PUBLIC int magic_range_is_dfunction(void* addr); 94*b2ed49a5SDavid van Moolenbroek PUBLIC int magic_range_is_dsentry(void* addr); 95*b2ed49a5SDavid van Moolenbroek PUBLIC int magic_range_is_stack(void* addr); 96*b2ed49a5SDavid van Moolenbroek 97*b2ed49a5SDavid van Moolenbroek /* Lookup functions. */ 98*b2ed49a5SDavid van Moolenbroek PUBLIC int magic_range_lookup_by_addr(void *addr, void **container); 99*b2ed49a5SDavid van Moolenbroek 100*b2ed49a5SDavid van Moolenbroek #endif /* _MAGIC_RANGE_H */ 101