Hi, The current CMSE support in the multilib build for "-march=armv8.1-m.main+mve -mfloat-abi=hard -mfpu=auto" is broken as specified in PR99939 and this patch fixes the issue.
Regression tested on arm-none-eabi and found no regressions. Ok for master? and Ok for GCC-10 branch? Regards, Srinath. gcc/testsuite/ChangeLog: 2021-04-12 Srinath Parvathaneni <srinath.parvathan...@arm.com> PR target/99939 * gcc.target/arm/cmse/cmse-20.c: New test. libgcc/ChangeLog: 2021-04-12 Srinath Parvathaneni <srinath.parvathan...@arm.com> PR target/99939 * config/arm/t-arm: Make changes to use cmse.c for all the armv8.1-m.main mulitlibs. ############### Attachment also inlined for ease of reply ############### diff --git a/gcc/testsuite/gcc.target/arm/cmse/cmse-20.c b/gcc/testsuite/gcc.target/arm/cmse/cmse-20.c new file mode 100644 index 0000000000000000000000000000000000000000..7e2739e14792624adf5b4280ca58a5d8320acbf0 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/cmse/cmse-20.c @@ -0,0 +1,28 @@ +/* { dg-do run } */ +/* { dg-additional-options "-mcmse -Wl,--section-start,.gnu.sgstubs=0x00190000" } */ + +#include <arm_cmse.h> +#include <stdlib.h> +#include <stdio.h> + +void __attribute__((cmse_nonsecure_entry)) +secure_fun (int a, int *p) +{ + void *b = cmse_check_address_range ((void *)p, a, 1); + + if (b == NULL) + __builtin_abort (); + printf("%d", *((int *)b)); +} + +int +main (void) +{ + int *ptr; + int size = 1; + ptr = (int *) calloc (1, sizeof(int *)); + *ptr = 1315852292; + secure_fun (size, ptr); + free (ptr); + return 0; +} diff --git a/libgcc/config/arm/t-arm b/libgcc/config/arm/t-arm index 3625a2590beec4e4e0e0881be9ad284c595c7190..949e2ee06653680211ff2dcf0b55a41a6aedc31c 100644 --- a/libgcc/config/arm/t-arm +++ b/libgcc/config/arm/t-arm @@ -9,11 +9,12 @@ CMSE_OPTS:=-mcmse endif ifdef HAVE_CMSE -ifndef HAVE_V81M -libgcc-objects += cmse.o cmse_nonsecure_call.o +libgcc-objects += cmse.o cmse.o: $(srcdir)/config/arm/cmse.c $(gcc_compile) -c $(CMSE_OPTS) $< +ifndef HAVE_V81M +libgcc-objects += cmse_nonsecure_call.o cmse_nonsecure_call.o: $(srcdir)/config/arm/cmse_nonsecure_call.S $(gcc_compile) -c $< endif
diff --git a/gcc/testsuite/gcc.target/arm/cmse/cmse-20.c b/gcc/testsuite/gcc.target/arm/cmse/cmse-20.c new file mode 100644 index 0000000000000000000000000000000000000000..7e2739e14792624adf5b4280ca58a5d8320acbf0 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/cmse/cmse-20.c @@ -0,0 +1,28 @@ +/* { dg-do run } */ +/* { dg-additional-options "-mcmse -Wl,--section-start,.gnu.sgstubs=0x00190000" } */ + +#include <arm_cmse.h> +#include <stdlib.h> +#include <stdio.h> + +void __attribute__((cmse_nonsecure_entry)) +secure_fun (int a, int *p) +{ + void *b = cmse_check_address_range ((void *)p, a, 1); + + if (b == NULL) + __builtin_abort (); + printf("%d", *((int *)b)); +} + +int +main (void) +{ + int *ptr; + int size = 1; + ptr = (int *) calloc (1, sizeof(int *)); + *ptr = 1315852292; + secure_fun (size, ptr); + free (ptr); + return 0; +} diff --git a/libgcc/config/arm/t-arm b/libgcc/config/arm/t-arm index 3625a2590beec4e4e0e0881be9ad284c595c7190..949e2ee06653680211ff2dcf0b55a41a6aedc31c 100644 --- a/libgcc/config/arm/t-arm +++ b/libgcc/config/arm/t-arm @@ -9,11 +9,12 @@ CMSE_OPTS:=-mcmse endif ifdef HAVE_CMSE -ifndef HAVE_V81M -libgcc-objects += cmse.o cmse_nonsecure_call.o +libgcc-objects += cmse.o cmse.o: $(srcdir)/config/arm/cmse.c $(gcc_compile) -c $(CMSE_OPTS) $< +ifndef HAVE_V81M +libgcc-objects += cmse_nonsecure_call.o cmse_nonsecure_call.o: $(srcdir)/config/arm/cmse_nonsecure_call.S $(gcc_compile) -c $< endif