[PATCHv2 1/7, GCC, ARM, V8M] Add support for ARMv8-M's Secure Extensions flag and intrinsics

Kyrill Tkachov kyrylo.tkachov@foss.arm.com
Thu Oct 27 10:01:00 GMT 2016


On 27/10/16 10:53, Andre Vieira (lists) wrote:
> On 26/10/16 14:00, Kyrill Tkachov wrote:
>> On 26/10/16 10:12, Kyrill Tkachov wrote:
>>> Hi Andre, thanks for resending them.
>>>
>>> On 25/10/16 17:26, Andre Vieira (lists) wrote:
>>>> On 24/08/16 12:00, Andre Vieira (lists) wrote:
>>>>> On 25/07/16 14:19, Andre Vieira (lists) wrote:
>>>>>> This patch adds the support of the '-mcmse' option to enable ARMv8-M's
>>>>>> Security Extensions and supports the following intrinsics:
>>>>>> cmse_TT
>>>>>> cmse_TT_fptr
>>>>>> cmse_TTT
>>>>>> cmse_TTT_fptr
>>>>>> cmse_TTA
>>>>>> cmse_TTA_fptr
>>>>>> cmse_TTAT
>>>>>> cmse_TTAT_fptr
>>>>>> cmse_check_address_range
>>>>>> cmse_check_pointed_object
>>>>>> cmse_is_nsfptr
>>>>>> cmse_nsfptr_create
>>>>>>
>>>>>> It also defines the mandatory cmse_address_info struct and the
>>>>>> __ARM_FEATURE_CMSE macro.
>>>>>> See Chapter 4, Sections 5.2, 5.3 and 5.6 of ARM®v8-M Security
>>>>>> Extensions: Requirements on Development Tools
>>>>>> (http://infocenter.arm.com/help/topic/com.arm.doc.ecm0359818/index.html).
>>>>>>
>>>>>>
>>>>>> *** gcc/ChangeLog ***
>>>>>> 2016-07-25  Andre Vieira <andre.simoesdiasvieira@arm.com>
>>>>>>               Thomas Preud'homme <thomas.preudhomme@arm.com>
>>>>>>
>>>>>>           * config.gcc (extra_headers): Added arm_cmse.h.
>>>>>>           * config/arm/arm-arches.def (ARM_ARCH):
>>>>>>           (armv8-m): Add FL2_CMSE.
>>>>>>           (armv8-m.main): Likewise.
>>>>>>           (armv8-m.main+dsp): Likewise.
>>>>>>           * config/arm/arm-c.c
>>>>>>           (arm_cpu_builtins): Added __ARM_FEATURE_CMSE macro.
>>>>>>           * config/arm/arm-protos.h
>>>>>>           (arm_is_constant_pool_ref): Define FL2_CMSE.
>>>>>>           * config/arm.c (arm_arch_cmse): New.
>>>>>>           (arm_option_override): New error for unsupported cmse target.
>>>>>>           * config/arm/arm.h (arm_arch_cmse): New.
>>>>>>           * config/arm/arm.opt (mcmse): New.
>>>>>>           * doc/invoke.texi (ARM Options): Add -mcmse.
>>>>>>           * config/arm/arm_cmse.h: New file.
>>>>>>
>>>>>> *** libgcc/ChangeLog ***
>>>>>> 2016-07-25  Andre Vieira <andre.simoesdiasvieira@arm.com>
>>>>>>               Thomas Preud'homme <thomas.preudhomme@arm.com>
>>>>>>
>>>>>>           * config/arm/cmse.c: Likewise.
>>>>>>           * config/arm/t-arm (HAVE_CMSE): New.
>>>>>>
>>>>>> *** gcc/testsuite/ChangeLog ***
>>>>>> 2016-07-25  Andre Vieira <andre.simoesdiasvieira@arm.com>
>>>>>>               Thomas Preud'homme <thomas.preudhomme@arm.com>
>>>>>>
>>>>>>           * gcc.target/arm/cmse/cmse.exp: New.
>>>>>>           * gcc.target/arm/cmse/cmse-1.c: New.
>>>>>>           * gcc.target/arm/cmse/cmse-12.c: New.
>>>>>>           * lib/target-supports.exp
>>>>>>           (check_effective_target_arm_cmse_ok): New.
>>
>> Just remembered, new effective target checks should be documented in
>> sourcebuild.texi
>> Kyrill
>>
>>>>> Added more documentation as requested.
>>>>>
>>>>> This patch adds the support of the '-mcmse' option to enable ARMv8-M's
>>>>> Security Extensions and supports the following intrinsics:
>>>>> cmse_TT
>>>>> cmse_TT_fptr
>>>>> cmse_TTT
>>>>> cmse_TTT_fptr
>>>>> cmse_TTA
>>>>> cmse_TTA_fptr
>>>>> cmse_TTAT
>>>>> cmse_TTAT_fptr
>>>>> cmse_check_address_range
>>>>> cmse_check_pointed_object
>>>>> cmse_is_nsfptr
>>>>> cmse_nsfptr_create
>>>>>
>>>>> It also defines the mandatory cmse_address_info struct and the
>>>>> __ARM_FEATURE_CMSE macro.
>>>>> See Chapter 4, Sections 5.2, 5.3 and 5.6 of ARM®v8-M Security
>>>>> Extensions: Requirements on Development Tools
>>>>> (http://infocenter.arm.com/help/topic/com.arm.doc.ecm0359818/index.html).
>>>>>
>>>>>
>>>>> *** gcc/ChangeLog ***
>>>>> 2016-07-xx  Andre Vieira <andre.simoesdiasvieira@arm.com>
>>>>>               Thomas Preud'homme <thomas.preudhomme@arm.com>
>>>>>
>>>>>           * config.gcc (extra_headers): Added arm_cmse.h.
>>>>>           * config/arm/arm-arches.def (ARM_ARCH):
>>>>>           (armv8-m): Add FL2_CMSE.
>>>>>           (armv8-m.main): Likewise.
>>>>>           (armv8-m.main+dsp): Likewise.
>>>>>           * config/arm/arm-c.c
>>>>>           (arm_cpu_builtins): Added __ARM_FEATURE_CMSE macro.
>>>>>           * config/arm/arm-protos.h
>>>>>           (arm_is_constant_pool_ref): Define FL2_CMSE.
>>>>>           * config/arm.c (arm_arch_cmse): New.
>>>>>           (arm_option_override): New error for unsupported cmse target.
>>>>>           * config/arm/arm.h (arm_arch_cmse): New.
>>>>>           * config/arm/arm.opt (mcmse): New.
>>>>>           * doc/invoke.texi (ARM Options): Add -mcmse.
>>>>>           * doc/extend.texi (ARM ARMv8-M Security Extensions): Add
>>>>> section.
>>>>>           * config/arm/arm_cmse.h: New file.
>>>>>
>>>>> *** libgcc/ChangeLog ***
>>>>> 2016-07-xx  Andre Vieira <andre.simoesdiasvieira@arm.com>
>>>>>               Thomas Preud'homme <thomas.preudhomme@arm.com>
>>>>>           * config/arm/cmse.c: Likewise.
>>>>>           * config/arm/t-arm (HAVE_CMSE): New.
>>>>>
>>>>>
>>>>> *** gcc/testsuite/ChangeLog ***
>>>>> 2016-07-xx  Andre Vieira <andre.simoesdiasvieira@arm.com>
>>>>>               Thomas Preud'homme <thomas.preudhomme@arm.com>
>>>>>
>>>>>           * gcc.target/arm/cmse/cmse.exp: New.
>>>>>           * gcc.target/arm/cmse/cmse-1.c: New.
>>>>>           * gcc.target/arm/cmse/cmse-12.c: New.
>>>>>           * lib/target-supports.exp
>>>>>           (check_effective_target_arm_cmse_ok): New.
>>>>>
>>>> Hi,
>>>>
>>>> Rebased previous patch on top of trunk as requested. No changes to
>>>> ChangeLog.
>>>>
>>>> Cheers,
>>>> Andre
>>> diff --git a/gcc/config/arm/arm_cmse.h b/gcc/config/arm/arm_cmse.h
>>> new file mode 100644
>>> index
>>> 0000000000000000000000000000000000000000..b4232937c6ae04754a6bbc513b143672a4be5530
>>>
>>> --- /dev/null
>>> +++ b/gcc/config/arm/arm_cmse.h
>>>
>>> <snip>
>>>
>>> +
>>> +#if __ARM_FEATURE_CMSE & 2
>>> +
>>> +#define cmse_TTA_fptr(p) (__cmse_TTA_fptr ((__cmse_fptr)(p)))
>>> +
>>> +__extension__ static __inline __attribute__ ((__always_inline__))
>>> +cmse_address_info_t
>>> +__cmse_TTA_fptr (__cmse_fptr __p)
>>> +__CMSE_TT_ASM (a)
>>> +
>>> +__extension__ static __inline __attribute__ ((__always_inline__))
>>> +cmse_address_info_t
>>> +cmse_TTA (void *__p)
>>> +__CMSE_TT_ASM (a)
>>> +
>>> +#define cmse_TTAT_fptr(p) (__cmse_TTAT_fptr ((__cmse_fptr)(p)))
>>> +
>>> +__extension__ static __inline cmse_address_info_t
>>> +__attribute__ ((__always_inline__))
>>> +__cmse_TTAT_fptr (__cmse_fptr __p)
>>> +__CMSE_TT_ASM (at)
>>> +
>>> +__extension__ static __inline cmse_address_info_t
>>> +__attribute__ ((__always_inline__))
>>> +cmse_TTAT (void *__p)
>>> +__CMSE_TT_ASM (at)
>>> +
>>> +#define CMSE_AU_NONSECURE    2
>>> +#define CMSE_MPU_NONSECURE    16
>>> +#define CMSE_NONSECURE        18
>>> +
>>> +#endif /* __ARM_FEATURE_CMSE & 2 */
>>> +
>>> +#define CMSE_MPU_UNPRIV        4
>>> +#define CMSE_MPU_READWRITE    1
>>> +#define CMSE_MPU_READ        8
>>> +
>>> +__extension__ void *
>>> +cmse_check_address_range (void *, size_t, int);
>>> +
>>> +#define cmse_check_pointed_object(p, f) \
>>> +  ((typeof ((p))) cmse_check_address_range ((p), sizeof (*(p)), (f)))
>>> +
>>> +#define cmse_nsfptr_create(p) ((typeof ((p))) ((intptr_t) (p) & ~1))
>>> +
>>> +#define cmse_is_nsfptr(p) (!((intptr_t) (p) & 1))
>>> +
>>> +#endif /* __ARM_FEATURE_CMSE & 1 */
>>>
>>>  From my reading of the spec
>>> (http://infocenter.arm.com/help/topic/com.arm.doc.ecm0359818/ECM0359818_armv8m_security_extensions_reqs_on_dev_tools_1_0.pdf)
>>>
>>> cmse_nsfptr_create and cmse_is_nsfptr should be defined if bit 1 of
>>> __ARM_FEATURE_CMSE is set.
>>> But in your patch they fall under the "#if __ARM_FEATURE_CMSE & 1"
>>> check which checks bit 0.
>>> They should be in the "__ARM_FEATURE_CMSE & 2" block. Please double
>>> check the other defines against the SPEC to make sure they
>>> match the feature bit in __ARM_FEATURE_CMSE.
>>>
>>> The patch is ok with that resolved if bootstrap and test on a normal
>>> arm-none-linux-gnueabihf configuration
>>> shows no problems.
>>> Thanks,
>>> Kyrill
>>>
> Hi,
>
> Reworked comments.
>
> Is this OK?

Yes, thanks.
Please hold off committing until the whole series is approved.
Kyrill

> Cheers,
> Andre
>
> *** gcc/ChangeLog ***
> 2016-10-27  Andre Vieira <andre.simoesdiasvieira@arm.com>
>               Thomas Preud'homme <thomas.preudhomme@arm.com>
>
>           * config.gcc (extra_headers): Added arm_cmse.h.
>           * config/arm/arm-arches.def (ARM_ARCH):
>           (armv8-m): Add FL2_CMSE.
>           (armv8-m.main): Likewise.
>           (armv8-m.main+dsp): Likewise.
>           * config/arm/arm-c.c
>           (arm_cpu_builtins): Added __ARM_FEATURE_CMSE macro.
>           * config/arm/arm-protos.h
>           (arm_is_constant_pool_ref): Define FL2_CMSE.
>           * config/arm.c (arm_arch_cmse): New.
>           (arm_option_override): New error for unsupported cmse target.
>           * config/arm/arm.h (arm_arch_cmse): New.
>           * config/arm/arm.opt (mcmse): New.
>           * doc/invoke.texi (ARM Options): Add -mcmse.
>           * config/arm/arm_cmse.h: New file.
>           * doc/sourcebuild.texi (arm_cmse_ok): Add new effective target.
>
> *** libgcc/ChangeLog ***
> 2016-10-27  Andre Vieira <andre.simoesdiasvieira@arm.com>
>               Thomas Preud'homme <thomas.preudhomme@arm.com>
>
>           * config/arm/cmse.c: Likewise.
>           * config/arm/t-arm (HAVE_CMSE): New.
>
> *** gcc/testsuite/ChangeLog ***
> 2016-10-27  Andre Vieira <andre.simoesdiasvieira@arm.com>
>               Thomas Preud'homme <thomas.preudhomme@arm.com>
>
>           * gcc.target/arm/cmse/cmse.exp: New.
>           * gcc.target/arm/cmse/cmse-1.c: New.
>           * gcc.target/arm/cmse/cmse-12.c: New.
>           * lib/target-supports.exp
>           (check_effective_target_arm_cmse_ok): New.
>



More information about the Gcc-patches mailing list