xref: /minix3/minix/lib/libmagicrt/include/magic_structs.h (revision b2ed49a5d83e311ee0fa9e5ff613639b1bf77aaf)
1*b2ed49a5SDavid van Moolenbroek #ifndef _MAGIC_STRUCTS_H
2*b2ed49a5SDavid van Moolenbroek #define _MAGIC_STRUCTS_H
3*b2ed49a5SDavid van Moolenbroek 
4*b2ed49a5SDavid van Moolenbroek #include <magic_def.h>
5*b2ed49a5SDavid van Moolenbroek #include <magic_common.h>
6*b2ed49a5SDavid van Moolenbroek #include <stddef.h>
7*b2ed49a5SDavid van Moolenbroek #include <common/ut/uthash.h>
8*b2ed49a5SDavid van Moolenbroek 
9*b2ed49a5SDavid van Moolenbroek /* Magic state type struct. */
10*b2ed49a5SDavid van Moolenbroek struct _magic_type {
11*b2ed49a5SDavid van Moolenbroek     _magic_id_t id;
12*b2ed49a5SDavid van Moolenbroek     const char *name;
13*b2ed49a5SDavid van Moolenbroek     const char **names;
14*b2ed49a5SDavid van Moolenbroek     unsigned num_names;
15*b2ed49a5SDavid van Moolenbroek     const char *type_str;
16*b2ed49a5SDavid van Moolenbroek     unsigned size;
17*b2ed49a5SDavid van Moolenbroek     unsigned num_child_types;
18*b2ed49a5SDavid van Moolenbroek     struct _magic_type **contained_types;
19*b2ed49a5SDavid van Moolenbroek     struct _magic_type **compatible_types;
20*b2ed49a5SDavid van Moolenbroek     const char **member_names;
21*b2ed49a5SDavid van Moolenbroek     unsigned *member_offsets;
22*b2ed49a5SDavid van Moolenbroek     void *value_set;
23*b2ed49a5SDavid van Moolenbroek     unsigned type_id;
24*b2ed49a5SDavid van Moolenbroek     int flags;
25*b2ed49a5SDavid van Moolenbroek     unsigned bit_width;
26*b2ed49a5SDavid van Moolenbroek     const void *ext;
27*b2ed49a5SDavid van Moolenbroek };
28*b2ed49a5SDavid van Moolenbroek 
29*b2ed49a5SDavid van Moolenbroek /* Magic state entry struct. */
30*b2ed49a5SDavid van Moolenbroek struct _magic_sentry {
31*b2ed49a5SDavid van Moolenbroek     _magic_id_t id;
32*b2ed49a5SDavid van Moolenbroek     const char *name;
33*b2ed49a5SDavid van Moolenbroek     struct _magic_type *type;
34*b2ed49a5SDavid van Moolenbroek     int flags;
35*b2ed49a5SDavid van Moolenbroek     void *address;
36*b2ed49a5SDavid van Moolenbroek     void *shadow_address;
37*b2ed49a5SDavid van Moolenbroek };
38*b2ed49a5SDavid van Moolenbroek 
39*b2ed49a5SDavid van Moolenbroek /* Magic state entry list struct. */
40*b2ed49a5SDavid van Moolenbroek struct _magic_sentry_list {
41*b2ed49a5SDavid van Moolenbroek     struct _magic_sentry *sentry;
42*b2ed49a5SDavid van Moolenbroek     struct _magic_sentry_list *next;
43*b2ed49a5SDavid van Moolenbroek };
44*b2ed49a5SDavid van Moolenbroek 
45*b2ed49a5SDavid van Moolenbroek /* Magic state entry hash struct. */
46*b2ed49a5SDavid van Moolenbroek #define MAGIC_SENTRY_NAME_MAX_KEY_LEN       512
47*b2ed49a5SDavid van Moolenbroek struct _magic_sentry_hash {
48*b2ed49a5SDavid van Moolenbroek     struct _magic_sentry_list *sentry_list;
49*b2ed49a5SDavid van Moolenbroek     char key[MAGIC_SENTRY_NAME_MAX_KEY_LEN];
50*b2ed49a5SDavid van Moolenbroek     UT_hash_handle hh;
51*b2ed49a5SDavid van Moolenbroek };
52*b2ed49a5SDavid van Moolenbroek 
53*b2ed49a5SDavid van Moolenbroek /* Magic state function struct. */
54*b2ed49a5SDavid van Moolenbroek struct _magic_function {
55*b2ed49a5SDavid van Moolenbroek     _magic_id_t id;
56*b2ed49a5SDavid van Moolenbroek     const char *name;
57*b2ed49a5SDavid van Moolenbroek     struct _magic_type *type;
58*b2ed49a5SDavid van Moolenbroek     int flags;
59*b2ed49a5SDavid van Moolenbroek     void *address;
60*b2ed49a5SDavid van Moolenbroek };
61*b2ed49a5SDavid van Moolenbroek 
62*b2ed49a5SDavid van Moolenbroek /* Magic state function hash struct. */
63*b2ed49a5SDavid van Moolenbroek struct _magic_function_hash {
64*b2ed49a5SDavid van Moolenbroek     struct _magic_function *function;
65*b2ed49a5SDavid van Moolenbroek     void *key;
66*b2ed49a5SDavid van Moolenbroek     UT_hash_handle hh;
67*b2ed49a5SDavid van Moolenbroek };
68*b2ed49a5SDavid van Moolenbroek 
69*b2ed49a5SDavid van Moolenbroek /* Magic dynamic function struct. */
70*b2ed49a5SDavid van Moolenbroek struct _magic_dfunction {
71*b2ed49a5SDavid van Moolenbroek     unsigned long magic_number;
72*b2ed49a5SDavid van Moolenbroek     const char *parent_name;
73*b2ed49a5SDavid van Moolenbroek     struct _magic_function function;
74*b2ed49a5SDavid van Moolenbroek     struct _magic_dfunction *prev;
75*b2ed49a5SDavid van Moolenbroek     struct _magic_dfunction *next;
76*b2ed49a5SDavid van Moolenbroek };
77*b2ed49a5SDavid van Moolenbroek 
78*b2ed49a5SDavid van Moolenbroek /* Magic dynamic state index struct. */
79*b2ed49a5SDavid van Moolenbroek struct _magic_dsindex {
80*b2ed49a5SDavid van Moolenbroek     struct _magic_type *type;
81*b2ed49a5SDavid van Moolenbroek     const char *name;
82*b2ed49a5SDavid van Moolenbroek     const char *parent_name;
83*b2ed49a5SDavid van Moolenbroek     int flags;
84*b2ed49a5SDavid van Moolenbroek };
85*b2ed49a5SDavid van Moolenbroek 
86*b2ed49a5SDavid van Moolenbroek /* Magic dynamic state entry struct. */
87*b2ed49a5SDavid van Moolenbroek #define MAGIC_DSENTRY_ALLOW_PREV            0
88*b2ed49a5SDavid van Moolenbroek /*
89*b2ed49a5SDavid van Moolenbroek  * The name of an externally allocated dsentry will be:
90*b2ed49a5SDavid van Moolenbroek  * strlen("MAGIC_EXT_ALLOC_NAME") + strlen("MAGIC_ALLOC_NAME_SEP") +
91*b2ed49a5SDavid van Moolenbroek  * strlen(0xffffffff) + strlen("MAGIC_ALLOC_NAME_SUFFIX") + 1 =
92*b2ed49a5SDavid van Moolenbroek  * 4 + 1 + 10 + 1 + 1 = 17
93*b2ed49a5SDavid van Moolenbroek  */
94*b2ed49a5SDavid van Moolenbroek #define MAGIC_DSENTRY_EXT_NAME_BUFF_SIZE    17
95*b2ed49a5SDavid van Moolenbroek 
96*b2ed49a5SDavid van Moolenbroek struct _magic_dsentry {
97*b2ed49a5SDavid van Moolenbroek     unsigned long magic_number;
98*b2ed49a5SDavid van Moolenbroek     const char *parent_name;
99*b2ed49a5SDavid van Moolenbroek     char name_ext_buff[MAGIC_DSENTRY_EXT_NAME_BUFF_SIZE];
100*b2ed49a5SDavid van Moolenbroek     struct _magic_sentry sentry;
101*b2ed49a5SDavid van Moolenbroek     struct _magic_type type;
102*b2ed49a5SDavid van Moolenbroek     struct _magic_type *type_array[1];
103*b2ed49a5SDavid van Moolenbroek #if MAGIC_DSENTRY_ALLOW_PREV
104*b2ed49a5SDavid van Moolenbroek     struct _magic_dsentry *prev;
105*b2ed49a5SDavid van Moolenbroek #endif
106*b2ed49a5SDavid van Moolenbroek     struct _magic_dsentry *next;
107*b2ed49a5SDavid van Moolenbroek     struct _magic_dsentry *next_mpool;
108*b2ed49a5SDavid van Moolenbroek     struct _magic_dsentry *next_mblock;
109*b2ed49a5SDavid van Moolenbroek     /*
110*b2ed49a5SDavid van Moolenbroek      * The following 2 fields are only set if the dsentry
111*b2ed49a5SDavid van Moolenbroek      * is part of a super object.
112*b2ed49a5SDavid van Moolenbroek      * See llvm/shared/magic/libst/include/heap.h for more details.
113*b2ed49a5SDavid van Moolenbroek      */
114*b2ed49a5SDavid van Moolenbroek #ifndef __MINIX
115*b2ed49a5SDavid van Moolenbroek     struct _magic_dsentry *next_sobject;
116*b2ed49a5SDavid van Moolenbroek     void *sobject_base_addr;
117*b2ed49a5SDavid van Moolenbroek #endif
118*b2ed49a5SDavid van Moolenbroek     void *ext;
119*b2ed49a5SDavid van Moolenbroek     unsigned long magic_state;
120*b2ed49a5SDavid van Moolenbroek     union __alloc_flags {
121*b2ed49a5SDavid van Moolenbroek         struct {
122*b2ed49a5SDavid van Moolenbroek             int flags;
123*b2ed49a5SDavid van Moolenbroek             int prot;
124*b2ed49a5SDavid van Moolenbroek         } mmap_call;
125*b2ed49a5SDavid van Moolenbroek #define mmap_flags              mmap_call.flags
126*b2ed49a5SDavid van Moolenbroek #define mmap_prot               mmap_call.prot
127*b2ed49a5SDavid van Moolenbroek         struct {
128*b2ed49a5SDavid van Moolenbroek             int flags;
129*b2ed49a5SDavid van Moolenbroek             int shmid;
130*b2ed49a5SDavid van Moolenbroek         } shmat_call;
131*b2ed49a5SDavid van Moolenbroek #define shmat_flags             shmat_call.flags
132*b2ed49a5SDavid van Moolenbroek #define shmat_shmid             shmat_call.shmid
133*b2ed49a5SDavid van Moolenbroek     } alloc_flags;
134*b2ed49a5SDavid van Moolenbroek #define alloc_mmap_flags        alloc_flags.mmap_call.flags
135*b2ed49a5SDavid van Moolenbroek #define alloc_mmap_prot         alloc_flags.mmap_call.prot
136*b2ed49a5SDavid van Moolenbroek #define alloc_shmat_flags       alloc_flags.shmat_call.flags
137*b2ed49a5SDavid van Moolenbroek #define alloc_shmat_shmid       alloc_flags.shmat_call.shmid
138*b2ed49a5SDavid van Moolenbroek     _magic_id_t site_id;               /* Identifier of the call at a callsite. */
139*b2ed49a5SDavid van Moolenbroek };
140*b2ed49a5SDavid van Moolenbroek 
141*b2ed49a5SDavid van Moolenbroek /* Magic out-of-band dynamic state entry struct. */
142*b2ed49a5SDavid van Moolenbroek #define MAGIC_MAX_OBDSENTRIES                32
143*b2ed49a5SDavid van Moolenbroek #define MAGIC_MAX_OBDSENTRY_NAME_LEN         32
144*b2ed49a5SDavid van Moolenbroek #define MAGIC_MAX_OBDSENTRY_PARENT_NAME_LEN  32
145*b2ed49a5SDavid van Moolenbroek struct _magic_obdsentry {
146*b2ed49a5SDavid van Moolenbroek     char name[MAGIC_MAX_OBDSENTRY_NAME_LEN];
147*b2ed49a5SDavid van Moolenbroek     char parent_name[MAGIC_MAX_OBDSENTRY_PARENT_NAME_LEN];
148*b2ed49a5SDavid van Moolenbroek     struct _magic_dsentry dsentry;
149*b2ed49a5SDavid van Moolenbroek };
150*b2ed49a5SDavid van Moolenbroek EXTERN struct _magic_obdsentry _magic_obdsentries[MAGIC_MAX_OBDSENTRIES];
151*b2ed49a5SDavid van Moolenbroek 
152*b2ed49a5SDavid van Moolenbroek /* Magic memory pool state struct. */
153*b2ed49a5SDavid van Moolenbroek #define MAGIC_MAX_MEMPOOLS                  1024
154*b2ed49a5SDavid van Moolenbroek #define MAGIC_MAX_MEMPOOL_NAME_LEN          32
155*b2ed49a5SDavid van Moolenbroek #define MAGIC_MEMPOOL_NAME_PREFIX           "_magic_mempool_"
156*b2ed49a5SDavid van Moolenbroek EXTERN const char *const MAGIC_MEMPOOL_NAME_UNKNOWN;
157*b2ed49a5SDavid van Moolenbroek EXTERN const char *const MAGIC_MEMPOOL_NAME_DETACHED;
158*b2ed49a5SDavid van Moolenbroek 
159*b2ed49a5SDavid van Moolenbroek struct _magic_mpdesc {
160*b2ed49a5SDavid van Moolenbroek     int is_alive;
161*b2ed49a5SDavid van Moolenbroek     char name[MAGIC_MAX_MEMPOOL_NAME_LEN];
162*b2ed49a5SDavid van Moolenbroek     /* pointer to the pool object */
163*b2ed49a5SDavid van Moolenbroek     void *addr;
164*b2ed49a5SDavid van Moolenbroek #if MAGIC_MEM_USAGE_OUTPUT_CTL
165*b2ed49a5SDavid van Moolenbroek     unsigned long dtype_id;
166*b2ed49a5SDavid van Moolenbroek #endif
167*b2ed49a5SDavid van Moolenbroek };
168*b2ed49a5SDavid van Moolenbroek EXTERN struct _magic_mpdesc _magic_mpdescs[MAGIC_MAX_MEMPOOLS];
169*b2ed49a5SDavid van Moolenbroek 
170*b2ed49a5SDavid van Moolenbroek /* Magic state element. */
171*b2ed49a5SDavid van Moolenbroek struct _magic_selement_s {
172*b2ed49a5SDavid van Moolenbroek     struct _magic_dsentry dsentry_buff;
173*b2ed49a5SDavid van Moolenbroek     struct _magic_sentry *sentry;
174*b2ed49a5SDavid van Moolenbroek     const struct _magic_type *parent_type;
175*b2ed49a5SDavid van Moolenbroek     void *parent_address;
176*b2ed49a5SDavid van Moolenbroek     int child_num;
177*b2ed49a5SDavid van Moolenbroek     const struct _magic_type *type;
178*b2ed49a5SDavid van Moolenbroek     void *address;
179*b2ed49a5SDavid van Moolenbroek     int depth;
180*b2ed49a5SDavid van Moolenbroek     int num;
181*b2ed49a5SDavid van Moolenbroek     void *cb_args;
182*b2ed49a5SDavid van Moolenbroek };
183*b2ed49a5SDavid van Moolenbroek typedef struct _magic_selement_s _magic_selement_t;
184*b2ed49a5SDavid van Moolenbroek 
185*b2ed49a5SDavid van Moolenbroek /* Magic external library descriptor. */
186*b2ed49a5SDavid van Moolenbroek struct _magic_libdesc {
187*b2ed49a5SDavid van Moolenbroek     const char *name;
188*b2ed49a5SDavid van Moolenbroek     void *text_range[2];
189*b2ed49a5SDavid van Moolenbroek     void *data_range[2];
190*b2ed49a5SDavid van Moolenbroek     void *alloc_address;
191*b2ed49a5SDavid van Moolenbroek     size_t alloc_size;
192*b2ed49a5SDavid van Moolenbroek };
193*b2ed49a5SDavid van Moolenbroek 
194*b2ed49a5SDavid van Moolenbroek /* Magic SO library descriptor. */
195*b2ed49a5SDavid van Moolenbroek struct _magic_sodesc {
196*b2ed49a5SDavid van Moolenbroek     struct _magic_libdesc lib;
197*b2ed49a5SDavid van Moolenbroek     struct _magic_sodesc *prev;
198*b2ed49a5SDavid van Moolenbroek     struct _magic_sodesc *next;
199*b2ed49a5SDavid van Moolenbroek };
200*b2ed49a5SDavid van Moolenbroek 
201*b2ed49a5SDavid van Moolenbroek /* Magic DSO library descriptor. */
202*b2ed49a5SDavid van Moolenbroek struct _magic_dsodesc {
203*b2ed49a5SDavid van Moolenbroek     struct _magic_libdesc lib;
204*b2ed49a5SDavid van Moolenbroek     void *handle;
205*b2ed49a5SDavid van Moolenbroek     int ref_count;
206*b2ed49a5SDavid van Moolenbroek     struct _magic_dsodesc *prev;
207*b2ed49a5SDavid van Moolenbroek     struct _magic_dsodesc *next;
208*b2ed49a5SDavid van Moolenbroek };
209*b2ed49a5SDavid van Moolenbroek 
210*b2ed49a5SDavid van Moolenbroek /* The following constant is specific to MINIX3; on other platforms, this
211*b2ed49a5SDavid van Moolenbroek  * functionality is unused altogether. On MINIX3, the libc malloc code uses
212*b2ed49a5SDavid van Moolenbroek  * mmap to create page directories. Since malloc state is discarded upon state
213*b2ed49a5SDavid van Moolenbroek  * transfer, we must not instrument its mmap calls in the regular way. On the
214*b2ed49a5SDavid van Moolenbroek  * other hand, since mmap'ed regions are transferred to new instances, we end
215*b2ed49a5SDavid van Moolenbroek  * up with a memory leak if we do not unmap those mmap'ed regions. Therefore,
216*b2ed49a5SDavid van Moolenbroek  * we specifically track the mmap/munmap calls made from the malloc code, and
217*b2ed49a5SDavid van Moolenbroek  * explicitly unmap its regions during state transfer. The following constant
218*b2ed49a5SDavid van Moolenbroek  * defines how many ranges can be mmap'ed at once. The malloc code uses only
219*b2ed49a5SDavid van Moolenbroek  * one page directory, but it may enlarge it by first allocating a new area
220*b2ed49a5SDavid van Moolenbroek  * and then unmapping the old one. Therefore, we need two entries.
221*b2ed49a5SDavid van Moolenbroek  */
222*b2ed49a5SDavid van Moolenbroek #ifdef __MINIX
223*b2ed49a5SDavid van Moolenbroek #define MAGIC_UNMAP_MEM_ENTRIES	2
224*b2ed49a5SDavid van Moolenbroek #endif
225*b2ed49a5SDavid van Moolenbroek 
226*b2ed49a5SDavid van Moolenbroek /* Magic vars. */
227*b2ed49a5SDavid van Moolenbroek struct _magic_vars_t {
228*b2ed49a5SDavid van Moolenbroek 
229*b2ed49a5SDavid van Moolenbroek     /* Magic Address Space Randomization (ASRPass) */
230*b2ed49a5SDavid van Moolenbroek     int asr_seed;
231*b2ed49a5SDavid van Moolenbroek     int asr_heap_map_do_permutate;
232*b2ed49a5SDavid van Moolenbroek     int asr_heap_max_offset;
233*b2ed49a5SDavid van Moolenbroek     int asr_heap_max_padding;
234*b2ed49a5SDavid van Moolenbroek     int asr_map_max_offset_pages;
235*b2ed49a5SDavid van Moolenbroek     int asr_map_max_padding_pages;
236*b2ed49a5SDavid van Moolenbroek 
237*b2ed49a5SDavid van Moolenbroek     /* Runtime flags. */
238*b2ed49a5SDavid van Moolenbroek     int no_mem_inst;
239*b2ed49a5SDavid van Moolenbroek 
240*b2ed49a5SDavid van Moolenbroek     /* Magic type array. */
241*b2ed49a5SDavid van Moolenbroek     struct _magic_type *types;
242*b2ed49a5SDavid van Moolenbroek     int types_num;
243*b2ed49a5SDavid van Moolenbroek     _magic_id_t types_next_id;
244*b2ed49a5SDavid van Moolenbroek 
245*b2ed49a5SDavid van Moolenbroek     /* Magic function array. */
246*b2ed49a5SDavid van Moolenbroek     struct _magic_function *functions;
247*b2ed49a5SDavid van Moolenbroek     int functions_num;
248*b2ed49a5SDavid van Moolenbroek     _magic_id_t functions_next_id;
249*b2ed49a5SDavid van Moolenbroek 
250*b2ed49a5SDavid van Moolenbroek     /* Magic state entry array. */
251*b2ed49a5SDavid van Moolenbroek     struct _magic_sentry *sentries;
252*b2ed49a5SDavid van Moolenbroek     int sentries_num;
253*b2ed49a5SDavid van Moolenbroek     int sentries_str_num;
254*b2ed49a5SDavid van Moolenbroek     _magic_id_t sentries_next_id;
255*b2ed49a5SDavid van Moolenbroek 
256*b2ed49a5SDavid van Moolenbroek     /* Magic dynamic state index array. */
257*b2ed49a5SDavid van Moolenbroek     struct _magic_dsindex *dsindexes;
258*b2ed49a5SDavid van Moolenbroek     int dsindexes_num;
259*b2ed49a5SDavid van Moolenbroek 
260*b2ed49a5SDavid van Moolenbroek     /* Magic dynamic state entry list. */
261*b2ed49a5SDavid van Moolenbroek     struct _magic_dsentry *first_dsentry;
262*b2ed49a5SDavid van Moolenbroek     unsigned long num_dead_dsentries;
263*b2ed49a5SDavid van Moolenbroek     unsigned long size_dead_dsentries;
264*b2ed49a5SDavid van Moolenbroek 
265*b2ed49a5SDavid van Moolenbroek     /* Magic memory pool dynamic state entry list. */
266*b2ed49a5SDavid van Moolenbroek     struct _magic_dsentry *first_mempool_dsentry;
267*b2ed49a5SDavid van Moolenbroek 
268*b2ed49a5SDavid van Moolenbroek     /* Magic dynamic function list. */
269*b2ed49a5SDavid van Moolenbroek     struct _magic_dfunction *first_dfunction;
270*b2ed49a5SDavid van Moolenbroek     struct _magic_dfunction *last_dfunction;
271*b2ed49a5SDavid van Moolenbroek     int dfunctions_num;
272*b2ed49a5SDavid van Moolenbroek 
273*b2ed49a5SDavid van Moolenbroek     /* Magic SO library descriptor list. */
274*b2ed49a5SDavid van Moolenbroek     struct _magic_sodesc *first_sodesc;
275*b2ed49a5SDavid van Moolenbroek     struct _magic_sodesc *last_sodesc;
276*b2ed49a5SDavid van Moolenbroek     int sodescs_num;
277*b2ed49a5SDavid van Moolenbroek 
278*b2ed49a5SDavid van Moolenbroek     /* Magic DSO library descriptor list. */
279*b2ed49a5SDavid van Moolenbroek     struct _magic_dsodesc *first_dsodesc;
280*b2ed49a5SDavid van Moolenbroek     struct _magic_dsodesc *last_dsodesc;
281*b2ed49a5SDavid van Moolenbroek     int dsodescs_num;
282*b2ed49a5SDavid van Moolenbroek 
283*b2ed49a5SDavid van Moolenbroek     /* Magic stack-related variables. */
284*b2ed49a5SDavid van Moolenbroek     struct _magic_dsentry *first_stack_dsentry;
285*b2ed49a5SDavid van Moolenbroek     struct _magic_dsentry *last_stack_dsentry;
286*b2ed49a5SDavid van Moolenbroek 
287*b2ed49a5SDavid van Moolenbroek     /* Magic memory ranges */
288*b2ed49a5SDavid van Moolenbroek     void *null_range[2];
289*b2ed49a5SDavid van Moolenbroek     void *data_range[2];
290*b2ed49a5SDavid van Moolenbroek     void *heap_range[2];
291*b2ed49a5SDavid van Moolenbroek     void *map_range[2];
292*b2ed49a5SDavid van Moolenbroek     void *shm_range[2];
293*b2ed49a5SDavid van Moolenbroek     void *stack_range[2];
294*b2ed49a5SDavid van Moolenbroek     void *text_range[2];
295*b2ed49a5SDavid van Moolenbroek 
296*b2ed49a5SDavid van Moolenbroek     void *sentry_range[2];
297*b2ed49a5SDavid van Moolenbroek     void *function_range[2];
298*b2ed49a5SDavid van Moolenbroek     void *dfunction_range[2];
299*b2ed49a5SDavid van Moolenbroek 
300*b2ed49a5SDavid van Moolenbroek     void *heap_start;
301*b2ed49a5SDavid van Moolenbroek     void *heap_end;
302*b2ed49a5SDavid van Moolenbroek     int update_dsentry_ranges;
303*b2ed49a5SDavid van Moolenbroek     int update_dfunction_ranges;
304*b2ed49a5SDavid van Moolenbroek 
305*b2ed49a5SDavid van Moolenbroek #ifdef __MINIX
306*b2ed49a5SDavid van Moolenbroek     /* Memory to unmap after state transfer (MINIX3 only) */
307*b2ed49a5SDavid van Moolenbroek     struct {
308*b2ed49a5SDavid van Moolenbroek          void *start;
309*b2ed49a5SDavid van Moolenbroek          size_t length;
310*b2ed49a5SDavid van Moolenbroek     } unmap_mem[MAGIC_UNMAP_MEM_ENTRIES];
311*b2ed49a5SDavid van Moolenbroek #endif
312*b2ed49a5SDavid van Moolenbroek 
313*b2ed49a5SDavid van Moolenbroek     /* Range lookup index */
314*b2ed49a5SDavid van Moolenbroek     void *sentry_rl_buff;
315*b2ed49a5SDavid van Moolenbroek     size_t sentry_rl_buff_offset;
316*b2ed49a5SDavid van Moolenbroek     size_t sentry_rl_buff_size;
317*b2ed49a5SDavid van Moolenbroek     void *sentry_rl_index;
318*b2ed49a5SDavid van Moolenbroek 
319*b2ed49a5SDavid van Moolenbroek     /* Sentry hash */
320*b2ed49a5SDavid van Moolenbroek     void *sentry_hash_buff;
321*b2ed49a5SDavid van Moolenbroek     size_t sentry_hash_buff_offset;
322*b2ed49a5SDavid van Moolenbroek     size_t sentry_hash_buff_size;
323*b2ed49a5SDavid van Moolenbroek     void *sentry_hash_head;
324*b2ed49a5SDavid van Moolenbroek 
325*b2ed49a5SDavid van Moolenbroek     /* Function hash */
326*b2ed49a5SDavid van Moolenbroek     void *function_hash_buff;
327*b2ed49a5SDavid van Moolenbroek     size_t function_hash_buff_offset;
328*b2ed49a5SDavid van Moolenbroek     size_t function_hash_buff_size;
329*b2ed49a5SDavid van Moolenbroek     void *function_hash_head;
330*b2ed49a5SDavid van Moolenbroek 
331*b2ed49a5SDavid van Moolenbroek     /*
332*b2ed49a5SDavid van Moolenbroek      * Don't call malloc() in magic_malloc_positioned().
333*b2ed49a5SDavid van Moolenbroek      * Used in ST after RAW COPY.
334*b2ed49a5SDavid van Moolenbroek      */
335*b2ed49a5SDavid van Moolenbroek     int fake_malloc;
336*b2ed49a5SDavid van Moolenbroek };
337*b2ed49a5SDavid van Moolenbroek 
338*b2ed49a5SDavid van Moolenbroek 
339*b2ed49a5SDavid van Moolenbroek #endif /* _MAGIC_STRUCTS_H */
340