This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH, binutils, ARM 7/11] Support for dedicated stub section with padding
- From: Thomas Preudhomme <thomas dot preudhomme at foss dot arm dot com>
- To: binutils at sourceware dot org
- Date: Tue, 29 Mar 2016 15:40:17 +0100
- Subject: [PATCH, binutils, ARM 7/11] Support for dedicated stub section with padding
- Authentication-results: sourceware.org; auth=none
Hi,
This patch is part of a patch series to add support for ARMv8-M security
extension[1] to GNU ld. This specific patch adds support for padding the
dedicated section of a given veneer type.
ARM v8-M security extensions require [3] secure gateway veneers to be
generated for (secure) entry function in order for code to transition from
non-secure state to secure state when calling these entry function. One
requirement for these veneers [4] is that a consecutive sequence of them must
be padded to 32 bytes to make sure that no bit pattern of the SG instruction
is found in non secure callable memory. This patch adds support for padding a
dedicated section used for a given type of veneers, thus respecting this
requirement.
[1] Software requirements for ARMv8-M security extension are described in
document ARM-ECM-0359818 [2]
[2] Available on http://infocenter.arm.com in Developer guides and articles >
Software development > ARMÂv8-M Security Extensions: Requirements on
Development Tools
[3] See section 3.4.3 and requirement 44 of ARM-ECM-0359818 [2]
[4] requirement 12 and 13 and following comment of ARM-ECM-0359818 [2]
ChangeLog entry is as follows:
*** bfd/ChangeLog ***
2016-02-17 Thomas Preud'homme <thomas.preudhomme@arm.com>
* elf32-arm.c (arm_dedicated_stub_section_padding): New function.
(elf32_arm_size_stubs): Declare stub_type in a more outer scope and
account for padding for stub section requiring one.
(elf32_arm_build_stubs): Add comment to stress the importance of
zeroing veneer section content.
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index
94a3d197cae5fbf173da11dd4a50350e5ac68bb3..8b3dc8fc2dce2a4dbb1b5dbea6e94ee287111286
100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -4464,6 +4464,24 @@ arm_stub_sym_claimed (enum elf32_arm_stub_type
stub_type)
abort (); /* Should be unreachable. */
}
+/* Returns the padding needed for the dedicated section used stubs of type
+ STUB_TYPE. */
+
+static int
+arm_dedicated_stub_section_padding (enum elf32_arm_stub_type stub_type)
+{
+ if (stub_type >= max_stub_type)
+ abort (); /* Should be unreachable. */
+
+ switch (stub_type)
+ {
+ default:
+ return 0;
+ }
+
+ abort (); /* Should be unreachable. */
+}
+
static bfd_boolean
arm_build_one_stub (struct bfd_hash_entry *gen_entry,
void * in_arg)
@@ -5440,6 +5458,7 @@ elf32_arm_size_stubs (bfd *output_bfd,
bfd *input_bfd;
unsigned int bfd_indx;
asection *stub_sec;
+ enum elf32_arm_stub_type stub_type;
bfd_boolean stub_changed = FALSE;
unsigned prev_num_a8_fixes = num_a8_fixes;
@@ -5495,7 +5514,6 @@ elf32_arm_size_stubs (bfd *output_bfd,
for (; irela < irelaend; irela++)
{
unsigned int r_type, r_indx;
- enum elf32_arm_stub_type stub_type;
asection *sym_sec;
bfd_vma sym_value;
bfd_vma destination;
@@ -5795,7 +5813,27 @@ elf32_arm_size_stubs (bfd *output_bfd,
stub_sec->size = 0;
}
+ /* Compute stub section size, considering padding. */
bfd_hash_traverse (&htab->stub_hash_table, arm_size_one_stub, htab);
+ for (stub_type = arm_stub_none + 1; stub_type < max_stub_type;
+ stub_type++)
+ {
+ int size, padding;
+ asection **stub_sec_p;
+
+ padding = arm_dedicated_stub_section_padding (stub_type);
+ stub_sec_p = arm_dedicated_stub_input_section_ptr (htab, stub_type);
+ /* Skip if no stub input section or no stub section padding
+ required. */
+ if ((stub_sec_p != NULL && *stub_sec_p == NULL) || padding == 0)
+ continue;
+ /* Stub section padding required but no dedicated section. */
+ BFD_ASSERT (stub_sec_p);
+
+ size = (*stub_sec_p)->size;
+ size = (size + padding - 1) & ~(padding - 1);
+ (*stub_sec_p)->size = size;
+ }
/* Add Cortex-A8 erratum veneers to stub section sizes too. */
if (htab->fix_cortex_a8)
@@ -5903,7 +5941,8 @@ elf32_arm_build_stubs (struct bfd_link_info *info)
if (!strstr (stub_sec->name, STUB_SUFFIX))
continue;
- /* Allocate memory to hold the linker stubs. */
+ /* Allocate memory to hold the linker stubs. Zeroing the stub sections
+ must at least be done for stub section requiring padding. */
size = stub_sec->size;
stub_sec->contents = (unsigned char *) bfd_zalloc (htab->stub_bfd,
size);
if (stub_sec->contents == NULL && size != 0)
The patch doesn't show any regression when running the binutils-gdb testsuite
for the arm-none-eabi target.
Best regards,
Thomas