extern void
dump_sframe (sframe_decoder_ctx *decoder, uint64_t addr);
+/* SFrame textual dump - with relocation. */
+extern void
+dump_sframe_reloc (sframe_decoder_ctx *dctx, uint64_t sec_addr, bool relocate);
+
/* Get the base reg id from the FRE info. Sets errp if fails. */
extern uint8_t
sframe_fre_get_base_reg_id (sframe_frame_row_entry *fre, int *errp);
sframe_encoder_add_funcdesc_v2;
sframe_encoder_write;
dump_sframe;
+ dump_sframe_reloc;
sframe_errmsg;
local:
# then set age to 0.
#
# CURRENT:REVISION:AGE
-1:0:0
+1:1:1
}
void
-dump_sframe (sframe_decoder_ctx *sfd_ctx, uint64_t sec_addr)
+dump_sframe_reloc (sframe_decoder_ctx *sfd_ctx, uint64_t sec_addr, bool relocate)
{
- uint8_t ver;
+ if (relocate)
+ sframe_fde_tbl_reloc_fixup (sfd_ctx);
+
+ dump_sframe (sfd_ctx, sec_addr);
+}
+void
+dump_sframe (sframe_decoder_ctx *sfd_ctx, uint64_t sec_addr)
+{
dump_sframe_header (sfd_ctx);
- ver = sframe_decoder_get_version (sfd_ctx);
+ uint8_t ver = sframe_decoder_get_version (sfd_ctx);
if (ver == SFRAME_VERSION)
dump_sframe_functions (sfd_ctx, sec_addr);
else
size_t sfe_data_size;
};
+int sframe_fde_tbl_reloc_fixup (sframe_decoder_ctx *dctx);
+
#ifdef __cplusplus
}
#endif
return NULL;
}
+/* If the input buffer containing the SFrame section has been relocated, there
+ will be a need to do fixups too. The fixup merely accounts for the offset
+ of the byte from the start of the section.
+
+ Currently used by dump_sframe. The caller must have decoded (and hence,
+ endian flipped) the input buffer before calling this function. */
+
+int
+sframe_fde_tbl_reloc_fixup (sframe_decoder_ctx *dctx)
+{
+ uint8_t sframe_ver = sframe_decoder_get_version (dctx);
+ uint32_t num_fdes = sframe_decoder_get_num_fidx (dctx);
+ unsigned int buf_offset = 0;
+ sframe_func_desc_entry *fde;
+ uint32_t i = 0;
+
+ if (sframe_ver != SFRAME_VERSION_2 || !dctx->sfd_funcdesc)
+ return SFRAME_ERR;
+
+ buf_offset += sframe_decoder_get_hdr_size (dctx);
+ while (i < num_fdes)
+ {
+ fde = &dctx->sfd_funcdesc[i];
+ fde->sfde_func_start_address += buf_offset;
+ buf_offset += sizeof (sframe_func_desc_entry);
+ i++;
+ }
+
+ return 0;
+}
+
/* Get the SFrame header size. */
static uint32_t