public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v2] string: Add support for __memsetzero on all targets
@ 2022-02-09 16:11 H.J. Lu
  2022-02-09 16:11 ` [PATCH] elf: Use memset_zero to erase data H.J. Lu
  0 siblings, 1 reply; 3+ messages in thread
From: H.J. Lu @ 2022-02-09 16:11 UTC (permalink / raw)
  To: libc-alpha

On x86-64, memset is faster than bzero before glibc 2.36 since bzero was
an alias of SSE2 memset while memset is optimized for AVX2 and AVX512.
To optimize for data erase, add

void __memsetzero (void *s, size_t n);

which is an alias of bzero.  If __memsetzero is available, compilers can
generate call to __memsetzero to erase data, instead of memset or bzero.

Tested with build-many-glibcs.py and natively on x86-64, x32 and i686.
---
 NEWS                                          |  4 ++-
 string/Makefile                               |  1 +
 string/Versions                               |  3 +++
 string/bzero.c                                |  4 +++
 string/string.h                               |  3 +++
 string/test-memset.c                          | 25 ++++++++++++-------
 string/test-memsetzero.c                      | 19 ++++++++++++++
 sysdeps/alpha/bzero.S                         |  4 +++
 sysdeps/i386/bzero.S                          |  4 +++
 sysdeps/i386/i586/bzero.S                     |  4 +++
 sysdeps/i386/i686/bzero.S                     |  4 +++
 sysdeps/i386/i686/multiarch/bzero-ia32.S      |  3 +++
 sysdeps/i386/i686/multiarch/bzero.c           |  4 +++
 sysdeps/ia64/bzero.S                          | 10 ++++++--
 sysdeps/mach/hurd/i386/libc.abilist           |  1 +
 sysdeps/powerpc/powerpc32/bzero.S             |  4 +++
 .../powerpc32/power4/multiarch/bzero.c        |  4 +++
 sysdeps/powerpc/powerpc64/le/power10/memset.S |  3 +++
 sysdeps/powerpc/powerpc64/memset.S            |  3 +++
 sysdeps/powerpc/powerpc64/multiarch/bzero.c   |  4 +++
 sysdeps/powerpc/powerpc64/power4/memset.S     |  3 +++
 sysdeps/powerpc/powerpc64/power6/memset.S     |  3 +++
 sysdeps/powerpc/powerpc64/power7/memset.S     |  3 +++
 sysdeps/powerpc/powerpc64/power8/memset.S     |  3 +++
 sysdeps/s390/bzero.c                          |  4 +++
 sysdeps/sparc/sparc32/memset.S                |  3 +++
 .../sparc32/sparcv9/multiarch/memset-ultra1.S |  2 ++
 sysdeps/sparc/sparc64/memset.S                |  3 +++
 sysdeps/sparc/sparc64/multiarch/bzero.c       |  3 +++
 .../sparc/sparc64/multiarch/memset-ultra1.S   |  2 ++
 sysdeps/unix/sysv/linux/aarch64/libc.abilist  |  1 +
 sysdeps/unix/sysv/linux/alpha/libc.abilist    |  1 +
 sysdeps/unix/sysv/linux/arc/libc.abilist      |  1 +
 sysdeps/unix/sysv/linux/arm/be/libc.abilist   |  1 +
 sysdeps/unix/sysv/linux/arm/le/libc.abilist   |  1 +
 sysdeps/unix/sysv/linux/csky/libc.abilist     |  1 +
 sysdeps/unix/sysv/linux/hppa/libc.abilist     |  1 +
 sysdeps/unix/sysv/linux/i386/libc.abilist     |  1 +
 sysdeps/unix/sysv/linux/ia64/libc.abilist     |  1 +
 .../sysv/linux/m68k/coldfire/libc.abilist     |  1 +
 .../unix/sysv/linux/m68k/m680x0/libc.abilist  |  1 +
 .../sysv/linux/microblaze/be/libc.abilist     |  1 +
 .../sysv/linux/microblaze/le/libc.abilist     |  1 +
 .../sysv/linux/mips/mips32/fpu/libc.abilist   |  1 +
 .../sysv/linux/mips/mips32/nofpu/libc.abilist |  1 +
 .../sysv/linux/mips/mips64/n32/libc.abilist   |  1 +
 .../sysv/linux/mips/mips64/n64/libc.abilist   |  1 +
 sysdeps/unix/sysv/linux/nios2/libc.abilist    |  1 +
 sysdeps/unix/sysv/linux/or1k/libc.abilist     |  1 +
 .../linux/powerpc/powerpc32/fpu/libc.abilist  |  1 +
 .../powerpc/powerpc32/nofpu/libc.abilist      |  1 +
 .../linux/powerpc/powerpc64/be/libc.abilist   |  1 +
 .../linux/powerpc/powerpc64/le/libc.abilist   |  1 +
 .../unix/sysv/linux/riscv/rv32/libc.abilist   |  1 +
 .../unix/sysv/linux/riscv/rv64/libc.abilist   |  1 +
 .../unix/sysv/linux/s390/s390-32/libc.abilist |  1 +
 .../unix/sysv/linux/s390/s390-64/libc.abilist |  1 +
 sysdeps/unix/sysv/linux/sh/be/libc.abilist    |  1 +
 sysdeps/unix/sysv/linux/sh/le/libc.abilist    |  1 +
 .../sysv/linux/sparc/sparc32/libc.abilist     |  1 +
 .../sysv/linux/sparc/sparc64/libc.abilist     |  1 +
 .../unix/sysv/linux/x86_64/64/libc.abilist    |  1 +
 .../unix/sysv/linux/x86_64/x32/libc.abilist   |  1 +
 sysdeps/x86_64/memset.S                       |  2 ++
 sysdeps/x86_64/multiarch/bzero.c              |  8 ++++++
 65 files changed, 171 insertions(+), 12 deletions(-)
 create mode 100644 string/test-memsetzero.c

diff --git a/NEWS b/NEWS
index 7b8febcb72..df4403fe2c 100644
--- a/NEWS
+++ b/NEWS
@@ -9,7 +9,9 @@ Version 2.36
 
 Major new features:
 
-  [Add new features here]
+* ABI support for a new function '__memsetzero'. '__memsetzero' is meant
+  to be used by compilers to erase data.  The default implementation is
+  an alias of bzero.
 
 Deprecated and removed features, and other changes affecting compatibility:
 
diff --git a/string/Makefile b/string/Makefile
index 641e062bbb..ee0b6a4890 100644
--- a/string/Makefile
+++ b/string/Makefile
@@ -145,6 +145,7 @@ tests := \
   test-mempcpy \
   test-memrchr \
   test-memset \
+  test-memsetzero \
   test-rawmemchr \
   test-sig_np \
   test-stpcpy \
diff --git a/string/Versions b/string/Versions
index 864c4cf7a4..0abd7262c5 100644
--- a/string/Versions
+++ b/string/Versions
@@ -92,4 +92,7 @@ libc {
   GLIBC_2.35 {
     __memcmpeq;
   }
+  GLIBC_2.36 {
+    __memsetzero;
+  }
 }
diff --git a/string/bzero.c b/string/bzero.c
index eb2af49e9e..7cbd5b340b 100644
--- a/string/bzero.c
+++ b/string/bzero.c
@@ -26,3 +26,7 @@ __bzero (void *s, size_t len)
   memset (s, '\0', len);
 }
 weak_alias (__bzero, bzero)
+
+#undef __memsetzero
+strong_alias (__bzero, __memsetzero)
+libc_hidden_def (__memsetzero)
diff --git a/string/string.h b/string/string.h
index d494a1d5f9..01bb018b3d 100644
--- a/string/string.h
+++ b/string/string.h
@@ -60,6 +60,9 @@ extern void *memccpy (void *__restrict __dest, const void *__restrict __src,
 /* Set N bytes of S to C.  */
 extern void *memset (void *__s, int __c, size_t __n) __THROW __nonnull ((1));
 
+/* Set N bytes of S to 0.  */
+extern void __memsetzero (void *__s, size_t __n) __THROW __nonnull ((1));
+
 /* Compare N bytes of S1 and S2.  */
 extern int memcmp (const void *__s1, const void *__s2, size_t __n)
      __THROW __attribute_pure__ __nonnull ((1, 2));
diff --git a/string/test-memset.c b/string/test-memset.c
index 8498b1bc97..7da2ce835d 100644
--- a/string/test-memset.c
+++ b/string/test-memset.c
@@ -23,7 +23,9 @@
 # else
 #  define TEST_NAME "bzero"
 # endif
-#else
+#elif defined TEST_MEMSETZERO
+# define TEST_NAME "__memsetzero"
+#else /* !TEST_MEMSETZERO */
 # ifndef WIDE
 #  define TEST_NAME "memset"
 # else
@@ -52,8 +54,13 @@
 
 CHAR *SIMPLE_MEMSET (CHAR *, int, size_t);
 
-#ifdef TEST_BZERO
+#if defined TEST_BZERO || defined TEST_MEMSETZERO
 typedef void (*proto_t) (char *, size_t);
+# ifdef TEST_MEMSETZERO
+#  define bzero __memsetzero
+#  define simple_bzero simple_memsetzero
+#  define builtin_bzero builtin_memsetzero
+# endif
 void simple_bzero (char *, size_t);
 void builtin_bzero (char *, size_t);
 
@@ -93,7 +100,7 @@ builtin_memset (char *s, int c, size_t n)
   return __builtin_memset (s, c, n);
 }
 # endif /* !WIDE */
-#endif /* !TEST_BZERO */
+#endif /* !TEST_BZERO && !TEST_MEMSETZERO */
 
 CHAR *
 inhibit_loop_to_libcall
@@ -113,7 +120,7 @@ do_one_test (impl_t *impl, CHAR *s, int c __attribute ((unused)), size_t n)
   CHAR sentinel = c - 1;
   buf[0] = sentinel;
   buf[n + 1] = sentinel;
-#ifdef TEST_BZERO
+#if defined TEST_BZERO || defined TEST_MEMSETZERO
   simple_bzero (tstbuf, n);
   CALL (impl, s, n);
   if (memcmp (s, tstbuf, n) != 0
@@ -126,7 +133,7 @@ do_one_test (impl_t *impl, CHAR *s, int c __attribute ((unused)), size_t n)
       || MEMCMP (s, tstbuf, n) != 0
       || buf[0] != sentinel
       || buf[n + 1] != sentinel)
-#endif /* !TEST_BZERO */
+#endif /* !TEST_BZERO && !TEST_MEMSETZERO */
     {
       error (0, 0, "Wrong result in function %s", impl->name);
       ret = 1;
@@ -145,7 +152,7 @@ do_test (size_t align, int c, size_t len)
     do_one_test (impl, (CHAR *) (buf1) + align, c, len);
 }
 
-#ifndef TEST_BZERO
+#if !defined TEST_BZERO && !defined TEST_MEMSETZERO
 static void
 do_random_tests (void)
 {
@@ -231,7 +238,7 @@ do_random_tests (void)
 	}
     }
 }
-#endif /* !TEST_BZERO */
+#endif /* !TEST_BZERO && !TEST_MEMSETZERO */
 
 int
 test_main (void)
@@ -246,7 +253,7 @@ test_main (void)
     printf ("\t%s", impl->name);
   putchar ('\n');
 
-#ifndef TEST_BZERO
+#if !defined TEST_BZERO && !defined TEST_MEMSETZERO
   for (c = -65; c <= 130; c += 65)
 #endif
     {
@@ -266,7 +273,7 @@ test_main (void)
       do_test (2, c, 25);
     }
 
-#ifndef TEST_BZERO
+#if !defined TEST_BZERO && !defined TEST_MEMSETZERO
   do_random_tests ();
 #endif
 
diff --git a/string/test-memsetzero.c b/string/test-memsetzero.c
new file mode 100644
index 0000000000..85160efe67
--- /dev/null
+++ b/string/test-memsetzero.c
@@ -0,0 +1,19 @@
+/* Test and measure bzero functions.
+   Copyright (C) 2012-2022 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/>.  */
+#define TEST_MEMSETZERO
+#include "test-memset.c"
diff --git a/sysdeps/alpha/bzero.S b/sysdeps/alpha/bzero.S
index 4821778622..62d2055c44 100644
--- a/sysdeps/alpha/bzero.S
+++ b/sysdeps/alpha/bzero.S
@@ -107,3 +107,7 @@ $done:	ret
 
 	cfi_endproc
 weak_alias (__bzero, bzero)
+
+#undef __memsetzero
+strong_alias (__bzero, __memsetzero)
+libc_hidden_def (__memsetzero)
diff --git a/sysdeps/i386/bzero.S b/sysdeps/i386/bzero.S
index c8dd47b4da..9f6ecc9dbd 100644
--- a/sysdeps/i386/bzero.S
+++ b/sysdeps/i386/bzero.S
@@ -3,3 +3,7 @@
 #include "memset.S"
 
 weak_alias (__bzero, bzero)
+
+#undef __memsetzero
+strong_alias (__bzero, __memsetzero)
+libc_hidden_def (__memsetzero)
diff --git a/sysdeps/i386/i586/bzero.S b/sysdeps/i386/i586/bzero.S
index 2a106719a4..776a34f604 100644
--- a/sysdeps/i386/i586/bzero.S
+++ b/sysdeps/i386/i586/bzero.S
@@ -2,3 +2,7 @@
 #define memset __bzero
 #include <sysdeps/i386/i586/memset.S>
 weak_alias (__bzero, bzero)
+
+#undef __memsetzero
+strong_alias (__bzero, __memsetzero)
+libc_hidden_def (__memsetzero)
diff --git a/sysdeps/i386/i686/bzero.S b/sysdeps/i386/i686/bzero.S
index c7898f18e0..337308859d 100644
--- a/sysdeps/i386/i686/bzero.S
+++ b/sysdeps/i386/i686/bzero.S
@@ -2,3 +2,7 @@
 #define memset __bzero
 #include <sysdeps/i386/i686/memset.S>
 weak_alias (__bzero, bzero)
+
+#undef __memsetzero
+strong_alias (__bzero, __memsetzero)
+libc_hidden_def (__memsetzero)
diff --git a/sysdeps/i386/i686/multiarch/bzero-ia32.S b/sysdeps/i386/i686/multiarch/bzero-ia32.S
index 96afe9bad1..d4e4b77e16 100644
--- a/sysdeps/i386/i686/multiarch/bzero-ia32.S
+++ b/sysdeps/i386/i686/multiarch/bzero-ia32.S
@@ -33,5 +33,8 @@
 # undef weak_alias
 # define weak_alias(original, alias)
 
+# undef strong_alias
+# define strong_alias(original, alias)
+
 # include <sysdeps/i386/i686/bzero.S>
 #endif
diff --git a/sysdeps/i386/i686/multiarch/bzero.c b/sysdeps/i386/i686/multiarch/bzero.c
index 7fd0ddd576..764d3cdb94 100644
--- a/sysdeps/i386/i686/multiarch/bzero.c
+++ b/sysdeps/i386/i686/multiarch/bzero.c
@@ -29,4 +29,8 @@
 libc_ifunc_redirected (__redirect_bzero, __bzero, IFUNC_SELECTOR ());
 
 weak_alias (__bzero, bzero)
+
+# undef __memsetzero
+strong_alias (__bzero, __memsetzero)
+libc_hidden_def (__memsetzero)
 #endif
diff --git a/sysdeps/ia64/bzero.S b/sysdeps/ia64/bzero.S
index cd01abb436..15bbc2b8df 100644
--- a/sysdeps/ia64/bzero.S
+++ b/sysdeps/ia64/bzero.S
@@ -72,7 +72,7 @@
 #endif
 
 .align	64
-ENTRY(bzero)
+ENTRY(__bzero_impl)
 { .mmi
 	.prologue
 	alloc	tmp = ar.pfs, 2, 0, 0, 0
@@ -309,4 +309,10 @@ ENTRY(bzero)
 (p_y)	st1	[ptr3] = r0		// fill last byte (using ptr3)
 	br.ret.sptk.many rp
 ;; }
-END(bzero)
+END(__bzero_impl)
+
+weak_alias (__bzero_impl, bzero)
+
+#undef __memsetzero
+strong_alias (__bzero_impl, __memsetzero)
+libc_hidden_def (__memsetzero)
diff --git a/sysdeps/mach/hurd/i386/libc.abilist b/sysdeps/mach/hurd/i386/libc.abilist
index 4dc87e9061..9a39a5c342 100644
--- a/sysdeps/mach/hurd/i386/libc.abilist
+++ b/sysdeps/mach/hurd/i386/libc.abilist
@@ -2289,6 +2289,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 close_range F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero F
 GLIBC_2.4 __confstr_chk F
 GLIBC_2.4 __fgets_chk F
 GLIBC_2.4 __fgets_unlocked_chk F
diff --git a/sysdeps/powerpc/powerpc32/bzero.S b/sysdeps/powerpc/powerpc32/bzero.S
index 9cc03c92df..76b0161e10 100644
--- a/sysdeps/powerpc/powerpc32/bzero.S
+++ b/sysdeps/powerpc/powerpc32/bzero.S
@@ -25,3 +25,7 @@ ENTRY (__bzero)
 	b	memset@local
 END (__bzero)
 weak_alias (__bzero, bzero)
+
+#undef __memsetzero
+strong_alias (__bzero, __memsetzero)
+libc_hidden_def (__memsetzero)
diff --git a/sysdeps/powerpc/powerpc32/power4/multiarch/bzero.c b/sysdeps/powerpc/powerpc32/power4/multiarch/bzero.c
index 5d9270289f..72ee70b99d 100644
--- a/sysdeps/powerpc/powerpc32/power4/multiarch/bzero.c
+++ b/sysdeps/powerpc/powerpc32/power4/multiarch/bzero.c
@@ -34,4 +34,8 @@ libc_ifunc (__bzero,
             : __bzero_ppc);
 
 weak_alias (__bzero, bzero)
+
+# undef __memsetzero
+strong_alias (__bzero, __memsetzero)
+libc_hidden_def (__memsetzero)
 #endif
diff --git a/sysdeps/powerpc/powerpc64/le/power10/memset.S b/sysdeps/powerpc/powerpc64/le/power10/memset.S
index bee6d8b31b..1d7504c055 100644
--- a/sysdeps/powerpc/powerpc64/le/power10/memset.S
+++ b/sysdeps/powerpc/powerpc64/le/power10/memset.S
@@ -253,4 +253,7 @@ ENTRY_TOCLESS (__bzero)
 END (__bzero)
 #ifndef __bzero
 weak_alias (__bzero, bzero)
+
+# undef __memsetzero
+strong_alias (__bzero, __memsetzero)
 #endif
diff --git a/sysdeps/powerpc/powerpc64/memset.S b/sysdeps/powerpc/powerpc64/memset.S
index 34ee8ffca4..bac3d53c5f 100644
--- a/sysdeps/powerpc/powerpc64/memset.S
+++ b/sysdeps/powerpc/powerpc64/memset.S
@@ -265,4 +265,7 @@ ENTRY (__bzero)
 END_GEN_TB (__bzero,TB_TOCLESS)
 
 weak_alias (__bzero, bzero)
+
+#undef __memsetzero
+strong_alias (__bzero, __memsetzero)
 #endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/bzero.c b/sysdeps/powerpc/powerpc64/multiarch/bzero.c
index f83d6da55b..fb36089e10 100644
--- a/sysdeps/powerpc/powerpc64/multiarch/bzero.c
+++ b/sysdeps/powerpc/powerpc64/multiarch/bzero.c
@@ -51,4 +51,8 @@ libc_ifunc (__bzero,
             : __bzero_ppc);
 
 weak_alias (__bzero, bzero)
+
+# undef __memsetzero
+strong_alias (__bzero, __memsetzero)
+libc_hidden_def (__memsetzero)
 #endif
diff --git a/sysdeps/powerpc/powerpc64/power4/memset.S b/sysdeps/powerpc/powerpc64/power4/memset.S
index dfc136261b..3a62ad3fbf 100644
--- a/sysdeps/powerpc/powerpc64/power4/memset.S
+++ b/sysdeps/powerpc/powerpc64/power4/memset.S
@@ -248,4 +248,7 @@ ENTRY_TOCLESS (__bzero)
 END (__bzero)
 #ifndef __bzero
 weak_alias (__bzero, bzero)
+
+# undef __memsetzero
+strong_alias (__bzero, __memsetzero)
 #endif
diff --git a/sysdeps/powerpc/powerpc64/power6/memset.S b/sysdeps/powerpc/powerpc64/power6/memset.S
index 7ad82c38e6..6cb3202848 100644
--- a/sysdeps/powerpc/powerpc64/power6/memset.S
+++ b/sysdeps/powerpc/powerpc64/power6/memset.S
@@ -392,4 +392,7 @@ ENTRY_TOCLESS (__bzero)
 END (__bzero)
 #ifndef __bzero
 weak_alias (__bzero, bzero)
+
+# undef __memsetzero
+strong_alias (__bzero, __memsetzero)
 #endif
diff --git a/sysdeps/powerpc/powerpc64/power7/memset.S b/sysdeps/powerpc/powerpc64/power7/memset.S
index 31aa0f91cf..8146fd2755 100644
--- a/sysdeps/powerpc/powerpc64/power7/memset.S
+++ b/sysdeps/powerpc/powerpc64/power7/memset.S
@@ -395,4 +395,7 @@ ENTRY_TOCLESS (__bzero)
 END (__bzero)
 #ifndef __bzero
 weak_alias (__bzero, bzero)
+
+# undef __memsetzero
+strong_alias (__bzero, __memsetzero)
 #endif
diff --git a/sysdeps/powerpc/powerpc64/power8/memset.S b/sysdeps/powerpc/powerpc64/power8/memset.S
index 9ecb6f3067..7de395d341 100644
--- a/sysdeps/powerpc/powerpc64/power8/memset.S
+++ b/sysdeps/powerpc/powerpc64/power8/memset.S
@@ -515,4 +515,7 @@ ENTRY_TOCLESS (__bzero)
 END (__bzero)
 #ifndef __bzero
 weak_alias (__bzero, bzero)
+
+# undef __memsetzero
+strong_alias (__bzero, __memsetzero)
 #endif
diff --git a/sysdeps/s390/bzero.c b/sysdeps/s390/bzero.c
index 1f0a03e2ed..8f76614be2 100644
--- a/sysdeps/s390/bzero.c
+++ b/sysdeps/s390/bzero.c
@@ -44,4 +44,8 @@ s390_libc_ifunc_expr (__bzero, __bzero,
 		      })
 		      )
 weak_alias (__bzero, bzero)
+
+# undef __memsetzero
+strong_alias (__bzero, __memsetzero)
+libc_hidden_def (__memsetzero)
 #endif
diff --git a/sysdeps/sparc/sparc32/memset.S b/sysdeps/sparc/sparc32/memset.S
index d222fa7506..8f4a80898d 100644
--- a/sysdeps/sparc/sparc32/memset.S
+++ b/sysdeps/sparc/sparc32/memset.S
@@ -150,3 +150,6 @@ END(memset)
 libc_hidden_builtin_def (memset)
 
 weak_alias (__bzero, bzero)
+
+#undef __memsetzero
+strong_alias (__bzero, __memsetzero)
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memset-ultra1.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/memset-ultra1.S
index 6038611134..ca2b650842 100644
--- a/sysdeps/sparc/sparc32/sparcv9/multiarch/memset-ultra1.S
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/memset-ultra1.S
@@ -23,6 +23,8 @@
 # define libc_hidden_builtin_def(name)
 # undef weak_alias
 # define weak_alias(x, y)
+# undef strong_alias
+# define strong_alias(x, y)
 
 # define memset  __memset_ultra1
 # define __bzero __bzero_ultra1
diff --git a/sysdeps/sparc/sparc64/memset.S b/sysdeps/sparc/sparc64/memset.S
index a7f8361fa3..c93e3171e8 100644
--- a/sysdeps/sparc/sparc64/memset.S
+++ b/sysdeps/sparc/sparc64/memset.S
@@ -310,3 +310,6 @@ ENTRY(__bzero)
 END(__bzero)
 
 weak_alias (__bzero, bzero)
+
+#undef __memsetzero
+strong_alias (__bzero, __memsetzero)
diff --git a/sysdeps/sparc/sparc64/multiarch/bzero.c b/sysdeps/sparc/sparc64/multiarch/bzero.c
index 409d66a864..dbababa795 100644
--- a/sysdeps/sparc/sparc64/multiarch/bzero.c
+++ b/sysdeps/sparc/sparc64/multiarch/bzero.c
@@ -30,4 +30,7 @@
 sparc_libc_ifunc_redirected (__redirect_bzero, __bzero, IFUNC_SELECTOR)
 weak_alias (__bzero, bzero)
 
+# undef __memsetzero
+strong_alias (__bzero, __memsetzero)
+libc_hidden_def (__memsetzero)
 #endif
diff --git a/sysdeps/sparc/sparc64/multiarch/memset-ultra1.S b/sysdeps/sparc/sparc64/multiarch/memset-ultra1.S
index e0d3424307..e4893db425 100644
--- a/sysdeps/sparc/sparc64/multiarch/memset-ultra1.S
+++ b/sysdeps/sparc/sparc64/multiarch/memset-ultra1.S
@@ -23,6 +23,8 @@
 # define libc_hidden_builtin_def(name)
 # undef weak_alias
 # define weak_alias(x, y)
+# undef strong_alias
+# define strong_alias(x, y)
 
 # define memset  __memset_ultra1
 # define __bzero __bzero_ultra1
diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
index 1b63d9e447..68b86b22c9 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
@@ -2616,3 +2616,4 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero F
diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
index e7e4cf7d2a..1714ca23fe 100644
--- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
@@ -2713,6 +2713,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
diff --git a/sysdeps/unix/sysv/linux/arc/libc.abilist b/sysdeps/unix/sysv/linux/arc/libc.abilist
index bc3d228e31..8891587282 100644
--- a/sysdeps/unix/sysv/linux/arc/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arc/libc.abilist
@@ -2377,3 +2377,4 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero F
diff --git a/sysdeps/unix/sysv/linux/arm/be/libc.abilist b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
index db7039c4ab..4adeec6ca6 100644
--- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
@@ -496,6 +496,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero F
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
 GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
diff --git a/sysdeps/unix/sysv/linux/arm/le/libc.abilist b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
index d2add4fb49..1b2573e690 100644
--- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
@@ -493,6 +493,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero F
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
 GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist
index 355d72a30c..f3dab9746f 100644
--- a/sysdeps/unix/sysv/linux/csky/libc.abilist
+++ b/sysdeps/unix/sysv/linux/csky/libc.abilist
@@ -2652,3 +2652,4 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero F
diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
index 3df39bb28c..21e22081fe 100644
--- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
@@ -2601,6 +2601,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero 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/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
index c4da358f80..43b37f2ef1 100644
--- a/sysdeps/unix/sysv/linux/i386/libc.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
@@ -2785,6 +2785,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero 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/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist
index 241bac70ea..2ee6184fab 100644
--- a/sysdeps/unix/sysv/linux/ia64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist
@@ -2551,6 +2551,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero 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/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
index 78bf372b72..fc43c9d49c 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
@@ -497,6 +497,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero F
 GLIBC_2.4 _Exit F
 GLIBC_2.4 _IO_2_1_stderr_ D 0x98
 GLIBC_2.4 _IO_2_1_stdin_ D 0x98
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
index 00df5c901f..f0e94f92bd 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
@@ -2728,6 +2728,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero 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/microblaze/be/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
index e8118569c3..7b309378da 100644
--- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
@@ -2701,3 +2701,4 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero F
diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
index c0d2373e64..6d414b32dc 100644
--- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
@@ -2698,3 +2698,4 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
index 2d0fd04f54..0c12abffa1 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
@@ -2693,6 +2693,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero 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/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
index e39ccfb312..1876d86269 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
@@ -2691,6 +2691,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero 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/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
index 1e900f86e4..301941d0cc 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
@@ -2699,6 +2699,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero 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/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
index 9145ba7931..906491a531 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
@@ -2602,6 +2602,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero 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/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist
index e95d60d926..13b9299c87 100644
--- a/sysdeps/unix/sysv/linux/nios2/libc.abilist
+++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist
@@ -2740,3 +2740,4 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero F
diff --git a/sysdeps/unix/sysv/linux/or1k/libc.abilist b/sysdeps/unix/sysv/linux/or1k/libc.abilist
index ca934e374b..3cc2db60a5 100644
--- a/sysdeps/unix/sysv/linux/or1k/libc.abilist
+++ b/sysdeps/unix/sysv/linux/or1k/libc.abilist
@@ -2123,3 +2123,4 @@ GLIBC_2.35 wprintf F
 GLIBC_2.35 write F
 GLIBC_2.35 writev F
 GLIBC_2.35 wscanf F
+GLIBC_2.36 __memsetzero F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
index 3820b9f235..fab9acf53f 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
@@ -2755,6 +2755,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
index 464dc27fcd..fd2d98b1e6 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
@@ -2788,6 +2788,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
index 2f7e58747f..24b8f2ad81 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
@@ -2510,6 +2510,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
index 4f3043d913..50a36c4e52 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
@@ -2812,3 +2812,4 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero F
diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
index 84b6ac815a..da5f3f83e0 100644
--- a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
@@ -2379,3 +2379,4 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero F
diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
index 4d5c19c56a..f8477073b2 100644
--- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
@@ -2579,3 +2579,4 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
index 7c5ee8d569..92a70e2473 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
@@ -2753,6 +2753,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
index 50de0b46cf..8dfb6ccdc5 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
@@ -2547,6 +2547,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
diff --git a/sysdeps/unix/sysv/linux/sh/be/libc.abilist b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
index 66fba013ca..3c7c4b79d6 100644
--- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
@@ -2608,6 +2608,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero 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/sh/le/libc.abilist b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
index 38703f8aa0..48b4993fb6 100644
--- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
@@ -2605,6 +2605,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero 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/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
index 6df55eb765..011b7cda7e 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
@@ -2748,6 +2748,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero F
 GLIBC_2.4 _IO_fprintf F
 GLIBC_2.4 _IO_printf F
 GLIBC_2.4 _IO_sprintf F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
index b90569d881..b1156d801e 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
@@ -2574,6 +2574,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero 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 e88b0f101f..d7c7667768 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
@@ -2525,6 +2525,7 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero 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 e0755272eb..67619a0d9a 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
@@ -2631,3 +2631,4 @@ GLIBC_2.35 __memcmpeq F
 GLIBC_2.35 _dl_find_object F
 GLIBC_2.35 epoll_pwait2 F
 GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 __memsetzero F
diff --git a/sysdeps/x86_64/memset.S b/sysdeps/x86_64/memset.S
index af26e9cedc..ffcafbeeaa 100644
--- a/sysdeps/x86_64/memset.S
+++ b/sysdeps/x86_64/memset.S
@@ -68,6 +68,8 @@
 #include "multiarch/memset-vec-unaligned-erms.S"
 
 libc_hidden_builtin_def (memset)
+strong_alias (__bzero, __memsetzero)
+libc_hidden_def (__memsetzero)
 
 #if IS_IN (libc)
 weak_alias (__bzero, bzero)
diff --git a/sysdeps/x86_64/multiarch/bzero.c b/sysdeps/x86_64/multiarch/bzero.c
index 58a14b2c33..1ef287df23 100644
--- a/sysdeps/x86_64/multiarch/bzero.c
+++ b/sysdeps/x86_64/multiarch/bzero.c
@@ -20,8 +20,10 @@
 /* Define multiple versions only for the definition in libc.  */
 #if IS_IN (libc)
 # define __bzero __redirect___bzero
+# define __memsetzero __redirect___memsetzero
 # include <string.h>
 # undef __bzero
+# undef __memsetzero
 
 # define SYMBOL_NAME __bzero
 # include <init-arch.h>
@@ -103,4 +105,10 @@ IFUNC_SELECTOR (void)
 libc_ifunc_redirected (__redirect___bzero, __bzero, IFUNC_SELECTOR ());
 
 weak_alias (__bzero, bzero)
+strong_alias (__bzero, __memsetzero)
+
+# ifdef SHARED
+__hidden_ver1 (__bzero, __GI___memsetzero, __redirect___bzero)
+  __attribute__ ((visibility ("hidden"))) __attribute_copy__ (__bzero);
+# endif
 #endif
-- 
2.34.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH] elf: Use memset_zero to erase data
  2022-02-09 16:11 [PATCH v2] string: Add support for __memsetzero on all targets H.J. Lu
@ 2022-02-09 16:11 ` H.J. Lu
  2022-02-09 16:14   ` H.J. Lu
  0 siblings, 1 reply; 3+ messages in thread
From: H.J. Lu @ 2022-02-09 16:11 UTC (permalink / raw)
  To: libc-alpha

---
 elf/cache.c             |  8 ++++----
 elf/circleload1.c       |  2 +-
 elf/dl-load.c           |  2 +-
 elf/dl-map-segments.h   |  2 +-
 elf/dl-minimal-malloc.c |  2 +-
 elf/dl-profile.c        |  8 ++++----
 elf/dl-reloc.c          |  5 +++--
 elf/dl-sort-maps.c      |  4 ++--
 elf/dl-tls.c            | 30 ++++++++++++++++--------------
 elf/neededtest.c        |  2 +-
 elf/neededtest2.c       |  2 +-
 elf/neededtest3.c       |  2 +-
 elf/neededtest4.c       |  2 +-
 elf/sprof.c             |  2 +-
 14 files changed, 38 insertions(+), 35 deletions(-)

diff --git a/elf/cache.c b/elf/cache.c
index dbf4c83a7a..8987fad828 100644
--- a/elf/cache.c
+++ b/elf/cache.c
@@ -608,7 +608,7 @@ save_cache (const char *cache_name)
       file_entries = xmalloc (file_entries_size);
 
       /* Fill in the header.  */
-      memset (file_entries, '\0', sizeof (struct cache_file));
+      memset_zero (file_entries, sizeof (struct cache_file));
       memcpy (file_entries->magic, CACHEMAGIC, sizeof CACHEMAGIC - 1);
 
       file_entries->nlibs = cache_entry_old_count;
@@ -625,7 +625,7 @@ save_cache (const char *cache_name)
       file_entries_new = xmalloc (file_entries_new_size);
 
       /* Fill in the header.  */
-      memset (file_entries_new, '\0', sizeof (struct cache_file_new));
+      memset_zero (file_entries_new, sizeof (struct cache_file_new));
       memcpy (file_entries_new->magic, CACHEMAGIC_NEW,
 	      sizeof CACHEMAGIC_NEW - 1);
       memcpy (file_entries_new->version, CACHE_VERSION,
@@ -738,7 +738,7 @@ save_cache (const char *cache_name)
       if (opt_format != opt_format_new)
 	{
 	  char zero[pad];
-	  memset (zero, '\0', pad);
+	  memset_zero (zero, pad);
 	  if (write (fd, zero, pad) != (ssize_t) pad)
 	    error (EXIT_FAILURE, errno, _("Writing of cache data failed"));
 	}
@@ -1088,7 +1088,7 @@ save_aux_cache (const char *aux_cache_name)
     = xmalloc (file_entries_size + total_strlen);
 
   /* Fill in the header of the auxiliary cache.  */
-  memset (file_entries, '\0', sizeof (struct aux_cache_file));
+  memset_zero (file_entries, sizeof (struct aux_cache_file));
   memcpy (file_entries->magic, AUX_CACHEMAGIC, sizeof AUX_CACHEMAGIC - 1);
 
   file_entries->nlibs = cache_entry_count;
diff --git a/elf/circleload1.c b/elf/circleload1.c
index 990ff84a84..e9981395d8 100644
--- a/elf/circleload1.c
+++ b/elf/circleload1.c
@@ -21,7 +21,7 @@ check_loaded_objects (const char **loaded)
   if (n)
     {
       found = (int *) alloca (sizeof (int) * n);
-      memset (found, 0, sizeof (int) * n);
+      memset_zero (found, sizeof (int) * n);
     }
 
   printf("   Name\n");
diff --git a/elf/dl-load.c b/elf/dl-load.c
index 5b0ff41ee1..87fd476c52 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -961,7 +961,7 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd,
   if (mode & __RTLD_OPENEXEC)
     {
       assert (nsid == LM_ID_BASE);
-      memset (&id, 0, sizeof (id));
+      memset_zero (&id, sizeof (id));
     }
   else
     {
diff --git a/elf/dl-map-segments.h b/elf/dl-map-segments.h
index 172692b120..6d4759973f 100644
--- a/elf/dl-map-segments.h
+++ b/elf/dl-map-segments.h
@@ -171,7 +171,7 @@ _dl_map_segments (struct link_map *l, int fd,
                                   GLRO(dl_pagesize), c->prot|PROT_WRITE) < 0)
                     return DL_MAP_SEGMENTS_ERROR_MPROTECT;
                 }
-              memset ((void *) zero, '\0', zeropage - zero);
+              memset_zero ((void *) zero, zeropage - zero);
               if (__glibc_unlikely ((c->prot & PROT_WRITE) == 0))
                 __mprotect ((caddr_t) (zero & ~(GLRO(dl_pagesize) - 1)),
                             GLRO(dl_pagesize), c->prot);
diff --git a/elf/dl-minimal-malloc.c b/elf/dl-minimal-malloc.c
index 7cca54208d..024e640dcd 100644
--- a/elf/dl-minimal-malloc.c
+++ b/elf/dl-minimal-malloc.c
@@ -98,7 +98,7 @@ __minimal_free (void *ptr)
     {
       /* Since this is rare, we clear the freed block here
 	 so that calloc can presume malloc returns cleared memory.  */
-      memset (alloc_last_block, '\0', alloc_ptr - alloc_last_block);
+      memset_zero (alloc_last_block, alloc_ptr - alloc_last_block);
       alloc_ptr = alloc_last_block;
     }
 }
diff --git a/elf/dl-profile.c b/elf/dl-profile.c
index 9359be7c33..65957a6ad5 100644
--- a/elf/dl-profile.c
+++ b/elf/dl-profile.c
@@ -274,7 +274,7 @@ _dl_start_profile (void)
 
   memcpy (&gmon_hdr.cookie[0], GMON_MAGIC, sizeof (gmon_hdr.cookie));
   gmon_hdr.version = GMON_SHOBJ_VERSION;
-  memset (gmon_hdr.spare, '\0', sizeof (gmon_hdr.spare));
+  memset_zero (gmon_hdr.spare, sizeof (gmon_hdr.spare));
 
   /* Create the hist_hdr we expect or write.  */
   struct real_gmon_hist_hdr
@@ -308,8 +308,8 @@ _dl_start_profile (void)
   if (sizeof (hist_hdr.dimen) >= sizeof ("seconds"))
     {
       memcpy (hist_hdr.dimen, "seconds", sizeof ("seconds"));
-      memset (hist_hdr.dimen + sizeof ("seconds"), '\0',
-	      sizeof (hist_hdr.dimen) - sizeof ("seconds"));
+      memset_zero (hist_hdr.dimen + sizeof ("seconds"),
+		   sizeof (hist_hdr.dimen) - sizeof ("seconds"));
     }
   else
     strncpy (hist_hdr.dimen, "seconds", sizeof (hist_hdr.dimen));
@@ -355,7 +355,7 @@ _dl_start_profile (void)
       /* We have to create the file.  */
       char buf[GLRO(dl_pagesize)];
 
-      memset (buf, '\0', GLRO(dl_pagesize));
+      memset_zero (buf, GLRO(dl_pagesize));
 
       if (__lseek (fd, expected_size & ~(GLRO(dl_pagesize) - 1), SEEK_SET) == -1)
 	{
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
index 771a34bd14..3b4bee421f 100644
--- a/elf/dl-reloc.c
+++ b/elf/dl-reloc.c
@@ -157,8 +157,9 @@ _dl_nothread_init_static_tls (struct link_map *map)
 #endif
 
   /* Initialize the memory.  */
-  memset (__mempcpy (dest, map->l_tls_initimage, map->l_tls_initimage_size),
-	  '\0', map->l_tls_blocksize - map->l_tls_initimage_size);
+  memset_zero (__mempcpy (dest, map->l_tls_initimage,
+			  map->l_tls_initimage_size),
+	       map->l_tls_blocksize - map->l_tls_initimage_size);
 }
 #endif /* !PTHREAD_IN_LIBC */
 
diff --git a/elf/dl-sort-maps.c b/elf/dl-sort-maps.c
index 9e9d53ec47..2cb38cec9a 100644
--- a/elf/dl-sort-maps.c
+++ b/elf/dl-sort-maps.c
@@ -40,7 +40,7 @@ _dl_sort_maps_original (struct link_map **maps, unsigned int nmaps,
 
   unsigned int i = 0;
   uint16_t seen[nmaps];
-  memset (seen, 0, nmaps * sizeof (seen[0]));
+  memset_zero (seen, nmaps * sizeof (seen[0]));
   while (1)
     {
       /* Keep track of which object we looked at this round.  */
@@ -115,7 +115,7 @@ _dl_sort_maps_original (struct link_map **maps, unsigned int nmaps,
       if (++i == nmaps)
 	break;
     next_clear:
-      memset (&seen[i], 0, (nmaps - i) * sizeof (seen[0]));
+      memset_zero (&seen[i], (nmaps - i) * sizeof (seen[0]));
 
     next:;
     }
diff --git a/elf/dl-tls.c b/elf/dl-tls.c
index 093cdddb7e..d3e1e70475 100644
--- a/elf/dl-tls.c
+++ b/elf/dl-tls.c
@@ -447,7 +447,7 @@ _dl_allocate_tls_storage (void)
 
   /* Clear the TCB data structure.  We can't ask the caller (i.e.
      libpthread) to do it, because we will initialize the DTV et al.  */
-  memset (result, '\0', TLS_TCB_SIZE);
+  memset_zero (result, TLS_TCB_SIZE);
 #elif TLS_DTV_AT_TP
   /* Pre-TCB and TCB come before the TLS blocks.  The layout computed
      in _dl_determine_tlsoffset assumes that the TCB is aligned to the
@@ -461,7 +461,8 @@ _dl_allocate_tls_storage (void)
   /* Clear the TCB data structure and TLS_PRE_TCB_SIZE bytes before
      it.  We can't ask the caller (i.e. libpthread) to do it, because
      we will initialize the DTV et al.  */
-  memset (result - TLS_PRE_TCB_SIZE, '\0', TLS_PRE_TCB_SIZE + TLS_TCB_SIZE);
+  memset_zero (result - TLS_PRE_TCB_SIZE,
+	       TLS_PRE_TCB_SIZE + TLS_TCB_SIZE);
 #endif
 
   /* Record the value of the original pointer for later
@@ -511,8 +512,8 @@ _dl_resize_dtv (dtv_t *dtv, size_t max_modid)
   newp[0].counter = newsize;
 
   /* Clear the newly allocated part.  */
-  memset (newp + 2 + oldsize, '\0',
-	  (newsize - oldsize) * sizeof (dtv_t));
+  memset_zero (newp + 2 + oldsize,
+	       (newsize - oldsize) * sizeof (dtv_t));
 
   /* Return the generation counter.  */
   return &newp[1];
@@ -605,9 +606,9 @@ _dl_allocate_tls_init (void *result, bool init_tls)
 	     behaviour.   */
 	  if (map->l_ns != LM_ID_BASE && !init_tls)
 	    continue;
-	  memset (__mempcpy (dest, map->l_tls_initimage,
-			     map->l_tls_initimage_size), '\0',
-		  map->l_tls_blocksize - map->l_tls_initimage_size);
+	  memset_zero (__mempcpy (dest, map->l_tls_initimage,
+				  map->l_tls_initimage_size),
+		       map->l_tls_blocksize - map->l_tls_initimage_size);
 	}
 
       total += cnt;
@@ -712,9 +713,9 @@ allocate_and_init (struct link_map *map)
     oom ();
 
   /* Initialize the memory.  */
-  memset (__mempcpy (result.val, map->l_tls_initimage,
-		     map->l_tls_initimage_size),
-	  '\0', map->l_tls_blocksize - map->l_tls_initimage_size);
+  memset_zero (__mempcpy (result.val, map->l_tls_initimage,
+			  map->l_tls_initimage_size),
+	       map->l_tls_blocksize - map->l_tls_initimage_size);
 
   return result;
 }
@@ -1053,8 +1054,8 @@ cannot create TLS data structures"));
 
       listp->len = TLS_SLOTINFO_SURPLUS;
       listp->next = NULL;
-      memset (listp->slotinfo, '\0',
-	      TLS_SLOTINFO_SURPLUS * sizeof (struct dtv_slotinfo));
+      memset_zero (listp->slotinfo,
+		   TLS_SLOTINFO_SURPLUS * sizeof (struct dtv_slotinfo));
       /* Synchronize with _dl_update_slotinfo.  */
       atomic_store_release (&prevp->next, listp);
     }
@@ -1082,8 +1083,9 @@ init_one_static_tls (struct pthread *curp, struct link_map *map)
 # endif
 
   /* Initialize the memory.  */
-  memset (__mempcpy (dest, map->l_tls_initimage, map->l_tls_initimage_size),
-	  '\0', map->l_tls_blocksize - map->l_tls_initimage_size);
+  memset_zero (__mempcpy (dest, map->l_tls_initimage,
+			  map->l_tls_initimage_size),
+	       map->l_tls_blocksize - map->l_tls_initimage_size);
 }
 
 void
diff --git a/elf/neededtest.c b/elf/neededtest.c
index 3cea499314..1ab8380123 100644
--- a/elf/neededtest.c
+++ b/elf/neededtest.c
@@ -21,7 +21,7 @@ check_loaded_objects (const char **loaded)
   if (n)
     {
       found = (int *) alloca (sizeof (int) * n);
-      memset (found, 0, sizeof (int) * n);
+      memset_zero (found, sizeof (int) * n);
     }
 
   printf("   Name\n");
diff --git a/elf/neededtest2.c b/elf/neededtest2.c
index 17c75f2ba3..eb67692828 100644
--- a/elf/neededtest2.c
+++ b/elf/neededtest2.c
@@ -21,7 +21,7 @@ check_loaded_objects (const char **loaded)
   if (n)
     {
       found = (int *) alloca (sizeof (int) * n);
-      memset (found, 0, sizeof (int) * n);
+      memset_zero (found, sizeof (int) * n);
     }
 
   printf("   Name\n");
diff --git a/elf/neededtest3.c b/elf/neededtest3.c
index 41970cf2c7..5cc7a4453e 100644
--- a/elf/neededtest3.c
+++ b/elf/neededtest3.c
@@ -21,7 +21,7 @@ check_loaded_objects (const char **loaded)
   if (n)
     {
       found = (int *) alloca (sizeof (int) * n);
-      memset (found, 0, sizeof (int) * n);
+      memset_zero (found, sizeof (int) * n);
     }
 
   printf("   Name\n");
diff --git a/elf/neededtest4.c b/elf/neededtest4.c
index 0ae0b7ff47..8e88194dcf 100644
--- a/elf/neededtest4.c
+++ b/elf/neededtest4.c
@@ -21,7 +21,7 @@ check_loaded_objects (const char **loaded)
   if (n)
     {
       found = (int *) alloca (sizeof (int) * n);
-      memset (found, 0, sizeof (int) * n);
+      memset_zero (found, sizeof (int) * n);
     }
 
   printf("   Name\n");
diff --git a/elf/sprof.c b/elf/sprof.c
index 405fbcbf38..b950e61a16 100644
--- a/elf/sprof.c
+++ b/elf/sprof.c
@@ -860,7 +860,7 @@ load_profdata (const char *name, struct shobj *shobj)
 
   memcpy (&gmon_hdr.cookie[0], GMON_MAGIC, sizeof (gmon_hdr.cookie));
   gmon_hdr.version = GMON_SHOBJ_VERSION;
-  memset (gmon_hdr.spare, '\0', sizeof (gmon_hdr.spare));
+  memset_zero (gmon_hdr.spare, sizeof (gmon_hdr.spare));
 
   /* Create the hist_hdr we expect or write.  */
   struct real_gmon_hist_hdr hist_hdr;
-- 
2.34.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] elf: Use memset_zero to erase data
  2022-02-09 16:11 ` [PATCH] elf: Use memset_zero to erase data H.J. Lu
