File indexing completed on 2025-12-16 10:36:01
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #ifndef _SFRAME_API_H
0021 #define _SFRAME_API_H
0022
0023 #include <sframe.h>
0024 #include <stdbool.h>
0025
0026 #ifdef __cplusplus
0027 extern "C"
0028 {
0029 #endif
0030
0031 typedef struct sframe_decoder_ctx sframe_decoder_ctx;
0032 typedef struct sframe_encoder_ctx sframe_encoder_ctx;
0033
0034 #define MAX_NUM_STACK_OFFSETS 3
0035
0036 #define MAX_OFFSET_BYTES \
0037 ((SFRAME_FRE_OFFSET_4B * 2 * MAX_NUM_STACK_OFFSETS))
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047 typedef struct sframe_frame_row_entry
0048 {
0049 uint32_t fre_start_addr;
0050 unsigned char fre_offsets[MAX_OFFSET_BYTES];
0051 unsigned char fre_info;
0052 } sframe_frame_row_entry;
0053
0054 #define SFRAME_ERR ((int) -1)
0055
0056
0057
0058
0059
0060
0061 #define _SFRAME_ERRORS \
0062 _SFRAME_FIRST (SFRAME_ERR_VERSION_INVAL, "SFrame version not supported.") \
0063 _SFRAME_ITEM (SFRAME_ERR_NOMEM, "Out of Memory.") \
0064 _SFRAME_ITEM (SFRAME_ERR_INVAL, "Corrupt SFrame.") \
0065 _SFRAME_ITEM (SFRAME_ERR_BUF_INVAL, "Buffer does not contain SFrame data.") \
0066 _SFRAME_ITEM (SFRAME_ERR_DCTX_INVAL, "Corrupt SFrame decoder.") \
0067 _SFRAME_ITEM (SFRAME_ERR_ECTX_INVAL, "Corrupt SFrame encoder.") \
0068 _SFRAME_ITEM (SFRAME_ERR_FDE_INVAL, "Corrput FDE.") \
0069 _SFRAME_ITEM (SFRAME_ERR_FRE_INVAL, "Corrupt FRE.") \
0070 _SFRAME_ITEM (SFRAME_ERR_FDE_NOTFOUND,"FDE not found.") \
0071 _SFRAME_ITEM (SFRAME_ERR_FDE_NOTSORTED, "FDEs not sorted.") \
0072 _SFRAME_ITEM (SFRAME_ERR_FRE_NOTFOUND,"FRE not found.") \
0073 _SFRAME_ITEM (SFRAME_ERR_FREOFFSET_NOPRESENT,"FRE offset not present.")
0074
0075 #define SFRAME_ERR_BASE 2000
0076
0077 enum
0078 {
0079 #define _SFRAME_FIRST(NAME, STR) NAME = SFRAME_ERR_BASE
0080 #define _SFRAME_ITEM(NAME, STR) , NAME
0081 _SFRAME_ERRORS
0082 #undef _SFRAME_ITEM
0083 #undef _SFRAME_FIRST
0084 };
0085
0086
0087 #define SFRAME_ERR_NERR (SFRAME_ERR_FREOFFSET_NOPRESENT - SFRAME_ERR_BASE + 1)
0088
0089
0090
0091 extern const char *
0092 sframe_errmsg (int error);
0093
0094
0095
0096 extern unsigned char
0097 sframe_fde_create_func_info (uint32_t fre_type, uint32_t fde_type);
0098
0099
0100
0101 extern uint32_t
0102 sframe_calc_fre_type (size_t func_size);
0103
0104
0105
0106
0107
0108 extern sframe_decoder_ctx *
0109 sframe_decode (const char *cf_buf, size_t cf_size, int *errp);
0110
0111
0112 extern void
0113 sframe_decoder_free (sframe_decoder_ctx **dctx);
0114
0115
0116 extern unsigned int
0117 sframe_decoder_get_hdr_size (sframe_decoder_ctx *dctx);
0118
0119
0120 extern uint8_t
0121 sframe_decoder_get_abi_arch (sframe_decoder_ctx *dctx);
0122
0123
0124 extern uint8_t
0125 sframe_decoder_get_version (sframe_decoder_ctx *dctx);
0126
0127
0128
0129 extern uint32_t
0130 sframe_decoder_get_num_fidx (sframe_decoder_ctx *dctx);
0131
0132
0133 extern int8_t
0134 sframe_decoder_get_fixed_fp_offset (sframe_decoder_ctx *dctx);
0135
0136
0137 extern int8_t
0138 sframe_decoder_get_fixed_ra_offset (sframe_decoder_ctx *dctx);
0139
0140
0141
0142
0143
0144 extern void *
0145 sframe_get_funcdesc_with_addr (sframe_decoder_ctx *dctx, int32_t addr,
0146 int *errp);
0147
0148
0149
0150
0151 extern int
0152 sframe_find_fre (sframe_decoder_ctx *ctx, int32_t pc,
0153 sframe_frame_row_entry *frep);
0154
0155
0156
0157
0158 extern int
0159 sframe_decoder_get_fre (sframe_decoder_ctx *ctx,
0160 unsigned int func_idx,
0161 unsigned int fre_idx,
0162 sframe_frame_row_entry *fre);
0163
0164
0165
0166
0167 extern int
0168 sframe_decoder_get_funcdesc (sframe_decoder_ctx *ctx,
0169 unsigned int i,
0170 uint32_t *num_fres,
0171 uint32_t *func_size,
0172 int32_t *func_start_address,
0173 unsigned char *func_info);
0174
0175
0176
0177
0178
0179 extern int
0180 sframe_decoder_get_funcdesc_v2 (sframe_decoder_ctx *ctx,
0181 unsigned int i,
0182 uint32_t *num_fres,
0183 uint32_t *func_size,
0184 int32_t *func_start_address,
0185 unsigned char *func_info,
0186 uint8_t *rep_block_size);
0187
0188
0189 extern void
0190 dump_sframe (sframe_decoder_ctx *decoder, uint64_t addr);
0191
0192
0193 extern uint8_t
0194 sframe_fre_get_base_reg_id (sframe_frame_row_entry *fre, int *errp);
0195
0196
0197 extern int32_t
0198 sframe_fre_get_cfa_offset (sframe_decoder_ctx *dtcx,
0199 sframe_frame_row_entry *fre, int *errp);
0200
0201
0202 extern int32_t
0203 sframe_fre_get_fp_offset (sframe_decoder_ctx *dctx,
0204 sframe_frame_row_entry *fre, int *errp);
0205
0206
0207 extern int32_t
0208 sframe_fre_get_ra_offset (sframe_decoder_ctx *dctx,
0209 sframe_frame_row_entry *fre, int *errp);
0210
0211
0212
0213 extern bool
0214 sframe_fre_get_ra_mangled_p (sframe_decoder_ctx *dctx,
0215 sframe_frame_row_entry *fre, int *errp);
0216
0217
0218
0219
0220
0221 extern sframe_encoder_ctx *
0222 sframe_encode (uint8_t ver, uint8_t flags, uint8_t abi_arch,
0223 int8_t fixed_fp_offset, int8_t fixed_ra_offset, int *errp);
0224
0225
0226 extern void
0227 sframe_encoder_free (sframe_encoder_ctx **encoder);
0228
0229
0230 extern unsigned int
0231 sframe_encoder_get_hdr_size (sframe_encoder_ctx *encoder);
0232
0233
0234 extern uint8_t
0235 sframe_encoder_get_abi_arch (sframe_encoder_ctx *encoder);
0236
0237
0238 extern uint8_t
0239 sframe_encoder_get_version (sframe_encoder_ctx *encoder);
0240
0241
0242
0243 extern uint32_t
0244 sframe_encoder_get_num_fidx (sframe_encoder_ctx *encoder);
0245
0246
0247
0248 extern int
0249 sframe_encoder_add_fre (sframe_encoder_ctx *encoder,
0250 unsigned int func_idx,
0251 sframe_frame_row_entry *frep);
0252
0253
0254
0255 extern int
0256 sframe_encoder_add_funcdesc (sframe_encoder_ctx *encoder,
0257 int32_t start_addr,
0258 uint32_t func_size,
0259 unsigned char func_info,
0260 uint32_t num_fres);
0261
0262
0263
0264 extern int
0265 sframe_encoder_add_funcdesc_v2 (sframe_encoder_ctx *encoder,
0266 int32_t start_addr,
0267 uint32_t func_size,
0268 unsigned char func_info,
0269 uint8_t rep_block_size,
0270 uint32_t num_fres);
0271
0272
0273
0274 extern char *
0275 sframe_encoder_write (sframe_encoder_ctx *encoder,
0276 size_t *encoded_size, int *errp);
0277
0278 #ifdef __cplusplus
0279 }
0280 #endif
0281
0282 #endif