This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH, binutils, ARM 7/11, ping1] 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
- Cc: richard dot earnshaw at arm dot com, nickc at redhat dot com
- Date: Wed, 18 May 2016 17:33:09 +0100
- Subject: Re: [PATCH, binutils, ARM 7/11, ping1] Support for dedicated stub section with padding
- Authentication-results: sourceware.org; auth=none
- References: <6199794 dot MLGQcacbfr at e108577-lin> <2328029 dot 92yLvD4qYH at e108577-lin>
[CCing Richard Earnshaw and Nick Clifton who reviewed previous ARMv8-M
patches]
Ping?
Best regards,
Thomas
On Thursday 05 May 2016 11:27:09 Thomas Preudhomme wrote:
> On Tuesday 29 March 2016 15:40:17 Thomas Preudhomme wrote:
> > Hi,
> >
> > This patch is part of a patch series to add support for ARMv8-M Security
> > Extensions[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]
>
> Please find an updated version without the switch case for the
> arm_dedicated_stub_* functions.
>
> ChangeLog entry is unchanged:
>
> *** 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
> ab878b20905c907b3496317c7ed1c9c698d850c9..f2b50667ef50572488e4d868ce40e67580
> 356343 100644
> --- a/bfd/elf32-arm.c
> +++ b/bfd/elf32-arm.c
> @@ -4435,6 +4435,18 @@ arm_stub_sym_claimed (enum elf32_arm_stub_type
> stub_type)
> return FALSE;
> }
>
> +/* 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. */
> +
> + return 0;
> +}
> +
> static bfd_boolean
> arm_build_one_stub (struct bfd_hash_entry *gen_entry,
> void * in_arg)
> @@ -5411,6 +5423,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;
>
> @@ -5466,7 +5479,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;
> @@ -5765,7 +5777,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)
> @@ -5873,7 +5905,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)
>
>
> Best regards,
>
> Thomas