etc/services - sync with NetBSD-8
[minix.git] / minix / lib / libsys / sef_llvm.c
blob2525b11997f51626c4446c32f3c387eb4479fccf
1 #include "syslib.h"
2 #include <assert.h>
3 #include <unistd.h>
4 #include <sys/mman.h>
5 #include <minix/sysutil.h>
7 /* Stack refs definitions. */
8 extern char **environ;
9 extern char **env_argv;
10 extern int env_argc;
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);
21 if (!magic_init)
22 return 0;
23 return 1;
26 /*===========================================================================*
27 * sef_llvm_real_brk *
28 *===========================================================================*/
29 int sef_llvm_real_brk(char *newbrk)
31 extern int __attribute__((weak)) _magic_real_brk(char*);
32 if (!_magic_real_brk)
33 return brk(newbrk);
34 return _magic_real_brk(newbrk);
37 /*===========================================================================*
38 * sef_llvm_state_cleanup *
39 *===========================================================================*/
40 int sef_llvm_state_cleanup(void)
42 return OK;
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)
52 return;
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*);
62 if (!magic_eval_bool)
63 return 0;
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)
74 return NULL;
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)
85 return 0;
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);
95 char *p = stack_buff;
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)
128 return ENOSYS;
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)
140 return 0;
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(
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);
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)
163 return;
164 _magic_ds_st_init();
167 /*===========================================================================*
168 * sef_llvm_ac_mmap *
169 *===========================================================================*/
170 void* sef_llvm_ac_mmap(void *buf, size_t len, int prot, int flags, int fd,
171 off_t offset)
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);
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)
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;
190 /*===========================================================================*
191 * sef_llvm_ac_munmap *
192 *===========================================================================*/
193 int sef_llvm_ac_munmap(void *buf, size_t len)
195 int r;
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)
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;
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())
214 return 0;
215 return 1;
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)
225 return 0;
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);