Message ID | 20220212074747.10849-2-lecopzer.chen@mediatek.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | arm: kasan: support CONFIG_KASAN_VMALLOC | expand |
Hi Lecopzer, thanks for working on this! I need this support too. On Sat, Feb 12, 2022 at 8:47 AM Lecopzer Chen <lecopzer.chen@mediatek.com> wrote: > Simply make shadow of vmalloc area mapped on demand. > > This can fix ARM_MODULE_PLTS with KASAN and provide first step > to support CONFIG_VMAP_STACK in ARM. > > Signed-off-by: Lecopzer Chen <lecopzer.chen@mediatek.com> (...) > - kasan_populate_early_shadow(kasan_mem_to_shadow((void *)VMALLOC_START), > + if (!IS_ENABLED(CONFIG_KASAN_VMALLOC)) > + kasan_populate_early_shadow(kasan_mem_to_shadow((void *)VMALLOC_START), > + kasan_mem_to_shadow((void *)VMALLOC_END)); > + > + kasan_populate_early_shadow(kasan_mem_to_shadow((void *)VMALLOC_END), > kasan_mem_to_shadow((void *)-1UL) + 1); Where is this actually mapped? Can you print out where kasan_mem_to_shadow((void *)VMALLOC_START) kasan_mem_to_shadow((void *)VMALLOC_END) as well as KASAN_SHADOW_START and KASAN_SHADOW_END points? When I looked into this getting the shadow memory between KASAN_SHADOW_START and KASAN_SHADOW_END seemed like the big problem since this is static, so how is Kasan solving this now? Please patch the picture in include/asm/kasan_def.h and the info in Documentation/arm/memory.rst so it clearly reflects where VMALLOC is shadowed. Yours, Linus Walleij
Hi Linus Thanks for your review. > > - kasan_populate_early_shadow(kasan_mem_to_shadow((void *)VMALLOC_START), > > + if (!IS_ENABLED(CONFIG_KASAN_VMALLOC)) > > + kasan_populate_early_shadow(kasan_mem_to_shadow((void *)VMALLOC_START), > > + kasan_mem_to_shadow((void *)VMALLOC_END)); > > + > > + kasan_populate_early_shadow(kasan_mem_to_shadow((void *)VMALLOC_END), > > kasan_mem_to_shadow((void *)-1UL) + 1); > > Where is this actually mapped? > > Can you print out where > kasan_mem_to_shadow((void *)VMALLOC_START) > kasan_mem_to_shadow((void *)VMALLOC_END) > as well as KASAN_SHADOW_START and KASAN_SHADOW_END > points? > > When I looked into this getting the shadow memory between > KASAN_SHADOW_START and KASAN_SHADOW_END > seemed like the big problem since this is static, so how is Kasan > solving this now? For quick answer: As I knwon, the definition of KASAN_SHADOW_START and END (@arch/arm/include/asm/kasan_def.h) * 1) KASAN_SHADOW_START * This value begins with the MODULE_VADDR's shadow address. It is the * start of kernel virtual space.... * * 2) KASAN_SHADOW_END * This value is the 0x100000000's shadow address: the mapping that would * be after the end of the kernel memory at 0xffffffff.... and the virt address of vmalloc for ARM32 is also between MODULE_VADDR and 0x100000000 (ZONE_HIGHMEM), so nothing needs to do. If there is any cases may break this assumption, please correct me, thanks. > > Please patch the picture in > include/asm/kasan_def.h > and the info in > Documentation/arm/memory.rst > so it clearly reflects where VMALLOC is shadowed. Thanks for suggestion, Yes, we really do need to update doc for memory layout. I'll study how to add it and provide in v3.
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 4c97cb40eebb..78250e246cc6 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -72,6 +72,7 @@ config ARM select HAVE_ARCH_KFENCE if MMU && !XIP_KERNEL select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU select HAVE_ARCH_KASAN if MMU && !XIP_KERNEL + select HAVE_ARCH_KASAN_VMALLOC if HAVE_ARCH_KASAN select HAVE_ARCH_MMAP_RND_BITS if MMU select HAVE_ARCH_PFN_VALID select HAVE_ARCH_SECCOMP diff --git a/arch/arm/mm/kasan_init.c b/arch/arm/mm/kasan_init.c index 5ad0d6c56d56..29caee9c79ce 100644 --- a/arch/arm/mm/kasan_init.c +++ b/arch/arm/mm/kasan_init.c @@ -236,7 +236,11 @@ void __init kasan_init(void) clear_pgds(KASAN_SHADOW_START, KASAN_SHADOW_END); - kasan_populate_early_shadow(kasan_mem_to_shadow((void *)VMALLOC_START), + if (!IS_ENABLED(CONFIG_KASAN_VMALLOC)) + kasan_populate_early_shadow(kasan_mem_to_shadow((void *)VMALLOC_START), + kasan_mem_to_shadow((void *)VMALLOC_END)); + + kasan_populate_early_shadow(kasan_mem_to_shadow((void *)VMALLOC_END), kasan_mem_to_shadow((void *)-1UL) + 1); for_each_mem_range(i, &pa_start, &pa_end) {
Simply make shadow of vmalloc area mapped on demand. This can fix ARM_MODULE_PLTS with KASAN and provide first step to support CONFIG_VMAP_STACK in ARM. Signed-off-by: Lecopzer Chen <lecopzer.chen@mediatek.com> --- arch/arm/Kconfig | 1 + arch/arm/mm/kasan_init.c | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-)