xref: /minix3/minix/lib/libmagicrt/include/st/callback.h (revision b2ed49a5d83e311ee0fa9e5ff613639b1bf77aaf)
1*b2ed49a5SDavid van Moolenbroek #ifndef ST_CALLBACK_H
2*b2ed49a5SDavid van Moolenbroek #define ST_CALLBACK_H
3*b2ed49a5SDavid van Moolenbroek 
4*b2ed49a5SDavid van Moolenbroek #include <st/state_transfer.h>
5*b2ed49a5SDavid van Moolenbroek 
6*b2ed49a5SDavid van Moolenbroek #define NUM_CB_ARRAYS     8
7*b2ed49a5SDavid van Moolenbroek #define MAX_NUM_CBS       20
8*b2ed49a5SDavid van Moolenbroek 
9*b2ed49a5SDavid van Moolenbroek /* Struct for holding info for selement transfer callbacks. */
10*b2ed49a5SDavid van Moolenbroek struct st_cb_info {
11*b2ed49a5SDavid van Moolenbroek     _magic_selement_t *local_selement;
12*b2ed49a5SDavid van Moolenbroek     _magic_selement_t *local_selements;
13*b2ed49a5SDavid van Moolenbroek     int walk_flags;
14*b2ed49a5SDavid van Moolenbroek     int st_cb_flags;
15*b2ed49a5SDavid van Moolenbroek     int *st_cb_saved_flags;
16*b2ed49a5SDavid van Moolenbroek     st_init_info_t *init_info;
17*b2ed49a5SDavid van Moolenbroek };
18*b2ed49a5SDavid van Moolenbroek 
19*b2ed49a5SDavid van Moolenbroek /* Callback type definitions and call registration helpers. */
20*b2ed49a5SDavid van Moolenbroek 
21*b2ed49a5SDavid van Moolenbroek #define CALLBACK_PREFIX st
22*b2ed49a5SDavid van Moolenbroek #undef CALLBACK_FAMILY
23*b2ed49a5SDavid van Moolenbroek #include <st/cb_template.h>
24*b2ed49a5SDavid van Moolenbroek 
25*b2ed49a5SDavid van Moolenbroek DEFINE_DECL_CALLBACK(void *, pages_allocate, (st_init_info_t *info, uint32_t *phys, int num_pages));
26*b2ed49a5SDavid van Moolenbroek DEFINE_DECL_CALLBACK(void, pages_free, (st_init_info_t *info, st_alloc_pages *current_page));
27*b2ed49a5SDavid van Moolenbroek DEFINE_DECL_CALLBACK(int, state_cleanup, (void));
28*b2ed49a5SDavid van Moolenbroek typedef magic_sentry_analyze_cb_t st_cb_state_checking_t;
29*b2ed49a5SDavid van Moolenbroek PUBLIC  void st_setcb_state_checking(st_cb_state_checking_t cb);
30*b2ed49a5SDavid van Moolenbroek DEFINE_DECL_CALLBACK(void, selement_map, (_magic_selement_t *cached_selement, _magic_selement_t *local_selement, struct st_cb_info *cb_info, int is_trg_mapping));
31*b2ed49a5SDavid van Moolenbroek DEFINE_DECL_CALLBACK_CUSTOM(int, selement_transfer, (_magic_selement_t *selement, _magic_sel_analyzed_t *sel_analyzed, _magic_sel_stats_t *sel_stats, struct st_cb_info *cb_info), (CALLBACK_TYPENAME(selement_transfer) cb, int flags));
32*b2ed49a5SDavid van Moolenbroek 
33*b2ed49a5SDavid van Moolenbroek /* Struct for holding state transfer callback functions. */
34*b2ed49a5SDavid van Moolenbroek struct st_cbs_t {
35*b2ed49a5SDavid van Moolenbroek     st_cb_pages_allocate_t    st_cb_pages_allocate;
36*b2ed49a5SDavid van Moolenbroek     st_cb_pages_free_t        st_cb_pages_free;
37*b2ed49a5SDavid van Moolenbroek     st_cb_state_cleanup_t     st_cb_state_cleanup;
38*b2ed49a5SDavid van Moolenbroek     st_cb_state_checking_t    st_cb_state_checking;
39*b2ed49a5SDavid van Moolenbroek     st_cb_selement_map_t      st_cb_selement_map;
40*b2ed49a5SDavid van Moolenbroek     st_cb_selement_transfer_t st_cb_selement_transfer[NUM_CB_ARRAYS][MAX_NUM_CBS];
41*b2ed49a5SDavid van Moolenbroek };
42*b2ed49a5SDavid van Moolenbroek 
43*b2ed49a5SDavid van Moolenbroek /* Predefined callback implementations. */
44*b2ed49a5SDavid van Moolenbroek PUBLIC void *st_cb_pages_allocate(st_init_info_t *info, uint32_t *phys, int num_pages);
45*b2ed49a5SDavid van Moolenbroek PUBLIC void st_cb_pages_free(st_init_info_t *info, st_alloc_pages *current_page);
46*b2ed49a5SDavid van Moolenbroek PUBLIC int st_cb_state_cleanup_null(void);
47*b2ed49a5SDavid van Moolenbroek PUBLIC int st_cb_state_checking_null(_magic_selement_t* selement,
48*b2ed49a5SDavid van Moolenbroek     _magic_sel_analyzed_t *sel_analyzed, _magic_sel_stats_t *sel_stats,
49*b2ed49a5SDavid van Moolenbroek     void* cb_args);
50*b2ed49a5SDavid van Moolenbroek PUBLIC int st_cb_state_checking_print(_magic_selement_t* selement,
51*b2ed49a5SDavid van Moolenbroek     _magic_sel_analyzed_t *sel_analyzed, _magic_sel_stats_t *sel_stats,
52*b2ed49a5SDavid van Moolenbroek     void* cb_args);
53*b2ed49a5SDavid van Moolenbroek PUBLIC int st_cb_state_checking_panic(_magic_selement_t* selement,
54*b2ed49a5SDavid van Moolenbroek     _magic_sel_analyzed_t *sel_analyzed, _magic_sel_stats_t *sel_stats,
55*b2ed49a5SDavid van Moolenbroek     void* cb_args);
56*b2ed49a5SDavid van Moolenbroek 
57*b2ed49a5SDavid van Moolenbroek PUBLIC int st_cb_transfer_sentry_default(_magic_selement_t *selement, _magic_sel_analyzed_t *sel_analyzed, _magic_sel_stats_t *sel_stats, struct st_cb_info *cb_info);
58*b2ed49a5SDavid van Moolenbroek PUBLIC int st_cb_transfer_typename_default(_magic_selement_t *selement, _magic_sel_analyzed_t *sel_analyzed, _magic_sel_stats_t *sel_stats, struct st_cb_info *cb_info);
59*b2ed49a5SDavid van Moolenbroek PUBLIC int st_cb_transfer_walkable(_magic_selement_t *selement, _magic_sel_analyzed_t *sel_analyzed, _magic_sel_stats_t *sel_stats, struct st_cb_info *cb_info);
60*b2ed49a5SDavid van Moolenbroek PUBLIC int st_cb_transfer_ptr(_magic_selement_t *selement, _magic_sel_analyzed_t *sel_analyzed, _magic_sel_stats_t *sel_stats, struct st_cb_info *cb_info);
61*b2ed49a5SDavid van Moolenbroek PUBLIC int st_cb_transfer_identity(_magic_selement_t *selement, _magic_sel_analyzed_t *sel_analyzed, _magic_sel_stats_t *sel_stats, struct st_cb_info *cb_info);
62*b2ed49a5SDavid van Moolenbroek PUBLIC int st_cb_transfer_cond_identity(_magic_selement_t *selement, _magic_sel_analyzed_t *sel_analyzed, _magic_sel_stats_t *sel_stats, struct st_cb_info *cb_info);
63*b2ed49a5SDavid van Moolenbroek PUBLIC int st_cb_transfer_nonptr(_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 PUBLIC int st_cb_transfer_struct(_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 PUBLIC int st_cb_transfer_selement_base(_magic_selement_t *selement, _magic_sel_analyzed_t *sel_analyzed, _magic_sel_stats_t *sel_stats, struct st_cb_info *cb_info);
66*b2ed49a5SDavid van Moolenbroek PUBLIC int st_cb_transfer_selement_generic(_magic_selement_t *selement, _magic_sel_analyzed_t *sel_analyzed, _magic_sel_stats_t *sel_stats, struct st_cb_info *cb_info);
67*b2ed49a5SDavid van Moolenbroek 
68*b2ed49a5SDavid van Moolenbroek PUBLIC void st_cb_map_from_parent_array_selement_generic(_magic_selement_t *cached_selement, _magic_selement_t *local_selement, struct st_cb_info *cb_info, int is_trg_mapping);
69*b2ed49a5SDavid van Moolenbroek PUBLIC void st_cb_map_child_array_selement_generic(_magic_selement_t *cached_selement, _magic_selement_t *local_selement, struct st_cb_info *cb_info, int is_trg_mapping);
70*b2ed49a5SDavid van Moolenbroek PUBLIC void st_cb_map_from_parent_union_selement_generic(_magic_selement_t *cached_selement, _magic_selement_t *local_selement, struct st_cb_info *cb_info, int is_trg_mapping);
71*b2ed49a5SDavid van Moolenbroek PUBLIC void st_cb_map_child_union_selement_generic(_magic_selement_t *cached_selement, _magic_selement_t *local_selement, struct st_cb_info *cb_info, int is_trg_mapping);
72*b2ed49a5SDavid van Moolenbroek PUBLIC void st_cb_map_from_parent_struct_selement_generic(_magic_selement_t *cached_selement, _magic_selement_t *local_selement, struct st_cb_info *cb_info, int is_trg_mapping);
73*b2ed49a5SDavid van Moolenbroek PUBLIC void st_cb_map_child_nonaggr_selement_generic(_magic_selement_t *cached_selement, _magic_selement_t *local_selement, struct st_cb_info *cb_info, int is_trg_mapping);
74*b2ed49a5SDavid van Moolenbroek PUBLIC void st_cb_map_child_struct_selement_generic(_magic_selement_t *cached_selement, _magic_selement_t *local_selement, struct st_cb_info *cb_info, int is_trg_mapping);
75*b2ed49a5SDavid van Moolenbroek PUBLIC void st_cb_map_child_primitive_selement_generic(_magic_selement_t *cached_selement, _magic_selement_t *local_selement, struct st_cb_info *cb_info, int is_trg_mapping);
76*b2ed49a5SDavid van Moolenbroek PUBLIC void st_cb_map_child_ptr_selement_generic(_magic_selement_t *cached_selement, _magic_selement_t *local_selement, struct st_cb_info *cb_info, int is_trg_mapping);
77*b2ed49a5SDavid van Moolenbroek PUBLIC void st_cb_map_from_parent_selement_generic(_magic_selement_t *cached_selement, _magic_selement_t *local_selement, struct st_cb_info *cb_info, int is_trg_mapping);
78*b2ed49a5SDavid van Moolenbroek PUBLIC void st_cb_map_child_selement_generic(_magic_selement_t *cached_selement, _magic_selement_t *local_selement, struct st_cb_info *cb_info, int is_trg_mapping);
79*b2ed49a5SDavid van Moolenbroek PUBLIC void st_cb_map_selement_generic(_magic_selement_t *cached_selement, _magic_selement_t *local_selement, struct st_cb_info *cb_info, int is_trg_mapping);
80*b2ed49a5SDavid van Moolenbroek 
81*b2ed49a5SDavid van Moolenbroek /* Macros for callbacks not defined statically. */
82*b2ed49a5SDavid van Moolenbroek #define ST_CB_SELEMENT_TRANSFER_EMPTY  {{0}}
83*b2ed49a5SDavid van Moolenbroek 
84*b2ed49a5SDavid van Moolenbroek /* Macros for predefined callback implementations. */
85*b2ed49a5SDavid van Moolenbroek #define ST_CB_PAGES_ALLOCATE_DEFAULT   st_cb_pages_allocate
86*b2ed49a5SDavid van Moolenbroek #define ST_CB_PAGES_FREE_DEFAULT       st_cb_pages_free
87*b2ed49a5SDavid van Moolenbroek #define ST_CB_STATE_CLEANUP_DEFAULT    st_cb_state_cleanup_null
88*b2ed49a5SDavid van Moolenbroek #define ST_CB_STATE_CHECKING_DEFAULT   st_cb_state_checking_print
89*b2ed49a5SDavid van Moolenbroek #define ST_CB_SELEMENT_MAP_DEFAULT     st_cb_map_selement_generic
90*b2ed49a5SDavid van Moolenbroek 
91*b2ed49a5SDavid van Moolenbroek #define ST_CB_PRINT st_cb_print
92*b2ed49a5SDavid van Moolenbroek 
93*b2ed49a5SDavid van Moolenbroek #define ST_TYPE_NAME_KEY(TYPE) ((const char *) (TYPE)->ext)
94*b2ed49a5SDavid van Moolenbroek 
95*b2ed49a5SDavid van Moolenbroek #define ST_TYPE_NAME_MATCH(REGISTERED_TYPE_NAME_KEY, KEY)                      \
96*b2ed49a5SDavid van Moolenbroek     (REGISTERED_TYPE_NAME_KEY == KEY)
97*b2ed49a5SDavid van Moolenbroek #define ST_TYPE_NAME_MATCH_ANY(REGISTERED_TYPE_NAME_KEYS, KEY)                 \
98*b2ed49a5SDavid van Moolenbroek     st_type_name_match_any(REGISTERED_TYPE_NAME_KEYS, KEY)
99*b2ed49a5SDavid van Moolenbroek #define ST_SENTRY_NAME_MATCH(SENTRY_WILDCARD_NAME, NAME)                       \
100*b2ed49a5SDavid van Moolenbroek     (!st_strcmp_wildcard(SENTRY_WILDCARD_NAME, NAME))
101*b2ed49a5SDavid van Moolenbroek #define ST_SENTRY_NAME_MATCH_ANY(SENTRY_WILDCARD_NAMES, NAME)                  \
102*b2ed49a5SDavid van Moolenbroek     st_sentry_name_match_any(SENTRY_WILDCARD_NAMES, NAME)
103*b2ed49a5SDavid van Moolenbroek #define ST_DSENTRY_PARENT_NAME_MATCH(DSENTRY_WILDCARD_PARENT_NAME, PARENT_NAME)\
104*b2ed49a5SDavid van Moolenbroek     (!st_strcmp_wildcard(DSENTRY_WILDCARD_PARENT_NAME, PARENT_NAME))
105*b2ed49a5SDavid van Moolenbroek #define ST_DSENTRY_PARENT_NAME_MATCH_ANY(DSENTRY_WILDCARD_PARENT_NAMES,        \
106*b2ed49a5SDavid van Moolenbroek     PARENT_NAME)                                                               \
107*b2ed49a5SDavid van Moolenbroek     st_dsentry_parent_name_match_any(DSENTRY_WILDCARD_PARENT_NAMES, PARENT_NAME)
108*b2ed49a5SDavid van Moolenbroek 
109*b2ed49a5SDavid van Moolenbroek #define ST_CB_TYPE_TYPENAME 1
110*b2ed49a5SDavid van Moolenbroek #define ST_CB_TYPE_SENTRY   2
111*b2ed49a5SDavid van Moolenbroek #define ST_CB_TYPE_SELEMENT 4
112*b2ed49a5SDavid van Moolenbroek #define ST_CB_NOT_PROCESSED 1000
113*b2ed49a5SDavid van Moolenbroek 
114*b2ed49a5SDavid van Moolenbroek #define ST_CB_CHECK_ONLY    0x01
115*b2ed49a5SDavid van Moolenbroek #define ST_CB_PRINT_DBG     0x02
116*b2ed49a5SDavid van Moolenbroek #define ST_CB_PRINT_ERR     0x04
117*b2ed49a5SDavid van Moolenbroek #define ST_CB_FORCE_IXFER   0x08
118*b2ed49a5SDavid van Moolenbroek #define ST_CB_DEFAULT_FLAGS (ST_CB_PRINT_ERR)
119*b2ed49a5SDavid van Moolenbroek #define ST_CB_FLAG(F) (cb_info->st_cb_flags & F)
120*b2ed49a5SDavid van Moolenbroek 
121*b2ed49a5SDavid van Moolenbroek #define ST_CB_DBG ST_CB_PRINT_DBG
122*b2ed49a5SDavid van Moolenbroek #define ST_CB_ERR ST_CB_PRINT_ERR
123*b2ed49a5SDavid van Moolenbroek #define ST_CB_PRINT_LEVEL(L) ST_CB_FLAG(L)
124*b2ed49a5SDavid van Moolenbroek #define ST_CB_LEVEL_TO_STR(L)               \
125*b2ed49a5SDavid van Moolenbroek     (L == ST_CB_DBG ? "DEBUG" :             \
126*b2ed49a5SDavid van Moolenbroek      L == ST_CB_ERR ? "ERROR" : "???")
127*b2ed49a5SDavid van Moolenbroek 
128*b2ed49a5SDavid van Moolenbroek #endif /* ST_CALLBACK_H */
129