@ 2022-02-09 16:14   ` H.J. Lu
  0 siblings, 0 replies; 3+ messages in thread
From: H.J. Lu @ 2022-02-09 16:14 UTC (permalink / raw)
  To: GNU C Library

On Wed, Feb 9, 2022 at 8:11 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> ---
>  elf/cache.c             |  8 ++++----
>  elf/circleload1.c       |  2 +-
>  elf/dl-load.c           |  2 +-
>  elf/dl-map-segments.h   |  2 +-
>  elf/dl-minimal-malloc.c |  2 +-
>  elf/dl-profile.c        |  8 ++++----
>  elf/dl-reloc.c          |  5 +++--
>  elf/dl-sort-maps.c      |  4 ++--
>  elf/dl-tls.c            | 30 ++++++++++++++++--------------
>  elf/neededtest.c        |  2 +-
>  elf/neededtest2.c       |  2 +-
>  elf/neededtest3.c       |  2 +-
>  elf/neededtest4.c       |  2 +-
>  elf/sprof.c             |  2 +-
>  14 files changed, 38 insertions(+), 35 deletions(-)
>
> diff --git a/elf/cache.c b/elf/cache.c
> index dbf4c83a7a..8987fad828 100644
> --- a/elf/cache.c
> +++ b/elf/cache.c
> @@ -608,7 +608,7 @@ save_cache (const char *cache_name)
>        file_entries = xmalloc (file_entries_size);
>
>        /* Fill in the header.  */
> -      memset (file_entries, '\0', sizeof (struct cache_file));
> +      memset_zero (file_entries, sizeof (struct cache_file));
>        memcpy (file_entries->magic, CACHEMAGIC, sizeof CACHEMAGIC - 1);
>
>        file_entries->nlibs = cache_entry_old_count;
> @@ -625,7 +625,7 @@ save_cache (const char *cache_name)
>        file_entries_new = xmalloc (file_entries_new_size);
>
>        /* Fill in the header.  */
> -      memset (file_entries_new, '\0', sizeof (struct cache_file_new));
> +      memset_zero (file_entries_new, sizeof (struct cache_file_new));
>        memcpy (file_entries_new->magic, CACHEMAGIC_NEW,
>               sizeof CACHEMAGIC_NEW - 1);
>        memcpy (file_entries_new->version, CACHE_VERSION,
> @@ -738,7 +738,7 @@ save_cache (const char *cache_name)
>        if (opt_format != opt_format_new)
>         {
>           char zero[pad];
> -         memset (zero, '\0', pad);
> +         memset_zero (zero, pad);
>           if (write (fd, zero, pad) != (ssize_t) pad)
>             error (EXIT_FAILURE, errno, _("Writing of cache data failed"));
>         }
> @@ -1088,7 +1088,7 @@ save_aux_cache (const char *aux_cache_name)
>      = xmalloc (file_entries_size + total_strlen);
>
>    /* Fill in the header of the auxiliary cache.  */
> -  memset (file_entries, '\0', sizeof (struct aux_cache_file));
> +  memset_zero (file_entries, sizeof (struct aux_cache_file));
>    memcpy (file_entries->magic, AUX_CACHEMAGIC, sizeof AUX_CACHEMAGIC - 1);
>
>    file_entries->nlibs = cache_entry_count;
> diff --git a/elf/circleload1.c b/elf/circleload1.c
> index 990ff84a84..e9981395d8 100644
> --- a/elf/circleload1.c
> +++ b/elf/circleload1.c
> @@ -21,7 +21,7 @@ check_loaded_objects (const char **loaded)
>    if (n)
>      {
>        found = (int *) alloca (sizeof (int) * n);
> -      memset (found, 0, sizeof (int) * n);
> +      memset_zero (found, sizeof (int) * n);
>      }
>
>    printf("   Name\n");
> diff --git a/elf/dl-load.c b/elf/dl-load.c
> index 5b0ff41ee1..87fd476c52 100644
> --- a/elf/dl-load.c
> +++ b/elf/dl-load.c
> @@ -961,7 +961,7 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd,
>    if (mode & __RTLD_OPENEXEC)
>      {
>        assert (nsid == LM_ID_BASE);
> -      memset (&id, 0, sizeof (id));
> +      memset_zero (&id, sizeof (id));
>      }
>    else
>      {
> diff --git a/elf/dl-map-segments.h b/elf/dl-map-segments.h
> index 172692b120..6d4759973f 100644
> --- a/elf/dl-map-segments.h
> +++ b/elf/dl-map-segments.h
> @@ -171,7 +171,7 @@ _dl_map_segments (struct link_map *l, int fd,
>                                    GLRO(dl_pagesize), c->prot|PROT_WRITE) < 0)
>                      return DL_MAP_SEGMENTS_ERROR_MPROTECT;
>                  }
> -              memset ((void *) zero, '\0', zeropage - zero);
> +              memset_zero ((void *) zero, zeropage - zero);
>                if (__glibc_unlikely ((c->prot & PROT_WRITE) == 0))
>                  __mprotect ((caddr_t) (zero & ~(GLRO(dl_pagesize) - 1)),
>                              GLRO(dl_pagesize), c->prot);
> diff --git a/elf/dl-minimal-malloc.c b/elf/dl-minimal-malloc.c
> index 7cca54208d..024e640dcd 100644
> --- a/elf/dl-minimal-malloc.c
> +++ b/elf/dl-minimal-malloc.c
> @@ -98,7 +98,7 @@ __minimal_free (void *ptr)
>      {
>        /* Since this is rare, we clear the freed block here
>          so that calloc can presume malloc returns cleared memory.  */
> -      memset (alloc_last_block, '\0', alloc_ptr - alloc_last_block);
> +      memset_zero (alloc_last_block, alloc_ptr - alloc_last_block);
>        alloc_ptr = alloc_last_block;
>      }
>  }
> diff --git a/elf/dl-profile.c b/elf/dl-profile.c
> index 9359be7c33..65957a6ad5 100644
> --- a/elf/dl-profile.c
> +++ b/elf/dl-profile.c
> @@ -274,7 +274,7 @@ _dl_start_profile (void)
>
>    memcpy (&gmon_hdr.cookie[0], GMON_MAGIC, sizeof (gmon_hdr.cookie));
>    gmon_hdr.version = GMON_SHOBJ_VERSION;
> -  memset (gmon_hdr.spare, '\0', sizeof (gmon_hdr.spare));
> +  memset_zero (gmon_hdr.spare, sizeof (gmon_hdr.spare));
>
>    /* Create the hist_hdr we expect or write.  */
>    struct real_gmon_hist_hdr
> @@ -308,8 +308,8 @@ _dl_start_profile (void)
>    if (sizeof (hist_hdr.dimen) >= sizeof ("seconds"))
>      {
>        memcpy (hist_hdr.dimen, "seconds", sizeof ("seconds"));
> -      memset (hist_hdr.dimen + sizeof ("seconds"), '\0',
> -             sizeof (hist_hdr.dimen) - sizeof ("seconds"));
> +      memset_zero (hist_hdr.dimen + sizeof ("seconds"),
> +                  sizeof (hist_hdr.dimen) - sizeof ("seconds"));
>      }
>    else
>      strncpy (hist_hdr.dimen, "seconds", sizeof (hist_hdr.dimen));
> @@ -355,7 +355,7 @@ _dl_start_profile (void)
>        /* We have to create the file.  */
>        char buf[GLRO(dl_pagesize)];
>
> -      memset (buf, '\0', GLRO(dl_pagesize));
> +      memset_zero (buf, GLRO(dl_pagesize));
>
>        if (__lseek (fd, expected_size & ~(GLRO(dl_pagesize) - 1), SEEK_SET) == -1)
>         {
> diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
> index 771a34bd14..3b4bee421f 100644
> --- a/elf/dl-reloc.c
> +++ b/elf/dl-reloc.c
> @@ -157,8 +157,9 @@ _dl_nothread_init_static_tls (struct link_map *map)
>  #endif
>
>    /* Initialize the memory.  */
> -  memset (__mempcpy (dest, map->l_tls_initimage, map->l_tls_initimage_size),
> -         '\0', map->l_tls_blocksize - map->l_tls_initimage_size);
> +  memset_zero (__mempcpy (dest, map->l_tls_initimage,
> +                         map->l_tls_initimage_size),
> +              map->l_tls_blocksize - map->l_tls_initimage_size);
>  }
>  #endif /* !PTHREAD_IN_LIBC */
>
> diff --git a/elf/dl-sort-maps.c b/elf/dl-sort-maps.c
> index 9e9d53ec47..2cb38cec9a 100644
> --- a/elf/dl-sort-maps.c
> +++ b/elf/dl-sort-maps.c
> @@ -40,7 +40,7 @@ _dl_sort_maps_original (struct link_map **maps, unsigned int nmaps,
>
>    unsigned int i = 0;
>    uint16_t seen[nmaps];
> -  memset (seen, 0, nmaps * sizeof (seen[0]));
> +  memset_zero (seen, nmaps * sizeof (seen[0]));
>    while (1)
>      {
>        /* Keep track of which object we looked at this round.  */
> @@ -115,7 +115,7 @@ _dl_sort_maps_original (struct link_map **maps, unsigned int nmaps,
>        if (++i == nmaps)
>         break;
>      next_clear:
> -      memset (&seen[i], 0, (nmaps - i) * sizeof (seen[0]));
> +      memset_zero (&seen[i], (nmaps - i) * sizeof (seen[0]));
>
>      next:;
>      }
> diff --git a/elf/dl-tls.c b/elf/dl-tls.c
> index 093cdddb7e..d3e1e70475 100644
> --- a/elf/dl-tls.c
> +++ b/elf/dl-tls.c
> @@ -447,7 +447,7 @@ _dl_allocate_tls_storage (void)
>
>    /* Clear the TCB data structure.  We can't ask the caller (i.e.
>       libpthread) to do it, because we will initialize the DTV et al.  */
> -  memset (result, '\0', TLS_TCB_SIZE);
> +  memset_zero (result, TLS_TCB_SIZE);
>  #elif TLS_DTV_AT_TP
>    /* Pre-TCB and TCB come before the TLS blocks.  The layout computed
>       in _dl_determine_tlsoffset assumes that the TCB is aligned to the
> @@ -461,7 +461,8 @@ _dl_allocate_tls_storage (void)
>    /* Clear the TCB data structure and TLS_PRE_TCB_SIZE bytes before
>       it.  We can't ask the caller (i.e. libpthread) to do it, because
>       we will initialize the DTV et al.  */
> -  memset (result - TLS_PRE_TCB_SIZE, '\0', TLS_PRE_TCB_SIZE + TLS_TCB_SIZE);
> +  memset_zero (result - TLS_PRE_TCB_SIZE,
> +              TLS_PRE_TCB_SIZE + TLS_TCB_SIZE);
>  #endif
>
>    /* Record the value of the original pointer for later
> @@ -511,8 +512,8 @@ _dl_resize_dtv (dtv_t *dtv, size_t max_modid)
>    newp[0].counter = newsize;
>
>    /* Clear the newly allocated part.  */
> -  memset (newp + 2 + oldsize, '\0',
> -         (newsize - oldsize) * sizeof (dtv_t));
> +  memset_zero (newp + 2 + oldsize,
> +              (newsize - oldsize) * sizeof (dtv_t));
>
>    /* Return the generation counter.  */
>    return &newp[1];
> @@ -605,9 +606,9 @@ _dl_allocate_tls_init (void *result, bool init_tls)
>              behaviour.   */
>           if (map->l_ns != LM_ID_BASE && !init_tls)
>             continue;
> -         memset (__mempcpy (dest, map->l_tls_initimage,
> -                            map->l_tls_initimage_size), '\0',
> -                 map->l_tls_blocksize - map->l_tls_initimage_size);
> +         memset_zero (__mempcpy (dest, map->l_tls_initimage,
> +                                 map->l_tls_initimage_size),
> +                      map->l_tls_blocksize - map->l_tls_initimage_size);
>         }
>
>        total += cnt;
> @@ -712,9 +713,9 @@ allocate_and_init (struct link_map *map)
>      oom ();
>
>    /* Initialize the memory.  */
> -  memset (__mempcpy (result.val, map->l_tls_initimage,
> -                    map->l_tls_initimage_size),
> -         '\0', map->l_tls_blocksize - map->l_tls_initimage_size);
> +  memset_zero (__mempcpy (result.val, map->l_tls_initimage,
> +                         map->l_tls_initimage_size),
> +              map->l_tls_blocksize - map->l_tls_initimage_size);
>
>    return result;
>  }
> @@ -1053,8 +1054,8 @@ cannot create TLS data structures"));
>
>        listp->len = TLS_SLOTINFO_SURPLUS;
>        listp->next = NULL;
> -      memset (listp->slotinfo, '\0',
> -             TLS_SLOTINFO_SURPLUS * sizeof (struct dtv_slotinfo));
> +      memset_zero (listp->slotinfo,
> +                  TLS_SLOTINFO_SURPLUS * sizeof (struct dtv_slotinfo));
>        /* Synchronize with _dl_update_slotinfo.  */
>        atomic_store_release (&prevp->next, listp);
>      }
> @@ -1082,8 +1083,9 @@ init_one_static_tls (struct pthread *curp, struct link_map *map)
>  # endif
>
>    /* Initialize the memory.  */
> -  memset (__mempcpy (dest, map->l_tls_initimage, map->l_tls_initimage_size),
> -         '\0', map->l_tls_blocksize - map->l_tls_initimage_size);
> +  memset_zero (__mempcpy (dest, map->l_tls_initimage,
> +                         map->l_tls_initimage_size),
> +              map->l_tls_blocksize - map->l_tls_initimage_size);
>  }
>
>  void
> diff --git a/elf/neededtest.c b/elf/neededtest.c
> index 3cea499314..1ab8380123 100644
> --- a/elf/neededtest.c
> +++ b/elf/neededtest.c
> @@ -21,7 +21,7 @@ check_loaded_objects (const char **loaded)
>    if (n)
>      {
>        found = (int *) alloca (sizeof (int) * n);
> -      memset (found, 0, sizeof (int) * n);
> +      memset_zero (found, sizeof (int) * n);
>      }
>
>    printf("   Name\n");
> diff --git a/elf/neededtest2.c b/elf/neededtest2.c
> index 17c75f2ba3..eb67692828 100644
> --- a/elf/neededtest2.c
> +++ b/elf/neededtest2.c
> @@ -21,7 +21,7 @@ check_loaded_objects (const char **loaded)
>    if (n)
>      {
>        found = (int *) alloca (sizeof (int) * n);
> -      memset (found, 0, sizeof (int) * n);
> +      memset_zero (found, sizeof (int) * n);
>      }
>
>    printf("   Name\n");
> diff --git a/elf/neededtest3.c b/elf/neededtest3.c
> index 41970cf2c7..5cc7a4453e 100644
> --- a/elf/neededtest3.c
> +++ b/elf/neededtest3.c
> @@ -21,7 +21,7 @@ check_loaded_objects (const char **loaded)
>    if (n)
>      {
>        found = (int *) alloca (sizeof (int) * n);
> -      memset (found, 0, sizeof (int) * n);
> +      memset_zero (found, sizeof (int) * n);
>      }
>
>    printf("   Name\n");
> diff --git a/elf/neededtest4.c b/elf/neededtest4.c
> index 0ae0b7ff47..8e88194dcf 100644
> --- a/elf/neededtest4.c
> +++ b/elf/neededtest4.c
> @@ -21,7 +21,7 @@ check_loaded_objects (const char **loaded)
>    if (n)
>      {
>        found = (int *) alloca (sizeof (int) * n);
> -      memset (found, 0, sizeof (int) * n);
> +      memset_zero (found, sizeof (int) * n);
>      }
>
>    printf("   Name\n");
> diff --git a/elf/sprof.c b/elf/sprof.c
> index 405fbcbf38..b950e61a16 100644
> --- a/elf/sprof.c
> +++ b/elf/sprof.c
> @@ -860,7 +860,7 @@ load_profdata (const char *name, struct shobj *shobj)
>
>    memcpy (&gmon_hdr.cookie[0], GMON_MAGIC, sizeof (gmon_hdr.cookie));
>    gmon_hdr.version = GMON_SHOBJ_VERSION;
> -  memset (gmon_hdr.spare, '\0', sizeof (gmon_hdr.spare));
> +  memset_zero (gmon_hdr.spare, sizeof (gmon_hdr.spare));
>
>    /* Create the hist_hdr we expect or write.  */
>    struct real_gmon_hist_hdr hist_hdr;
> --
> 2.34.1
>

Sent by accident.  Please ignore this.

-- 
H.J.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2022-02-09 16:14 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-09 16:11 [PATCH v2] string: Add support for __memsetzero on all targets H.J. Lu
2022-02-09 16:11 ` [PATCH] elf: Use memset_zero to erase data H.J. Lu
2022-02-09 16:14   ` H.J. Lu

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).