diff mbox series

arm: Fix the mve multilib for the broken cmse support (pr99939).

Message ID VI1PR0802MB2368E5B2285B1CEEA2633EEF9B709@VI1PR0802MB2368.eurprd08.prod.outlook.com
State New
Headers show
Series arm: Fix the mve multilib for the broken cmse support (pr99939). | expand

Commit Message

Srinath Parvathaneni April 12, 2021, 1:04 p.m. UTC
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.parvathaneni@arm.com>

	PR target/99939
	* gcc.target/arm/cmse/cmse-20.c: New test.

libgcc/ChangeLog:

2021-04-12  Srinath Parvathaneni  <srinath.parvathaneni@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

Comments

Richard Earnshaw April 13, 2021, 1:55 p.m. UTC | #1
On 12/04/2021 14:04, Srinath Parvathaneni via Gcc-patches wrote:
> 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.parvathaneni@arm.com>
> 
> 	PR target/99939
> 	* gcc.target/arm/cmse/cmse-20.c: New test.
> 
> libgcc/ChangeLog:
> 
> 2021-04-12  Srinath Parvathaneni  <srinath.parvathaneni@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
> 

So if I have two object files using CMSE and one is built with v8m, but 
the other with v8.1m, when I link them, the needed additional support 
for the v8m object file will be missing the library support.

Wouldn't it be better to just build the cmse_nonsecure_call code 
unconditionally?  It won't be called if it's not needed, but will be 
there if something does require it.

R.
Srinath Parvathaneni June 1, 2021, 5:16 p.m. UTC | #2
Hi Richard,

> -----Original Message-----
> From: Richard Earnshaw <Richard.Earnshaw@foss.arm.com>
> Sent: 13 April 2021 14:55
> To: Srinath Parvathaneni <Srinath.Parvathaneni@arm.com>; gcc-
> patches@gcc.gnu.org
> Cc: Richard Earnshaw <Richard.Earnshaw@arm.com>
> Subject: Re: [GCC][Patch] arm: Fix the mve multilib for the broken cmse
> support (pr99939).
> 
> 
> 
> On 12/04/2021 14:04, Srinath Parvathaneni via Gcc-patches wrote:
> > 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.parvathaneni@arm.com>
> >
> > 	PR target/99939
> > 	* gcc.target/arm/cmse/cmse-20.c: New test.
> >
> > libgcc/ChangeLog:
> >
> > 2021-04-12  Srinath Parvathaneni  <srinath.parvathaneni@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..7e2739e14792624adf5b428
> 0ca58
> > a5d8320acbf0
> > --- /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..949e2ee06653680211ff2dcf
> 0b55
> > a41a6aedc31c 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
> >
> 
> So if I have two object files using CMSE and one is built with v8m, but the
> other with v8.1m, when I link them, the needed additional support for the
> v8m object file will be missing the library support.
> 
> Wouldn't it be better to just build the cmse_nonsecure_call code
> unconditionally?  It won't be called if it's not needed, but will be there if
> something does require it.

I have modified the patch to build the cmse_nonsecure_call code unconditionally,
I have attached the diff and cover letter in this email.

Please let me know if it is ok for master?

Regards,
Srinath.
> 
> R.
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-06-01  Srinath Parvathaneni  <srinath.parvathaneni@arm.com>

	* gcc.target/arm/cmse/cmse-18.c: Modify
	* gcc.target/arm/cmse/cmse-20.c: New test.

libgcc/ChangeLog:

2021-06-01  Srinath Parvathaneni  <srinath.parvathaneni@arm.com>

	* config/arm/cmse_nonsecure_call.S: Modify to add
	__ARM_FEATURE_MVE macro check.
	* config/arm/t-arm: Make changes to link cmse.o and
	cmse_nonsecure_call.o on finding -mcmse gcc options.
Richard Earnshaw June 2, 2021, 3:53 p.m. UTC | #3
On 01/06/2021 18:16, Srinath Parvathaneni via Gcc-patches wrote:
> Hi Richard,
> 
>> -----Original Message-----
>> From: Richard Earnshaw <Richard.Earnshaw@foss.arm.com>
>> Sent: 13 April 2021 14:55
>> To: Srinath Parvathaneni <Srinath.Parvathaneni@arm.com>; gcc-
>> patches@gcc.gnu.org
>> Cc: Richard Earnshaw <Richard.Earnshaw@arm.com>
>> Subject: Re: [GCC][Patch] arm: Fix the mve multilib for the broken cmse
>> support (pr99939).
>>
>>
>>
>> On 12/04/2021 14:04, Srinath Parvathaneni via Gcc-patches wrote:
>>> 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.parvathaneni@arm.com>
>>>
>>> 	PR target/99939
>>> 	* gcc.target/arm/cmse/cmse-20.c: New test.
>>>
>>> libgcc/ChangeLog:
>>>
>>> 2021-04-12  Srinath Parvathaneni  <srinath.parvathaneni@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..7e2739e14792624adf5b428
>> 0ca58
>>> a5d8320acbf0
>>> --- /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..949e2ee06653680211ff2dcf
>> 0b55
>>> a41a6aedc31c 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
>>>
>>
>> So if I have two object files using CMSE and one is built with v8m, but the
>> other with v8.1m, when I link them, the needed additional support for the
>> v8m object file will be missing the library support.
>>
>> Wouldn't it be better to just build the cmse_nonsecure_call code
>> unconditionally?  It won't be called if it's not needed, but will be there if
>> something does require it.
> 
> I have modified the patch to build the cmse_nonsecure_call code unconditionally,
> I have attached the diff and cover letter in this email.
> 
> Please let me know if it is ok for master?
> 
> Regards,
> Srinath.
>>
>> R.
> 

gcc/testsuite/ChangeLog:

2021-06-01  Srinath Parvathaneni  <srinath.parvathaneni@arm.com>

	* gcc.target/arm/cmse/cmse-18.c: Modify

Incomplete.  I know you've modified it, but how?

	* gcc.target/arm/cmse/cmse-20.c: New test.

libgcc/ChangeLog:

2021-06-01  Srinath Parvathaneni  <srinath.parvathaneni@arm.com>

	* config/arm/cmse_nonsecure_call.S: Modify to add
	__ARM_FEATURE_MVE macro check.

"Add __ARM_FEATURE_MVE macro check." is sufficient (I know you've 
modified it).

	* config/arm/t-arm: Make changes to link cmse.o and
	cmse_nonsecure_call.o on finding -mcmse gcc options.

Again, "Make changes to " is redundant.

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" } */

Why does this need a different stubs address to all the other executable 
CMSE tests?  Can't it use 0x00400000 like them?


R.
diff mbox series

Patch

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