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