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