diff options
-rw-r--r-- | malloc/malloc.c | 17 | ||||
-rw-r--r-- | sysdeps/aarch64/Makefile | 2 | ||||
-rw-r--r-- | sysdeps/aarch64/__mtag_tag_zero_region.S (renamed from sysdeps/aarch64/__mtag_memset_tag.S) | 18 | ||||
-rw-r--r-- | sysdeps/aarch64/libc-mtag.h | 4 | ||||
-rw-r--r-- | sysdeps/generic/libc-mtag.h | 6 |
5 files changed, 21 insertions, 26 deletions
diff --git a/malloc/malloc.c b/malloc/malloc.c index 9c3981f..9cfea1f 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -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); diff --git a/sysdeps/aarch64/Makefile b/sysdeps/aarch64/Makefile index d3ab37a..259070c 100644 --- a/sysdeps/aarch64/Makefile +++ b/sysdeps/aarch64/Makefile @@ -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 diff --git a/sysdeps/aarch64/__mtag_memset_tag.S b/sysdeps/aarch64/__mtag_tag_zero_region.S index 3c20288..74d398b 100644 --- a/sysdeps/aarch64/__mtag_memset_tag.S +++ b/sysdeps/aarch64/__mtag_tag_zero_region.S @@ -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 @@ -31,16 +28,15 @@ /* 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 */ diff --git a/sysdeps/aarch64/libc-mtag.h b/sysdeps/aarch64/libc-mtag.h index 979cbb7..f58402c 100644 --- a/sysdeps/aarch64/libc-mtag.h +++ b/sysdeps/aarch64/libc-mtag.h @@ -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. diff --git a/sysdeps/generic/libc-mtag.h b/sysdeps/generic/libc-mtag.h index e8fc236..4743e87 100644 --- a/sysdeps/generic/libc-mtag.h +++ b/sysdeps/generic/libc-mtag.h @@ -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 |