@@ -172,6 +172,19 @@ sframe_decoder_get_funcdesc (sframe_decoder_ctx *ctx,
int32_t *func_start_address,
unsigned char *func_info);
+/* Get the data (NUM_FRES, FUNC_SIZE, FUNC_START_ADDRESS, FUNC_INFO,
+ REP_BLOCK_SIZE) from the function descriptor entry at index I'th
+ in the decoder CTX. If failed, return error code.
+ This API is only available from SFRAME_VERSION_2. */
+extern int
+sframe_decoder_get_funcdesc_v2 (sframe_decoder_ctx *ctx,
+ unsigned int i,
+ uint32_t *num_fres,
+ uint32_t *func_size,
+ int32_t *func_start_address,
+ unsigned char *func_info,
+ uint8_t *rep_block_size);
+
/* SFrame textual dump. */
extern void
dump_sframe (sframe_decoder_ctx *decoder, uint64_t addr);
@@ -246,6 +259,16 @@ sframe_encoder_add_funcdesc (sframe_encoder_ctx *encoder,
unsigned char func_info,
uint32_t num_fres);
+/* Add a new function descriptor entry with START_ADDR, FUNC_SIZE, FUNC_INFO
+ and REP_BLOCK_SIZE to the encoder. */
+extern int
+sframe_encoder_add_funcdesc_v2 (sframe_encoder_ctx *encoder,
+ int32_t start_addr,
+ uint32_t func_size,
+ unsigned char func_info,
+ uint8_t rep_block_size,
+ uint32_t num_fres);
+
/* Serialize the contents of the encoder and return the buffer. ENCODED_SIZE
is updated to the size of the buffer. Sets ERRP if failure. */
extern char *
@@ -20,6 +20,7 @@ LIBSFRAME_1.0 {
sframe_find_fre;
sframe_decoder_get_num_fidx;
sframe_decoder_get_funcdesc;
+ sframe_decoder_get_funcdesc_v2;
sframe_decoder_get_fre;
sframe_encode;
sframe_encoder_free;
@@ -29,6 +30,7 @@ LIBSFRAME_1.0 {
sframe_encoder_get_num_fidx;
sframe_encoder_add_fre;
sframe_encoder_add_funcdesc;
+ sframe_encoder_add_funcdesc_v2;
sframe_encoder_write;
dump_sframe;
sframe_errmsg;
@@ -1208,6 +1208,36 @@ sframe_decoder_get_funcdesc (sframe_decoder_ctx *ctx,
return 0;
}
+int
+sframe_decoder_get_funcdesc_v2 (sframe_decoder_ctx *dctx,
+ unsigned int i,
+ uint32_t *num_fres,
+ uint32_t *func_size,
+ int32_t *func_start_address,
+ unsigned char *func_info,
+ uint8_t *rep_block_size)
+{
+ sframe_func_desc_entry *fdp;
+ int err = 0;
+
+ if (dctx == NULL || func_start_address == NULL
+ || num_fres == NULL || func_size == NULL
+ || sframe_decoder_get_version (dctx) == SFRAME_VERSION_1)
+ return sframe_set_errno (&err, SFRAME_ERR_INVAL);
+
+ fdp = sframe_decoder_get_funcdesc_at_index (dctx, i);
+
+ if (fdp == NULL)
+ return sframe_set_errno (&err, SFRAME_ERR_FDE_NOTFOUND);
+
+ *num_fres = fdp->sfde_func_num_fres;
+ *func_start_address = fdp->sfde_func_start_address;
+ *func_size = fdp->sfde_func_size;
+ *func_info = fdp->sfde_func_info;
+ *rep_block_size = fdp->sfde_func_rep_size;
+
+ return 0;
+}
/* Get the FRE_IDX'th FRE of the function at FUNC_IDX'th function
descriptor entry in the SFrame decoder CTX. Returns error code as
applicable. */
@@ -1579,6 +1609,37 @@ bad:
return -1;
}
+/* Add a new function descriptor entry with START_ADDR, FUNC_SIZE, FUNC_INFO
+ and REP_BLOCK_SIZE to the encoder.
+
+ This API is valid only for SFrame format version 2. */
+
+int
+sframe_encoder_add_funcdesc_v2 (sframe_encoder_ctx *encoder,
+ int32_t start_addr,
+ uint32_t func_size,
+ unsigned char func_info,
+ uint8_t rep_block_size,
+ uint32_t num_fres __attribute__ ((unused)))
+{
+ sf_fde_tbl *fd_info;
+ int err;
+
+ if (encoder == NULL
+ || sframe_encoder_get_version (encoder) == SFRAME_VERSION_1)
+ return sframe_set_errno (&err, SFRAME_ERR_INVAL);
+
+ err = sframe_encoder_add_funcdesc (encoder, start_addr, func_size, func_info,
+ num_fres);
+ if (err)
+ return SFRAME_ERR;
+
+ fd_info = encoder->sfe_funcdesc;
+ fd_info->entry[fd_info->count-1].sfde_func_rep_size = rep_block_size;
+
+ return 0;
+}
+
static int
sframe_sort_funcdesc (sframe_encoder_ctx *encoder)
{