From: "H.J. Lu" <hjl.tools@gmail.com>
To: libc-alpha@sourceware.org
Subject: [RFC] <sys/tagged-address.h>: An API for tagged address
Date: Thu, 11 Feb 2021 09:37:11 -0800 [thread overview]
Message-ID: <20210211173711.71736-1-hjl.tools@gmail.com> (raw)
An API for tagged address:
/* Get the current address bits used in address translation. */
extern unsigned int get_tagged_address_bits (void);
/* Get the current mask for address bits used in address translation. */
extern uintptr_t get_tagged_address_mask (void);
/* Set the mask for address bits used in address translation. Return 0
on success. Return -1 on error. */
extern int set_tagged_address_mask (uintptr_t __mask);
/* Return the tagged address of __ADDR with the tag value __TAG. */
extern void *tag_address (void *__addr, unsigned int __tag);
/* Return the untagged address of __ADDR. */
extern void *untag_address (void *__addr);
/* TRUE if constant address BITS is a valid tagged address bits. */
#define TAGGED_ADDRESS_VALID_BITS(BITS)
/* A mask for constant address BITS used in address translation. */
#define TAGGED_ADDRESS_MASK(BITS)
---
bits/tagged-address.h | 25 +++++++++
include/sys/tagged-address.h | 9 +++
misc/Makefile | 3 +-
misc/Versions | 7 +++
misc/set-tagged-address-mask.c | 28 ++++++++++
misc/sys/tagged-address.h | 56 +++++++++++++++++++
misc/tagged-address.c | 55 ++++++++++++++++++
sysdeps/generic/inline-tagged-address.h | 43 ++++++++++++++
sysdeps/unix/sysv/linux/i386/libc.abilist | 5 ++
.../unix/sysv/linux/x86_64/64/libc.abilist | 5 ++
.../unix/sysv/linux/x86_64/x32/libc.abilist | 5 ++
11 files changed, 240 insertions(+), 1 deletion(-)
create mode 100644 bits/tagged-address.h
create mode 100644 include/sys/tagged-address.h
create mode 100644 misc/set-tagged-address-mask.c
create mode 100644 misc/sys/tagged-address.h
create mode 100644 misc/tagged-address.c
create mode 100644 sysdeps/generic/inline-tagged-address.h
diff --git a/bits/tagged-address.h b/bits/tagged-address.h
new file mode 100644
index 0000000000..24f865b8af
--- /dev/null
+++ b/bits/tagged-address.h
@@ -0,0 +1,25 @@
+/* Copyright (C) 2021 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _BITS_TAGGED_ADDRESS_H
+#define _BITS_TAGGED_ADDRESS_H 1
+
+#ifndef _SYS_TAGGED_ADDRESS_H
+# error "Never include this file directly. Use <sys/tagged-address.h> instead"
+#endif
+
+#endif /* <bits/tagged-address.h> */
diff --git a/include/sys/tagged-address.h b/include/sys/tagged-address.h
new file mode 100644
index 0000000000..2e902f72b2
--- /dev/null
+++ b/include/sys/tagged-address.h
@@ -0,0 +1,9 @@
+#include <misc/sys/tagged-address.h>
+
+#ifndef _ISOMAC
+# include <inline-tagged-address.h>
+# define get_tagged_address_bits() __get_tagged_address_bits ()
+# define get_tagged_address_mask() __get_tagged_address_mask ()
+# define tag_address(addr, tag) __tag_address ((addr), (tag))
+# define untag_address(addr) __untag_address ((addr))
+#endif
diff --git a/misc/Makefile b/misc/Makefile
index b08d7c68ab..c5d8838486 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -73,7 +73,8 @@ routines := brk sbrk sstk ioctl \
fgetxattr flistxattr fremovexattr fsetxattr getxattr \
listxattr lgetxattr llistxattr lremovexattr lsetxattr \
removexattr setxattr getauxval ifunc-impl-list makedev \
- allocate_once fd_to_filename single_threaded
+ allocate_once fd_to_filename single_threaded \
+ tagged-address set-tagged-address-mask
generated += tst-error1.mtrace tst-error1-mem.out \
tst-allocate_once.mtrace tst-allocate_once-mem.out
diff --git a/misc/Versions b/misc/Versions
index 95666f6548..9e9ded4d5c 100644
--- a/misc/Versions
+++ b/misc/Versions
@@ -164,6 +164,13 @@ libc {
GLIBC_2.32 {
__libc_single_threaded;
}
+ GLIBC_2.34 {
+ get_tagged_address_bits;
+ get_tagged_address_mask;
+ set_tagged_address_mask;
+ tag_address;
+ untag_address;
+ }
GLIBC_PRIVATE {
__madvise;
__mktemp;
diff --git a/misc/set-tagged-address-mask.c b/misc/set-tagged-address-mask.c
new file mode 100644
index 0000000000..89902b47c2
--- /dev/null
+++ b/misc/set-tagged-address-mask.c
@@ -0,0 +1,28 @@
+/* Copyright (C) 2021 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <sys/tagged-address.h>
+
+/* Set the mask for address bits used in address translation. Return 0
+ on success. Return -1 on error. */
+
+int
+set_tagged_address_mask (uintptr_t mask)
+{
+ __set_errno (ENOSYS);
+ return -1;
+}
diff --git a/misc/sys/tagged-address.h b/misc/sys/tagged-address.h
new file mode 100644
index 0000000000..540db14dd2
--- /dev/null
+++ b/misc/sys/tagged-address.h
@@ -0,0 +1,56 @@
+/* Copyright (C) 2021 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _SYS_TAGGED_ADDRESS_H
+#define _SYS_TAGGED_ADDRESS_H 1
+
+#include <features.h>
+#include <stdint.h>
+#include <bits/tagged-address.h>
+
+#if defined TAGGED_ADDRESS_VALID_BITS && defined __GNUC__
+/* A mask for constant address BITS used in address translation. */
+# define TAGGED_ADDRESS_MASK(BITS) \
+ (__extension__ \
+ ({ \
+ _Static_assert (TAGGED_ADDRESS_VALID_BITS (BITS), \
+ "Tagged address bits must be valid"); \
+ (((uintptr_t) 1) << (BITS)) - 1; \
+ }))
+#endif
+
+__BEGIN_DECLS
+
+/* Get the current address bits used in address translation. */
+extern unsigned int get_tagged_address_bits (void);
+
+/* Get the current mask for address bits used in address translation. */
+extern uintptr_t get_tagged_address_mask (void);
+
+/* Set the mask for address bits used in address translation. Return 0
+ on success. Return -1 on error. */
+extern int set_tagged_address_mask (uintptr_t __mask);
+
+/* Return the tagged address of __ADDR with the tag value __TAG. */
+extern void *tag_address (void *__addr, unsigned int __tag);
+
+/* Return the untagged address of __ADDR. */
+extern void *untag_address (void *__addr);
+
+__END_DECLS
+
+#endif /* <sys/tagged-address.h> */
diff --git a/misc/tagged-address.c b/misc/tagged-address.c
new file mode 100644
index 0000000000..df474f3d0b
--- /dev/null
+++ b/misc/tagged-address.c
@@ -0,0 +1,55 @@
+/* Copyright (C) 2021 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <sys/tagged-address.h>
+
+#undef get_tagged_address_bits
+#undef get_tagged_address_mask
+#undef tag_address
+#undef untag_address
+
+/* Get the current address bits used in address translation. */
+
+unsigned int
+get_tagged_address_bits (void)
+{
+ return __get_tagged_address_bits ();
+}
+
+/* Get the current mask for address bits used in address translation. */
+
+uintptr_t
+get_tagged_address_mask (void)
+{
+ return __get_tagged_address_mask ();
+}
+
+/* Return the tagged address of ADDR with the tag value TAG. */
+
+void *
+tag_address (void *addr, unsigned int tag)
+{
+ return __tag_address (addr, tag);
+}
+
+/* Return the untagged address of ADDR. */
+
+void *
+untag_address (void *addr)
+{
+ return __untag_address (addr);
+}
diff --git a/sysdeps/generic/inline-tagged-address.h b/sysdeps/generic/inline-tagged-address.h
new file mode 100644
index 0000000000..a016b16f21
--- /dev/null
+++ b/sysdeps/generic/inline-tagged-address.h
@@ -0,0 +1,43 @@
+/* Inline tagged address functions. Generic version.
+ Copyright (C) 2021 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+
+static inline unsigned int
+__get_tagged_address_bits (void)
+{
+ return sizeof (uintptr_t) * 8;
+}
+
+static inline uintptr_t
+__get_tagged_address_mask (void)
+{
+ return (uintptr_t) -1;
+}
+
+static inline void *
+__tag_address (void *addr, unsigned int tag)
+{
+ return addr;
+}
+
+static inline void *
+__untag_address (void *addr)
+{
+ return addr;
+}
diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
index ddc5837059..464c8af2ee 100644
--- a/sysdeps/unix/sysv/linux/i386/libc.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
@@ -2241,6 +2241,11 @@ GLIBC_2.33 mknod F
GLIBC_2.33 mknodat F
GLIBC_2.33 stat F
GLIBC_2.33 stat64 F
+GLIBC_2.34 get_tagged_address_bits F
+GLIBC_2.34 get_tagged_address_mask F
+GLIBC_2.34 set_tagged_address_mask F
+GLIBC_2.34 tag_address F
+GLIBC_2.34 untag_address F
GLIBC_2.4 __confstr_chk F
GLIBC_2.4 __fgets_chk F
GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
index 2744bba4af..7486bf09bc 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
@@ -2088,6 +2088,11 @@ GLIBC_2.33 mknod F
GLIBC_2.33 mknodat F
GLIBC_2.33 stat F
GLIBC_2.33 stat64 F
+GLIBC_2.34 get_tagged_address_bits F
+GLIBC_2.34 get_tagged_address_mask F
+GLIBC_2.34 set_tagged_address_mask F
+GLIBC_2.34 tag_address F
+GLIBC_2.34 untag_address F
GLIBC_2.4 __confstr_chk F
GLIBC_2.4 __fgets_chk F
GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
index ce2f4fb72b..d88202196f 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
@@ -2185,3 +2185,8 @@ GLIBC_2.33 mknod F
GLIBC_2.33 mknodat F
GLIBC_2.33 stat F
GLIBC_2.33 stat64 F
+GLIBC_2.34 get_tagged_address_bits F
+GLIBC_2.34 get_tagged_address_mask F
+GLIBC_2.34 set_tagged_address_mask F
+GLIBC_2.34 tag_address F
+GLIBC_2.34 untag_address F
--
2.29.2
next reply other threads:[~2021-02-11 17:37 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-11 17:37 H.J. Lu [this message]
2021-02-11 20:28 ` Joseph Myers
2021-02-11 21:39 ` H.J. Lu
2021-02-12 9:43 ` Florian Weimer
2021-02-12 13:06 ` H.J. Lu
2021-02-17 18:43 ` H.J. Lu
2021-02-17 21:58 ` H.J. Lu
2021-02-18 13:24 ` Szabolcs Nagy
2021-02-18 13:28 ` Florian Weimer
2021-02-18 13:50 ` Szabolcs Nagy
2021-02-18 22:32 ` H.J. Lu
2021-02-22 8:27 ` Szabolcs Nagy
2021-02-22 13:57 ` H.J. Lu
2021-02-18 13:17 ` Szabolcs Nagy
2021-02-18 13:21 ` Florian Weimer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210211173711.71736-1-hjl.tools@gmail.com \
--to=hjl.tools@gmail.com \
--cc=libc-alpha@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).