5 #include <minix/sysutil.h>
7 /* Stack refs definitions. */
9 extern char **env_argv
;
12 #define sef_llvm_stack_refs_save_one(P, T, R) { *((T*)P) = R; P += sizeof(T); }
13 #define sef_llvm_stack_refs_restore_one(P, T, R) { R = *((T*)P); P += sizeof(T); }
15 /*===========================================================================*
16 * sef_llvm_magic_enabled *
17 *===========================================================================*/
18 int sef_llvm_magic_enabled(void)
20 extern void __attribute__((weak
)) magic_init(void);
26 /*===========================================================================*
28 *===========================================================================*/
29 int sef_llvm_real_brk(char *newbrk
)
31 extern int __attribute__((weak
)) _magic_real_brk(char*);
34 return _magic_real_brk(newbrk
);
37 /*===========================================================================*
38 * sef_llvm_state_cleanup *
39 *===========================================================================*/
40 int sef_llvm_state_cleanup(void)
45 /*===========================================================================*
46 * sef_llvm_dump_eval *
47 *===========================================================================*/
48 void sef_llvm_dump_eval(char *expr
)
50 extern void __attribute__((weak
)) _magic_dump_eval_bool(char*);
51 if (!_magic_dump_eval_bool
)
53 return _magic_dump_eval_bool(expr
);
56 /*===========================================================================*
57 * sef_llvm_eval_bool *
58 *===========================================================================*/
59 int sef_llvm_eval_bool(char *expr
, char *result
)
61 extern int __attribute__((weak
)) magic_eval_bool(char*, char*);
64 return magic_eval_bool(expr
, result
);
67 /*===========================================================================*
68 * sef_llvm_state_table_addr *
69 *===========================================================================*/
70 void *sef_llvm_state_table_addr(void)
72 extern void* __attribute__((weak
)) _magic_vars_addr(void);
73 if (!_magic_vars_addr
)
75 return _magic_vars_addr();
78 /*===========================================================================*
79 * sef_llvm_state_table_size *
80 *===========================================================================*/
81 size_t sef_llvm_state_table_size(void)
83 extern size_t __attribute__((weak
)) _magic_vars_size(void);
84 if (!_magic_vars_size
)
86 return _magic_vars_size();
89 /*===========================================================================*
90 * sef_llvm_stack_refs_save *
91 *===========================================================================*/
92 void sef_llvm_stack_refs_save(char *stack_buff
)
94 extern void __attribute__((weak
)) st_stack_refs_save_restore(char*, int);
97 sef_llvm_stack_refs_save_one(p
, char**, environ
);
98 sef_llvm_stack_refs_save_one(p
, char**, env_argv
);
99 sef_llvm_stack_refs_save_one(p
, int, env_argc
);
101 if (st_stack_refs_save_restore
)
102 st_stack_refs_save_restore(p
, 1);
105 /*===========================================================================*
106 * sef_llvm_stack_refs_restore *
107 *===========================================================================*/
108 void sef_llvm_stack_refs_restore(char *stack_buff
)
110 extern void __attribute__((weak
)) st_stack_refs_save_restore(char*, int);
111 char *p
= stack_buff
;
113 sef_llvm_stack_refs_restore_one(p
, char**, environ
);
114 sef_llvm_stack_refs_restore_one(p
, char**, env_argv
);
115 sef_llvm_stack_refs_restore_one(p
, int, env_argc
);
117 if (st_stack_refs_save_restore
)
118 st_stack_refs_save_restore(p
, 0);
121 /*===========================================================================*
122 * sef_llvm_state_transfer *
123 *===========================================================================*/
124 int sef_llvm_state_transfer(sef_init_info_t
*info
)
126 extern int __attribute__((weak
)) _magic_state_transfer(sef_init_info_t
*info
);
127 if (!_magic_state_transfer
)
129 return _magic_state_transfer(info
);
132 /*===========================================================================*
133 * sef_llvm_add_special_mem_region *
134 *===========================================================================*/
135 int sef_llvm_add_special_mem_region(void *addr
, size_t len
, const char* name
)
137 extern int __attribute__((weak
)) st_add_special_mmapped_region(void *addr
,
138 size_t len
, const char* name
);
139 if (!st_add_special_mmapped_region
)
141 return st_add_special_mmapped_region(addr
, len
, name
);
144 /*===========================================================================*
145 * sef_llvm_del_special_mem_region_by_addr *
146 *===========================================================================*/
147 int sef_llvm_del_special_mem_region_by_addr(void *addr
)
149 extern int __attribute__((weak
)) st_del_special_mmapped_region_by_addr(
151 if (!st_del_special_mmapped_region_by_addr
)
153 return st_del_special_mmapped_region_by_addr(addr
);
156 /*===========================================================================*
157 * sef_llvm_ds_st_init *
158 *===========================================================================*/
159 void sef_llvm_ds_st_init(void)
161 extern void __attribute__((weak
)) _magic_ds_st_init(void);
162 if (!_magic_ds_st_init
)
167 /*===========================================================================*
169 *===========================================================================*/
170 void* sef_llvm_ac_mmap(void *buf
, size_t len
, int prot
, int flags
, int fd
,
174 extern void* __attribute__((weak
))
175 _magic_real_mmap(void*, size_t, int, int, int, off_t
);
176 if (!_magic_real_mmap
)
177 return mmap(buf
, len
, prot
, flags
, fd
, offset
);
179 /* Avoid regular dsentries for non-relocatable regions (e.g., DMA buffers).
181 buf
= _magic_real_mmap(buf
, len
, prot
, flags
, fd
, offset
);
182 if(buf
== MAP_FAILED
)
184 r
= sef_llvm_add_special_mem_region(buf
, len
, NULL
);
186 printf("sef_llvm_add_special_mem_region failed: %d\n", r
);
190 /*===========================================================================*
191 * sef_llvm_ac_munmap *
192 *===========================================================================*/
193 int sef_llvm_ac_munmap(void *buf
, size_t len
)
196 extern int __attribute__((weak
)) _magic_real_munmap(void*, size_t);
197 if (!_magic_real_munmap
)
198 return munmap(buf
, len
);
200 if ((r
= _magic_real_munmap(buf
, len
)) != 0)
202 if ((r
= sef_llvm_del_special_mem_region_by_addr(buf
)) < 0)
203 printf("sef_llvm_del_special_mem_region_by_addr failed: %d\n", r
);
207 /*===========================================================================*
208 * sef_llvm_ltckpt_enabled *
209 *===========================================================================*/
210 int sef_llvm_ltckpt_enabled(void)
212 extern int __attribute__((weak
)) ltckpt_mechanism_enabled(void);
213 if (!sef_llvm_get_ltckpt_offset() || !ltckpt_mechanism_enabled())
218 /*===========================================================================*
219 * sef_llvm_ltckpt_get_offset *
220 *===========================================================================*/
221 int sef_llvm_get_ltckpt_offset(void)
223 extern int __attribute__((weak
)) ltckpt_get_offset(void);
224 if (!ltckpt_get_offset
)
226 return ltckpt_get_offset();
229 /*===========================================================================*
230 * sef_llvm_ltckpt_restart *
231 *===========================================================================*/
232 int sef_llvm_ltckpt_restart(int type
, sef_init_info_t
*info
)
234 extern int __attribute__((weak
)) ltckpt_restart(void *);
236 if(!sef_llvm_ltckpt_enabled())
237 return sef_cb_init_identity_state_transfer(type
, info
);
239 assert(ltckpt_restart
);
240 return ltckpt_restart(info
);