On 27/10/16 10:55, Andre Vieira (lists) wrote: > 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 > Hi, Backported this to the embedded-6-branch in revision r. Cheers, Andre gcc/ChangeLog.arm: 2016-12-05 Andre Vieira Backport from mainline 2016-12-02 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. (thumb2_expand_return): Assert that entry functions always have simple returns. (arm_expand_epilogue): Handle entry functions. (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.arm: 2016-12-05 Andre Vieira Backport from mainline 2016-12-02 Andre Vieira Thomas Preud'homme * gcc.target/arm/cmse/cmse-4.c: New. * gcc.target/arm/cmse/cmse-9.c: New. * gcc.target/arm/cmse/cmse-10.c: New.