#include "sframe-api.h"
#include "sframe-internal.h"
-typedef sframe_func_desc_entry_v2 sframe_func_desc_entry;
+typedef sframe_func_desc_entry_v3 sframe_func_desc_entry;
/* Return TRUE if the function has been marked for deletion during the linking
process. */
SFRAME_V2_GNU_AS_LD_ENCODING_FLAGS, it is enforced that the provided
input sections also have this flag set. */
tflags |= SFRAME_F_FDE_FUNC_START_PCREL;
- htab->sfe_info.sfe_ctx = sframe_encode (SFRAME_VERSION_2,
+ htab->sfe_info.sfe_ctx = sframe_encode (SFRAME_VERSION_3,
tflags, /* SFrame flags. */
sfd_ctx_abi_arch,
sfd_ctx_fixed_fp_offset,
/* Check that all .sframe sections being linked have the same version. */
dctx_version = sframe_decoder_get_version (sfd_ctx);
ectx_version = sframe_encoder_get_version (sfe_ctx);
- if (dctx_version != SFRAME_VERSION_2 || dctx_version != ectx_version)
+ if (dctx_version != SFRAME_VERSION_3 || dctx_version != ectx_version)
{
_bfd_error_handler
(_("input SFrame sections with different format versions prevent"
num_pltn_fres = htab->sframe_plt->pltn_num_fres;
num_pltn_entries = (dpltsec->size - plt0_entry_size) / plt_entry_size;
- *ectx = sframe_encode (SFRAME_VERSION_2,
+ *ectx = sframe_encode (SFRAME_VERSION_3,
SFRAME_F_FDE_FUNC_START_PCREL,
SFRAME_ABI_S390X_ENDIAN_BIG,
SFRAME_CFA_FIXED_FP_INVALID,
break;
}
- *ectx = sframe_encode (SFRAME_VERSION_2,
+ *ectx = sframe_encode (SFRAME_VERSION_3,
SFRAME_F_FDE_FUNC_START_PCREL,
SFRAME_ABI_AMD64_ENDIAN_LITTLE,
SFRAME_CFA_FIXED_FP_INVALID,
#...
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
CFA fixed RA offset: -8
Num FDEs: 1
#...
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
CFA fixed RA offset: -8
Num FDEs: 1
# define SFRAME_FRE_TYPE_SELECTION_OPT 1
#endif
-/* gas emits SFrame Version 2 only at this time. */
-typedef sframe_func_desc_entry_v2 sframe_func_desc_entry;
+/* gas emits SFrame Version 3 only at this time. */
+typedef sframe_func_desc_entry_v3 sframe_func_desc_entry;
/* List of SFrame FDE entries. */
static void
sframe_set_version (uint32_t sframe_version ATTRIBUTE_UNUSED)
{
- sframe_ver_ops.format_version = SFRAME_VERSION_2;
+ sframe_ver_ops.format_version = SFRAME_VERSION_3;
- /* These operations remain the same for SFRAME_VERSION_2 as fre_info and
- func_info have not changed from SFRAME_VERSION_1. */
+ /* These operations remain the same for SFRAME_VERSION_3 as fre_info and
+ func_info have not changed from SFRAME_VERSION_2 and SFRAME_VERSION_1. */
sframe_ver_ops.set_fre_info = sframe_v1_set_fre_info;
(void) sframe_seg;
/* Setup the version specific access functions. */
- sframe_set_version (SFRAME_VERSION_2);
+ sframe_set_version (SFRAME_VERSION_3);
/* Process all fdes and create SFrame stack trace information. */
create_sframe_all ();
Contents of the SFrame section .sframe:
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
Num FDEs: 1
Num FREs: 3
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
Num FDEs: 1
Num FREs: 2
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
Num FDEs: 1
Num FREs: 2
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
Num FDEs: 0
Num FREs: 0
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
Num FDEs: 2
Num FREs: 6
Contents of the SFrame section .sframe:
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
Num FDEs: 1
Num FREs: 4
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
Num FDEs: 1
Num FREs: 6
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
Num FDEs: 1
Num FREs: 6
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
Num FDEs: 1
Num FREs: 1
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
Num FDEs: 0
Num FREs: 0
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
Num FDEs: 0
Num FREs: 0
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
Num FDEs: 0
Num FREs: 0
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
Num FDEs: 1
Num FREs: 5
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
Num FDEs: 1
Num FREs: 5
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
Num FDEs: 1
Num FREs: 5
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
Num FDEs: 1
Num FREs: 5
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
Num FDEs: 1
Num FREs: 4
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
CFA fixed RA offset: \-8
Num FDEs: 1
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Contents of the SFrame section .sframe:
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
CFA fixed RA offset: \-8
Num FDEs: 1
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
CFA fixed RA offset: \-8
Num FDEs: 1
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
#? CFA fixed FP offset: \-?\d+
#? CFA fixed RA offset: \-?\d+
Contents of the SFrame section .sframe:
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
CFA fixed RA offset: \-8
Num FDEs: 1
Contents of the SFrame section .sframe:
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_FUNC_START_PCREL
CFA fixed RA offset: \-8
Num FDEs: 1
/* SFrame format versions. */
#define SFRAME_VERSION_1 1
#define SFRAME_VERSION_2 2
+#define SFRAME_VERSION_3 3
/* SFrame magic number. */
#define SFRAME_MAGIC 0xdee2
/* Current version of SFrame format. */
-#define SFRAME_VERSION SFRAME_VERSION_2
+#define SFRAME_VERSION SFRAME_VERSION_3
/* Various flags for SFrame. */
#define SFRAME_V2_FUNC_INFO_UPDATE_PAUTH_KEY(pauth_key, fde_info) \
SFRAME_V1_FUNC_INFO_UPDATE_PAUTH_KEY (pauth_key, fde_info)
+typedef struct sframe_func_desc_entry_v3
+{
+ /* Function start address. Encoded as a signed offset, relative to the
+ beginning of the current FDE. */
+ int32_t sfde_func_start_address;
+ /* Size of the function in bytes. */
+ uint32_t sfde_func_size;
+ /* Offset of the first SFrame Frame Row Entry of the function, relative to the
+ beginning of the SFrame Frame Row Entry sub-section. */
+ uint32_t sfde_func_start_fre_off;
+ /* Number of frame row entries for the function. */
+ uint32_t sfde_func_num_fres;
+ /* Additional information for stack tracing from the function:
+ - 4-bits: Identify the FRE type used for the function.
+ - 1-bit: Identify the FDE type of the function - mask or inc.
+ - 1-bit: PAC authorization A/B key (aarch64).
+ - 2-bits: Unused.
+ --------------------------------------------------------------------------
+ | Unused | PAC auth A/B key (aarch64) | FDE type | FRE type |
+ | | Unused (amd64, s390x) | | |
+ --------------------------------------------------------------------------
+ 8 6 5 4 0 */
+ uint8_t sfde_func_info;
+ /* Size of the block of repeating insns. Used for SFrame FDEs of type
+ SFRAME_FDE_TYPE_PCMASK. */
+ uint8_t sfde_func_rep_size;
+ uint16_t sfde_func_padding2;
+} ATTRIBUTE_PACKED sframe_func_desc_entry_v3;
+
+/* SFrame V3 FDE. TBD comment. */
+
+#define SFRAME_V3_FUNC_INFO(fde_type, fre_enc_type) \
+ (SFRAME_V2_FUNC_INFO (fde_type, fre_enc_type))
+
+#define SFRAME_V3_FUNC_FRE_TYPE(data) (SFRAME_V2_FUNC_FRE_TYPE (data))
+#define SFRAME_V3_FUNC_FDE_TYPE(data) (SFRAME_V2_FUNC_FDE_TYPE (data))
+#define SFRAME_V3_FUNC_PAUTH_KEY(data) (SFRAME_V2_FUNC_PAUTH_KEY (data))
+
+#define SFRAME_V3_FUNC_INFO_UPDATE_PAUTH_KEY(pauth_key, fde_info) \
+ SFRAME_V2_FUNC_INFO_UPDATE_PAUTH_KEY (pauth_key, fde_info)
+
/* Size of stack frame offsets in an SFrame Frame Row Entry. A single
SFrame FRE has all offsets of the same size. Offset size may vary
across frame row entries. */
Contents of the SFrame section .sframe:
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_SORTED,
SFRAME_F_FDE_FUNC_START_PCREL
Num FDEs: 2
Contents of the SFrame section .sframe:
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_SORTED,
SFRAME_F_FDE_FUNC_START_PCREL
Num FDEs: 4
Contents of the SFrame section .sframe:
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_SORTED,
SFRAME_F_FDE_FUNC_START_PCREL
Num FDEs: 4
Contents of the SFrame section .sframe:
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_SORTED,
SFRAME_F_FDE_FUNC_START_PCREL
CFA fixed RA offset: \-8
Contents of the SFrame section .sframe:
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_SORTED,
SFRAME_F_FDE_FUNC_START_PCREL
CFA fixed RA offset: \-8
Contents of the SFrame section .sframe:
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_SORTED,
SFRAME_F_FDE_FUNC_START_PCREL
CFA fixed RA offset: \-8
Contents of the SFrame section .sframe:
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_SORTED,
SFRAME_F_FDE_FUNC_START_PCREL
CFA fixed RA offset: \-8
Contents of the SFrame section .sframe:
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_SORTED,
SFRAME_F_FDE_FUNC_START_PCREL
CFA fixed RA offset: \-8
Contents of the SFrame section .sframe:
Header :
- Version: SFRAME_VERSION_2
+ Version: SFRAME_VERSION_3
Flags: SFRAME_F_FDE_SORTED,
SFRAME_F_FDE_FUNC_START_PCREL
CFA fixed RA offset: \-8
const char *version_names[]
= { "NULL",
"SFRAME_VERSION_1",
- "SFRAME_VERSION_2" };
+ "SFRAME_VERSION_2",
+ "SFRAME_VERSION_3" };
ver = sframe_decoder_get_version (sfd_ctx);
if (ver <= SFRAME_VERSION)
sframe_fde_tbl_init (sf_fde_tbl *fde_tbl, const char *fde_buf,
size_t *fidx_size, unsigned int num_fdes, uint8_t ver)
{
- sframe_func_desc_entry_v2 *fdep = NULL;
-
- if (ver == SFRAME_VERSION_2 && SFRAME_VERSION == SFRAME_VERSION_2)
+ if (ver == SFRAME_VERSION_3 && SFRAME_VERSION == SFRAME_VERSION_3)
{
- *fidx_size = num_fdes * sizeof (sframe_func_desc_entry_int);
+ *fidx_size = num_fdes * sizeof (sframe_func_desc_entry_v3);
for (unsigned int i = 0; i < num_fdes; i++)
{
- fdep = (sframe_func_desc_entry_v2 *)fde_buf + i;
+ const sframe_func_desc_entry_v3 *fdep
+ = (sframe_func_desc_entry_v3 *)fde_buf + i;
fde_tbl->entry[i].func_start_addr = fdep->sfde_func_start_address;
fde_tbl->entry[i].func_size = fdep->sfde_func_size;
fde_tbl->entry[i].func_start_fre_off = fdep->sfde_func_start_fre_off;
}
/* If ver is not the latest, read buffer manually and upgrade from
sframe_func_desc_entry_v2 to populate the sf_fde_tbl entries. */
+ else if (ver == SFRAME_VERSION_2 && SFRAME_VERSION == SFRAME_VERSION_3)
+ {
+ *fidx_size = num_fdes * sizeof (sframe_func_desc_entry_v2);
+ for (unsigned int i = 0; i < num_fdes; i++)
+ {
+ const sframe_func_desc_entry_v2 *fdep
+ = (sframe_func_desc_entry_v2 *)fde_buf + i;
+ fde_tbl->entry[i].func_start_addr = fdep->sfde_func_start_address;
+ fde_tbl->entry[i].func_size = fdep->sfde_func_size;
+ fde_tbl->entry[i].func_start_fre_off = fdep->sfde_func_start_fre_off;
+ fde_tbl->entry[i].func_num_fres = fdep->sfde_func_num_fres;
+ fde_tbl->entry[i].func_info = fdep->sfde_func_info;
+ fde_tbl->entry[i].func_rep_size = fdep->sfde_func_rep_size;
+ }
+ fde_tbl->count = num_fdes;
+ }
else
{
/* Not possible ATM. */
static int
flip_fde (char *buf, size_t buf_size, uint8_t ver, size_t *fde_size)
{
+ if (ver == SFRAME_VERSION_3)
+ {
+ sframe_func_desc_entry_v3 *fdep = (sframe_func_desc_entry_v3 *) buf;
+ swap_thing (fdep->sfde_func_start_address);
+ swap_thing (fdep->sfde_func_size);
+ swap_thing (fdep->sfde_func_start_fre_off);
+ swap_thing (fdep->sfde_func_num_fres);
- if (ver == SFRAME_VERSION_2)
+ *fde_size = sizeof (sframe_func_desc_entry_v3);
+ }
+ else if (ver == SFRAME_VERSION_2)
{
if (buf_size < sizeof (sframe_func_desc_entry_v2))
return SFRAME_ERR;
/* Check preamble is valid. */
if (hp->sfh_preamble.sfp_magic != SFRAME_MAGIC
|| (hp->sfh_preamble.sfp_version != SFRAME_VERSION_1
- && hp->sfh_preamble.sfp_version != SFRAME_VERSION_2)
+ && hp->sfh_preamble.sfp_version != SFRAME_VERSION_2
+ && hp->sfh_preamble.sfp_version != SFRAME_VERSION_3)
|| (hp->sfh_preamble.sfp_flags & ~SFRAME_V2_F_ALL_FLAGS))
return false;
uint32_t *num_fres, uint32_t *fre_type,
uint32_t *fre_offset, size_t *fde_size)
{
- if (ver == SFRAME_VERSION_2)
+ if (ver == SFRAME_VERSION_3)
+ {
+ if (buf_size < sizeof (sframe_func_desc_entry_v3))
+ return SFRAME_ERR;
+
+ sframe_func_desc_entry_v3 *fdep = (sframe_func_desc_entry_v3 *) buf;
+ *num_fres = fdep->sfde_func_num_fres;
+ *fre_type = SFRAME_V1_FUNC_FRE_TYPE (fdep->sfde_func_info);
+ *fre_offset = fdep->sfde_func_start_fre_off;
+
+ *fde_size = sizeof (sframe_func_desc_entry_v3);
+ }
+ else if (ver == SFRAME_VERSION_2)
{
if (buf_size < sizeof (sframe_func_desc_entry_v2))
return SFRAME_ERR;
else if (errp)
*errp = 0;
- return (sframe_decoder_get_hdr_size (dctx)
- + func_idx * sizeof (sframe_func_desc_entry_v2)
- + offsetof (sframe_func_desc_entry_v2, sfde_func_start_address));
+ if (sframe_decoder_get_version (dctx) == SFRAME_VERSION_3)
+ return (sframe_decoder_get_hdr_size (dctx)
+ + func_idx * sizeof (sframe_func_desc_entry_v3)
+ + offsetof (sframe_func_desc_entry_v3, sfde_func_start_address));
+ else if (sframe_decoder_get_version (dctx) == SFRAME_VERSION_2)
+ return (sframe_decoder_get_hdr_size (dctx)
+ + func_idx * sizeof (sframe_func_desc_entry_v2)
+ + offsetof (sframe_func_desc_entry_v2, sfde_func_start_address));
+ else
+ sframe_ret_set_errno (errp, SFRAME_ERR_INVAL);
+
+ return 0;
}
/* Find the function descriptor entry starting which contains the specified
*errp = 0;
return (sframe_encoder_get_hdr_size (ectx)
- + func_idx * sizeof (sframe_func_desc_entry_v2)
- + offsetof (sframe_func_desc_entry_v2, sfde_func_start_address));
+ + func_idx * sizeof (sframe_func_desc_entry_v3)
+ + offsetof (sframe_func_desc_entry_v3, sfde_func_start_address));
}
/* Add an SFrame FRE to function at FUNC_IDX'th function descriptor entry in
char *contents, sframe_func_desc_entry_int *fde,
size_t *fde_write_size)
{
- sframe_func_desc_entry_v2 *fdep = (sframe_func_desc_entry_v2 *)contents;
+ sframe_func_desc_entry_v3 *fdep = (sframe_func_desc_entry_v3 *)contents;
fdep->sfde_func_start_address = (int32_t)fde->func_start_addr;
fdep->sfde_func_size = fde->func_size;
fdep->sfde_func_rep_size = fde->func_rep_size;
fdep->sfde_func_padding2 = 0;
- *fde_write_size = sizeof (sframe_func_desc_entry_v2);
+ *fde_write_size = sizeof (sframe_func_desc_entry_v3);
return 0;
}
contents = ectx->sfe_data;
buf_size = ectx->sfe_data_size;
num_fdes = sframe_encoder_get_num_fidx (ectx);
- all_fdes_size = num_fdes * sizeof (sframe_func_desc_entry_v2);
+ all_fdes_size = num_fdes * sizeof (sframe_func_desc_entry_v3);
ehp = sframe_encoder_get_header (ectx);
hdr_size = sframe_get_hdr_size (ehp);
ehp = sframe_encoder_get_header (ectx);
hdrsize = sframe_get_hdr_size (ehp);
- fsz = sframe_encoder_get_num_fidx (ectx) * sizeof (sframe_func_desc_entry_v2);
+ fsz = sframe_encoder_get_num_fidx (ectx) * sizeof (sframe_func_desc_entry_v3);
fresz = ectx->sfe_fre_nbytes;
/* Encoder writes out data in the latest SFrame format version. */