Add support for stable secure gateway veneers addresses
authorThomas Preud'homme <thomas.preudhomme@arm.com>
Fri, 26 Aug 2016 09:59:26 +0000 (10:59 +0100)
committerThomas Preud'homme <thomas.preudhomme@arm.com>
Fri, 26 Aug 2016 10:00:36 +0000 (11:00 +0100)
commit0955507f6e7144c9c5e420bbcf617593b13de38b
tree01e7b1d24870728adf17b1bca5d21e2f937ef197
parent4edcc97c1a892325fcda1abe0d383802cc87a869
Add support for stable secure gateway veneers addresses

2016-08-26  Thomas Preud'homme  <thomas.preudhomme@arm.com>

bfd/
* bfd-in.h (bfd_elf32_arm_set_target_relocs): Add a new parameter for
the input import library bfd.
* bfd-in2.h: Regenerate.
* elf32-arm.c (struct elf32_arm_link_hash_table): New in_implib_bfd
and new_cmse_stub_offset fields.
(stub_hash_newfunc): Initialize stub_offset and stub_template_size to
-1.
(elf32_arm_add_stub): Likewise for stub_offset.
(arm_new_stubs_start_offset_ptr): New function.
(arm_build_one_stub): Only allocate a stub_offset if it is -1.  Allow
empty SG veneers to have zero relocations.
(arm_size_one_stub): Only initialize stub size and template
information for non empty veneers.  Do not update veneer section size
if veneer already has an offset.
(elf32_arm_create_stub): Return the stub entry pointer or NULL instead
of a boolean indicating success or failure.
(cmse_scan): Change stub_changed parameter into an integer pointer
parameter cmse_stub_created to count the number of stub created and
adapt to change of return value in elf32_arm_create_stub.
(cmse_entry_fct_p): New function.
(arm_list_new_cmse_stub): Likewise.
(set_cmse_veneer_addr_from_implib): Likewise.
(elf32_arm_size_stubs): Define cmse_stub_created, pass its address to
cmse_scan instead of that of cmse_stub_changed to compute the number
of stub created and use it to initialize stub_changed.  Call
set_cmse_veneer_addr_from_implib after all cmse_scan.  Adapt to change
of return value in elf32_arm_create_stub.  Use
arm_stub_section_start_offset () if not NULL to initialize size of
secure gateway veneers section.  Initialize stub_offset of Cortex-A8
erratum fix to -1.  Use ret to hold return value.
(elf32_arm_build_stubs): Use arm_stub_section_start_offset () if not
NULL to initialize size of secure gateway veneers section.  Adapt
comment to stress the importance of zeroing veneer section content.
(bfd_elf32_arm_set_target_relocs): Add new in_implib_bfd parameter to
initialize eponymous field in struct elf32_arm_link_hash_table.

ld/
* emultempl/armelf.em (in_implib_filename): Declare and initialize new
variable.
(arm_elf_create_output_section_statements): Open import input library
file for writing and pass resulting in_implib_bfd to
bfd_elf32_arm_set_target_relocs.
(PARSE_AND_LIST_PROLOGUE): Define OPTION_IN_IMPLIB option.
(PARSE_AND_LIST_LONGOPTS): Define --in-implib option.
(PARSE_AND_LIST_OPTIONS): Add help message for --in-implib option.
(PARSE_AND_LIST_ARGS_CASES): Handle new OPTION_IN_IMPLIB case.
* ld.texinfo (--cmse-implib): Update to mention --in-implib.
(--in-implib): Document new option.
* NEWS: Likewise.
* testsuite/ld-arm/arm-elf.exp
(Secure gateway import library generation): add --defsym VER=1 to gas
CLI.
(Secure gateway import library generation: errors): Likewise.
(Input secure gateway import library): New test.
(Input secure gateway import library: no output import library):
Likewise.
(Input secure gateway import library: not an SG input import library):
Likewise.
(Input secure gateway import library: earlier stub section base):
Likewise.
(Input secure gateway import library: later stub section base):
Likewise.
(Input secure gateway import library: veneer comeback): Likewise.
(Input secure gateway import library: entry function change):
Likewise.
* testsuite/ld-arm/cmse-implib.s: Add input import library testing.
* testsuite/ld-arm/cmse-implib.rd: Update accordingly.
* testsuite/ld-arm/cmse-new-implib.out: New file.
* testsuite/ld-arm/cmse-new-implib.rd: Likewise.
* testsuite/ld-arm/cmse-new-implib-no-output.out: Likewise.
* testsuite/ld-arm/cmse-new-implib-not-sg-in-implib.out: Likewise.
* testsuite/ld-arm/cmse-new-earlier-later-implib.out: Likewise.
* testsuite/ld-arm/cmse-new-comeback-implib.rd: Likewise.
* testsuite/ld-arm/cmse-new-wrong-implib.out: Likewise.
17 files changed:
bfd/ChangeLog
bfd/bfd-in.h
bfd/bfd-in2.h
bfd/elf32-arm.c
ld/ChangeLog
ld/NEWS
ld/emultempl/armelf.em
ld/ld.texinfo
ld/testsuite/ld-arm/arm-elf.exp
ld/testsuite/ld-arm/cmse-implib.s
ld/testsuite/ld-arm/cmse-new-comeback-implib.rd [new file with mode: 0644]
ld/testsuite/ld-arm/cmse-new-earlier-later-implib.out [new file with mode: 0644]
ld/testsuite/ld-arm/cmse-new-implib-no-output.out [new file with mode: 0644]
ld/testsuite/ld-arm/cmse-new-implib-not-sg-in-implib.out [new file with mode: 0644]
ld/testsuite/ld-arm/cmse-new-implib.out [new file with mode: 0644]
ld/testsuite/ld-arm/cmse-new-implib.rd [new file with mode: 0644]
ld/testsuite/ld-arm/cmse-new-wrong-implib.out [new file with mode: 0644]