On Mon, 6 Dec 2021 11:46:45 +0100 Alexandre Ghiti <alexandre.ghiti@xxxxxxxxxxxxx> 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@xxxxxxxxxxxxx> > --- > 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