xref: /minix3/minix/lib/libsys/sef_llvm.c (revision ebfedea0ce5bbe81e252ddf32d732e40fb633fae)
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