Messages in this thread | | | From | Andrey Konovalov <> | Date | Fri, 15 Jan 2021 19:59:14 +0100 | Subject | Re: [PATCH v3 1/4] kasan, arm64: Add KASAN light mode |
| |
On Fri, Jan 15, 2021 at 1:00 PM Vincenzo Frascino <vincenzo.frascino@arm.com> wrote: > > Architectures supported by KASAN HW can provide a light mode of > execution. On an MTE enabled arm64 hw for example this can be identified > with the asynch mode of execution. > In this mode, if a tag check fault occurs, the TFSR_EL1 register is > updated asynchronously. The kernel checks the corresponding bits > periodically. > > KASAN requires a specific mode of execution to make use of this hw feature. > > Add KASAN HW light execution mode. > > Note: This patch adds the KASAN_ARG_MODE_LIGHT config option and the > "light" kernel command line option to enable the described feature. > This patch introduces the kasan_def.h header to make easier to propagate > the relevant enumerations to the architectural code. > > Cc: Dmitry Vyukov <dvyukov@google.com> > Cc: Andrey Ryabinin <aryabinin@virtuozzo.com> > Cc: Alexander Potapenko <glider@google.com> > Cc: Andrey Konovalov <andreyknvl@google.com> > Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com> > --- > arch/arm64/include/asm/memory.h | 2 +- > arch/arm64/include/asm/mte-kasan.h | 5 +++-- > arch/arm64/kernel/mte.c | 2 +- > include/linux/kasan.h | 1 + > include/linux/kasan_def.h | 10 ++++++++++ > mm/kasan/hw_tags.c | 19 ++++++++++++++++++- > mm/kasan/kasan.h | 2 +- > 7 files changed, 35 insertions(+), 6 deletions(-) > create mode 100644 include/linux/kasan_def.h > > diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h > index 18fce223b67b..3a7c5beb7096 100644 > --- a/arch/arm64/include/asm/memory.h > +++ b/arch/arm64/include/asm/memory.h > @@ -231,7 +231,7 @@ static inline const void *__tag_set(const void *addr, u8 tag) > } > > #ifdef CONFIG_KASAN_HW_TAGS > -#define arch_enable_tagging() mte_enable_kernel() > +#define arch_enable_tagging(mode) mte_enable_kernel(mode) > #define arch_init_tags(max_tag) mte_init_tags(max_tag) > #define arch_get_random_tag() mte_get_random_tag() > #define arch_get_mem_tag(addr) mte_get_mem_tag(addr) > diff --git a/arch/arm64/include/asm/mte-kasan.h b/arch/arm64/include/asm/mte-kasan.h > index 26349a4b5e2e..5402f4c8e88d 100644 > --- a/arch/arm64/include/asm/mte-kasan.h > +++ b/arch/arm64/include/asm/mte-kasan.h > @@ -9,6 +9,7 @@ > > #ifndef __ASSEMBLY__ > > +#include <linux/kasan_def.h> > #include <linux/types.h> > > /* > @@ -29,7 +30,7 @@ u8 mte_get_mem_tag(void *addr); > u8 mte_get_random_tag(void); > void *mte_set_mem_tag_range(void *addr, size_t size, u8 tag); > > -void mte_enable_kernel(void); > +void mte_enable_kernel(enum kasan_hw_tags_mode mode); > void mte_init_tags(u64 max_tag); > > #else /* CONFIG_ARM64_MTE */ > @@ -52,7 +53,7 @@ static inline void *mte_set_mem_tag_range(void *addr, size_t size, u8 tag) > return addr; > } > > -static inline void mte_enable_kernel(void) > +static inline void mte_enable_kernel(enum kasan_hw_tags_mode mode) > { > } > > diff --git a/arch/arm64/kernel/mte.c b/arch/arm64/kernel/mte.c > index dc9ada64feed..53a6d734e29b 100644 > --- a/arch/arm64/kernel/mte.c > +++ b/arch/arm64/kernel/mte.c > @@ -151,7 +151,7 @@ void mte_init_tags(u64 max_tag) > write_sysreg_s(SYS_GCR_EL1_RRND | gcr_kernel_excl, SYS_GCR_EL1); > } > > -void mte_enable_kernel(void) > +void mte_enable_kernel(enum kasan_hw_tags_mode mode) > { > /* Enable MTE Sync Mode for EL1. */ > sysreg_clear_set(sctlr_el1, SCTLR_ELx_TCF_MASK, SCTLR_ELx_TCF_SYNC); > diff --git a/include/linux/kasan.h b/include/linux/kasan.h > index 5e0655fb2a6f..026031444217 100644 > --- a/include/linux/kasan.h > +++ b/include/linux/kasan.h > @@ -2,6 +2,7 @@ > #ifndef _LINUX_KASAN_H > #define _LINUX_KASAN_H > > +#include <linux/kasan_def.h> > #include <linux/static_key.h> > #include <linux/types.h> > > diff --git a/include/linux/kasan_def.h b/include/linux/kasan_def.h > new file mode 100644 > index 000000000000..0a55400809c9 > --- /dev/null > +++ b/include/linux/kasan_def.h > @@ -0,0 +1,10 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +#ifndef _LINUX_KASAN_DEF_H > +#define _LINUX_KASAN_DEF_H > + > +enum kasan_hw_tags_mode { > + KASAN_HW_TAGS_SYNC, > + KASAN_HW_TAGS_ASYNC, > +}; > + > +#endif /* _LINUX_KASAN_DEF_H */ > diff --git a/mm/kasan/hw_tags.c b/mm/kasan/hw_tags.c > index 55bd6f09c70f..6c3b0742f639 100644 > --- a/mm/kasan/hw_tags.c > +++ b/mm/kasan/hw_tags.c > @@ -22,6 +22,7 @@ > enum kasan_arg_mode { > KASAN_ARG_MODE_DEFAULT, > KASAN_ARG_MODE_OFF, > + KASAN_ARG_MODE_LIGHT, > KASAN_ARG_MODE_PROD, > KASAN_ARG_MODE_FULL, > }; > @@ -60,6 +61,8 @@ static int __init early_kasan_mode(char *arg) > > if (!strcmp(arg, "off")) > kasan_arg_mode = KASAN_ARG_MODE_OFF; > + else if (!strcmp(arg, "light")) > + kasan_arg_mode = KASAN_ARG_MODE_LIGHT;
Hi Vincenzo,
I've just mailed the change to KASAN parameters [1] as discussed, so we should use a standalone parameter here (kasan.trap?).
Thanks!
[1] https://lkml.org/lkml/2021/1/15/1242
| |