xref: /minix3/minix/lib/libmagicrt/magic_range.c (revision b2ed49a5d83e311ee0fa9e5ff613639b1bf77aaf)
1*b2ed49a5SDavid van Moolenbroek #define MAGIC_RANGE_DEBUG                   MAGIC_DEBUG_SET(0)
2*b2ed49a5SDavid van Moolenbroek 
3*b2ed49a5SDavid van Moolenbroek #include <magic_range.h>
4*b2ed49a5SDavid van Moolenbroek 
5*b2ed49a5SDavid van Moolenbroek /*===========================================================================*
6*b2ed49a5SDavid van Moolenbroek  *                           magic_range_is_shlib                            *
7*b2ed49a5SDavid van Moolenbroek  *===========================================================================*/
magic_range_is_shlib(void * addr,void ** container)8*b2ed49a5SDavid van Moolenbroek PRIVATE int magic_range_is_shlib(void *addr, void **container)
9*b2ed49a5SDavid van Moolenbroek {
10*b2ed49a5SDavid van Moolenbroek     /*
11*b2ed49a5SDavid van Moolenbroek      * NB!: This function requires the calling thread to already
12*b2ed49a5SDavid van Moolenbroek      * hold the DSODESC lock.
13*b2ed49a5SDavid van Moolenbroek      */
14*b2ed49a5SDavid van Moolenbroek     int ret = 0;
15*b2ed49a5SDavid van Moolenbroek     struct _magic_sodesc *sodesc;
16*b2ed49a5SDavid van Moolenbroek     struct _magic_dsodesc *dsodesc;
17*b2ed49a5SDavid van Moolenbroek 
18*b2ed49a5SDavid van Moolenbroek     /* First iterate through the SO descriptors. */
19*b2ed49a5SDavid van Moolenbroek     MAGIC_SODESC_ITER(_magic_first_sodesc, sodesc,
20*b2ed49a5SDavid van Moolenbroek         /* First check the text range. */
21*b2ed49a5SDavid van Moolenbroek         MAGIC_RANGE_DEBUG_ADDR(addr, sodesc->lib.text_range);
22*b2ed49a5SDavid van Moolenbroek         if (MAGIC_ADDR_IS_IN_RANGE(addr, sodesc->lib.text_range)) {
23*b2ed49a5SDavid van Moolenbroek             ret |= MAGIC_STATE_TEXT;
24*b2ed49a5SDavid van Moolenbroek             goto found_so;
25*b2ed49a5SDavid van Moolenbroek         }
26*b2ed49a5SDavid van Moolenbroek         /* Next check the data range. */
27*b2ed49a5SDavid van Moolenbroek         MAGIC_RANGE_DEBUG_ADDR(addr, sodesc->lib.data_range);
28*b2ed49a5SDavid van Moolenbroek         if (MAGIC_ADDR_IS_IN_RANGE(addr, sodesc->lib.data_range)) {
29*b2ed49a5SDavid van Moolenbroek             ret |= MAGIC_STATE_DATA;
30*b2ed49a5SDavid van Moolenbroek             goto found_so;
31*b2ed49a5SDavid van Moolenbroek         }
32*b2ed49a5SDavid van Moolenbroek     );
33*b2ed49a5SDavid van Moolenbroek 
34*b2ed49a5SDavid van Moolenbroek     /* Next iterate through the DSO descriptors. */
35*b2ed49a5SDavid van Moolenbroek     MAGIC_SODESC_ITER(_magic_first_dsodesc, dsodesc,
36*b2ed49a5SDavid van Moolenbroek         /* First check the text range. */
37*b2ed49a5SDavid van Moolenbroek         MAGIC_RANGE_DEBUG_ADDR(addr, dsodesc->lib.text_range);
38*b2ed49a5SDavid van Moolenbroek         if (MAGIC_ADDR_IS_IN_RANGE(addr, dsodesc->lib.text_range)) {
39*b2ed49a5SDavid van Moolenbroek             ret |= MAGIC_STATE_TEXT;
40*b2ed49a5SDavid van Moolenbroek             goto found_dso;
41*b2ed49a5SDavid van Moolenbroek         }
42*b2ed49a5SDavid van Moolenbroek         /* Next check the data range. */
43*b2ed49a5SDavid van Moolenbroek         MAGIC_RANGE_DEBUG_ADDR(addr, dsodesc->lib.data_range);
44*b2ed49a5SDavid van Moolenbroek         if (MAGIC_ADDR_IS_IN_RANGE(addr, dsodesc->lib.data_range)) {
45*b2ed49a5SDavid van Moolenbroek             ret |= MAGIC_STATE_DATA;
46*b2ed49a5SDavid van Moolenbroek             goto found_dso;
47*b2ed49a5SDavid van Moolenbroek         }
48*b2ed49a5SDavid van Moolenbroek     );
49*b2ed49a5SDavid van Moolenbroek 
50*b2ed49a5SDavid van Moolenbroek 
51*b2ed49a5SDavid van Moolenbroek out:
52*b2ed49a5SDavid van Moolenbroek     return ret;
53*b2ed49a5SDavid van Moolenbroek found_so:
54*b2ed49a5SDavid van Moolenbroek     ret |= MAGIC_STATE_LIB | MAGIC_STATE_LIB_SO;
55*b2ed49a5SDavid van Moolenbroek     if (container != NULL)
56*b2ed49a5SDavid van Moolenbroek         *container = (void *)(sodesc);
57*b2ed49a5SDavid van Moolenbroek     goto out;
58*b2ed49a5SDavid van Moolenbroek found_dso:
59*b2ed49a5SDavid van Moolenbroek     ret |= MAGIC_STATE_LIB | MAGIC_STATE_LIB_DSO;
60*b2ed49a5SDavid van Moolenbroek     if (container != NULL) {
61*b2ed49a5SDavid van Moolenbroek         *container = (void *)(dsodesc);
62*b2ed49a5SDavid van Moolenbroek     }
63*b2ed49a5SDavid van Moolenbroek     goto out;
64*b2ed49a5SDavid van Moolenbroek 
65*b2ed49a5SDavid van Moolenbroek }
66*b2ed49a5SDavid van Moolenbroek 
67*b2ed49a5SDavid van Moolenbroek /*===========================================================================*
68*b2ed49a5SDavid van Moolenbroek  *                          magic_range_is_data                              *
69*b2ed49a5SDavid van Moolenbroek  *===========================================================================*/
magic_range_is_data(void * addr)70*b2ed49a5SDavid van Moolenbroek PRIVATE INLINE int magic_range_is_data(void *addr)
71*b2ed49a5SDavid van Moolenbroek {
72*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_DEBUG_ADDR(addr, magic_data_range);
73*b2ed49a5SDavid van Moolenbroek     return MAGIC_ADDR_IS_IN_RANGE(addr, magic_data_range) ? MAGIC_STATE_DATA : 0;
74*b2ed49a5SDavid van Moolenbroek }
75*b2ed49a5SDavid van Moolenbroek 
76*b2ed49a5SDavid van Moolenbroek /*===========================================================================*
77*b2ed49a5SDavid van Moolenbroek  *                          magic_range_is_text                              *
78*b2ed49a5SDavid van Moolenbroek  *===========================================================================*/
magic_range_is_text(void * addr)79*b2ed49a5SDavid van Moolenbroek PRIVATE INLINE int magic_range_is_text(void *addr)
80*b2ed49a5SDavid van Moolenbroek {
81*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_DEBUG_ADDR(addr, magic_text_range);
82*b2ed49a5SDavid van Moolenbroek     return MAGIC_ADDR_IS_IN_RANGE(addr, magic_text_range) ? MAGIC_STATE_TEXT : 0;
83*b2ed49a5SDavid van Moolenbroek }
84*b2ed49a5SDavid van Moolenbroek 
85*b2ed49a5SDavid van Moolenbroek /*===========================================================================*
86*b2ed49a5SDavid van Moolenbroek  *                          magic_range_is_heap                              *
87*b2ed49a5SDavid van Moolenbroek  *===========================================================================*/
magic_range_is_heap(void * addr)88*b2ed49a5SDavid van Moolenbroek PRIVATE INLINE int magic_range_is_heap(void *addr)
89*b2ed49a5SDavid van Moolenbroek {
90*b2ed49a5SDavid van Moolenbroek     void* heap_range[2];
91*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_SET_MIN(heap_range, magic_heap_start);
92*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_SET_MAX(heap_range, (char *)magic_heap_end + MAGIC_HEAP_GAP);
93*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_DEBUG_ADDR(addr, heap_range);
94*b2ed49a5SDavid van Moolenbroek     return MAGIC_ADDR_IS_IN_RANGE(addr, heap_range) ? MAGIC_STATE_HEAP : 0;
95*b2ed49a5SDavid van Moolenbroek }
96*b2ed49a5SDavid van Moolenbroek 
97*b2ed49a5SDavid van Moolenbroek /*===========================================================================*
98*b2ed49a5SDavid van Moolenbroek  *                          magic_range_is_stack                             *
99*b2ed49a5SDavid van Moolenbroek  *===========================================================================*/
magic_range_is_stack(void * addr)100*b2ed49a5SDavid van Moolenbroek PUBLIC int magic_range_is_stack(void *addr)
101*b2ed49a5SDavid van Moolenbroek {
102*b2ed49a5SDavid van Moolenbroek     /*
103*b2ed49a5SDavid van Moolenbroek      * NB!: This function requires the calling thread to already
104*b2ed49a5SDavid van Moolenbroek      * hold the DSENTRY lock.
105*b2ed49a5SDavid van Moolenbroek      */
106*b2ed49a5SDavid van Moolenbroek     struct _magic_sentry *sentry;
107*b2ed49a5SDavid van Moolenbroek     int ret;
108*b2ed49a5SDavid van Moolenbroek     void *stack_range[2];
109*b2ed49a5SDavid van Moolenbroek 
110*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_INIT(stack_range);
111*b2ed49a5SDavid van Moolenbroek     assert(_magic_first_stack_dsentry && _magic_last_stack_dsentry);
112*b2ed49a5SDavid van Moolenbroek     sentry = MAGIC_DSENTRY_TO_SENTRY(_magic_first_stack_dsentry);
113*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_SET_MIN(stack_range,
114*b2ed49a5SDavid van Moolenbroek         (char *) MAGIC_DSENTRY_TO_SENTRY(_magic_last_stack_dsentry)->address -
115*b2ed49a5SDavid van Moolenbroek         MAGIC_STACK_GAP);
116*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_SET_MAX(stack_range,
117*b2ed49a5SDavid van Moolenbroek         ((char *) sentry->address) + sentry->type->size - 1);
118*b2ed49a5SDavid van Moolenbroek #if MAGIC_RANGE_ROUND_STACK
119*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_PAGE_ROUND(stack_range);
120*b2ed49a5SDavid van Moolenbroek #endif
121*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_DEBUG_ADDR(addr, stack_range);
122*b2ed49a5SDavid van Moolenbroek     ret = MAGIC_ADDR_IS_IN_RANGE(addr, stack_range) ? MAGIC_STATE_STACK : 0;
123*b2ed49a5SDavid van Moolenbroek 
124*b2ed49a5SDavid van Moolenbroek     return ret;
125*b2ed49a5SDavid van Moolenbroek }
126*b2ed49a5SDavid van Moolenbroek 
127*b2ed49a5SDavid van Moolenbroek /*===========================================================================*
128*b2ed49a5SDavid van Moolenbroek  *                         magic_range_is_dsentry                            *
129*b2ed49a5SDavid van Moolenbroek  *===========================================================================*/
magic_range_is_dsentry(void * addr)130*b2ed49a5SDavid van Moolenbroek PUBLIC int magic_range_is_dsentry(void *addr)
131*b2ed49a5SDavid van Moolenbroek {
132*b2ed49a5SDavid van Moolenbroek     /*
133*b2ed49a5SDavid van Moolenbroek      * NB!: This function requires the calling thread to already
134*b2ed49a5SDavid van Moolenbroek      * hold the DSENTRY lock.
135*b2ed49a5SDavid van Moolenbroek      */
136*b2ed49a5SDavid van Moolenbroek     int ret = 0;
137*b2ed49a5SDavid van Moolenbroek     void *start_address, *end_address;
138*b2ed49a5SDavid van Moolenbroek     struct _magic_dsentry *prev_dsentry, *dsentry;
139*b2ed49a5SDavid van Moolenbroek     struct _magic_sentry *sentry;
140*b2ed49a5SDavid van Moolenbroek     int region;
141*b2ed49a5SDavid van Moolenbroek 
142*b2ed49a5SDavid van Moolenbroek     if(magic_update_dsentry_ranges) {
143*b2ed49a5SDavid van Moolenbroek         MAGIC_RANGE_INIT(magic_heap_range);
144*b2ed49a5SDavid van Moolenbroek         MAGIC_RANGE_INIT(magic_map_range);
145*b2ed49a5SDavid van Moolenbroek         MAGIC_RANGE_INIT(magic_shm_range);
146*b2ed49a5SDavid van Moolenbroek         MAGIC_RANGE_INIT(magic_stack_range);
147*b2ed49a5SDavid van Moolenbroek         MAGIC_DSENTRY_ALIVE_ITER(_magic_first_dsentry, prev_dsentry, dsentry, sentry,
148*b2ed49a5SDavid van Moolenbroek             start_address = sentry->address;
149*b2ed49a5SDavid van Moolenbroek             end_address = (void *) (((char *)sentry->address) +
150*b2ed49a5SDavid van Moolenbroek                 sentry->type->size - 1);
151*b2ed49a5SDavid van Moolenbroek             region = MAGIC_STATE_REGION(sentry);
152*b2ed49a5SDavid van Moolenbroek             if(region & MAGIC_STATE_HEAP) {
153*b2ed49a5SDavid van Moolenbroek                 MAGIC_RANGE_UPDATE(magic_heap_range, start_address, end_address);
154*b2ed49a5SDavid van Moolenbroek             }
155*b2ed49a5SDavid van Moolenbroek             else if(region & MAGIC_STATE_MAP) {
156*b2ed49a5SDavid van Moolenbroek                 MAGIC_RANGE_UPDATE(magic_map_range, start_address, end_address);
157*b2ed49a5SDavid van Moolenbroek             }
158*b2ed49a5SDavid van Moolenbroek             else if(region & MAGIC_STATE_SHM) {
159*b2ed49a5SDavid van Moolenbroek                 MAGIC_RANGE_UPDATE(magic_shm_range, start_address, end_address);
160*b2ed49a5SDavid van Moolenbroek             }
161*b2ed49a5SDavid van Moolenbroek             else if(region & MAGIC_STATE_STACK) {
162*b2ed49a5SDavid van Moolenbroek                 MAGIC_RANGE_UPDATE(magic_stack_range, start_address, end_address);
163*b2ed49a5SDavid van Moolenbroek             }
164*b2ed49a5SDavid van Moolenbroek         );
165*b2ed49a5SDavid van Moolenbroek         magic_update_dsentry_ranges = 0;
166*b2ed49a5SDavid van Moolenbroek     }
167*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_DEBUG_ADDR(addr, magic_heap_range);
168*b2ed49a5SDavid van Moolenbroek     if(MAGIC_ADDR_IS_IN_RANGE(addr, magic_heap_range)) {
169*b2ed49a5SDavid van Moolenbroek         ret |= MAGIC_STATE_HEAP;
170*b2ed49a5SDavid van Moolenbroek     }
171*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_DEBUG_ADDR(addr, magic_map_range);
172*b2ed49a5SDavid van Moolenbroek     if(MAGIC_ADDR_IS_IN_RANGE(addr, magic_map_range)) {
173*b2ed49a5SDavid van Moolenbroek         ret |= MAGIC_STATE_MAP;
174*b2ed49a5SDavid van Moolenbroek     }
175*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_DEBUG_ADDR(addr, magic_shm_range);
176*b2ed49a5SDavid van Moolenbroek     if(MAGIC_ADDR_IS_IN_RANGE(addr, magic_shm_range)) {
177*b2ed49a5SDavid van Moolenbroek         ret |= MAGIC_STATE_SHM;
178*b2ed49a5SDavid van Moolenbroek     }
179*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_DEBUG_ADDR(addr, magic_stack_range);
180*b2ed49a5SDavid van Moolenbroek     if(MAGIC_ADDR_IS_IN_RANGE(addr, magic_stack_range)) {
181*b2ed49a5SDavid van Moolenbroek         ret |= MAGIC_STATE_STACK;
182*b2ed49a5SDavid van Moolenbroek     }
183*b2ed49a5SDavid van Moolenbroek 
184*b2ed49a5SDavid van Moolenbroek     return ret;
185*b2ed49a5SDavid van Moolenbroek }
186*b2ed49a5SDavid van Moolenbroek 
187*b2ed49a5SDavid van Moolenbroek /*===========================================================================*
188*b2ed49a5SDavid van Moolenbroek  *                        magic_range_is_dfunction                           *
189*b2ed49a5SDavid van Moolenbroek  *===========================================================================*/
magic_range_is_dfunction(void * addr)190*b2ed49a5SDavid van Moolenbroek PUBLIC int magic_range_is_dfunction(void *addr)
191*b2ed49a5SDavid van Moolenbroek {
192*b2ed49a5SDavid van Moolenbroek     /*
193*b2ed49a5SDavid van Moolenbroek      * NB!: This function requires the calling thread to already
194*b2ed49a5SDavid van Moolenbroek      * hold the DFUNCTION lock.
195*b2ed49a5SDavid van Moolenbroek      */
196*b2ed49a5SDavid van Moolenbroek     int ret = 0;
197*b2ed49a5SDavid van Moolenbroek     void *start_address;
198*b2ed49a5SDavid van Moolenbroek     struct _magic_dfunction* dfunction;
199*b2ed49a5SDavid van Moolenbroek     struct _magic_function* function;
200*b2ed49a5SDavid van Moolenbroek     int region;
201*b2ed49a5SDavid van Moolenbroek 
202*b2ed49a5SDavid van Moolenbroek     if(magic_update_dfunction_ranges) {
203*b2ed49a5SDavid van Moolenbroek         MAGIC_RANGE_INIT(magic_dfunction_range);
204*b2ed49a5SDavid van Moolenbroek         MAGIC_DFUNCTION_FUNC_ITER(_magic_first_dfunction, dfunction, function,
205*b2ed49a5SDavid van Moolenbroek             start_address = function->address;
206*b2ed49a5SDavid van Moolenbroek             region = MAGIC_STATE_REGION(function);
207*b2ed49a5SDavid van Moolenbroek             assert(region & MAGIC_STATE_TEXT);
208*b2ed49a5SDavid van Moolenbroek             MAGIC_RANGE_UPDATE(magic_dfunction_range, start_address, start_address);
209*b2ed49a5SDavid van Moolenbroek         );
210*b2ed49a5SDavid van Moolenbroek         magic_update_dfunction_ranges = 0;
211*b2ed49a5SDavid van Moolenbroek     }
212*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_DEBUG_ADDR(addr, magic_dfunction_range);
213*b2ed49a5SDavid van Moolenbroek     if(MAGIC_ADDR_IS_IN_RANGE(addr, magic_dfunction_range)) {
214*b2ed49a5SDavid van Moolenbroek         ret |= MAGIC_STATE_TEXT;
215*b2ed49a5SDavid van Moolenbroek     }
216*b2ed49a5SDavid van Moolenbroek 
217*b2ed49a5SDavid van Moolenbroek     return ret;
218*b2ed49a5SDavid van Moolenbroek }
219*b2ed49a5SDavid van Moolenbroek 
220*b2ed49a5SDavid van Moolenbroek /*===========================================================================*
221*b2ed49a5SDavid van Moolenbroek  *                           magic_ranges_init                               *
222*b2ed49a5SDavid van Moolenbroek  *===========================================================================*/
magic_ranges_init(void)223*b2ed49a5SDavid van Moolenbroek PUBLIC void magic_ranges_init(void)
224*b2ed49a5SDavid van Moolenbroek {
225*b2ed49a5SDavid van Moolenbroek     int i,j;
226*b2ed49a5SDavid van Moolenbroek     void *start_address, *end_address;
227*b2ed49a5SDavid van Moolenbroek     const char* linker_vars[] = { MAGIC_LINKER_VAR_NAMES };
228*b2ed49a5SDavid van Moolenbroek 
229*b2ed49a5SDavid van Moolenbroek     /* Init sentry and data range. */
230*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_INIT(magic_data_range);
231*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_INIT(magic_sentry_range);
232*b2ed49a5SDavid van Moolenbroek     for (i = 0 ; i < _magic_sentries_num ; i++) {
233*b2ed49a5SDavid van Moolenbroek         start_address = _magic_sentries[i].address;
234*b2ed49a5SDavid van Moolenbroek         end_address = (void *) (((char *)_magic_sentries[i].address)+_magic_sentries[i].type->size-1);
235*b2ed49a5SDavid van Moolenbroek         MAGIC_RANGE_UPDATE(magic_sentry_range, start_address, end_address);
236*b2ed49a5SDavid van Moolenbroek         j = 0;
237*b2ed49a5SDavid van Moolenbroek         while (linker_vars[j] && strcmp(linker_vars[j], _magic_sentries[i].name)) j++;
238*b2ed49a5SDavid van Moolenbroek         if (linker_vars[j] || MAGIC_STATE_FLAG(&_magic_sentries[i], MAGIC_STATE_THREAD_LOCAL)
239*b2ed49a5SDavid van Moolenbroek             || MAGIC_STATE_FLAG(&_magic_sentries[i], MAGIC_STATE_EXTERNAL)) {
240*b2ed49a5SDavid van Moolenbroek             continue;
241*b2ed49a5SDavid van Moolenbroek         }
242*b2ed49a5SDavid van Moolenbroek         MAGIC_RANGE_UPDATE(magic_data_range, start_address, end_address);
243*b2ed49a5SDavid van Moolenbroek     }
244*b2ed49a5SDavid van Moolenbroek #if MAGIC_RANGE_ROUND_DATA
245*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_PAGE_ROUND(magic_data_range);
246*b2ed49a5SDavid van Moolenbroek #endif
247*b2ed49a5SDavid van Moolenbroek 
248*b2ed49a5SDavid van Moolenbroek     /* Init function range. */
249*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_INIT(magic_function_range);
250*b2ed49a5SDavid van Moolenbroek     for (i = 0 ; i < _magic_functions_num ; i++) {
251*b2ed49a5SDavid van Moolenbroek         start_address = _magic_functions[i].address;
252*b2ed49a5SDavid van Moolenbroek         MAGIC_RANGE_UPDATE(magic_function_range, start_address, start_address);
253*b2ed49a5SDavid van Moolenbroek     }
254*b2ed49a5SDavid van Moolenbroek 
255*b2ed49a5SDavid van Moolenbroek     /* Init text range. */
256*b2ed49a5SDavid van Moolenbroek #ifdef __MINIX
257*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_SET(magic_text_range, MAGIC_TEXT_START,
258*b2ed49a5SDavid van Moolenbroek         MAGIC_TEXT_END ? MAGIC_TEXT_END : ((char *)magic_function_range[1]));
259*b2ed49a5SDavid van Moolenbroek #else
260*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_SET(magic_text_range, MAGIC_TEXT_START,
261*b2ed49a5SDavid van Moolenbroek         MAGIC_TEXT_END ? MAGIC_TEXT_END : ((char *)magic_data_range[0] - 1));
262*b2ed49a5SDavid van Moolenbroek #endif
263*b2ed49a5SDavid van Moolenbroek #if MAGIC_RANGE_ROUND_TEXT
264*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_PAGE_ROUND(magic_text_range);
265*b2ed49a5SDavid van Moolenbroek #endif
266*b2ed49a5SDavid van Moolenbroek 
267*b2ed49a5SDavid van Moolenbroek     /* Init heap start. */
268*b2ed49a5SDavid van Moolenbroek     magic_heap_start = MAGIC_HEAP_START ? MAGIC_HEAP_START : ((char *)magic_data_range[1] + 1);
269*b2ed49a5SDavid van Moolenbroek     magic_heap_end = ((char *)sbrk(0)) - 1;
270*b2ed49a5SDavid van Moolenbroek 
271*b2ed49a5SDavid van Moolenbroek     /* Defaults for other ranges. */
272*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_INIT(magic_heap_range);
273*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_INIT(magic_map_range);
274*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_INIT(magic_shm_range);
275*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_INIT(magic_stack_range);
276*b2ed49a5SDavid van Moolenbroek     MAGIC_RANGE_INIT(magic_dfunction_range);
277*b2ed49a5SDavid van Moolenbroek }
278*b2ed49a5SDavid van Moolenbroek 
279*b2ed49a5SDavid van Moolenbroek /*===========================================================================*
280*b2ed49a5SDavid van Moolenbroek  *                        magic_range_lookup_by_addr                         *
281*b2ed49a5SDavid van Moolenbroek  *===========================================================================*/
magic_range_lookup_by_addr(void * addr,void ** container)282*b2ed49a5SDavid van Moolenbroek PUBLIC int magic_range_lookup_by_addr(void *addr, void **container)
283*b2ed49a5SDavid van Moolenbroek {
284*b2ed49a5SDavid van Moolenbroek     /*
285*b2ed49a5SDavid van Moolenbroek      * NB!: This function requires the calling thread to already
286*b2ed49a5SDavid van Moolenbroek      * hold the DSENTRY, DFUNCTION and DSODESC locks.
287*b2ed49a5SDavid van Moolenbroek      */
288*b2ed49a5SDavid van Moolenbroek     int ret;
289*b2ed49a5SDavid van Moolenbroek     /* Constant ranges first. */
290*b2ed49a5SDavid van Moolenbroek     if (magic_range_is_data(addr)) {
291*b2ed49a5SDavid van Moolenbroek         return MAGIC_STATE_DATA;
292*b2ed49a5SDavid van Moolenbroek     }
293*b2ed49a5SDavid van Moolenbroek     if (magic_range_is_text(addr)) {
294*b2ed49a5SDavid van Moolenbroek         return MAGIC_STATE_TEXT;
295*b2ed49a5SDavid van Moolenbroek     }
296*b2ed49a5SDavid van Moolenbroek 
297*b2ed49a5SDavid van Moolenbroek     /* Non-dsentry ranges next. */
298*b2ed49a5SDavid van Moolenbroek     if (magic_range_is_heap(addr)) {
299*b2ed49a5SDavid van Moolenbroek         return MAGIC_STATE_HEAP;
300*b2ed49a5SDavid van Moolenbroek     }
301*b2ed49a5SDavid van Moolenbroek     if (magic_range_is_stack(addr)) {
302*b2ed49a5SDavid van Moolenbroek         return MAGIC_STATE_STACK;
303*b2ed49a5SDavid van Moolenbroek     }
304*b2ed49a5SDavid van Moolenbroek 
305*b2ed49a5SDavid van Moolenbroek     /* Shared library ranges. */
306*b2ed49a5SDavid van Moolenbroek #if 0
307*b2ed49a5SDavid van Moolenbroek     /* XXX: This kind of range isn't very accurate. */
308*b2ed49a5SDavid van Moolenbroek     if (magic_range_is_dfunction(addr)) {
309*b2ed49a5SDavid van Moolenbroek         return MAGIC_STATE_LIB | MAGIC_STATE_TEXT;
310*b2ed49a5SDavid van Moolenbroek     }
311*b2ed49a5SDavid van Moolenbroek #endif
312*b2ed49a5SDavid van Moolenbroek 
313*b2ed49a5SDavid van Moolenbroek     if ((ret = magic_range_is_shlib(addr, container))) {
314*b2ed49a5SDavid van Moolenbroek         return ret;
315*b2ed49a5SDavid van Moolenbroek     }
316*b2ed49a5SDavid van Moolenbroek 
317*b2ed49a5SDavid van Moolenbroek     /* Dsentry ranges last. */
318*b2ed49a5SDavid van Moolenbroek     return magic_range_is_dsentry(addr);
319*b2ed49a5SDavid van Moolenbroek }
320*b2ed49a5SDavid van Moolenbroek 
321*b2ed49a5SDavid van Moolenbroek 
322