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)
}
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. */
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);
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
#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
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 */
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.
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