1 #include "syslib.h"
2 #include <assert.h>
3 #include <unistd.h>
4 #include <sys/mman.h>
5 #include <minix/sysutil.h>
6
7 /* Stack refs definitions. */
8 extern char **environ;
9 extern char **env_argv;
10 extern int env_argc;
11
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); }
14
15 /*===========================================================================*
16 * sef_llvm_magic_enabled *
17 *===========================================================================*/
sef_llvm_magic_enabled(void)18 int sef_llvm_magic_enabled(void)
19 {
20 extern void __attribute__((weak)) magic_init(void);
21 if (!magic_init)
22 return 0;
23 return 1;
24 }
25
26 /*===========================================================================*
27 * sef_llvm_real_brk *
28 *===========================================================================*/
sef_llvm_real_brk(char * newbrk)29 int sef_llvm_real_brk(char *newbrk)
30 {
31 extern int __attribute__((weak)) _magic_real_brk(char*);
32 if (!_magic_real_brk)
33 return brk(newbrk);
34 return _magic_real_brk(newbrk);
35 }
36
37 /*===========================================================================*
38 * sef_llvm_state_cleanup *
39 *===========================================================================*/
sef_llvm_state_cleanup(void)40 int sef_llvm_state_cleanup(void)
41 {
42 return OK;
43 }
44
45 /*===========================================================================*
46 * sef_llvm_dump_eval *
47 *===========================================================================*/
sef_llvm_dump_eval(char * expr)48 void sef_llvm_dump_eval(char *expr)
49 {
50 extern void __attribute__((weak)) _magic_dump_eval_bool(char*);
51 if (!_magic_dump_eval_bool)
52 return;
53 return _magic_dump_eval_bool(expr);
54 }
55
56 /*===========================================================================*
57 * sef_llvm_eval_bool *
58 *===========================================================================*/
sef_llvm_eval_bool(char * expr,char * result)59 int sef_llvm_eval_bool(char *expr, char *result)
60 {
61 extern int __attribute__((weak)) magic_eval_bool(char*, char*);
62 if (!magic_eval_bool)
63 return 0;
64 return magic_eval_bool(expr, result);
65 }
66
67 /*===========================================================================*
68 * sef_llvm_state_table_addr *
69 *===========================================================================*/
sef_llvm_state_table_addr(void)70 void *sef_llvm_state_table_addr(void)
71 {
72 extern void* __attribute__((weak)) _magic_vars_addr(void);
73 if (!_magic_vars_addr)
74 return NULL;
75 return _magic_vars_addr();
76 }
77
78 /*===========================================================================*
79 * sef_llvm_state_table_size *
80 *===========================================================================*/
sef_llvm_state_table_size(void)81 size_t sef_llvm_state_table_size(void)
82 {
83 extern size_t __attribute__((weak)) _magic_vars_size(void);
84 if (!_magic_vars_size)
85 return 0;
86 return _magic_vars_size();
87 }
88
89 /*===========================================================================*
90 * sef_llvm_stack_refs_save *
91 *===========================================================================*/
sef_llvm_stack_refs_save(char * stack_buff)92 void sef_llvm_stack_refs_save(char *stack_buff)
93 {
94 extern void __attribute__((weak)) st_stack_refs_save_restore(char*, int);
95 char *p = stack_buff;
96
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);
100
101 if (st_stack_refs_save_restore)
102 st_stack_refs_save_restore(p, 1);
103 }
104
105 /*===========================================================================*
106 * sef_llvm_stack_refs_restore *
107 *===========================================================================*/
sef_llvm_stack_refs_restore(char * stack_buff)108 void sef_llvm_stack_refs_restore(char *stack_buff)
109 {
110 extern void __attribute__((weak)) st_stack_refs_save_restore(char*, int);
111 char *p = stack_buff;
112
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);
116
117 if (st_stack_refs_save_restore)
118 st_stack_refs_save_restore(p, 0);
119 }
120
121 /*===========================================================================*
122 * sef_llvm_state_transfer *
123 *===========================================================================*/
sef_llvm_state_transfer(sef_init_info_t * info)124 int sef_llvm_state_transfer(sef_init_info_t *info)
125 {
126 extern int __attribute__((weak)) _magic_state_transfer(sef_init_info_t *info);
127 if (!_magic_state_transfer)
128 return ENOSYS;
129 return _magic_state_transfer(info);
130 }
131
132 /*===========================================================================*
133 * sef_llvm_add_special_mem_region *
134 *===========================================================================*/
sef_llvm_add_special_mem_region(void * addr,size_t len,const char * name)135 int sef_llvm_add_special_mem_region(void *addr, size_t len, const char* name)
136 {
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)
140 return 0;
141 return st_add_special_mmapped_region(addr, len, name);
142 }
143
144 /*===========================================================================*
145 * sef_llvm_del_special_mem_region_by_addr *
146 *===========================================================================*/
sef_llvm_del_special_mem_region_by_addr(void * addr)147 int sef_llvm_del_special_mem_region_by_addr(void *addr)
148 {
149 extern int __attribute__((weak)) st_del_special_mmapped_region_by_addr(
150 void *addr);
151 if (!st_del_special_mmapped_region_by_addr)
152 return 0;
153 return st_del_special_mmapped_region_by_addr(addr);
154 }
155
156 /*===========================================================================*
157 * sef_llvm_ds_st_init *
158 *===========================================================================*/
sef_llvm_ds_st_init(void)159 void sef_llvm_ds_st_init(void)
160 {
161 extern void __attribute__((weak)) _magic_ds_st_init(void);
162 if (!_magic_ds_st_init)
163 return;
164 _magic_ds_st_init();
165 }
166
167 /*===========================================================================*
168 * sef_llvm_ac_mmap *
169 *===========================================================================*/
sef_llvm_ac_mmap(void * buf,size_t len,int prot,int flags,int fd,off_t offset)170 void* sef_llvm_ac_mmap(void *buf, size_t len, int prot, int flags, int fd,
171 off_t offset)
172 {
173 int r;
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);
178
179 /* Avoid regular dsentries for non-relocatable regions (e.g., DMA buffers).
180 */
181 buf = _magic_real_mmap(buf, len, prot, flags, fd, offset);
182 if(buf == MAP_FAILED)
183 return buf;
184 r = sef_llvm_add_special_mem_region(buf, len, NULL);
185 if(r < 0)
186 printf("sef_llvm_add_special_mem_region failed: %d\n", r);
187 return buf;
188 }
189
190 /*===========================================================================*
191 * sef_llvm_ac_munmap *
192 *===========================================================================*/
sef_llvm_ac_munmap(void * buf,size_t len)193 int sef_llvm_ac_munmap(void *buf, size_t len)
194 {
195 int r;
196 extern int __attribute__((weak)) _magic_real_munmap(void*, size_t);
197 if (!_magic_real_munmap)
198 return munmap(buf, len);
199
200 if ((r = _magic_real_munmap(buf, len)) != 0)
201 return r;
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);
204 return 0;
205 }
206
207 /*===========================================================================*
208 * sef_llvm_ltckpt_enabled *
209 *===========================================================================*/
sef_llvm_ltckpt_enabled(void)210 int sef_llvm_ltckpt_enabled(void)
211 {
212 extern int __attribute__((weak)) ltckpt_mechanism_enabled(void);
213 if (!sef_llvm_get_ltckpt_offset() || !ltckpt_mechanism_enabled())
214 return 0;
215 return 1;
216 }
217
218 /*===========================================================================*
219 * sef_llvm_ltckpt_get_offset *
220 *===========================================================================*/
sef_llvm_get_ltckpt_offset(void)221 int sef_llvm_get_ltckpt_offset(void)
222 {
223 extern int __attribute__((weak)) ltckpt_get_offset(void);
224 if (!ltckpt_get_offset)
225 return 0;
226 return ltckpt_get_offset();
227 }
228
229 /*===========================================================================*
230 * sef_llvm_ltckpt_restart *
231 *===========================================================================*/
sef_llvm_ltckpt_restart(int type,sef_init_info_t * info)232 int sef_llvm_ltckpt_restart(int type, sef_init_info_t *info)
233 {
234 extern int __attribute__((weak)) ltckpt_restart(void *);
235
236 if(!sef_llvm_ltckpt_enabled())
237 return sef_cb_init_identity_state_transfer(type, info);
238
239 assert(ltckpt_restart);
240 return ltckpt_restart(info);
241 }
242