On Tue, Apr 4, 2023 at 10:43 AM Qing Zhang <zhangqing@xxxxxxxxxxx> wrote: > > Like the LoongArch, which has many holes between different segments > and valid address space(256T available) is insufficient to map all > these segments to kasan shadow memory with the common formula provided > by kasan core, We need architecture specific mapping formula,different > segments are mapped individually, and only limited length of space of > that specific segment is mapped to shadow. > > Therefore, when the incoming address is converted to a shadow, we need > to add a condition to determine whether it is valid. > > Signed-off-by: Qing Zhang <zhangqing@xxxxxxxxxxx> > --- > include/linux/kasan.h | 2 ++ > mm/kasan/kasan.h | 6 ++++++ > 2 files changed, 8 insertions(+) > > diff --git a/include/linux/kasan.h b/include/linux/kasan.h > index f7ef70661ce2..3b91b941873d 100644 > --- a/include/linux/kasan.h > +++ b/include/linux/kasan.h > @@ -54,11 +54,13 @@ extern p4d_t kasan_early_shadow_p4d[MAX_PTRS_PER_P4D]; > int kasan_populate_early_shadow(const void *shadow_start, > const void *shadow_end); > > +#ifndef __HAVE_ARCH_SHADOW_MAP > static inline void *kasan_mem_to_shadow(const void *addr) > { > return (void *)((unsigned long)addr >> KASAN_SHADOW_SCALE_SHIFT) > + KASAN_SHADOW_OFFSET; > } > +#endif > > int kasan_add_zero_shadow(void *start, unsigned long size); > void kasan_remove_zero_shadow(void *start, unsigned long size); > diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h > index a61eeee3095a..033335c13b25 100644 > --- a/mm/kasan/kasan.h > +++ b/mm/kasan/kasan.h > @@ -291,16 +291,22 @@ struct kasan_stack_ring { > > #if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) > > +#ifndef __HAVE_ARCH_SHADOW_MAP > static inline const void *kasan_shadow_to_mem(const void *shadow_addr) > { > return (void *)(((unsigned long)shadow_addr - KASAN_SHADOW_OFFSET) > << KASAN_SHADOW_SCALE_SHIFT); > } > +#endif > > static __always_inline bool addr_has_metadata(const void *addr) > { > +#ifdef __HAVE_ARCH_SHADOW_MAP > + return (kasan_mem_to_shadow((void *)addr) != NULL); > +#else > return (kasan_reset_tag(addr) >= > kasan_shadow_to_mem((void *)KASAN_SHADOW_START)); > +#endif > } > > /** > -- > 2.20.1 > Reviewed-by: Andrey Konovalov <andreyknvl@xxxxxxxxx> Thanks!