[PATCH v3 01/13] riscv: Move KASAN mapping next to the kernel mapping
Jisheng Zhang
jszhang at kernel.org
Mon Dec 6 08:18:54 PST 2021
On Mon, 6 Dec 2021 11:46:45 +0100
Alexandre Ghiti <alexandre.ghiti at canonical.com> wrote:
> Now that KASAN_SHADOW_OFFSET is defined at compile time as a config,
> this value must remain constant whatever the size of the virtual address
> space, which is only possible by pushing this region at the end of the
> address space next to the kernel mapping.
>
> Signed-off-by: Alexandre Ghiti <alexandre.ghiti at canonical.com>
> ---
> Documentation/riscv/vm-layout.rst | 12 ++++++------
> arch/riscv/Kconfig | 4 ++--
> arch/riscv/include/asm/kasan.h | 4 ++--
> arch/riscv/include/asm/page.h | 6 +++++-
> arch/riscv/include/asm/pgtable.h | 6 ++++--
> arch/riscv/mm/init.c | 25 +++++++++++++------------
> 6 files changed, 32 insertions(+), 25 deletions(-)
>
> diff --git a/Documentation/riscv/vm-layout.rst b/Documentation/riscv/vm-layout.rst
> index b7f98930d38d..1bd687b97104 100644
> --- a/Documentation/riscv/vm-layout.rst
> +++ b/Documentation/riscv/vm-layout.rst
> @@ -47,12 +47,12 @@ RISC-V Linux Kernel SV39
> | Kernel-space virtual memory, shared between all processes:
> ____________________________________________________________|___________________________________________________________
> | | | |
> - ffffffc000000000 | -256 GB | ffffffc7ffffffff | 32 GB | kasan
> - ffffffcefee00000 | -196 GB | ffffffcefeffffff | 2 MB | fixmap
> - ffffffceff000000 | -196 GB | ffffffceffffffff | 16 MB | PCI io
> - ffffffcf00000000 | -196 GB | ffffffcfffffffff | 4 GB | vmemmap
> - ffffffd000000000 | -192 GB | ffffffdfffffffff | 64 GB | vmalloc/ioremap space
> - ffffffe000000000 | -128 GB | ffffffff7fffffff | 124 GB | direct mapping of all physical memory
> + ffffffc6fee00000 | -228 GB | ffffffc6feffffff | 2 MB | fixmap
> + ffffffc6ff000000 | -228 GB | ffffffc6ffffffff | 16 MB | PCI io
> + ffffffc700000000 | -228 GB | ffffffc7ffffffff | 4 GB | vmemmap
> + ffffffc800000000 | -224 GB | ffffffd7ffffffff | 64 GB | vmalloc/ioremap space
> + ffffffd800000000 | -160 GB | fffffff6ffffffff | 124 GB | direct mapping of all physical memory
> + fffffff700000000 | -36 GB | fffffffeffffffff | 32 GB | kasan
> __________________|____________|__________________|_________|____________________________________________________________
> |
> |
> diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
> index 6d5b63bd4bd9..6cd98ade5ebc 100644
> --- a/arch/riscv/Kconfig
> +++ b/arch/riscv/Kconfig
> @@ -161,12 +161,12 @@ config PAGE_OFFSET
> default 0xC0000000 if 32BIT && MAXPHYSMEM_1GB
> default 0x80000000 if 64BIT && !MMU
> default 0xffffffff80000000 if 64BIT && MAXPHYSMEM_2GB
> - default 0xffffffe000000000 if 64BIT && MAXPHYSMEM_128GB
> + default 0xffffffd800000000 if 64BIT && MAXPHYSMEM_128GB
>
> config KASAN_SHADOW_OFFSET
> hex
> depends on KASAN_GENERIC
> - default 0xdfffffc800000000 if 64BIT
> + default 0xdfffffff00000000 if 64BIT
> default 0xffffffff if 32BIT
>
> config ARCH_FLATMEM_ENABLE
> diff --git a/arch/riscv/include/asm/kasan.h b/arch/riscv/include/asm/kasan.h
> index b00f503ec124..257a2495145a 100644
> --- a/arch/riscv/include/asm/kasan.h
> +++ b/arch/riscv/include/asm/kasan.h
> @@ -28,8 +28,8 @@
> #define KASAN_SHADOW_SCALE_SHIFT 3
>
> #define KASAN_SHADOW_SIZE (UL(1) << ((CONFIG_VA_BITS - 1) - KASAN_SHADOW_SCALE_SHIFT))
> -#define KASAN_SHADOW_START KERN_VIRT_START
> -#define KASAN_SHADOW_END (KASAN_SHADOW_START + KASAN_SHADOW_SIZE)
> +#define KASAN_SHADOW_START (KASAN_SHADOW_END - KASAN_SHADOW_SIZE)
> +#define KASAN_SHADOW_END MODULES_LOWEST_VADDR
> #define KASAN_SHADOW_OFFSET _AC(CONFIG_KASAN_SHADOW_OFFSET, UL)
>
> void kasan_init(void);
> diff --git a/arch/riscv/include/asm/page.h b/arch/riscv/include/asm/page.h
> index 109c97e991a6..e03559f9b35e 100644
> --- a/arch/riscv/include/asm/page.h
> +++ b/arch/riscv/include/asm/page.h
> @@ -33,7 +33,11 @@
> */
> #define PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL)
>
> -#define KERN_VIRT_SIZE (-PAGE_OFFSET)
> +/*
> + * Half of the kernel address space (half of the entries of the page global
> + * directory) is for the direct mapping.
> + */
> +#define KERN_VIRT_SIZE ((PTRS_PER_PGD / 2 * PGDIR_SIZE) / 2)
>
> #ifndef __ASSEMBLY__
>
> diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h
> index 39b550310ec6..d34f3a7a9701 100644
> --- a/arch/riscv/include/asm/pgtable.h
> +++ b/arch/riscv/include/asm/pgtable.h
> @@ -39,8 +39,10 @@
>
> /* Modules always live before the kernel */
> #ifdef CONFIG_64BIT
> -#define MODULES_VADDR (PFN_ALIGN((unsigned long)&_end) - SZ_2G)
> -#define MODULES_END (PFN_ALIGN((unsigned long)&_start))
> +/* This is used to define the end of the KASAN shadow region */
> +#define MODULES_LOWEST_VADDR (KERNEL_LINK_ADDR - SZ_2G)
> +#define MODULES_VADDR (PFN_ALIGN((unsigned long)&_end) - SZ_2G)
> +#define MODULES_END (PFN_ALIGN((unsigned long)&_start))
> #endif
>
> /*
> diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
> index c0cddf0fc22d..4224e9d0ecf5 100644
> --- a/arch/riscv/mm/init.c
> +++ b/arch/riscv/mm/init.c
> @@ -103,6 +103,9 @@ static void __init print_vm_layout(void)
> print_mlm("lowmem", (unsigned long)PAGE_OFFSET,
> (unsigned long)high_memory);
> #ifdef CONFIG_64BIT
> +#ifdef CONFIG_KASAN
> + print_mlm("kasan", KASAN_SHADOW_START, KASAN_SHADOW_END);
> +#endif
I think we'd better avoid #ifdef usage as much as possible.
For this KASAN case, we can make both KASAN_SHADOW_START and KASAN_SHADOW_END
always visible as x86 does, then above code can be
if (IS_ENABLED(CONFIG_KASAN))
print_mlm("kasan", KASAN_SHADOW_START, KASAN_SHADOW_END);
Thanks
More information about the linux-riscv
mailing list