[v4,4/6] linux: Add compatibility definitions to sys/prctl.h for MTE

Message ID 20201218192957.11035-5-rearnsha@arm.com
State Committed
Commit 0d1bafdcb62187a1535618c71b840672308ba07d
Headers
Series Memory tagging support |

Commit Message

Richard Earnshaw Dec. 18, 2020, 7:29 p.m. UTC
  Older versions of the Linux kernel headers obviously lack support for
memory tagging, but we still want to be able to build in support when
using those (obviously it can't be enabled on such systems).

The linux kernel extensions are made to the platform-independent
header (linux/prctl.h), so this patch takes a similar approach.
---
 sysdeps/unix/sysv/linux/sys/prctl.h | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
  

Comments

Siddhesh Poyarekar Dec. 21, 2020, 1:32 p.m. UTC | #1
On 12/19/20 12:59 AM, Richard Earnshaw via Libc-alpha wrote:
> 
> Older versions of the Linux kernel headers obviously lack support for
> memory tagging, but we still want to be able to build in support when
> using those (obviously it can't be enabled on such systems).
> 
> The linux kernel extensions are made to the platform-independent
> header (linux/prctl.h), so this patch takes a similar approach.
> ---
>   sysdeps/unix/sysv/linux/sys/prctl.h | 18 ++++++++++++++++++
>   1 file changed, 18 insertions(+)

Please put the additions into an architecture-specific 
sysdeps/unix/sysv/linux/aarch64/sys/prctl.h and include_next this file 
from there.

> 
> diff --git a/sysdeps/unix/sysv/linux/sys/prctl.h b/sysdeps/unix/sysv/linux/sys/prctl.h
> index 7f748ebeeb..4d01379c23 100644
> --- a/sysdeps/unix/sysv/linux/sys/prctl.h
> +++ b/sysdeps/unix/sysv/linux/sys/prctl.h
> @@ -21,6 +21,24 @@
>  #include <features.h>
>  #include <linux/prctl.h>  /*  The magic values come from here  */
>  
> +/* Recent extensions to linux which may post-date the kernel headers
> +   we're picking up...  */
> +
> +/* Memory tagging control operations (for AArch64).  */
> +#ifndef PR_TAGGED_ADDR_ENABLE
> +# define PR_TAGGED_ADDR_ENABLE	(1UL << 8)
> +#endif
> +
> +#ifndef PR_MTE_TCF_SHIFT
> +# define PR_MTE_TCF_SHIFT	1
> +# define PR_MTE_TCF_NONE	(0UL << PR_MTE_TCF_SHIFT)
> +# define PR_MTE_TCF_SYNC	(1UL << PR_MTE_TCF_SHIFT)
> +# define PR_MTE_TCF_ASYNC	(2UL << PR_MTE_TCF_SHIFT)
> +# define PR_MTE_TCF_MASK	(3UL << PR_MTE_TCF_SHIFT)
> +# define PR_MTE_TAG_SHIFT	3
> +# define PR_MTE_TAG_MASK	(0xffffUL << PR_MTE_TAG_SHIFT)
> +#endif
> +
>  __BEGIN_DECLS
>  
>  /* Control process execution.  */
  
Richard Earnshaw Dec. 21, 2020, 1:34 p.m. UTC | #2
On 21/12/2020 13:32, Siddhesh Poyarekar wrote:
> On 12/19/20 12:59 AM, Richard Earnshaw via Libc-alpha wrote:
>>
>> Older versions of the Linux kernel headers obviously lack support for
>> memory tagging, but we still want to be able to build in support when
>> using those (obviously it can't be enabled on such systems).
>>
>> The linux kernel extensions are made to the platform-independent
>> header (linux/prctl.h), so this patch takes a similar approach.
>> ---
>>   sysdeps/unix/sysv/linux/sys/prctl.h | 18 ++++++++++++++++++
>>   1 file changed, 18 insertions(+)
> 
> Please put the additions into an architecture-specific
> sysdeps/unix/sysv/linux/aarch64/sys/prctl.h and include_next this file
> from there.
> 
>>
>> diff --git a/sysdeps/unix/sysv/linux/sys/prctl.h
>> b/sysdeps/unix/sysv/linux/sys/prctl.h
>> index 7f748ebeeb..4d01379c23 100644
>> --- a/sysdeps/unix/sysv/linux/sys/prctl.h
>> +++ b/sysdeps/unix/sysv/linux/sys/prctl.h
>> @@ -21,6 +21,24 @@
>>  #include <features.h>
>>  #include <linux/prctl.h>  /*  The magic values come from here  */
>>  
>> +/* Recent extensions to linux which may post-date the kernel headers
>> +   we're picking up...  */
>> +
>> +/* Memory tagging control operations (for AArch64).  */
>> +#ifndef PR_TAGGED_ADDR_ENABLE
>> +# define PR_TAGGED_ADDR_ENABLE    (1UL << 8)
>> +#endif
>> +
>> +#ifndef PR_MTE_TCF_SHIFT
>> +# define PR_MTE_TCF_SHIFT    1
>> +# define PR_MTE_TCF_NONE    (0UL << PR_MTE_TCF_SHIFT)
>> +# define PR_MTE_TCF_SYNC    (1UL << PR_MTE_TCF_SHIFT)
>> +# define PR_MTE_TCF_ASYNC    (2UL << PR_MTE_TCF_SHIFT)
>> +# define PR_MTE_TCF_MASK    (3UL << PR_MTE_TCF_SHIFT)
>> +# define PR_MTE_TAG_SHIFT    3
>> +# define PR_MTE_TAG_MASK    (0xffffUL << PR_MTE_TAG_SHIFT)
>> +#endif
>> +
>>  __BEGIN_DECLS
>>  
>>  /* Control process execution.  */
> 
> 

The standard linux kernel headers have this in an architecture
independent file, so why should glibc need to do this differently?

R.
  
Siddhesh Poyarekar Dec. 21, 2020, 1:38 p.m. UTC | #3
On 12/21/20 7:04 PM, Richard Earnshaw wrote:
> The standard linux kernel headers have this in an architecture
> independent file, so why should glibc need to do this differently?

Only because that's the precedent we set with x86, where we avoided 
writing into the architecture-independent header.  It seems cleaner that 
way too.

Siddhesh
  
Florian Weimer Dec. 21, 2020, 1:39 p.m. UTC | #4
* Siddhesh Poyarekar:

> On 12/19/20 12:59 AM, Richard Earnshaw via Libc-alpha wrote:
>> Older versions of the Linux kernel headers obviously lack support
>> for
>> memory tagging, but we still want to be able to build in support when
>> using those (obviously it can't be enabled on such systems).
>> The linux kernel extensions are made to the platform-independent
>> header (linux/prctl.h), so this patch takes a similar approach.
>> ---
>>   sysdeps/unix/sysv/linux/sys/prctl.h | 18 ++++++++++++++++++
>>   1 file changed, 18 insertions(+)
>
> Please put the additions into an architecture-specific
> sysdeps/unix/sysv/linux/aarch64/sys/prctl.h and include_next this file 
> from there.

This does not work for an installed header.  A separate bits/ header is
needed for such cases (if it is indeed required not to make the
definitions generic, which is probably not the case here—that is,
this part of Richard's patch can be used as-is).

Thanks,
Florian
  
Siddhesh Poyarekar Dec. 21, 2020, 1:41 p.m. UTC | #5
On 12/21/20 7:09 PM, Florian Weimer wrote:
> * Siddhesh Poyarekar:
> 
>> On 12/19/20 12:59 AM, Richard Earnshaw via Libc-alpha wrote:
>>> Older versions of the Linux kernel headers obviously lack support
>>> for
>>> memory tagging, but we still want to be able to build in support when
>>> using those (obviously it can't be enabled on such systems).
>>> The linux kernel extensions are made to the platform-independent
>>> header (linux/prctl.h), so this patch takes a similar approach.
>>> ---
>>>    sysdeps/unix/sysv/linux/sys/prctl.h | 18 ++++++++++++++++++
>>>    1 file changed, 18 insertions(+)
>>
>> Please put the additions into an architecture-specific
>> sysdeps/unix/sysv/linux/aarch64/sys/prctl.h and include_next this file
>> from there.
> 
> This does not work for an installed header.  A separate bits/ header is
> needed for such cases (if it is indeed required not to make the
> definitions generic, which is probably not the case here—that is,
> this part of Richard's patch can be used as-is).

Uff, indeed I didn't notice that it was an installed header.  This is OK 
as is then.

Thanks,
Siddhesh
  

Patch

diff --git a/sysdeps/unix/sysv/linux/sys/prctl.h b/sysdeps/unix/sysv/linux/sys/prctl.h
index 7f748ebeeb..4d01379c23 100644
--- a/sysdeps/unix/sysv/linux/sys/prctl.h
+++ b/sysdeps/unix/sysv/linux/sys/prctl.h
@@ -21,6 +21,24 @@ 
 #include <features.h>
 #include <linux/prctl.h>  /*  The magic values come from here  */
 
+/* Recent extensions to linux which may post-date the kernel headers
+   we're picking up...  */
+
+/* Memory tagging control operations (for AArch64).  */
+#ifndef PR_TAGGED_ADDR_ENABLE
+# define PR_TAGGED_ADDR_ENABLE	(1UL << 8)
+#endif
+
+#ifndef PR_MTE_TCF_SHIFT
+# define PR_MTE_TCF_SHIFT	1
+# define PR_MTE_TCF_NONE	(0UL << PR_MTE_TCF_SHIFT)
+# define PR_MTE_TCF_SYNC	(1UL << PR_MTE_TCF_SHIFT)
+# define PR_MTE_TCF_ASYNC	(2UL << PR_MTE_TCF_SHIFT)
+# define PR_MTE_TCF_MASK	(3UL << PR_MTE_TCF_SHIFT)
+# define PR_MTE_TAG_SHIFT	3
+# define PR_MTE_TAG_MASK	(0xffffUL << PR_MTE_TAG_SHIFT)
+#endif
+
 __BEGIN_DECLS
 
 /* Control process execution.  */