1*b2ed49a5SDavid van Moolenbroek #include <minix/syslib.h>
2*b2ed49a5SDavid van Moolenbroek #include <minix/sysutil.h>
3*b2ed49a5SDavid van Moolenbroek #include <minix/com.h>
4*b2ed49a5SDavid van Moolenbroek
5*b2ed49a5SDavid van Moolenbroek #include <minix/type.h>
6*b2ed49a5SDavid van Moolenbroek #include <minix/ds.h>
7*b2ed49a5SDavid van Moolenbroek #include "ds/store.h"
8*b2ed49a5SDavid van Moolenbroek
9*b2ed49a5SDavid van Moolenbroek #include <magic_analysis.h>
10*b2ed49a5SDavid van Moolenbroek #include <st/state_transfer.h>
11*b2ed49a5SDavid van Moolenbroek
12*b2ed49a5SDavid van Moolenbroek const char* sef_sf_typename_keys[] = { "dsi_u", NULL };
13*b2ed49a5SDavid van Moolenbroek #define dsi_u_idx 0
14*b2ed49a5SDavid van Moolenbroek
15*b2ed49a5SDavid van Moolenbroek /*===========================================================================*
16*b2ed49a5SDavid van Moolenbroek * sef_cb_sf_transfer_dsi_u *
17*b2ed49a5SDavid van Moolenbroek *===========================================================================*/
sef_cb_sf_transfer_dsi_u(_magic_selement_t * selement,_magic_sel_analyzed_t * sel_analyzed,_magic_sel_stats_t * sel_stats,struct st_cb_info * cb_info)18*b2ed49a5SDavid van Moolenbroek static int sef_cb_sf_transfer_dsi_u(_magic_selement_t *selement, _magic_sel_analyzed_t *sel_analyzed, _magic_sel_stats_t *sel_stats, struct st_cb_info *cb_info) {
19*b2ed49a5SDavid van Moolenbroek static struct dsi_mem noxfer_dsi_mem_stub;
20*b2ed49a5SDavid van Moolenbroek static const struct _magic_type* _magic_dsi_mem_type = NULL;
21*b2ed49a5SDavid van Moolenbroek struct data_store* dsp;
22*b2ed49a5SDavid van Moolenbroek _magic_selement_t parent_selement;
23*b2ed49a5SDavid van Moolenbroek int ret = EGENERIC;
24*b2ed49a5SDavid van Moolenbroek VOLATILE int keep_stubs = (int)&noxfer_dsi_mem_stub;
25*b2ed49a5SDavid van Moolenbroek assert(keep_stubs);
26*b2ed49a5SDavid van Moolenbroek
27*b2ed49a5SDavid van Moolenbroek if(magic_selement_get_parent(selement, &parent_selement) == NULL) {
28*b2ed49a5SDavid van Moolenbroek ST_CB_PRINT(ST_CB_ERR, "sef_cb_sf_transfer_dsi_u: magic_selement_get_parent failed", selement, sel_analyzed, sel_stats, cb_info);
29*b2ed49a5SDavid van Moolenbroek return EINVAL;
30*b2ed49a5SDavid van Moolenbroek }
31*b2ed49a5SDavid van Moolenbroek dsp = (struct data_store*) parent_selement.address;
32*b2ed49a5SDavid van Moolenbroek if(!(dsp->flags & DSF_IN_USE)) {
33*b2ed49a5SDavid van Moolenbroek /* Skip when unused. */
34*b2ed49a5SDavid van Moolenbroek return MAGIC_SENTRY_ANALYZE_SKIP_PATH;
35*b2ed49a5SDavid van Moolenbroek }
36*b2ed49a5SDavid van Moolenbroek switch(dsp->flags & DSF_MASK_TYPE) {
37*b2ed49a5SDavid van Moolenbroek case DSF_TYPE_U32:
38*b2ed49a5SDavid van Moolenbroek case DSF_TYPE_LABEL:
39*b2ed49a5SDavid van Moolenbroek /* Identity transfer when no ptr is involved. */
40*b2ed49a5SDavid van Moolenbroek ret = st_cb_transfer_identity(selement, sel_analyzed, sel_stats, cb_info);
41*b2ed49a5SDavid van Moolenbroek break;
42*b2ed49a5SDavid van Moolenbroek case DSF_TYPE_STR:
43*b2ed49a5SDavid van Moolenbroek case DSF_TYPE_MEM:
44*b2ed49a5SDavid van Moolenbroek /* Transfer as dsp->u.mem struct. */
45*b2ed49a5SDavid van Moolenbroek if(!_magic_dsi_mem_type && !(_magic_dsi_mem_type = magic_type_lookup_by_name("dsi_mem"))) {
46*b2ed49a5SDavid van Moolenbroek ST_CB_PRINT(ST_CB_ERR, "sef_cb_sf_transfer_dsi_u: type dsi_mem not found", selement, sel_analyzed, sel_stats, cb_info);
47*b2ed49a5SDavid van Moolenbroek return ENOENT;
48*b2ed49a5SDavid van Moolenbroek }
49*b2ed49a5SDavid van Moolenbroek st_cb_selement_type_cast(_magic_dsi_mem_type, _magic_dsi_mem_type, selement, sel_analyzed, sel_stats, cb_info);
50*b2ed49a5SDavid van Moolenbroek ret = st_cb_transfer_selement_generic(selement, sel_analyzed, sel_stats, cb_info);
51*b2ed49a5SDavid van Moolenbroek break;
52*b2ed49a5SDavid van Moolenbroek default:
53*b2ed49a5SDavid van Moolenbroek /* Unknown? Report error. */
54*b2ed49a5SDavid van Moolenbroek ST_CB_PRINT(ST_CB_ERR, "sef_cb_sf_transfer_dsi_u: bad flags", selement, sel_analyzed, sel_stats, cb_info);
55*b2ed49a5SDavid van Moolenbroek ret = EFAULT;
56*b2ed49a5SDavid van Moolenbroek break;
57*b2ed49a5SDavid van Moolenbroek }
58*b2ed49a5SDavid van Moolenbroek return ret;
59*b2ed49a5SDavid van Moolenbroek }
60*b2ed49a5SDavid van Moolenbroek
61*b2ed49a5SDavid van Moolenbroek /*===========================================================================*
62*b2ed49a5SDavid van Moolenbroek * sef_cb_sf_transfer_typename *
63*b2ed49a5SDavid van Moolenbroek *===========================================================================*/
sef_cb_sf_transfer_typename(_magic_selement_t * selement,_magic_sel_analyzed_t * sel_analyzed,_magic_sel_stats_t * sel_stats,struct st_cb_info * cb_info)64*b2ed49a5SDavid van Moolenbroek static int sef_cb_sf_transfer_typename(_magic_selement_t *selement, _magic_sel_analyzed_t *sel_analyzed, _magic_sel_stats_t *sel_stats, struct st_cb_info *cb_info) {
65*b2ed49a5SDavid van Moolenbroek const char *typename_key = ST_TYPE_NAME_KEY(selement->type);
66*b2ed49a5SDavid van Moolenbroek if(ST_TYPE_NAME_MATCH(sef_sf_typename_keys[dsi_u_idx],typename_key))
67*b2ed49a5SDavid van Moolenbroek {
68*b2ed49a5SDavid van Moolenbroek return sef_cb_sf_transfer_dsi_u(selement, sel_analyzed, sel_stats, cb_info);
69*b2ed49a5SDavid van Moolenbroek }
70*b2ed49a5SDavid van Moolenbroek
71*b2ed49a5SDavid van Moolenbroek return ST_CB_NOT_PROCESSED;
72*b2ed49a5SDavid van Moolenbroek }
73*b2ed49a5SDavid van Moolenbroek
74*b2ed49a5SDavid van Moolenbroek /*===========================================================================*
75*b2ed49a5SDavid van Moolenbroek * _magic_ds_st_init *
76*b2ed49a5SDavid van Moolenbroek *===========================================================================*/
_magic_ds_st_init(void)77*b2ed49a5SDavid van Moolenbroek void _magic_ds_st_init(void)
78*b2ed49a5SDavid van Moolenbroek {
79*b2ed49a5SDavid van Moolenbroek st_register_typename_keys(sef_sf_typename_keys);
80*b2ed49a5SDavid van Moolenbroek st_setcb_selement_transfer(sef_cb_sf_transfer_typename, ST_CB_TYPE_TYPENAME);
81*b2ed49a5SDavid van Moolenbroek }
82*b2ed49a5SDavid van Moolenbroek
83