This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH, binutils, ARM 7/11, ping1] Support for dedicated stub section with padding


[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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]