diff options
author | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2021-02-04 10:04:07 +0000 |
---|---|---|
committer | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2021-03-26 11:03:06 +0000 |
commit | 40dc773f92ad33b6c742bbb84884761e399b9ce8 (patch) | |
tree | e9223aaca1a99fe76d799ba4367166975b77e780 /sysdeps/aarch64/libc-mtag.h | |
parent | d32624802d0b2105c95f699dd6a887b54cebf197 (diff) | |
download | glibc-40dc773f92ad33b6c742bbb84884761e399b9ce8.tar.gz glibc-40dc773f92ad33b6c742bbb84884761e399b9ce8.tar.xz glibc-40dc773f92ad33b6c742bbb84884761e399b9ce8.zip |
aarch64: inline __libc_mtag_address_get_tag
This is a common operation when heap tagging is enabled, so inline the instruction instead of using an extern call. The .inst directive is used instead of the name of the instruction (or acle intrinsics) because malloc.c is not compiled for armv8.5-a+memtag architecture, runtime cpu support detection is used. Prototypes are removed from the comments as they were not always correct.
Diffstat (limited to 'sysdeps/aarch64/libc-mtag.h')
-rw-r--r-- | sysdeps/aarch64/libc-mtag.h | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/sysdeps/aarch64/libc-mtag.h b/sysdeps/aarch64/libc-mtag.h index f58402ccf9..da1b6be776 100644 --- a/sysdeps/aarch64/libc-mtag.h +++ b/sysdeps/aarch64/libc-mtag.h @@ -35,17 +35,21 @@ #define __MTAG_MMAP_FLAGS PROT_MTE /* Set the tags for a region of memory, which must have size and alignment - that are multiples of __MTAG_GRANULE_SIZE. Size cannot be zero. - void *__libc_mtag_tag_region (const void *, size_t) */ + that are multiples of __MTAG_GRANULE_SIZE. Size cannot be zero. */ void *__libc_mtag_tag_region (void *, 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. - void *__libc_mtag_address_get_tag (void*) */ -void *__libc_mtag_address_get_tag (void *); + location. */ +static __always_inline void * +__libc_mtag_address_get_tag (void *p) +{ + register void *x0 asm ("x0") = p; + asm (".inst 0xd9600000 /* ldg x0, [x0] */" : "+r" (x0)); + return x0; +} /* Assign a new (random) tag to a pointer P (does not adjust the tag on the memory addressed). |