Message ID | b52bdc9fc7fd11bf3e0003c96855bb4c191cc4fa.1600204505.git.andreyknvl@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | kasan: add hardware tag-based mode for arm64 | expand |
On Tue, Sep 15, 2020 at 11:16:05PM +0200, Andrey Konovalov wrote: > This patch add a set of arch_*() memory tagging helpers currently only > defined for arm64 when hardware tag-based KASAN is enabled. These helpers > will be used by KASAN runtime to implement the hardware tag-based mode. > > The arch-level indirection level is introduced to simplify adding hardware > tag-based KASAN support for other architectures in the future by defining > the appropriate arch_*() macros. > > Signed-off-by: Andrey Konovalov <andreyknvl@google.com> > Co-developed-by: Vincenzo Frascino <vincenzo.frascino@arm.com> > Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
On Tue, Sep 15, 2020 at 11:16PM +0200, 'Andrey Konovalov' via kasan-dev wrote: > This patch add a set of arch_*() memory tagging helpers currently only > defined for arm64 when hardware tag-based KASAN is enabled. These helpers > will be used by KASAN runtime to implement the hardware tag-based mode. > > The arch-level indirection level is introduced to simplify adding hardware > tag-based KASAN support for other architectures in the future by defining > the appropriate arch_*() macros. > > Signed-off-by: Andrey Konovalov <andreyknvl@google.com> > Co-developed-by: Vincenzo Frascino <vincenzo.frascino@arm.com> > Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com> > --- > Change-Id: I42b0795a28067872f8308e00c6f0195bca435c2a > --- > arch/arm64/include/asm/memory.h | 8 ++++++++ > mm/kasan/kasan.h | 19 +++++++++++++++++++ > 2 files changed, 27 insertions(+) > > diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h > index e424fc3a68cb..268a3b6cebd2 100644 > --- a/arch/arm64/include/asm/memory.h > +++ b/arch/arm64/include/asm/memory.h > @@ -231,6 +231,14 @@ static inline const void *__tag_set(const void *addr, u8 tag) > return (const void *)(__addr | __tag_shifted(tag)); > } > > +#ifdef CONFIG_KASAN_HW_TAGS > +#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) > +#define arch_set_mem_tag_range(addr, size, tag) \ > + mte_set_mem_tag_range((addr), (size), (tag)) Suggested edit below, assuming you're fine with checkpatch.pl's new 100col limit: -#define set_mem_tag_range(addr, size, tag) \ - arch_set_mem_tag_range((addr), (size), (tag)) +#define set_mem_tag_range(addr, size, tag) arch_set_mem_tag_range((addr), (size), (tag))
On Fri, Sep 18, 2020 at 3:00 PM Marco Elver <elver@google.com> wrote: > > On Tue, Sep 15, 2020 at 11:16PM +0200, 'Andrey Konovalov' via kasan-dev wrote: > > This patch add a set of arch_*() memory tagging helpers currently only > > defined for arm64 when hardware tag-based KASAN is enabled. These helpers > > will be used by KASAN runtime to implement the hardware tag-based mode. > > > > The arch-level indirection level is introduced to simplify adding hardware > > tag-based KASAN support for other architectures in the future by defining > > the appropriate arch_*() macros. > > > > Signed-off-by: Andrey Konovalov <andreyknvl@google.com> > > Co-developed-by: Vincenzo Frascino <vincenzo.frascino@arm.com> > > Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com> > > --- > > Change-Id: I42b0795a28067872f8308e00c6f0195bca435c2a > > --- > > arch/arm64/include/asm/memory.h | 8 ++++++++ > > mm/kasan/kasan.h | 19 +++++++++++++++++++ > > 2 files changed, 27 insertions(+) > > > > diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h > > index e424fc3a68cb..268a3b6cebd2 100644 > > --- a/arch/arm64/include/asm/memory.h > > +++ b/arch/arm64/include/asm/memory.h > > @@ -231,6 +231,14 @@ static inline const void *__tag_set(const void *addr, u8 tag) > > return (const void *)(__addr | __tag_shifted(tag)); > > } > > > > +#ifdef CONFIG_KASAN_HW_TAGS > > +#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) > > +#define arch_set_mem_tag_range(addr, size, tag) \ > > + mte_set_mem_tag_range((addr), (size), (tag)) > > Suggested edit below, assuming you're fine with checkpatch.pl's new > 100col limit: > > -#define set_mem_tag_range(addr, size, tag) \ > - arch_set_mem_tag_range((addr), (size), (tag)) > +#define set_mem_tag_range(addr, size, tag) arch_set_mem_tag_range((addr), (size), (tag)) Will do in v3, thanks!
diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h index e424fc3a68cb..268a3b6cebd2 100644 --- a/arch/arm64/include/asm/memory.h +++ b/arch/arm64/include/asm/memory.h @@ -231,6 +231,14 @@ static inline const void *__tag_set(const void *addr, u8 tag) return (const void *)(__addr | __tag_shifted(tag)); } +#ifdef CONFIG_KASAN_HW_TAGS +#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) +#define arch_set_mem_tag_range(addr, size, tag) \ + mte_set_mem_tag_range((addr), (size), (tag)) +#endif /* CONFIG_KASAN_HW_TAGS */ + /* * Physical vs virtual RAM address space conversion. These are * private definitions which should NOT be used outside memory.h diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h index 1d3c7c6ce771..8b43fc163ed1 100644 --- a/mm/kasan/kasan.h +++ b/mm/kasan/kasan.h @@ -240,6 +240,25 @@ static inline const void *arch_kasan_set_tag(const void *addr, u8 tag) #define reset_tag(addr) ((void *)arch_kasan_reset_tag(addr)) #define get_tag(addr) arch_kasan_get_tag(addr) +#ifndef arch_init_tags +#define arch_init_tags(max_tag) +#endif +#ifndef arch_get_random_tag +#define arch_get_random_tag() (0xFF) +#endif +#ifndef arch_get_mem_tag +#define arch_get_mem_tag(addr) (0xFF) +#endif +#ifndef arch_set_mem_tag_range +#define arch_set_mem_tag_range(addr, size, tag) ((void *)(addr)) +#endif + +#define init_tags(max_tag) arch_init_tags(max_tag) +#define get_random_tag() arch_get_random_tag() +#define get_mem_tag(addr) arch_get_mem_tag(addr) +#define set_mem_tag_range(addr, size, tag) \ + arch_set_mem_tag_range((addr), (size), (tag)) + /* * Exported functions for interfaces called from assembly or from generated * code. Declarations here to avoid warning about missing declarations.