On 26/10/16 11:03, Kyrill Tkachov wrote: > Hi Andre, > > On 25/10/16 17:28, Andre Vieira (lists) wrote: >> On 25/07/16 14:23, Andre Vieira (lists) wrote: >>> This patch extends support for the ARMv8-M Security Extensions >>> 'cmse_nonsecure_entry' attribute in two ways: >>> >>> 1) Generate two labels for the function, the regular function name and >>> one with the function's name appended to '__acle_se_', this will trigger >>> the linker to create a secure gateway veneer for this entry function. >>> 2) Return from cmse_nonsecure_entry marked functions using bxns. >>> >>> See Section 5.4 of ARM®v8-M Security Extensions >>> (http://infocenter.arm.com/help/topic/com.arm.doc.ecm0359818/index.html). >>> >>> >>> >>> *** gcc/ChangeLog *** >>> 2016-07-25 Andre Vieira >>> Thomas Preud'homme >>> >>> * config/arm/arm.c (use_return_insn): Change to return with >>> bxns >>> when cmse_nonsecure_entry. >>> (output_return_instruction): Likewise. >>> (arm_output_function_prologue): Likewise. >>> (thumb_pop): Likewise. >>> (thumb_exit): Likewise. >>> (arm_function_ok_for_sibcall): Disable sibcall for entry >>> functions. >>> (arm_asm_declare_function_name): New. >>> * config/arm/arm-protos.h (arm_asm_declare_function_name): New. >>> * config/arm/elf.h (ASM_DECLARE_FUNCTION_NAME): Redefine to >>> use arm_asm_declare_function_name. >>> >>> *** gcc/testsuite/ChangeLog *** >>> 2016-07-25 Andre Vieira >>> Thomas Preud'homme >>> >>> * gcc.target/arm/cmse/cmse-2.c: New. >>> * gcc.target/arm/cmse/cmse-4.c: New. >>> >> Hi, >> >> Rebased previous patch on top of trunk as requested. No changes to >> ChangeLog. >> >> Cheers, >> Andre > > @@ -19919,6 +19932,42 @@ output_return_instruction (rtx operand, bool > really_return, bool reverse, > return ""; > } > > +/* Output in FILE asm statements needed to declare the NAME of the > function > + defined by its DECL node. */ > + > +void > +arm_asm_declare_function_name (FILE *file, const char *name, tree decl) > +{ > + size_t cmse_name_len; > + char *cmse_name = 0; > + char cmse_prefix[] = "__acle_se_"; > + > + if (use_cmse && lookup_attribute ("cmse_nonsecure_entry", > + DECL_ATTRIBUTES (decl))) > + { > + cmse_name_len = sizeof (cmse_prefix) + strlen (name); > + cmse_name = XALLOCAVEC (char, cmse_name_len); > + snprintf (cmse_name, cmse_name_len, "%s%s", cmse_prefix, name); > + targetm.asm_out.globalize_label (file, cmse_name); > + } > + > > I think this definitely warrants a quick comment explaining why you're > adding > __acle_se_ to the function label > > > /* Scan INSN just before assembler is output for it. > @@ -25247,6 +25301,12 @@ thumb2_expand_return (bool simple_return) > > if (!simple_return && saved_regs_mask) > { > + /* TODO: Verify that this path is never taken for > cmse_nonsecure_entry > + functions or adapt code to handle according to ACLE. This path > should > + not be reachable for cmse_nonsecure_entry functions though we prefer > + to guard it for now to ensure that future code changes do not > silently > + change this behavior. */ > > I think you mean s/guard/assert/ > > + gcc_assert (!IS_CMSE_ENTRY (arm_current_func_type ())); > if (num_regs == 1) > { > rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (2)); > > This is ok with those changes. > Thanks, > Kyrill > Hi, Reworked comments. Also got rid of a redundant 'if (cmse_name)' in 'arm_asm_declare_function_name'. No change to ChangeLogs. Cheers, Andre