about summary refs log tree commit diff
path: root/sysdeps/aarch64/__mtag_tag_zero_region.S
diff options
context:
space:
mode:
authorSzabolcs Nagy <szabolcs.nagy@arm.com>2021-01-29 17:07:28 +0000
committerSzabolcs Nagy <szabolcs.nagy@arm.com>2021-03-26 11:03:06 +0000
commitc076a0bc698c537f72c33bad2925f4e3da59d23c (patch)
tree188e36bfaa2c51ca50df2f1ef882a8fd57a61780 /sysdeps/aarch64/__mtag_tag_zero_region.S
parent42bac88a211a7fac9dd1bfe7d1e45e59ac50c24f (diff)
downloadglibc-c076a0bc698c537f72c33bad2925f4e3da59d23c.tar.gz
glibc-c076a0bc698c537f72c33bad2925f4e3da59d23c.tar.xz
glibc-c076a0bc698c537f72c33bad2925f4e3da59d23c.zip
malloc: Only support zeroing and not arbitrary memset with mtag
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>
Diffstat (limited to 'sysdeps/aarch64/__mtag_tag_zero_region.S')
-rw-r--r--sysdeps/aarch64/__mtag_tag_zero_region.S49
1 files changed, 49 insertions, 0 deletions
diff --git a/sysdeps/aarch64/__mtag_tag_zero_region.S b/sysdeps/aarch64/__mtag_tag_zero_region.S
new file mode 100644
index 0000000000..74d398bba5
--- /dev/null
+++ b/sysdeps/aarch64/__mtag_tag_zero_region.S
@@ -0,0 +1,49 @@
+/* Copyright (C) 2020-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
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+
+#ifdef USE_MTAG
+
+	.arch armv8.5-a
+	.arch_extension memtag
+
+/* NB, only supported on variants with 64-bit pointers.  */
+
+/* FIXME: This is a minimal implementation.  We could do much better than
+   this for large values of COUNT.  */
+
+#define dstin x0
+#define count x1
+#define dst   x2
+
+ENTRY(__libc_mtag_tag_zero_region)
+
+	mov	dst, dstin
+L(loop):
+	stzg	dst, [dst], #16
+	subs	count, count, 16
+	bne	L(loop)
+#if 0
+	/* This is not currently needed, since for now we are only called
+	   to tag memory that is taggable.  */
+	ldg	dstin, [dstin] // Recover the tag created (might be untagged).
+#endif
+	ret
+END (__libc_mtag_tag_zero_region)
+#endif /* USE_MTAG */