]> sourceware.org Git - glibc.git/commitdiff
malloc: Only support zeroing and not arbitrary memset with mtag
authorSzabolcs Nagy <szabolcs.nagy@arm.com>
Fri, 29 Jan 2021 17:07:28 +0000 (17:07 +0000)
committerSzabolcs Nagy <szabolcs.nagy@arm.com>
Fri, 19 Mar 2021 11:46:20 +0000 (11:46 +0000)
The memset api is suboptimal and does not provide much benefit. Memory
tagging only needs a zeroing memset (and only for memory that's sized
and aligned to multiples of the tag granule), so change the internal
api and the target hooks accordingly.  This is to simplify the
implementation of the target hook.

Reviewed-by: DJ Delorie <dj@redhat.com>
malloc/malloc.c
sysdeps/aarch64/Makefile
sysdeps/aarch64/__mtag_tag_zero_region.S [moved from sysdeps/aarch64/__mtag_memset_tag.S with 82% similarity]
sysdeps/aarch64/libc-mtag.h
sysdeps/generic/libc-mtag.h

index 253a919ec5fa601da75238bbd23ca685318c713a..01cf6e9325125c807095808b24cb5ccbbe338af2 100644 (file)
@@ -413,12 +413,11 @@ void *(*__morecore)(ptrdiff_t) = __default_morecore;
    operations can continue to be used.  Support macros are used to do
    this:
 
-   void *tag_new_memset (void *ptr, int, val, size_t size)
+   void *tag_new_zero_region (void *ptr, size_t size)
 
-   Has the same interface as memset(), but additionally allocates a
-   new tag, colors the memory with that tag and returns a pointer that
-   is correctly colored for that location.  The non-tagging version
-   will simply call memset.
+   Allocates a new tag, colors the memory with that tag, zeros the
+   memory and returns a pointer that is correctly colored for that
+   location.  The non-tagging version will simply call memset with 0.
 
    void *tag_region (void *ptr, size_t size)
 
@@ -458,11 +457,11 @@ tag_region (void *ptr, size_t size)
 }
 
 static __always_inline void *
-tag_new_memset (void *ptr, int val, size_t size)
+tag_new_zero_region (void *ptr, size_t size)
 {
   if (__glibc_unlikely (mtag_enabled))
-    return __libc_mtag_memset_with_tag (__libc_mtag_new_tag (ptr), val, size);
-  return memset (ptr, val, size);
+    return __libc_mtag_tag_zero_region (__libc_mtag_new_tag (ptr), size);
+  return memset (ptr, 0, size);
 }
 
 /* Defined later.  */
@@ -3679,7 +3678,7 @@ __libc_calloc (size_t n, size_t elem_size)
      regardless of MORECORE_CLEARS, so we zero the whole block while
      doing so.  */
 #ifdef USE_MTAG
-  return tag_new_memset (mem, 0, CHUNK_AVAILABLE_SIZE (p) - CHUNK_HDR_SZ);
+  return tag_new_zero_region (mem, CHUNK_AVAILABLE_SIZE (p) - CHUNK_HDR_SZ);
 #else
   INTERNAL_SIZE_T csz = chunksize (p);
 
index d3ab37a40ac9f3f8499cb4fc72cda514f3bfe307..259070cfad9628821ad8ca2214c9a727c3e1aa97 100644 (file)
@@ -41,7 +41,7 @@ endif
 ifeq ($(subdir),misc)
 sysdep_headers += sys/ifunc.h
 sysdep_routines += __mtag_address_get_tag \
-                  __mtag_memset_tag \
+                  __mtag_tag_zero_region \
                   __mtag_new_tag \
                   __mtag_tag_region
 
similarity index 82%
rename from sysdeps/aarch64/__mtag_memset_tag.S
rename to sysdeps/aarch64/__mtag_tag_zero_region.S
index 3c202888a45122660f057580abea687aeb78cf4a..74d398bba5250c60c62ce98b54de2052631ca7a2 100644 (file)
@@ -20,9 +20,6 @@
 
 #ifdef USE_MTAG
 
-/* Use the same register names and assignments as memset.  */
-#include "memset-reg.h"
-
        .arch armv8.5-a
        .arch_extension memtag
 
 /* FIXME: This is a minimal implementation.  We could do much better than
    this for large values of COUNT.  */
 
-ENTRY(__libc_mtag_memset_with_tag)
+#define dstin x0
+#define count x1
+#define dst   x2
 
-       and     valw, valw, 255
-       orr     valw, valw, valw, lsl 8
-       orr     valw, valw, valw, lsl 16
-       orr     val, val, val, lsl 32
-       mov     dst, dstin
+ENTRY(__libc_mtag_tag_zero_region)
 
+       mov     dst, dstin
 L(loop):
-       stgp    val, val, [dst], #16
+       stzg    dst, [dst], #16
        subs    count, count, 16
        bne     L(loop)
 #if 0
@@ -49,5 +45,5 @@ L(loop):
        ldg     dstin, [dstin] // Recover the tag created (might be untagged).
 #endif
        ret
-END (__libc_mtag_memset_with_tag)
+END (__libc_mtag_tag_zero_region)
 #endif /* USE_MTAG */
index 979cbb743ea9e512d2c431622675081232f74ae8..f58402ccf94e6109b242cb201ee5042da885a75e 100644 (file)
@@ -39,8 +39,8 @@
    void *__libc_mtag_tag_region (const void *, size_t)  */
 void *__libc_mtag_tag_region (void *, size_t);
 
-/* Optimized equivalent to __libc_mtag_tag_region followed by memset.  */
-void *__libc_mtag_memset_with_tag (void *, int, size_t);
+/* Optimized equivalent to __libc_mtag_tag_region followed by memset to 0.  */
+void *__libc_mtag_tag_zero_region (void *, size_t);
 
 /* Convert address P to a pointer that is tagged correctly for that
    location.
index e8fc236b6cf0fcae017e8e729b7e46ace2a85850..4743e873f10907ae49587ccc872a1cee01b11e21 100644 (file)
@@ -44,12 +44,12 @@ __libc_mtag_tag_region (void *p, size_t n)
   return p;
 }
 
-/* Optimized equivalent to __libc_mtag_tag_region followed by memset.  */
+/* Optimized equivalent to __libc_mtag_tag_region followed by memset to 0.  */
 static inline void *
-__libc_mtag_memset_with_tag (void *p, int c, size_t n)
+__libc_mtag_tag_zero_region (void *p, size_t n)
 {
   __libc_mtag_link_error ();
-  return memset (p, c, n);
+  return memset (p, 0, n);
 }
 
 /* Convert address P to a pointer that is tagged correctly for that
This page took 0.064259 seconds and 5 git commands to generate.