Message ID | 20201218192957.11035-7-rearnsha@arm.com |
---|---|
State | New |
Headers | show |
Series | Memory tagging support | expand |
The 12/18/2020 19:29, Richard Earnshaw wrote: > This final patch provides the architecture-specific implementation of > the memory-tagging support hooks for aarch64. i see some gnu style issues in libc-mtag.h otherwise it looks ok. Reviewed-by: Szabolcs Nagy <szabolcs.nagy@arm.com> > --- > sysdeps/aarch64/Makefile | 5 +++ > sysdeps/aarch64/__mtag_address_get_tag.S | 32 +++++++++++++ > sysdeps/aarch64/__mtag_memset_tag.S | 53 ++++++++++++++++++++++ > sysdeps/aarch64/__mtag_new_tag.S | 37 +++++++++++++++ > sysdeps/aarch64/__mtag_tag_region.S | 51 +++++++++++++++++++++ > sysdeps/aarch64/libc-mtag.h | 57 ++++++++++++++++++++++++ > 6 files changed, 235 insertions(+) > create mode 100644 sysdeps/aarch64/__mtag_address_get_tag.S > create mode 100644 sysdeps/aarch64/__mtag_memset_tag.S > create mode 100644 sysdeps/aarch64/__mtag_new_tag.S > create mode 100644 sysdeps/aarch64/__mtag_tag_region.S > create mode 100644 sysdeps/aarch64/libc-mtag.h > > diff --git a/sysdeps/aarch64/Makefile b/sysdeps/aarch64/Makefile > index d8e06d27b2..d3ab37a40a 100644 > --- a/sysdeps/aarch64/Makefile > +++ b/sysdeps/aarch64/Makefile > @@ -40,4 +40,9 @@ endif > > ifeq ($(subdir),misc) > sysdep_headers += sys/ifunc.h > +sysdep_routines += __mtag_address_get_tag \ > + __mtag_memset_tag \ > + __mtag_new_tag \ > + __mtag_tag_region > + > endif > diff --git a/sysdeps/aarch64/__mtag_address_get_tag.S b/sysdeps/aarch64/__mtag_address_get_tag.S > new file mode 100644 > index 0000000000..4ffe884c95 > --- /dev/null > +++ b/sysdeps/aarch64/__mtag_address_get_tag.S > @@ -0,0 +1,32 @@ > +/* Copyright (C) 2020 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 > +#define ptr x0 > + > + .arch armv8.5-a > + .arch_extension memtag > + > +ENTRY (__libc_mtag_address_get_tag) > + > + ldg ptr, [ptr] > + ret > +END (__libc_mtag_address_get_tag) > +#endif /* USE_MTAG */ > diff --git a/sysdeps/aarch64/__mtag_memset_tag.S b/sysdeps/aarch64/__mtag_memset_tag.S > new file mode 100644 > index 0000000000..6f78d91b79 > --- /dev/null > +++ b/sysdeps/aarch64/__mtag_memset_tag.S > @@ -0,0 +1,53 @@ > +/* Copyright (C) 2020 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 > + > +/* Use the same register names and assignments as memset. */ > +#include "memset-reg.h" > + > + .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. */ > + > +ENTRY(__libc_mtag_memset_with_tag) > + > + 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 > + > +L(loop): > + stgp val, val, [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_memset_with_tag) > +#endif /* USE_MTAG */ > diff --git a/sysdeps/aarch64/__mtag_new_tag.S b/sysdeps/aarch64/__mtag_new_tag.S > new file mode 100644 > index 0000000000..663e3a484f > --- /dev/null > +++ b/sysdeps/aarch64/__mtag_new_tag.S > @@ -0,0 +1,37 @@ > +/* Copyright (C) 2020 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. */ > + > +#define ptr x0 > +#define xset x1 > + > +ENTRY(__libc_mtag_new_tag) > + // Guarantee that the new tag is not the same as now. > + gmi xset, ptr, xzr > + irg ptr, ptr, xset > + ret > +END (__libc_mtag_new_tag) > +#endif /* USE_MTAG */ > diff --git a/sysdeps/aarch64/__mtag_tag_region.S b/sysdeps/aarch64/__mtag_tag_region.S > new file mode 100644 > index 0000000000..7af4f0fa0a > --- /dev/null > +++ b/sysdeps/aarch64/__mtag_tag_region.S > @@ -0,0 +1,51 @@ > +/* Copyright (C) 2020 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 > + > +/* Use the same register names and assignments as memset. */ > + > + .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 better than > + this for larger values of COUNT. */ > + > +#define dstin x0 > +#define count x1 > +#define dst x2 > + > +ENTRY_ALIGN(__libc_mtag_tag_region, 6) > + > + mov dst, dstin > +L(loop): > + stg 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_region) > +#endif /* USE_MTAG */ > diff --git a/sysdeps/aarch64/libc-mtag.h b/sysdeps/aarch64/libc-mtag.h > new file mode 100644 > index 0000000000..0e9b63e95b > --- /dev/null > +++ b/sysdeps/aarch64/libc-mtag.h > @@ -0,0 +1,57 @@ > +/* libc-internal interface for tagged (colored) memory support. > + Copyright (C) 2020 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/>. */ > + > +#ifndef _AARCH64_LIBC_MTAG_H > +#define _AARCH64_LIBC_MTAG_H 1 > + > +#ifndef USE_MTAG > +/* Generic bindings for systems that do not support memory tagging. */ > +#include_next "libc-mtag.h" > +#else > + > +/* Used to ensure additional alignment when objects need to have distinct > + tags. */ > +#define __MTAG_GRANULE_SIZE 16 > + > +/* Non-zero if memory obtained via morecore (sbrk) is not tagged. */ > +#define __MTAG_SBRK_UNTAGGED 1 > + > +/* Extra flags to pass to mmap to get tagged pages. */ > +#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) */ > +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); > + > +/* 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 *); > + > +/* Assign a new (random) tag to a pointer P (does not adjust the tag on > + the memory addressed). > + void *__libc_mtag_new_tag (void*) */ > +void *__libc_mtag_new_tag(void *); missing spaces before ( > + > +#endif /* USE_MTAG */ > + > +#endif /* _AARCH64_LIBC_MTAG_H */
On 21/12/2020 12:44, Szabolcs Nagy via Libc-alpha wrote: > The 12/18/2020 19:29, Richard Earnshaw wrote: >> This final patch provides the architecture-specific implementation of >> the memory-tagging support hooks for aarch64. > > i see some gnu style issues in libc-mtag.h otherwise it looks ok. > > Reviewed-by: Szabolcs Nagy <szabolcs.nagy@arm.com> > >> --- >> sysdeps/aarch64/Makefile | 5 +++ >> sysdeps/aarch64/__mtag_address_get_tag.S | 32 +++++++++++++ >> sysdeps/aarch64/__mtag_memset_tag.S | 53 ++++++++++++++++++++++ >> sysdeps/aarch64/__mtag_new_tag.S | 37 +++++++++++++++ >> sysdeps/aarch64/__mtag_tag_region.S | 51 +++++++++++++++++++++ >> sysdeps/aarch64/libc-mtag.h | 57 ++++++++++++++++++++++++ >> 6 files changed, 235 insertions(+) >> create mode 100644 sysdeps/aarch64/__mtag_address_get_tag.S >> create mode 100644 sysdeps/aarch64/__mtag_memset_tag.S >> create mode 100644 sysdeps/aarch64/__mtag_new_tag.S >> create mode 100644 sysdeps/aarch64/__mtag_tag_region.S >> create mode 100644 sysdeps/aarch64/libc-mtag.h >> > >> diff --git a/sysdeps/aarch64/Makefile b/sysdeps/aarch64/Makefile >> index d8e06d27b2..d3ab37a40a 100644 >> --- a/sysdeps/aarch64/Makefile >> +++ b/sysdeps/aarch64/Makefile >> @@ -40,4 +40,9 @@ endif >> >> ifeq ($(subdir),misc) >> sysdep_headers += sys/ifunc.h >> +sysdep_routines += __mtag_address_get_tag \ >> + __mtag_memset_tag \ >> + __mtag_new_tag \ >> + __mtag_tag_region >> + >> endif >> diff --git a/sysdeps/aarch64/__mtag_address_get_tag.S b/sysdeps/aarch64/__mtag_address_get_tag.S >> new file mode 100644 >> index 0000000000..4ffe884c95 >> --- /dev/null >> +++ b/sysdeps/aarch64/__mtag_address_get_tag.S >> @@ -0,0 +1,32 @@ >> +/* Copyright (C) 2020 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 >> +#define ptr x0 >> + >> + .arch armv8.5-a >> + .arch_extension memtag >> + >> +ENTRY (__libc_mtag_address_get_tag) >> + >> + ldg ptr, [ptr] >> + ret >> +END (__libc_mtag_address_get_tag) >> +#endif /* USE_MTAG */ >> diff --git a/sysdeps/aarch64/__mtag_memset_tag.S b/sysdeps/aarch64/__mtag_memset_tag.S >> new file mode 100644 >> index 0000000000..6f78d91b79 >> --- /dev/null >> +++ b/sysdeps/aarch64/__mtag_memset_tag.S >> @@ -0,0 +1,53 @@ >> +/* Copyright (C) 2020 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 >> + >> +/* Use the same register names and assignments as memset. */ >> +#include "memset-reg.h" >> + >> + .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. */ >> + >> +ENTRY(__libc_mtag_memset_with_tag) >> + >> + 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 >> + >> +L(loop): >> + stgp val, val, [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_memset_with_tag) >> +#endif /* USE_MTAG */ >> diff --git a/sysdeps/aarch64/__mtag_new_tag.S b/sysdeps/aarch64/__mtag_new_tag.S >> new file mode 100644 >> index 0000000000..663e3a484f >> --- /dev/null >> +++ b/sysdeps/aarch64/__mtag_new_tag.S >> @@ -0,0 +1,37 @@ >> +/* Copyright (C) 2020 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. */ >> + >> +#define ptr x0 >> +#define xset x1 >> + >> +ENTRY(__libc_mtag_new_tag) >> + // Guarantee that the new tag is not the same as now. >> + gmi xset, ptr, xzr >> + irg ptr, ptr, xset >> + ret >> +END (__libc_mtag_new_tag) >> +#endif /* USE_MTAG */ >> diff --git a/sysdeps/aarch64/__mtag_tag_region.S b/sysdeps/aarch64/__mtag_tag_region.S >> new file mode 100644 >> index 0000000000..7af4f0fa0a >> --- /dev/null >> +++ b/sysdeps/aarch64/__mtag_tag_region.S >> @@ -0,0 +1,51 @@ >> +/* Copyright (C) 2020 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 >> + >> +/* Use the same register names and assignments as memset. */ >> + >> + .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 better than >> + this for larger values of COUNT. */ >> + >> +#define dstin x0 >> +#define count x1 >> +#define dst x2 >> + >> +ENTRY_ALIGN(__libc_mtag_tag_region, 6) >> + >> + mov dst, dstin >> +L(loop): >> + stg 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_region) >> +#endif /* USE_MTAG */ >> diff --git a/sysdeps/aarch64/libc-mtag.h b/sysdeps/aarch64/libc-mtag.h >> new file mode 100644 >> index 0000000000..0e9b63e95b >> --- /dev/null >> +++ b/sysdeps/aarch64/libc-mtag.h >> @@ -0,0 +1,57 @@ >> +/* libc-internal interface for tagged (colored) memory support. >> + Copyright (C) 2020 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/>. */ >> + >> +#ifndef _AARCH64_LIBC_MTAG_H >> +#define _AARCH64_LIBC_MTAG_H 1 >> + >> +#ifndef USE_MTAG >> +/* Generic bindings for systems that do not support memory tagging. */ >> +#include_next "libc-mtag.h" >> +#else >> + >> +/* Used to ensure additional alignment when objects need to have distinct >> + tags. */ >> +#define __MTAG_GRANULE_SIZE 16 >> + >> +/* Non-zero if memory obtained via morecore (sbrk) is not tagged. */ >> +#define __MTAG_SBRK_UNTAGGED 1 >> + >> +/* Extra flags to pass to mmap to get tagged pages. */ >> +#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) */ >> +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); >> + >> +/* 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 *); >> + >> +/* Assign a new (random) tag to a pointer P (does not adjust the tag on >> + the memory addressed). >> + void *__libc_mtag_new_tag (void*) */ >> +void *__libc_mtag_new_tag(void *); > > missing spaces before ( Oops, fixed. > >> + >> +#endif /* USE_MTAG */ >> + >> +#endif /* _AARCH64_LIBC_MTAG_H */ R.
diff --git a/sysdeps/aarch64/Makefile b/sysdeps/aarch64/Makefile index d8e06d27b2..d3ab37a40a 100644 --- a/sysdeps/aarch64/Makefile +++ b/sysdeps/aarch64/Makefile @@ -40,4 +40,9 @@ endif ifeq ($(subdir),misc) sysdep_headers += sys/ifunc.h +sysdep_routines += __mtag_address_get_tag \ + __mtag_memset_tag \ + __mtag_new_tag \ + __mtag_tag_region + endif diff --git a/sysdeps/aarch64/__mtag_address_get_tag.S b/sysdeps/aarch64/__mtag_address_get_tag.S new file mode 100644 index 0000000000..4ffe884c95 --- /dev/null +++ b/sysdeps/aarch64/__mtag_address_get_tag.S @@ -0,0 +1,32 @@ +/* Copyright (C) 2020 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 +#define ptr x0 + + .arch armv8.5-a + .arch_extension memtag + +ENTRY (__libc_mtag_address_get_tag) + + ldg ptr, [ptr] + ret +END (__libc_mtag_address_get_tag) +#endif /* USE_MTAG */ diff --git a/sysdeps/aarch64/__mtag_memset_tag.S b/sysdeps/aarch64/__mtag_memset_tag.S new file mode 100644 index 0000000000..6f78d91b79 --- /dev/null +++ b/sysdeps/aarch64/__mtag_memset_tag.S @@ -0,0 +1,53 @@ +/* Copyright (C) 2020 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 + +/* Use the same register names and assignments as memset. */ +#include "memset-reg.h" + + .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. */ + +ENTRY(__libc_mtag_memset_with_tag) + + 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 + +L(loop): + stgp val, val, [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_memset_with_tag) +#endif /* USE_MTAG */ diff --git a/sysdeps/aarch64/__mtag_new_tag.S b/sysdeps/aarch64/__mtag_new_tag.S new file mode 100644 index 0000000000..663e3a484f --- /dev/null +++ b/sysdeps/aarch64/__mtag_new_tag.S @@ -0,0 +1,37 @@ +/* Copyright (C) 2020 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. */ + +#define ptr x0 +#define xset x1 + +ENTRY(__libc_mtag_new_tag) + // Guarantee that the new tag is not the same as now. + gmi xset, ptr, xzr + irg ptr, ptr, xset + ret +END (__libc_mtag_new_tag) +#endif /* USE_MTAG */ diff --git a/sysdeps/aarch64/__mtag_tag_region.S b/sysdeps/aarch64/__mtag_tag_region.S new file mode 100644 index 0000000000..7af4f0fa0a --- /dev/null +++ b/sysdeps/aarch64/__mtag_tag_region.S @@ -0,0 +1,51 @@ +/* Copyright (C) 2020 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 + +/* Use the same register names and assignments as memset. */ + + .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 better than + this for larger values of COUNT. */ + +#define dstin x0 +#define count x1 +#define dst x2 + +ENTRY_ALIGN(__libc_mtag_tag_region, 6) + + mov dst, dstin +L(loop): + stg 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_region) +#endif /* USE_MTAG */ diff --git a/sysdeps/aarch64/libc-mtag.h b/sysdeps/aarch64/libc-mtag.h new file mode 100644 index 0000000000..0e9b63e95b --- /dev/null +++ b/sysdeps/aarch64/libc-mtag.h @@ -0,0 +1,57 @@ +/* libc-internal interface for tagged (colored) memory support. + Copyright (C) 2020 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/>. */ + +#ifndef _AARCH64_LIBC_MTAG_H +#define _AARCH64_LIBC_MTAG_H 1 + +#ifndef USE_MTAG +/* Generic bindings for systems that do not support memory tagging. */ +#include_next "libc-mtag.h" +#else + +/* Used to ensure additional alignment when objects need to have distinct + tags. */ +#define __MTAG_GRANULE_SIZE 16 + +/* Non-zero if memory obtained via morecore (sbrk) is not tagged. */ +#define __MTAG_SBRK_UNTAGGED 1 + +/* Extra flags to pass to mmap to get tagged pages. */ +#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) */ +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); + +/* 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 *); + +/* Assign a new (random) tag to a pointer P (does not adjust the tag on + the memory addressed). + void *__libc_mtag_new_tag (void*) */ +void *__libc_mtag_new_tag(void *); + +#endif /* USE_MTAG */ + +#endif /* _AARCH64_LIBC_MTAG_H */