From: Indu Bhagat Date: Tue, 28 Oct 2025 08:39:55 +0000 (-0700) Subject: [SFrame-V3] include: libsframe: bfd: gas: testsuite: support for signed 64-bit offset... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=64acda1eaf6844e7ef9633763a87a98c60a52b4b;p=thirdparty%2Fbinutils-gdb.git [SFrame-V3] include: libsframe: bfd: gas: testsuite: support for signed 64-bit offset in SFrame FDE 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. --- diff --git a/bfd/elf-sframe.c b/bfd/elf-sframe.c index 5c7941b3ea3..ba4827819ad 100644 --- a/bfd/elf-sframe.c +++ b/bfd/elf-sframe.c @@ -151,12 +151,12 @@ sframe_read_value (bfd *abfd, bfd_byte *contents, unsigned int offset, 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; } @@ -468,11 +468,12 @@ _bfd_elf_merge_section_sframe (bfd *abfd, 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; @@ -481,7 +482,7 @@ _bfd_elf_merge_section_sframe (bfd *abfd, 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)) { @@ -525,10 +526,11 @@ _bfd_elf_merge_section_sframe (bfd *abfd, } /* 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 @@ -547,7 +549,7 @@ _bfd_elf_merge_section_sframe (bfd *abfd, } /* 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++; diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c index aaa2d327d7e..ae609903d80 100644 --- a/bfd/elf64-s390.c +++ b/bfd/elf64-s390.c @@ -1612,7 +1612,7 @@ _bfd_s390_elf_create_sframe_plt (struct bfd_link_info *info) { /* 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, @@ -1640,7 +1640,7 @@ _bfd_s390_elf_create_sframe_plt (struct bfd_link_info *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, @@ -4030,7 +4030,7 @@ elf_s390_finish_dynamic_sections (bfd *output_bfd, 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); } diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c index f0b021f1549..5f610ab3fc1 100644 --- a/bfd/elfxx-x86.c +++ b/bfd/elfxx-x86.c @@ -1923,7 +1923,7 @@ _bfd_x86_elf_create_sframe_plt (bfd *output_bfd, { /* 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, @@ -1952,7 +1952,7 @@ _bfd_x86_elf_create_sframe_plt (bfd *output_bfd, 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, @@ -3007,7 +3007,7 @@ _bfd_x86_elf_finish_dynamic_sections (bfd *output_bfd, + 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); } @@ -3041,7 +3041,7 @@ _bfd_x86_elf_finish_dynamic_sections (bfd *output_bfd, + 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); } @@ -3068,7 +3068,7 @@ _bfd_x86_elf_finish_dynamic_sections (bfd *output_bfd, = (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); } diff --git a/include/sframe-api.h b/include/sframe-api.h index a4ba797794f..07454456356 100644 --- a/include/sframe-api.h +++ b/include/sframe-api.h @@ -157,7 +157,7 @@ sframe_decoder_get_fixed_ra_offset (const sframe_decoder_ctx *dctx); 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 @@ -293,7 +293,7 @@ sframe_encoder_add_fre (sframe_encoder_ctx *ectx, 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, diff --git a/include/sframe.h b/include/sframe.h index fb4d7d03fce..8588ba667ea 100644 --- a/include/sframe.h +++ b/include/sframe.h @@ -244,7 +244,7 @@ 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; + 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 diff --git a/libsframe/sframe-dump.c b/libsframe/sframe-dump.c index 4837b456e35..49fa7b28ce7 100644 --- a/libsframe/sframe-dump.c +++ b/libsframe/sframe-dump.c @@ -125,7 +125,6 @@ dump_sframe_func_with_fres (const sframe_decoder_ctx *sfd_ctx, 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; @@ -141,15 +140,30 @@ dump_sframe_func_with_fres (const sframe_decoder_ctx *sfd_ctx, 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, @@ -270,12 +284,12 @@ dump_sframe_functions (const sframe_decoder_ctx *sfd_ctx, uint64_t sec_addr) 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", diff --git a/libsframe/sframe.c b/libsframe/sframe.c index f4c30264334..8d8848fc37f 100644 --- a/libsframe/sframe.c +++ b/libsframe/sframe.c @@ -507,7 +507,7 @@ sframe_decoder_get_funcdesc_at_index (const sframe_decoder_ctx *ctx, 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) { @@ -519,7 +519,7 @@ sframe_decoder_get_secrel_func_start_addr (const sframe_decoder_ctx *dctx, 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; } @@ -531,10 +531,10 @@ sframe_decoder_get_secrel_func_start_addr (const sframe_decoder_ctx *dctx, 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; @@ -1351,7 +1351,7 @@ sframe_decoder_get_offsetof_fde_start_addr (const sframe_decoder_ctx *dctx, 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; @@ -1427,14 +1427,14 @@ sframe_fre_get_end_ip_offset (sframe_func_desc_entry_int *fdep, unsigned int i, 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; @@ -1871,7 +1871,7 @@ bad: 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; @@ -1942,7 +1942,7 @@ bad: 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; @@ -2128,7 +2128,7 @@ sframe_encoder_write_fde (const sframe_header *sfhp ATTRIBUTE_UNUSED, { 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; diff --git a/libsframe/testsuite/libsframe.decode/DATA2 b/libsframe/testsuite/libsframe.decode/DATA2 index b1069c3c4d1..06fd11bd8bf 100644 Binary files a/libsframe/testsuite/libsframe.decode/DATA2 and b/libsframe/testsuite/libsframe.decode/DATA2 differ diff --git a/libsframe/testsuite/libsframe.encode/encode-1.c b/libsframe/testsuite/libsframe.encode/encode-1.c index 335d3e6861f..fe2d2543c79 100644 --- a/libsframe/testsuite/libsframe.encode/encode-1.c +++ b/libsframe/testsuite/libsframe.encode/encode-1.c @@ -18,8 +18,8 @@ #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. */ @@ -35,11 +35,11 @@ add_fde1 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr, 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) @@ -53,8 +53,8 @@ add_fde1 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr, } 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. */ @@ -71,11 +71,11 @@ add_fde2 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr, 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) @@ -140,9 +140,9 @@ int main (void) { 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; diff --git a/libsframe/testsuite/libsframe.find/findfre-1.c b/libsframe/testsuite/libsframe.find/findfre-1.c index c9048888d6d..848b399f977 100644 --- a/libsframe/testsuite/libsframe.find/findfre-1.c +++ b/libsframe/testsuite/libsframe.find/findfre-1.c @@ -18,8 +18,8 @@ #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 @@ -35,11 +35,11 @@ add_fde1 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr, 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) @@ -53,8 +53,8 @@ add_fde1 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr, } 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 @@ -70,11 +70,11 @@ add_fde2 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr, 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) @@ -88,18 +88,18 @@ add_fde2 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr, } 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; @@ -171,15 +171,15 @@ void test_text_findfre (const char suffix, uint32_t text_vaddr, 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); } diff --git a/libsframe/testsuite/libsframe.find/findfunc-1.c b/libsframe/testsuite/libsframe.find/findfunc-1.c index 14ff9c51f16..27b902ee087 100644 --- a/libsframe/testsuite/libsframe.find/findfunc-1.c +++ b/libsframe/testsuite/libsframe.find/findfunc-1.c @@ -25,8 +25,8 @@ #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 @@ -42,11 +42,11 @@ add_fde1 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr, 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) @@ -60,8 +60,8 @@ add_fde1 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr, } 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 @@ -77,11 +77,11 @@ add_fde2 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr, 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) @@ -95,8 +95,8 @@ add_fde2 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr, } 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 @@ -112,11 +112,11 @@ add_fde3 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr, 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) @@ -130,20 +130,20 @@ add_fde3 (sframe_encoder_ctx *encode, uint32_t start_pc_vaddr, } 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; @@ -233,15 +233,15 @@ void test_text_findfre (const char suffix, uint32_t text_vaddr, 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); } diff --git a/libsframe/testsuite/libsframe.find/plt-findfre-1.c b/libsframe/testsuite/libsframe.find/plt-findfre-1.c index f62ca3f84f5..eb33b7de5cf 100644 --- a/libsframe/testsuite/libsframe.find/plt-findfre-1.c +++ b/libsframe/testsuite/libsframe.find/plt-findfre-1.c @@ -18,8 +18,8 @@ #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. */ @@ -34,11 +34,11 @@ add_plt_fde1 (sframe_encoder_ctx *ectx, uint32_t plt_vaddr, 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. */, @@ -54,8 +54,8 @@ add_plt_fde1 (sframe_encoder_ctx *ectx, uint32_t plt_vaddr, } 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; @@ -123,15 +123,15 @@ void test_plt_findfre (const char suffix, uint32_t plt_vaddr, 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); } diff --git a/libsframe/testsuite/libsframe.find/plt-findfre-2.c b/libsframe/testsuite/libsframe.find/plt-findfre-2.c index 097d23bfff0..9ed98553ecc 100644 --- a/libsframe/testsuite/libsframe.find/plt-findfre-2.c +++ b/libsframe/testsuite/libsframe.find/plt-findfre-2.c @@ -27,8 +27,8 @@ #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 @@ -41,11 +41,11 @@ add_plt0_fde (sframe_encoder_ctx *ectx, uint32_t plt_vaddr, 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. */, @@ -60,8 +60,8 @@ add_plt0_fde (sframe_encoder_ctx *ectx, uint32_t plt_vaddr, } 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 @@ -74,11 +74,11 @@ add_pltn_fde (sframe_encoder_ctx *ectx, uint32_t plt_vaddr, 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. */, @@ -93,8 +93,8 @@ add_pltn_fde (sframe_encoder_ctx *ectx, uint32_t plt_vaddr, } 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; @@ -165,15 +165,15 @@ void test_plt_findfre (const char suffix, const uint32_t plt_vaddr, 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);