xref: /minix/minix/lib/libmagicrt/magic_util.c (revision e1cdaee1)
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