xref: /minix3/minix/lib/libmagicrt/include/magic_range.h (revision b2ed49a5d83e311ee0fa9e5ff613639b1bf77aaf)
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