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