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