1 #include <assert.h> 2 #include <string.h> 3 #include <unistd.h> 4 #include <sys/mman.h> 5 #include <minix/syslib.h> 6 #include <minix/sysutil.h> 7 8 #include <magic.h> 9 #include <magic_mem.h> 10 #include <st/state_transfer.h> 11 #include <st/special.h> 12 13 static const char* _magic_generic_debug_header(void) 14 { 15 return "[DEBUG]"; 16 } 17 18 /*===========================================================================* 19 * _magic_dump_eval_bool * 20 *===========================================================================*/ 21 void _magic_dump_eval_bool(char *expr) 22 { 23 extern char *sef_lu_state_eval; 24 char result; 25 int print_style; 26 (void)(result); 27 print_style = magic_eval_get_print_style(); 28 magic_eval_set_print_style(MAGIC_EVAL_PRINT_STYLE_ALL); 29 magic_eval_bool(sef_lu_state_eval, &result); 30 magic_eval_set_print_style(print_style); 31 } 32 33 /*===========================================================================* 34 * _magic_real_alloc_contig * 35 *===========================================================================*/ 36 void *_magic_real_alloc_contig(size_t len, int flags, uint32_t *phys) 37 { 38 return magic_real_mmap(NULL, len, PROT_READ|PROT_WRITE, 39 MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); 40 } 41 42 /*===========================================================================* 43 * _magic_real_free_contig * 44 *===========================================================================*/ 45 int _magic_real_free_contig(void *addr, size_t len) 46 { 47 return munmap(addr, len); 48 } 49 50 /*===========================================================================* 51 * _magic_real_brk * 52 *===========================================================================*/ 53 int _magic_real_brk(char *newbrk) 54 { 55 return magic_real_brk(newbrk); 56 } 57 58 /*===========================================================================* 59 * _magic_real_mmap * 60 *===========================================================================*/ 61 void* _magic_real_mmap(void *buf, size_t len, int prot, int flags, int fd, off_t offset) 62 { 63 return magic_real_mmap(buf, len, prot, flags, fd, offset); 64 } 65 66 /*===========================================================================* 67 * _magic_real_munmap * 68 *===========================================================================*/ 69 int _magic_real_munmap(void *addr, size_t length) 70 { 71 return magic_real_munmap(addr, length); 72 } 73 74 /*===========================================================================* 75 * _magic_state_transfer * 76 *===========================================================================*/ 77 int _magic_state_transfer(sef_init_info_t *info) 78 { 79 st_init_info_t st_info; 80 /* Convert SEF flags into ST flags. */ 81 st_info.flags = 0; 82 if (info->flags & SEF_LU_ASR) 83 st_info.flags |= ST_LU_ASR; 84 if (info->flags & SEF_LU_NOMMAP) 85 st_info.flags |= ST_LU_NOMMAP; 86 st_info.init_buff_start = info->init_buff_start; 87 st_info.init_buff_cleanup_start = info->init_buff_cleanup_start; 88 st_info.init_buff_len = info->init_buff_len; 89 /* Transmit sef_init_info opaquely to the state transfer framework. */ 90 st_info.info_opaque = (void *) (info); 91 /* Add the OS callbacks. */ 92 st_info.st_cbs_os.panic = &(panic); /* panic() callback. */ 93 st_info.st_cbs_os.old_state_table_lookup = &(sef_old_state_table_lookup_opaque); /* old_state_table_lookup() callback. */ 94 st_info.st_cbs_os.copy_state_region = &(sef_copy_state_region_opaque); /* copy_state_region() callback. */ 95 st_info.st_cbs_os.alloc_contig = &(_magic_real_alloc_contig); /* alloc_contig() callback. */ 96 st_info.st_cbs_os.free_contig = &(_magic_real_free_contig); /* free_contig() callback. */ 97 st_info.st_cbs_os.debug_header = &(_magic_generic_debug_header); /* debug_header() callback. */ 98 return st_state_transfer(&st_info); 99 } 100 101 102