Skip to content

Commit 9b04c76

Browse files
zhangqingmychenhuacai
authored andcommitted
kasan: Add __HAVE_ARCH_SHADOW_MAP to support arch specific mapping
MIPS, LoongArch and some other architectures have many holes between different segments and the valid address space (256T available) is insufficient to map all these segments to kasan shadow memory with the common formula provided by kasan core. So we need architecture specific mapping formulas to ensure different segments are mapped individually, and only limited space lengths of those specific segments are 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. Reviewed-by: Andrey Konovalov <andreyknvl@gmail.com> Signed-off-by: Qing Zhang <zhangqing@loongson.cn> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
1 parent 6ad3df5 commit 9b04c76

File tree

2 files changed

+8
-0
lines changed

2 files changed

+8
-0
lines changed

include/linux/kasan.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,13 @@ extern p4d_t kasan_early_shadow_p4d[MAX_PTRS_PER_P4D];
5454
int kasan_populate_early_shadow(const void *shadow_start,
5555
const void *shadow_end);
5656

57+
#ifndef __HAVE_ARCH_SHADOW_MAP
5758
static inline void *kasan_mem_to_shadow(const void *addr)
5859
{
5960
return (void *)((unsigned long)addr >> KASAN_SHADOW_SCALE_SHIFT)
6061
+ KASAN_SHADOW_OFFSET;
6162
}
63+
#endif
6264

6365
int kasan_add_zero_shadow(void *start, unsigned long size);
6466
void kasan_remove_zero_shadow(void *start, unsigned long size);

mm/kasan/kasan.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,16 +291,22 @@ struct kasan_stack_ring {
291291

292292
#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)
293293

294+
#ifndef __HAVE_ARCH_SHADOW_MAP
294295
static inline const void *kasan_shadow_to_mem(const void *shadow_addr)
295296
{
296297
return (void *)(((unsigned long)shadow_addr - KASAN_SHADOW_OFFSET)
297298
<< KASAN_SHADOW_SCALE_SHIFT);
298299
}
300+
#endif
299301

300302
static __always_inline bool addr_has_metadata(const void *addr)
301303
{
304+
#ifdef __HAVE_ARCH_SHADOW_MAP
305+
return (kasan_mem_to_shadow((void *)addr) != NULL);
306+
#else
302307
return (kasan_reset_tag(addr) >=
303308
kasan_shadow_to_mem((void *)KASAN_SHADOW_START));
309+
#endif
304310
}
305311

306312
/**

0 commit comments

Comments
 (0)