xref: /minix/minix/lib/libsys/sef_llvm.c (revision 0a6a1f1d)
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  *===========================================================================*/
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  *===========================================================================*/
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  *===========================================================================*/
40 int sef_llvm_state_cleanup(void)
41 {
42     return OK;
43 }
44 
45 /*===========================================================================*
46  *      	                sef_llvm_dump_eval                           *
47  *===========================================================================*/
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  *===========================================================================*/
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  *===========================================================================*/
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  *===========================================================================*/
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  *===========================================================================*/
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  *===========================================================================*/
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  *===========================================================================*/
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  *===========================================================================*/
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  *===========================================================================*/
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  *===========================================================================*/
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  *===========================================================================*/
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  *===========================================================================*/
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  *===========================================================================*/
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  *===========================================================================*/
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  *===========================================================================*/
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