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