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