This change enables support text > 2 GiB in SFrame format.
Each SFrame FDE needs to hold information about the start PC of the
function it pertains to. Currently, the field 'sfde_func_start_address'
in SFrame FDE is encoded as a 32-bit offset to the start PC of the
function from the field itself.
In SFrame V2, this offset was a signed 32-bit offset. The signedness
gives the flexibility of having .sframe ELF section before or after the
.text* sections. But the size of 32-bit puts the limitation that
.sframe togther with the .text* sections must fit the 2 GiB range.
Currently, if the linker sees the offset not representable as 32-bit
signed offset, it issues an error (not seen in the wild, simulated by
forcing a function to align via an '.align
2147483648' directive):
test.o:(.sframe+0x1c): relocation truncated to fit: R_X86_64_PC32 against `.text'
make: *** [Makefile:7: all] Error 1
ATM, EH Frame also suffers with the same issue.
Moving forward, some cloud applications have been shown to be nearing
1.5 GiB threshold. Extending the offset to int64_t now seems to be good
choice to make now for future-proof'ing the sections.
The use of int64_t offset is done for all SFrame V3 sections. This
bump from int32_t to int64_t should not lead to an increase in the size
of SFrame sections, because of the following additional changes to the
SFrame FDE specification:
- Reduce the type of sfde_func_num_fres (from uint32_t to uint16_t)
- Remove the 2 bytes of padding (sfde_func_padding2). These served the
two-fold purpose of keeping FDE data aligned _and_ unused space for
future needs.
Now that the offset is int64_t, start using the
sframe_decoder_get_funcdesc_v3 () instead of
sframe_decoder_get_funcdesc_v2 () in GNU ld.
This patch changes the offset type in the SFrame FDE definition to an
int64_t. No further changes in gas are necessary because the code
already accounts for writing out as per the size of the member of the
struct:
emit_expr (&exp, sizeof_member (sframe_func_desc_entry,
sfde_func_start_address));
bfd/
* elf-sframe.c (sframe_read_value): Signed offset for start PC
is 8-bytes now.
(_bfd_elf_merge_section_sframe): Likewise.
* elf64-s390.c (_bfd_s390_elf_create_sframe_plt): Use V3 API.
(elf_s390_finish_dynamic_sections): Signed offset for start PC
is 8-bytes now.
* elfxx-x86.c (_bfd_x86_elf_create_sframe_plt): Use V3 API.
(_bfd_x86_elf_finish_dynamic_sections): Signed offset for start
PC is 8-bytes now.
libsframe/
* sframe-dump.c (dump_sframe_func_with_fres): Use int64_t.
* sframe.c (sframe_decoder_get_secrel_func_start_addr): Likewise.
(sframe_fre_check_range_p): Likewise.
(sframe_find_fre): Likewise.
(sframe_encoder_add_funcdesc): Likewise.
(sframe_encoder_write_fde): Write out int64_t now.
libsframe/testsuite/
* libsframe.decode/DATA2: Regenerate the data file.
* libsframe.encode/encode-1.c: Use int64_t for start pc offset.
* libsframe.find/findfre-1.c: Likewise.
* libsframe.find/findfunc-1.c: Likewise.
* libsframe.find/plt-findfre-1.c: Likewise.
* libsframe.find/plt-findfre-2.c: Likewise.
include/
* sframe-api.h (sframe_find_fre): Update arg type to int64_t.
(sframe_encoder_add_funcdesc): Likewise.
* sframe.h: Change data type to int64_t.
unsigned int width)
{
BFD_ASSERT (contents && offset);
- /* Supporting the usecase of reading only the 4-byte relocated
- value (signed offset for func start addr) for now. */
- BFD_ASSERT (width == 4);
+ /* ATM, for SFrame, the sole usecase is of reading only the 8-byte relocated
+ value (signed offset for func start addr). */
+ BFD_ASSERT (width == 8);
/* FIXME endianness ?? */
unsigned char *buf = contents + offset;
- bfd_vma value = bfd_get_signed_32 (abfd, buf);
+ bfd_vma value = bfd_get_signed_64 (abfd, buf);
return value;
}
uint32_t num_fidx = sframe_decoder_get_num_fidx (sfd_ctx);
uint32_t num_enc_fidx = sframe_encoder_get_num_fidx (sfe_ctx);
+ uint8_t reloc_size = 8;
for (i = 0; i < num_fidx; i++)
{
unsigned int num_fres = 0;
- int32_t func_start_addr;
+ int64_t func_start_addr;
bfd_vma address;
uint32_t func_size = 0;
unsigned char func_info = 0;
unsigned int pltn_r_offset = 0;
uint8_t rep_block_size = 0;
- if (!sframe_decoder_get_funcdesc_v2 (sfd_ctx, i, &num_fres, &func_size,
+ if (!sframe_decoder_get_funcdesc_v3 (sfd_ctx, i, &num_fres, &func_size,
&func_start_addr, &func_info,
&rep_block_size))
{
}
/* Get the SFrame FDE function start address after relocation. */
- address = sframe_read_value (abfd, contents, r_offset, 4);
+ address = sframe_read_value (abfd, contents, r_offset,
+ reloc_size);
if (pltn_reloc_by_hand)
- address += sframe_read_value (abfd, contents,
- pltn_r_offset, 4);
+ address += sframe_read_value (abfd, contents, pltn_r_offset,
+ reloc_size);
address += (sec->output_offset + r_offset);
/* SFrame FDE function start address is an offset from the
sfde_func_start_address field to the start PC. The
}
/* Update the encoder context with updated content. */
- int err = sframe_encoder_add_funcdesc_v2 (sfe_ctx, func_start_addr,
+ int err = sframe_encoder_add_funcdesc_v3 (sfe_ctx, func_start_addr,
func_size, func_info,
rep_block_size, num_fres);
cur_fidx++;
{
/* Add SFrame FDE for PLT0, the function start address is updated later
at _bfd_elf_merge_section_sframe time. */
- sframe_encoder_add_funcdesc_v2 (*ectx,
+ sframe_encoder_add_funcdesc_v3 (*ectx,
0, /* func start addr. */
plt0_entry_size,
func_info,
function start address = plt0_entry_size. As usual, this will be
updated later at _bfd_elf_merge_section_sframe, by when the
sections are relocated. */
- sframe_encoder_add_funcdesc_v2 (*ectx,
+ sframe_encoder_add_funcdesc_v3 (*ectx,
plt0_entry_size, /* func start addr. */
dpltsec->size - plt0_entry_size,
func_info,
bfd_vma sframe_start = htab->plt_sframe->output_section->vma
+ htab->plt_sframe->output_offset
+ PLT_SFRAME_FDE_START_OFFSET;
- bfd_put_signed_32 (dynobj, plt_start - sframe_start,
+ bfd_put_signed_64 (dynobj, plt_start - sframe_start,
htab->plt_sframe->contents
+ PLT_SFRAME_FDE_START_OFFSET);
}
{
/* Add SFrame FDE for plt0, the function start address is updated later
at _bfd_elf_merge_section_sframe time. */
- sframe_encoder_add_funcdesc_v2 (*ectx,
+ sframe_encoder_add_funcdesc_v3 (*ectx,
0, /* func start addr. */
plt0_entry_size,
func_info,
function start address = plt0_entry_size. As usual, this will be
updated later at _bfd_elf_merge_section_sframe, by when the
sections are relocated. */
- sframe_encoder_add_funcdesc_v2 (*ectx,
+ sframe_encoder_add_funcdesc_v3 (*ectx,
plt0_entry_size, /* func start addr. */
dpltsec->size - plt0_entry_size,
func_info,
+ PLT_SFRAME_FDE_START_OFFSET;
bfd_put_signed_32 (dynobj, test_value,
#endif
- bfd_put_signed_32 (dynobj, plt_start - sframe_start,
+ bfd_put_signed_64 (dynobj, plt_start - sframe_start,
htab->plt_sframe->contents
+ PLT_SFRAME_FDE_START_OFFSET);
}
+ PLT_SFRAME_FDE_START_OFFSET;
bfd_put_signed_32 (dynobj, test_value,
#endif
- bfd_put_signed_32 (dynobj, plt_start - sframe_start,
+ bfd_put_signed_64 (dynobj, plt_start - sframe_start,
htab->plt_second_sframe->contents
+ PLT_SFRAME_FDE_START_OFFSET);
}
= (htab->plt_got_sframe->output_section->vma
+ htab->plt_got_sframe->output_offset
+ PLT_SFRAME_FDE_START_OFFSET);
- bfd_put_signed_32 (dynobj, plt_start - sframe_start,
+ bfd_put_signed_64 (dynobj, plt_start - sframe_start,
htab->plt_got_sframe->contents
+ PLT_SFRAME_FDE_START_OFFSET);
}
SFRAME_ERR if failure. */
extern int
-sframe_find_fre (const sframe_decoder_ctx *ctx, int32_t pc,
+sframe_find_fre (const sframe_decoder_ctx *ctx, int64_t pc,
sframe_frame_row_entry *frep);
/* Get the FRE_IDX'th FRE of the function at FUNC_IDX'th function
the encoder context ECTX. */
extern int
sframe_encoder_add_funcdesc (sframe_encoder_ctx *ectx,
- int32_t start_addr,
+ int64_t start_addr,
uint32_t func_size);
/* Add a new SFrame function descriptor entry with START_ADDR, FUNC_SIZE,
{
/* Function start address. Encoded as a signed offset, relative to the
beginning of the current FDE. */
- int32_t sfde_func_start_address;
+ int64_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
uint32_t j = 0;
uint32_t num_fres = 0;
uint32_t func_size = 0;
- int32_t func_start_address = 0;
unsigned char func_info = 0;
uint8_t rep_block_size = 0;
sframe_frame_row_entry fre;
+ uint8_t ver = sframe_decoder_get_version (sfd_ctx);
+ sframe_assert (ver == SFRAME_VERSION_3 || ver == SFRAME_VERSION_2);
/* Get the SFrame function descriptor. */
- sframe_decoder_get_funcdesc_v2 (sfd_ctx, funcidx, &num_fres,
- &func_size, &func_start_address,
- &func_info, &rep_block_size);
+ if (ver == SFRAME_VERSION_3)
+ {
+ int64_t func_start_addr = 0;
+ sframe_decoder_get_funcdesc_v3 (sfd_ctx, funcidx, &num_fres,
+ &func_size, &func_start_addr,
+ &func_info, &rep_block_size);
+ func_start_pc_vma = func_start_addr + sec_addr;
+ }
+ else
+ {
+ int32_t func_start_addr = 0;
+ sframe_decoder_get_funcdesc_v2 (sfd_ctx, funcidx, &num_fres, &func_size,
+ &func_start_addr, &func_info,
+ &rep_block_size);
+ func_start_pc_vma = func_start_addr + sec_addr;
+ }
+
/* Calculate the virtual memory address for function start pc. Some older
SFrame V2 sections in ET_DYN or ET_EXEC may still have the
SFRAME_F_FDE_FUNC_START_PCREL flag unset, and hence may be using the
old encoding. Continue to support dumping the sections at least. */
- func_start_pc_vma = func_start_address + sec_addr;
if (sframe_decoder_get_flags (sfd_ctx) & SFRAME_F_FDE_FUNC_START_PCREL)
func_start_pc_vma += sframe_decoder_get_offsetof_fde_start_addr (sfd_ctx,
funcidx,
void
dump_sframe (const sframe_decoder_ctx *sfd_ctx, uint64_t sec_addr)
{
- uint8_t ver;
-
dump_sframe_header (sfd_ctx);
- ver = sframe_decoder_get_version (sfd_ctx);
- if (ver == SFRAME_VERSION)
+ uint8_t ver = sframe_decoder_get_version (sfd_ctx);
+ /* Although newer gas and ld do not generate SFrame V2, continue to support
+ textual dump of SFrame V2 sections ATM. */
+ if (ver == SFRAME_VERSION_3 || ver == SFRAME_VERSION_2)
dump_sframe_functions (sfd_ctx, sec_addr);
else
printf ("\n No further information can be displayed. %s",
If FUNC_IDX is not a valid index in the given decoder object, returns 0. */
-static int32_t
+static int64_t
sframe_decoder_get_secrel_func_start_addr (const sframe_decoder_ctx *dctx,
uint32_t func_idx)
{
return 0;
const sframe_func_desc_entry_int *fdep = &dctx->sfd_funcdesc->entry[func_idx];
- int32_t func_start_addr = fdep->func_start_addr;
+ int64_t func_start_addr = fdep->func_start_addr;
return func_start_addr + offsetof_fde_in_sec;
}
static bool
sframe_fre_check_range_p (const sframe_decoder_ctx *dctx, uint32_t func_idx,
uint32_t start_ip_offset, uint32_t end_ip_offset,
- int32_t pc)
+ int64_t pc)
{
sframe_func_desc_entry_int *fdep;
- int32_t func_start_addr;
+ int64_t func_start_addr;
uint8_t rep_block_size;
uint32_t fde_type;
uint32_t pc_offset;
static sframe_func_desc_entry_int *
sframe_get_funcdesc_with_addr_internal (const sframe_decoder_ctx *ctx,
- int32_t addr, int *errp,
+ int64_t addr, int *errp,
uint32_t *func_idx)
{
sframe_func_desc_entry_int *fdp;
SFRAME_ERR if failure. */
int
-sframe_find_fre (const sframe_decoder_ctx *ctx, int32_t pc,
+sframe_find_fre (const sframe_decoder_ctx *ctx, int64_t pc,
sframe_frame_row_entry *frep)
{
sframe_frame_row_entry cur_fre;
sframe_func_desc_entry_int *fdep;
uint32_t func_idx;
uint32_t fre_type, i;
- int32_t func_start_addr;
+ int64_t func_start_addr;
uint32_t start_ip_offset, end_ip_offset;
const char *fres;
size_t size = 0;
static int
sframe_encoder_add_funcdesc_internal (sframe_encoder_ctx *ectx,
- int32_t start_addr,
+ int64_t start_addr,
uint32_t func_size)
{
sframe_header *ehp;
the encoder context ECTX. */
int
-sframe_encoder_add_funcdesc (sframe_encoder_ctx *ectx, int32_t start_addr,
+sframe_encoder_add_funcdesc (sframe_encoder_ctx *ectx, int64_t start_addr,
uint32_t func_size)
{
int err = 0;
{
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_start_address = fde->func_start_addr;
fdep->sfde_func_size = fde->func_size;
fdep->sfde_func_start_fre_off = fde->func_start_fre_off;
fdep->sfde_func_num_fres = (uint16_t)fde->func_num_fres;
#include "sframe-test.h"
static int
-add_fde1 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
- uint32_t sframe_vaddr, int idx, uint32_t *func_size)
+add_fde1 (sframe_encoder_ctx *encode, int64_t start_pc_vaddr,
+ int64_t sframe_vaddr, int idx, uint32_t *func_size)
{
#define FDE1_NUM_FRES 4
/* A contiguous block containing 4 FREs. */
uint32_t offsetof_fde_in_sec
= sframe_encoder_get_offsetof_fde_start_addr (encode, idx, NULL);
- int32_t func1_start_addr = (start_pc_vaddr
+ int64_t func1_start_addr = (start_pc_vaddr
- (sframe_vaddr + offsetof_fde_in_sec));
unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
SFRAME_FDE_TYPE_PCINC);
- int err = sframe_encoder_add_funcdesc_v2 (encode, func1_start_addr,
+ int err = sframe_encoder_add_funcdesc_v3 (encode, func1_start_addr,
*func_size, finfo, 0,
FDE1_NUM_FRES);
if (err == -1)
}
static int
-add_fde2 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
- uint32_t sframe_vaddr, int idx, uint32_t *func_size)
+add_fde2 (sframe_encoder_ctx *encode, int64_t start_pc_vaddr,
+ int64_t sframe_vaddr, int idx, uint32_t *func_size)
{
/* A contiguous block containing 4 FREs. */
uint32_t offsetof_fde_in_sec
= sframe_encoder_get_offsetof_fde_start_addr (encode, idx, NULL);
- int32_t func1_start_addr = (start_pc_vaddr
+ int64_t func1_start_addr = (start_pc_vaddr
- (sframe_vaddr + offsetof_fde_in_sec));
unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
SFRAME_FDE_TYPE_PCINC);
- int err = sframe_encoder_add_funcdesc_v2 (encode, func1_start_addr,
+ int err = sframe_encoder_add_funcdesc_v3 (encode, func1_start_addr,
*func_size, finfo, 0,
FDE1_NUM_FRES);
if (err == -1)
{
sframe_encoder_ctx *encode;
sframe_frame_row_entry frep;
- uint32_t sframe_vaddr;
- uint32_t func1_start_vaddr;
- uint32_t func2_start_vaddr;
+ int64_t sframe_vaddr;
+ int64_t func1_start_vaddr;
+ int64_t func2_start_vaddr;
uint32_t func1_size = 0;
uint32_t func2_size = 0;
char *sframe_buf;
#include "sframe-test.h"
static int
-add_fde1 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
- uint32_t sframe_vaddr, int idx, uint32_t *func_size)
+add_fde1 (sframe_encoder_ctx *encode, int64_t start_pc_vaddr,
+ int64_t sframe_vaddr, int idx, uint32_t *func_size)
{
/* A contiguous block containing 4 FREs. */
#define FDE1_NUM_FRES 4
uint32_t offsetof_fde_in_sec
= sframe_encoder_get_offsetof_fde_start_addr (encode, idx, NULL);
- int32_t func1_start_addr = (start_pc_vaddr
+ int64_t func1_start_addr = (start_pc_vaddr
- (sframe_vaddr + offsetof_fde_in_sec));
unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
SFRAME_FDE_TYPE_PCINC);
- int err = sframe_encoder_add_funcdesc_v2 (encode, func1_start_addr,
+ int err = sframe_encoder_add_funcdesc_v3 (encode, func1_start_addr,
*func_size, finfo, 0,
FDE1_NUM_FRES);
if (err == -1)
}
static int
-add_fde2 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
- uint32_t sframe_vaddr, int idx, uint32_t *func_size)
+add_fde2 (sframe_encoder_ctx *encode, int64_t start_pc_vaddr,
+ int64_t sframe_vaddr, int idx, uint32_t *func_size)
{
/* A contiguous block containing 4 FREs. */
#define FDE2_NUM_FRES 4
uint32_t offsetof_fde_in_sec
= sframe_encoder_get_offsetof_fde_start_addr (encode, idx, NULL);
- int32_t func2_start_addr = (start_pc_vaddr
+ int64_t func2_start_addr = (start_pc_vaddr
- (sframe_vaddr + offsetof_fde_in_sec));
unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
SFRAME_FDE_TYPE_PCINC);
- int err = sframe_encoder_add_funcdesc_v2 (encode, func2_start_addr,
+ int err = sframe_encoder_add_funcdesc_v3 (encode, func2_start_addr,
*func_size, finfo, 0,
FDE2_NUM_FRES);
if (err == -1)
}
static
-void test_text_findfre (const char suffix, uint32_t text_vaddr,
- uint32_t sframe_vaddr)
+void test_text_findfre (const char suffix, int64_t text_vaddr,
+ int64_t sframe_vaddr)
{
sframe_encoder_ctx *encode;
sframe_decoder_ctx *dctx;
sframe_frame_row_entry frep;
- uint32_t func1_start_vaddr;
- uint32_t func2_start_vaddr;
+ int64_t func1_start_vaddr;
+ int64_t func2_start_vaddr;
uint32_t func1_size = 0;
uint32_t func2_size = 0;
uint32_t fde_cnt = 0;
- int32_t lookup_pc;
+ int64_t lookup_pc;
char *sframe_buf;
size_t sf_size;
int err = 0;
int main (void)
{
- uint32_t sframe_vaddr = 0x402220;
- uint32_t text_vaddr = 0x401020;
- printf ("Testing with text_vaddr = %#x; sframe_vaddr = %#x\n", text_vaddr,
+ int64_t sframe_vaddr = 0x402220;
+ int64_t text_vaddr = 0x401020;
+ printf ("Testing with text_vaddr = %#lx; sframe_vaddr = %#lx\n", text_vaddr,
sframe_vaddr);
test_text_findfre ('a', text_vaddr, sframe_vaddr);
sframe_vaddr = 0x401020;
text_vaddr = 0x402220;
- printf ("Testing with text_vaddr = %#x; sframe_vaddr = %#x\n", text_vaddr,
+ printf ("Testing with text_vaddr = %#lx; sframe_vaddr = %#lx\n", text_vaddr,
sframe_vaddr);
test_text_findfre ('b', text_vaddr, sframe_vaddr);
}
#include "sframe-test.h"
static int
-add_fde1 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
- uint32_t sframe_vaddr, int idx, uint32_t *func_size)
+add_fde1 (sframe_encoder_ctx *encode, int64_t start_pc_vaddr,
+ int64_t sframe_vaddr, int idx, uint32_t *func_size)
{
/* A contiguous block containing 4 FREs. */
#define FDE1_NUM_FRES 4
uint32_t offsetof_fde_in_sec
= sframe_encoder_get_offsetof_fde_start_addr (encode, idx, NULL);
- int32_t func1_start_addr = (start_pc_vaddr
+ int64_t func1_start_addr = (start_pc_vaddr
- (sframe_vaddr + offsetof_fde_in_sec));
unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
SFRAME_FDE_TYPE_PCINC);
- int err = sframe_encoder_add_funcdesc_v2 (encode, func1_start_addr,
+ int err = sframe_encoder_add_funcdesc_v3 (encode, func1_start_addr,
*func_size, finfo, 0,
FDE1_NUM_FRES);
if (err == -1)
}
static int
-add_fde2 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
- uint32_t sframe_vaddr, int idx, uint32_t *func_size)
+add_fde2 (sframe_encoder_ctx *encode, int64_t start_pc_vaddr,
+ int64_t sframe_vaddr, int idx, uint32_t *func_size)
{
/* A contiguous block containing 4 FREs. */
#define FDE2_NUM_FRES 4
uint32_t offsetof_fde_in_sec
= sframe_encoder_get_offsetof_fde_start_addr (encode, idx, NULL);
- int32_t func2_start_addr = (start_pc_vaddr
+ int64_t func2_start_addr = (start_pc_vaddr
- (sframe_vaddr + offsetof_fde_in_sec));
unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
SFRAME_FDE_TYPE_PCINC);
- int err = sframe_encoder_add_funcdesc_v2 (encode, func2_start_addr,
+ int err = sframe_encoder_add_funcdesc_v3 (encode, func2_start_addr,
*func_size, finfo, 0,
FDE2_NUM_FRES);
if (err == -1)
}
static int
-add_fde3 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr,
- uint32_t sframe_vaddr, int idx, uint32_t *func_size)
+add_fde3 (sframe_encoder_ctx *encode, int64_t start_pc_vaddr,
+ int64_t sframe_vaddr, int idx, uint32_t *func_size)
{
/* A contiguous block containing 4 FREs. */
#define FDE3_NUM_FRES 4
uint32_t offsetof_fde_in_sec
= sframe_encoder_get_offsetof_fde_start_addr (encode, idx, NULL);
- int32_t func3_start_addr = (start_pc_vaddr
+ int64_t func3_start_addr = (start_pc_vaddr
- (sframe_vaddr + offsetof_fde_in_sec));
unsigned char finfo = sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1,
SFRAME_FDE_TYPE_PCINC);
- int err = sframe_encoder_add_funcdesc_v2 (encode, func3_start_addr,
+ int err = sframe_encoder_add_funcdesc_v3 (encode, func3_start_addr,
*func_size, finfo, 0,
FDE3_NUM_FRES);
if (err == -1)
}
static
-void test_text_findfre (const char suffix, uint32_t text_vaddr,
- uint32_t sframe_vaddr)
+void test_text_findfre (const char suffix, int64_t text_vaddr,
+ int64_t sframe_vaddr)
{
sframe_encoder_ctx *encode;
sframe_decoder_ctx *dctx;
sframe_frame_row_entry frep;
- uint32_t func1_start_vaddr;
- uint32_t func2_start_vaddr;
- uint32_t func3_start_vaddr;
+ int64_t func1_start_vaddr;
+ int64_t func2_start_vaddr;
+ int64_t func3_start_vaddr;
uint32_t func1_size = 0;
uint32_t func2_size = 0;
uint32_t func3_size = 0;
uint32_t fde_cnt = 0;
- int32_t lookup_pc = 0;
+ int64_t lookup_pc = 0;
char *sframe_buf;
size_t sf_size;
int err = 0;
int main (void)
{
- uint32_t sframe_vaddr = 0x4b5620;
- uint32_t text_vaddr = 0x4038b0;
- printf ("Testing with text_vaddr = %#x; sframe_vaddr = %#x\n", text_vaddr,
+ int64_t sframe_vaddr = 0x4b5620;
+ int64_t text_vaddr = 0x4038b0;
+ printf ("Testing with text_vaddr = %#lx; sframe_vaddr = %#lx\n", text_vaddr,
sframe_vaddr);
test_text_findfre ('a', text_vaddr, sframe_vaddr);
sframe_vaddr = 0x4038b0;
text_vaddr = 0x4b5620;
- printf ("Testing with text_vaddr = %#x; sframe_vaddr = %#x\n", text_vaddr,
+ printf ("Testing with text_vaddr = %#lx; sframe_vaddr = %#lx\n", text_vaddr,
sframe_vaddr);
test_text_findfre ('b', text_vaddr, sframe_vaddr);
}
#include "sframe-test.h"
static int
-add_plt_fde1 (sframe_encoder_ctx *ectx, uint32_t plt_vaddr,
- uint32_t sframe_vaddr, int idx)
+add_plt_fde1 (sframe_encoder_ctx *ectx, int64_t plt_vaddr,
+ int64_t sframe_vaddr, int idx)
{
/* A contiguous block containing 3 FREs. The start_ip_offset must remain
less than 16 bytes. */
SFRAME_FDE_TYPE_PCMASK);
uint32_t offsetof_fde_in_sec
= sframe_encoder_get_offsetof_fde_start_addr (ectx, idx, NULL);
- int32_t func_start_addr = (plt_vaddr
+ int64_t func_start_addr = (plt_vaddr
- (sframe_vaddr + offsetof_fde_in_sec));
/* 5 pltN entries of 16 bytes each. */
- int err = sframe_encoder_add_funcdesc_v2 (ectx, func_start_addr,
+ int err = sframe_encoder_add_funcdesc_v3 (ectx, func_start_addr,
16 * 5 /* func size in bytes. */,
finfo,
16 /* rep block size in bytes. */,
}
static
-void test_plt_findfre (const char suffix, uint32_t plt_vaddr,
- uint32_t sframe_vaddr)
+void test_plt_findfre (const char suffix, int64_t plt_vaddr,
+ int64_t sframe_vaddr)
{
sframe_encoder_ctx *ectx;
sframe_decoder_ctx *dctx;
int main (void)
{
- uint32_t sframe_vaddr = 0x402220;
- uint32_t plt_vaddr = 0x401020;
- printf ("Testing with plt_vaddr = %#x; sframe_vaddr = %#x\n", plt_vaddr,
+ int64_t sframe_vaddr = 0x402220;
+ int64_t plt_vaddr = 0x401020;
+ printf ("Testing with plt_vaddr = %#lx; sframe_vaddr = %#lx\n", plt_vaddr,
sframe_vaddr);
test_plt_findfre ('a', plt_vaddr, sframe_vaddr);
sframe_vaddr = 0x401020;
plt_vaddr = 0x402220;
- printf ("Testing with plt_vaddr = %#x; sframe_vaddr = %#x\n", plt_vaddr,
+ printf ("Testing with plt_vaddr = %#lx; sframe_vaddr = %#lx\n", plt_vaddr,
sframe_vaddr);
test_plt_findfre ('b', plt_vaddr, sframe_vaddr);
}
#define PLTN_CFA_OFFSET_MAGIC 8
static int
-add_plt0_fde (sframe_encoder_ctx *ectx, uint32_t plt_vaddr,
- uint32_t sframe_vaddr, int idx)
+add_plt0_fde (sframe_encoder_ctx *ectx, int64_t plt_vaddr,
+ int64_t sframe_vaddr, int idx)
{
/* 1 single FRE. */
sframe_frame_row_entry fre
uint32_t offsetof_fde_in_sec
= sframe_encoder_get_offsetof_fde_start_addr (ectx, idx, NULL);
- int32_t func_start_addr = (plt_vaddr
+ int64_t func_start_addr = (plt_vaddr
- (sframe_vaddr + offsetof_fde_in_sec));
/* 1 PCINC-type FDE for 1 plt0 entry of 32 bytes. */
- int err = sframe_encoder_add_funcdesc_v2 (ectx, func_start_addr,
+ int err = sframe_encoder_add_funcdesc_v3 (ectx, func_start_addr,
PLT_SIZE /* func size. */,
finfo,
0 /* rep block size. */,
}
static int
-add_pltn_fde (sframe_encoder_ctx *ectx, uint32_t plt_vaddr,
- uint32_t sframe_vaddr, int idx)
+add_pltn_fde (sframe_encoder_ctx *ectx, int64_t plt_vaddr,
+ int64_t sframe_vaddr, int idx)
{
/* 1 single FRE. */
sframe_frame_row_entry fre
uint32_t offsetof_fde_in_sec
= sframe_encoder_get_offsetof_fde_start_addr (ectx, idx, NULL);
- int32_t func_start_addr = (plt_vaddr
+ int64_t func_start_addr = (plt_vaddr
- (sframe_vaddr + offsetof_fde_in_sec));
/* 1 PCMASK-type FDE for 5 pltN entries of 32 bytes each. */
- int err = sframe_encoder_add_funcdesc_v2 (ectx, func_start_addr,
+ int err = sframe_encoder_add_funcdesc_v3 (ectx, func_start_addr,
5 * PLT_SIZE /* func size. */,
finfo,
PLT_SIZE /* rep block size. */,
}
static
-void test_plt_findfre (const char suffix, const uint32_t plt_vaddr,
- const uint32_t sframe_vaddr)
+void test_plt_findfre (const char suffix, const int64_t plt_vaddr,
+ const int64_t sframe_vaddr)
{
sframe_encoder_ctx *ectx;
sframe_decoder_ctx *dctx;
int
main (void)
{
- uint32_t sframe_vaddr = 0x402220;
- uint32_t plt_vaddr = 0x401020;
- printf ("plt-findfre-2a: Testing with plt_vaddr = %#x; sframe_vaddr = %#x\n",
+ int64_t sframe_vaddr = 0x402220;
+ int64_t plt_vaddr = 0x401020;
+ printf ("plt-findfre-2a: Testing with plt_vaddr = %#lx; sframe_vaddr = %#lx\n",
plt_vaddr, sframe_vaddr);
test_plt_findfre ('a', plt_vaddr, sframe_vaddr);
sframe_vaddr = 0x401020;
plt_vaddr = 0x402220;
- printf ("plt-findfre-2b: Testing with plt_vaddr = %#x; sframe_vaddr = %#x\n",
+ printf ("plt-findfre-2b: Testing with plt_vaddr = %#lx; sframe_vaddr = %#lx\n",
plt_vaddr, sframe_vaddr);
test_plt_findfre ('b', plt_vaddr, sframe_vaddr);