@@ -9,7 +9,7 @@ Version 2.35
Major new features:
- [Add new features here]
+* Add <sys/tagged-address.h> to provide an API for tagged address.
Deprecated and removed features, and other changes affecting compatibility:
new file mode 100644
@@ -0,0 +1,47 @@
+/* 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_MASK_H
+#define _BITS_TAGGED_ADDRESS_MASK_H 1
+
+#ifndef _SYS_TAGGED_ADDRESS_H
+# error "Never include this file directly. Use <sys/tagged-address.h> instead"
+#endif
+
+#include <bits/tagged-address-valid-bits.h>
+
+#ifdef __cplusplus
+# if __cplusplus >= 201103L
+# define TRANSLATED_ADDRESS_ASSERT static_assert
+# else
+# define TRANSLATED_ADDRESS_ASSERT(expr, msg)
+# endif
+#else
+# define TRANSLATED_ADDRESS_ASSERT _Static_assert
+#endif
+
+/* A mask for constant address BITS used in address translation. */
+#define TRANSLATED_ADDRESS_MASK(BITS) \
+ (__extension__ \
+ ({ \
+ TRANSLATED_ADDRESS_ASSERT \
+ (TRANSLATED_ADDRESS_VALID_BITS (BITS), \
+ "Translated address bits must be valid"); \
+ (((uintptr_t) 1) << (BITS)) - 1; \
+ }))
+
+#endif /* <bits/tagged-address-mask.h> */
new file mode 100644
@@ -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/>. */
+
+#ifndef _BITS_TAGGED_ADDRESS_VALID_BITS_H
+#define _BITS_TAGGED_ADDRESS_VALID_BITS_H 1
+
+#ifndef _SYS_TAGGED_ADDRESS_H
+# error "Never include this file directly. Use <sys/tagged-address.h> instead"
+#endif
+
+/* Non-zero if constant address BITS is a valid translated address bits. */
+#define TRANSLATED_ADDRESS_VALID_BITS(BITS) 0
+
+#endif /* <bits/tagged-address-valid-bits.h> */
@@ -402,6 +402,9 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
GLRO(dl_debug_printf) ("\ntransferring control: %s\n\n", argv[0]);
#endif
+ /* set_translated_address_mask can only be called before main. */
+ GL(dl_translated_address_mask_locked) = 1;
+
#ifndef SHARED
_dl_debug_initialize (0, LM_ID_BASE);
#endif
@@ -213,6 +213,11 @@ struct link_map *_dl_sysinfo_map;
# include "get-dynamic-info.h"
#endif
+
+/* If nonzero, the mask for address bits used in address translation
+ is locked. */
+int _dl_translated_address_mask_locked;
+
#include "setup-vdso.h"
/* Define the vDSO function pointers. */
#include <dl-vdso-setup.c>
new file mode 100644
@@ -0,0 +1,18 @@
+#include <misc/sys/tagged-address.h>
+
+#ifdef _ISOMAC
+/* Get the current address bits used in address translation. */
+extern unsigned int __libc_get_translated_address_bits (void);
+
+/* Get the current mask for address bits used in address translation. */
+extern uintptr_t __libc_get_translated_address_mask (void);
+
+/* Return the tagged address of __ADDR with the tag value __TAG. */
+extern void *__libc_tag_address (void *__addr, unsigned int __tag);
+
+/* Return the untagged address of __ADDR. */
+extern void *__libc_untag_address (void *__addr);
+
+#else
+# include <inline-tagged-address.h>
+#endif
@@ -34,7 +34,8 @@ info: $(objpfx)libc.info
endif
chapters = $(addsuffix .texi, \
- intro errno memory ctype string charset locale \
+ intro errno memory tagged-address ctype string \
+ charset locale \
message search pattern io stdio llio filesys \
pipe socket terminal syslog math arith time \
resource setjmp signal startup process ipc job \
@@ -1,4 +1,4 @@
-@node Character Handling, String and Array Utilities, Memory, Top
+@node Character Handling, String and Array Utilities, Tagged Address, Top
@c %MENU% Character testing and conversion functions
@chapter Character Handling
@@ -1,4 +1,4 @@
-@node Memory, Character Handling, Error Reporting, Top
+@node Memory, Tagged Address, Error Reporting, Top
@chapter Virtual Memory Allocation And Paging
@c %MENU% Allocating virtual memory and controlling paging
@cindex memory allocation
new file mode 100644
@@ -0,0 +1,48 @@
+@node Tagged Address, Character Handling, Memory, Top
+@c %MENU% Tagged address functions and macros
+@chapter Tagged Address
+
+By default, the number of the address bits used in address translation
+is the number of address bits. But it can be changed by ARM Top-byte
+Ignore (TBI) or Intel Linear Address Masking (LAM).
+
+@Theglibc{} provides one function and two macros in the header file
+@file{sys/tagged-address.h} to manipulate translated address bits,
+which is the number of the address bits used in address translation,
+with restrictions:
+
+@itemize @bullet
+@item
+All bits between 0 and N - 1, where N is the number of translated address
+bits, are used in address translation.
+
+@item
+All pointers participating in a pointer arithmetic operation should have
+the same tag if they point to the same memory object so that pointer
+equality operation can be performed on tagged pointers.
+@end itemize
+
+@pindex sys/tagged-address.h
+
+@deftypefun int set_translated_address_mask (uintptr_t @var{mask})
+@standards{GNU, sys/tagged-address.h}
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
+Set the mask for address bits used in address translation to @var{mask}.
+Only bits set in @var{mask} will be used in address translation. The
+return value is @code{0} on success and @code{-1} on failure. This
+function can be called only once before @code{main} and thread creation.
+The possible @code{errno} error conditions are @code{ENODEV}, @code{EPERM},
+@code{EINVAL}, and @code{ENOSYS}.
+@end deftypefun
+
+@deftypefn Macro int TRANSLATED_ADDRESS_VALID_BITS (@var{bits})
+This macro returns a nonzero value (true) if @var{bits} is a valid
+constant number of the lower address bits which can be used in address
+translation.
+@end deftypefn
+
+@deftypefn Macro {const uintptr_t} TRANSLATED_ADDRESS_MASK (@var{bits})
+This macro returns a nonzero value which can be passed to
+@code{set_translated_address_mask} to specify the lower address
+@var{bits} for address translation.
+@end deftypefn
@@ -38,7 +38,10 @@ headers := sys/uio.h bits/uio-ext.h bits/uio_lim.h \
bits/select2.h bits/hwcap.h sys/auxv.h \
sys/sysmacros.h bits/sysmacros.h bits/types/struct_iovec.h \
bits/err-ldbl.h bits/error-ldbl.h \
- sys/single_threaded.h
+ sys/single_threaded.h \
+ sys/tagged-address.h \
+ bits/tagged-address-mask.h \
+ bits/tagged-address-valid-bits.h
routines := brk sbrk sstk ioctl \
readv writev preadv preadv64 pwritev pwritev64 \
@@ -73,7 +76,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 unwind-link
+ allocate_once fd_to_filename single_threaded unwind-link \
+ tagged-address set-translated-address-mask
generated += tst-error1.mtrace tst-error1-mem.out \
tst-allocate_once.mtrace tst-allocate_once-mem.out
@@ -89,7 +93,11 @@ tests := tst-dirname tst-tsearch tst-fdset tst-mntent tst-hsearch \
tst-preadvwritev2 tst-preadvwritev64v2 tst-warn-wide \
tst-ldbl-warn tst-ldbl-error tst-dbl-efgcvt tst-ldbl-efgcvt \
tst-mntent-autofs tst-syscalls tst-mntent-escape tst-select \
- tst-ioctl
+ tst-ioctl \
+ tst-tagged-address-1 tst-tagged-address-1-static \
+ tst-tagged-address-2 tst-tagged-address-2-static \
+ tst-tagged-address-3 tst-tagged-address-3-static \
+ tst-tagged-address-4 tst-tagged-address-4-static
tests-time64 := \
tst-select-time64 \
@@ -99,11 +107,24 @@ tests-time64 := \
# Tests which need libdl.
ifeq (yes,$(build-shared))
-tests += tst-gethostid
+tests += tst-gethostid \
+ tst-tagged-address-5 \
+ tst-tagged-address-6 \
+ tst-tagged-address-7
+modules-names-tst-tagged-address = \
+ tst-tagged-address-mod-5 \
+ tst-tagged-address-mod-6 \
+ tst-tagged-address-mod-7
+modules-names += $(modules-names-tst-tagged-address)
+modules-names-tests += $(modules-names-tst-tagged-address)
endif
tests-internal := tst-atomic tst-atomic-long tst-allocate_once
-tests-static := tst-empty
+tests-static := tst-empty \
+ tst-tagged-address-1-static \
+ tst-tagged-address-2-static \
+ tst-tagged-address-3-static \
+ tst-tagged-address-4-static
# Test for the internal, non-exported __fd_to_filename function.
tests-internal += tst-fd_to_filename
@@ -172,3 +193,12 @@ $(objpfx)tst-select: $(librt)
$(objpfx)tst-select-time64: $(librt)
$(objpfx)tst-pselect: $(librt)
$(objpfx)tst-pselect-time64: $(librt)
+
+$(objpfx)tst-tagged-address-2: $(shared-thread-library)
+$(objpfx)tst-tagged-address-2-static: $(static-thread-library)
+$(objpfx)tst-tagged-address-5: $(objpfx)tst-tagged-address-mod-5.so
+$(objpfx)tst-tagged-address-mod-5.so: $(libsupport)
+$(objpfx)tst-tagged-address-6: $(objpfx)tst-tagged-address-mod-6.so
+$(objpfx)tst-tagged-address-mod-6.so: $(libsupport)
+$(objpfx)tst-tagged-address-7.out: $(objpfx)tst-tagged-address-mod-7.so
+$(objpfx)tst-tagged-address-mod-7.so: $(libsupport)
@@ -164,6 +164,10 @@ libc {
GLIBC_2.32 {
__libc_single_threaded;
}
+ GLIBC_2.35 {
+ # Support tagged address.
+ set_translated_address_mask;
+ }
GLIBC_PRIVATE {
__madvise;
__mktemp;
@@ -173,5 +177,11 @@ libc {
__sched_get_priority_min; __sched_get_priority_max;
__libc_allocate_once_slow;
__libc_unwind_link_get;
+
+ # Support tagged address.
+ __libc_get_translated_address_bits;
+ __libc_get_translated_address_mask;
+ __libc_tag_address;
+ __libc_untag_address;
}
}
new file mode 100644
@@ -0,0 +1,41 @@
+/* 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>
+#include <ldsodefs.h>
+
+/* Set the mask for address bits used in address translation. Return 0
+ on success. Return -1 on error. */
+
+int
+set_translated_address_mask (uintptr_t mask)
+{
+ if (GL(dl_translated_address_mask_locked) != 0)
+ __set_errno (EPERM);
+ else
+ {
+ /* set_translated_address_mask can only be called once. */
+ GL(dl_translated_address_mask_locked) = 1;
+
+ /* Only NOP is allowed. */
+ if (mask == __get_translated_address_mask ())
+ return 0;
+
+ __set_errno (ENOSYS);
+ }
+ return -1;
+}
new file mode 100644
@@ -0,0 +1,33 @@
+/* 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-mask.h>
+
+__BEGIN_DECLS
+
+/* Set the mask for address bits used in address translation. Return 0
+ on success. Return -1 on error. */
+extern int set_translated_address_mask (uintptr_t __mask);
+
+__END_DECLS
+
+#endif /* <sys/tagged-address.h> */
new file mode 100644
@@ -0,0 +1,50 @@
+/* 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>
+
+/* Get the current address bits used in address translation. */
+
+unsigned int
+__libc_get_translated_address_bits (void)
+{
+ return __get_translated_address_bits ();
+}
+
+/* Get the current mask for address bits used in address translation. */
+
+uintptr_t
+__libc_get_translated_address_mask (void)
+{
+ return __get_translated_address_mask ();
+}
+
+/* Return the tagged address of ADDR with the tag value TAG. */
+
+void *
+__libc_tag_address (void *addr, unsigned int tag)
+{
+ return __tag_address (addr, tag);
+}
+
+/* Return the untagged address of ADDR. */
+
+void *
+__libc_untag_address (void *addr)
+{
+ return __untag_address (addr);
+}
new file mode 100644
@@ -0,0 +1 @@
+#include <tst-tagged-address-1.c>
new file mode 100644
@@ -0,0 +1,55 @@
+/* Tests for set_translated_address_mask before main.
+ 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>
+#include <sys/tagged-address.h>
+#include <support/check.h>
+
+static void
+init_0 (void)
+{
+ if (set_translated_address_mask (__libc_get_translated_address_mask ())
+ != 0)
+ FAIL_EXIT1 ("set_translated_address_mask failed: %m");
+}
+
+static void
+init_1 (void)
+{
+ if (set_translated_address_mask (__libc_get_translated_address_mask ())
+ == 0)
+ FAIL_EXIT1 ("set_translated_address_mask should fail");
+
+ if (errno != EPERM)
+ FAIL_EXIT1 ("set_translated_address_mask: errno (%m) != EPERM");
+}
+
+static void (*init_array []) (void)
+ __attribute__ ((used, section (".init_array"), aligned (sizeof (void *)))) =
+{
+ &init_0,
+ &init_1
+};
+
+static int
+do_test (void)
+{
+ return 0;
+}
+
+#include <support/test-driver.c>
new file mode 100644
@@ -0,0 +1 @@
+#include <tst-tagged-address-2.c>
new file mode 100644
@@ -0,0 +1,45 @@
+/* Test for set_translated_address_mask before main with pthread.
+ 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>
+#include <sys/tagged-address.h>
+#include <support/xthread.h>
+#include <support/check.h>
+
+static void *
+tf (void *arg)
+{
+ if (set_translated_address_mask (__libc_get_translated_address_mask ())
+ == 0)
+ FAIL_EXIT1 ("set_translated_address_mask should fail");
+
+ if (errno != EPERM)
+ FAIL_EXIT1 ("set_translated_address_mask: errno (%m) != EPERM");
+
+ return NULL;
+}
+
+static int
+do_test (void)
+{
+ pthread_t thr = xpthread_create (NULL, tf, NULL);
+ xpthread_join (thr);
+ return 0;
+}
+
+#include <support/test-driver.c>
new file mode 100644
@@ -0,0 +1 @@
+#include <tst-tagged-address-3.c>
new file mode 100644
@@ -0,0 +1,48 @@
+/* Tests for set_translated_address_mask to turn off tagged address.
+ 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>
+#include <support/check.h>
+
+static void
+init (void)
+{
+ uintptr_t mask = (uintptr_t) -1;
+ if (set_translated_address_mask (mask) != 0)
+ FAIL_EXIT1 ("set_translated_address_mask failed: %m");
+}
+
+static void (*init_array []) (void)
+ __attribute__ ((used, section (".init_array"), aligned (sizeof (void *)))) =
+{
+ &init
+};
+
+static int
+do_test (void)
+{
+ uintptr_t mask = (uintptr_t) -1;
+ uintptr_t curent_mask = __libc_get_translated_address_mask ();
+ if (curent_mask != mask)
+ FAIL_EXIT1 ("get_translated_address_mask failed: %p != %p",
+ (void *) curent_mask, (void *) mask);
+
+ return 0;
+}
+
+#include <support/test-driver.c>
new file mode 100644
@@ -0,0 +1 @@
+#include <tst-tagged-address-4.c>
new file mode 100644
@@ -0,0 +1,36 @@
+/* Test for set_translated_address_mask after main.
+ 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>
+#include <sys/tagged-address.h>
+#include <support/check.h>
+
+static int
+do_test (void)
+{
+ if (set_translated_address_mask (__libc_get_translated_address_mask ())
+ == 0)
+ FAIL_EXIT1 ("set_translated_address_mask should fail");
+
+ if (errno != EPERM)
+ FAIL_EXIT1 ("set_translated_address_mask: errno (%m) != EPERM");
+
+ return 0;
+}
+
+#include <support/test-driver.c>
new file mode 100644
@@ -0,0 +1,25 @@
+/* Tests for set_translated_address_mask in a shared library before main.
+ 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/>. */
+
+static int
+do_test (void)
+{
+ return 0;
+}
+
+#include <support/test-driver.c>
new file mode 100644
@@ -0,0 +1,34 @@
+/* Tests for set_translated_address_mask to turn off tagged address.
+ 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>
+#include <support/check.h>
+
+static int
+do_test (void)
+{
+ uintptr_t mask = (uintptr_t) -1;
+ uintptr_t curent_mask = __libc_get_translated_address_mask ();
+ if (curent_mask != mask)
+ FAIL_EXIT1 ("get_translated_address_mask failed: %p != %p",
+ (void *) curent_mask, (void *) mask);
+
+ return 0;
+}
+
+#include <support/test-driver.c>
new file mode 100644
@@ -0,0 +1,41 @@
+/* Test for set_translated_address_mask in a dlopened shared library
+ after main.
+ 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 <stddef.h>
+#include <dlfcn.h>
+#include <support/check.h>
+
+static int
+do_test (void)
+{
+ const char *modname = "$ORIGIN/tst-tagged-address-mod-7.so";
+ void *h = dlopen (modname, RTLD_LAZY);
+
+ if (h == NULL)
+ {
+ const char *err = dlerror ();
+ FAIL_EXIT1 ("cannot open '%s': %s\n", modname, err);
+ }
+
+ dlclose (h);
+
+ return 0;
+}
+
+#include <support/test-driver.c>
new file mode 100644
@@ -0,0 +1,47 @@
+/* Tests for set_translated_address_mask in a shared library.
+ 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>
+#include <sys/tagged-address.h>
+#include <support/check.h>
+
+static void
+init_0 (void)
+{
+ if (set_translated_address_mask (__libc_get_translated_address_mask ())
+ != 0)
+ FAIL_EXIT1 ("set_translated_address_mask failed: %m");
+}
+
+static void
+init_1 (void)
+{
+ if (set_translated_address_mask (__libc_get_translated_address_mask ())
+ == 0)
+ FAIL_EXIT1 ("set_translated_address_mask should fail");
+
+ if (errno != EPERM)
+ FAIL_EXIT1 ("set_translated_address_mask: errno (%m) != EPERM");
+}
+
+static void (*init_array []) (void)
+ __attribute__ ((used, section (".init_array"), aligned (sizeof (void *)))) =
+{
+ &init_0,
+ &init_1
+};
new file mode 100644
@@ -0,0 +1,34 @@
+/* Tests for set_translated_address_mask to turn off tagged address.
+ 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>
+#include <support/check.h>
+
+static void
+init (void)
+{
+ uintptr_t mask = (uintptr_t) -1;
+ if (set_translated_address_mask (mask) != 0)
+ FAIL_EXIT1 ("set_translated_address_mask failed: %m");
+}
+
+static void (*init_array []) (void)
+ __attribute__ ((used, section (".init_array"), aligned (sizeof (void *)))) =
+{
+ &init
+};
new file mode 100644
@@ -0,0 +1,35 @@
+/* Tests for set_translated_address_mask to turn off tagged address in
+ a shared library.
+ 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>
+#include <support/check.h>
+
+static void
+init (void)
+{
+ uintptr_t mask = (uintptr_t) -1;
+ if (set_translated_address_mask (mask) == 0)
+ FAIL_EXIT1 ("set_translated_address_mask should have failed");
+}
+
+static void (*init_array []) (void)
+ __attribute__ ((used, section (".init_array"), aligned (sizeof (void *)))) =
+{
+ &init
+};
new file mode 100644
@@ -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_translated_address_bits (void)
+{
+ return sizeof (uintptr_t) * 8;
+}
+
+static inline uintptr_t
+__get_translated_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;
+}
@@ -489,6 +489,10 @@ struct rtld_global
#else
EXTERN int _dl_thread_gscope_count;
#endif
+
+ /* If nonzero, the mask for address bits used in address translation
+ is locked. */
+ EXTERN int _dl_translated_address_mask_locked;
#ifdef SHARED
};
# define __rtld_global_attribute__
@@ -2780,6 +2780,7 @@ GLIBC_2.34 tss_create F
GLIBC_2.34 tss_delete F
GLIBC_2.34 tss_get F
GLIBC_2.34 tss_set F
+GLIBC_2.35 set_translated_address_mask F
GLIBC_2.4 __confstr_chk F
GLIBC_2.4 __fgets_chk F
GLIBC_2.4 __fgets_unlocked_chk F
@@ -2521,6 +2521,7 @@ GLIBC_2.34 tss_create F
GLIBC_2.34 tss_delete F
GLIBC_2.34 tss_get F
GLIBC_2.34 tss_set F
+GLIBC_2.35 set_translated_address_mask F
GLIBC_2.4 __confstr_chk F
GLIBC_2.4 __fgets_chk F
GLIBC_2.4 __fgets_unlocked_chk F
@@ -2627,3 +2627,4 @@ GLIBC_2.34 tss_create F
GLIBC_2.34 tss_delete F
GLIBC_2.34 tss_get F
GLIBC_2.34 tss_set F
+GLIBC_2.35 set_translated_address_mask F