Message ID | 20240814085618.968833-8-samuel.holland@sifive.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | kasan: RISC-V support for KASAN_SW_TAGS using pointer masking | expand |
On Wed, Aug 14, 2024 at 10:56 AM Samuel Holland <samuel.holland@sifive.com> wrote: > > This allows the kernel to boot on systems without pointer masking > support when stack tagging is enabled. > > Signed-off-by: Samuel Holland <samuel.holland@sifive.com> Reviewed-by: Andrey Konovalov <andreyknvl@gmail.com> But see a nit below. > --- > > mm/kasan/kasan.h | 2 ++ > mm/kasan/sw_tags.c | 9 +++++++++ > scripts/Makefile.kasan | 5 +++++ > 3 files changed, 16 insertions(+) > > diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h > index fb2b9ac0659a..01e945cb111d 100644 > --- a/mm/kasan/kasan.h > +++ b/mm/kasan/kasan.h > @@ -630,6 +630,8 @@ void *__asan_memset(void *addr, int c, ssize_t len); > void *__asan_memmove(void *dest, const void *src, ssize_t len); > void *__asan_memcpy(void *dest, const void *src, ssize_t len); > > +u8 __hwasan_generate_tag(void); > + > void __hwasan_load1_noabort(void *); > void __hwasan_store1_noabort(void *); > void __hwasan_load2_noabort(void *); > diff --git a/mm/kasan/sw_tags.c b/mm/kasan/sw_tags.c > index 220b5d4c6876..32435d33583a 100644 > --- a/mm/kasan/sw_tags.c > +++ b/mm/kasan/sw_tags.c > @@ -70,6 +70,15 @@ u8 kasan_random_tag(void) > return (u8)(state % (KASAN_TAG_MAX + 1)); > } > > +u8 __hwasan_generate_tag(void) > +{ > + if (!kasan_enabled()) > + return KASAN_TAG_KERNEL; > + > + return kasan_random_tag(); > +} > +EXPORT_SYMBOL(__hwasan_generate_tag); > + > bool kasan_check_range(const void *addr, size_t size, bool write, > unsigned long ret_ip) > { > diff --git a/scripts/Makefile.kasan b/scripts/Makefile.kasan > index 390658a2d5b7..f64c1aca3e97 100644 > --- a/scripts/Makefile.kasan > +++ b/scripts/Makefile.kasan > @@ -73,6 +73,11 @@ ifeq ($(call clang-min-version, 150000)$(call gcc-min-version, 130000),y) > CFLAGS_KASAN += $(call cc-param,hwasan-kernel-mem-intrinsic-prefix=1) > endif > > +# RISC-V requires dynamically determining if stack tagging can be enabled. > +ifdef CONFIG_RISCV > +CFLAGS_KASAN += $(call cc-param,hwasan-generate-tags-with-calls=1) Let's indent this line by 1 tab (I already sent a patch that fixes indentation in the other parts of this Makefile [1]). [1] https://lore.kernel.org/linux-mm/20240813224027.84503-1-andrey.konovalov@linux.dev/T/#u > +endif > + > endif # CONFIG_KASAN_SW_TAGS > > export CFLAGS_KASAN CFLAGS_KASAN_NOSANITIZE > -- > 2.45.1 >
diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h index fb2b9ac0659a..01e945cb111d 100644 --- a/mm/kasan/kasan.h +++ b/mm/kasan/kasan.h @@ -630,6 +630,8 @@ void *__asan_memset(void *addr, int c, ssize_t len); void *__asan_memmove(void *dest, const void *src, ssize_t len); void *__asan_memcpy(void *dest, const void *src, ssize_t len); +u8 __hwasan_generate_tag(void); + void __hwasan_load1_noabort(void *); void __hwasan_store1_noabort(void *); void __hwasan_load2_noabort(void *); diff --git a/mm/kasan/sw_tags.c b/mm/kasan/sw_tags.c index 220b5d4c6876..32435d33583a 100644 --- a/mm/kasan/sw_tags.c +++ b/mm/kasan/sw_tags.c @@ -70,6 +70,15 @@ u8 kasan_random_tag(void) return (u8)(state % (KASAN_TAG_MAX + 1)); } +u8 __hwasan_generate_tag(void) +{ + if (!kasan_enabled()) + return KASAN_TAG_KERNEL; + + return kasan_random_tag(); +} +EXPORT_SYMBOL(__hwasan_generate_tag); + bool kasan_check_range(const void *addr, size_t size, bool write, unsigned long ret_ip) { diff --git a/scripts/Makefile.kasan b/scripts/Makefile.kasan index 390658a2d5b7..f64c1aca3e97 100644 --- a/scripts/Makefile.kasan +++ b/scripts/Makefile.kasan @@ -73,6 +73,11 @@ ifeq ($(call clang-min-version, 150000)$(call gcc-min-version, 130000),y) CFLAGS_KASAN += $(call cc-param,hwasan-kernel-mem-intrinsic-prefix=1) endif +# RISC-V requires dynamically determining if stack tagging can be enabled. +ifdef CONFIG_RISCV +CFLAGS_KASAN += $(call cc-param,hwasan-generate-tags-with-calls=1) +endif + endif # CONFIG_KASAN_SW_TAGS export CFLAGS_KASAN CFLAGS_KASAN_NOSANITIZE
This allows the kernel to boot on systems without pointer masking support when stack tagging is enabled. Signed-off-by: Samuel Holland <samuel.holland@sifive.com> --- mm/kasan/kasan.h | 2 ++ mm/kasan/sw_tags.c | 9 +++++++++ scripts/Makefile.kasan | 5 +++++ 3 files changed, 16 insertions(+)