Christophe Leroy <christophe.leroy@xxxxxx> writes: > This patch prepares a shadow area for KASAN. > > The shadow area will be at the top of the kernel virtual > memory space above the fixmap area and will occupy one > eighth of the total kernel virtual memory space. > > Signed-off-by: Christophe Leroy <christophe.leroy@xxxxxx> > --- > arch/powerpc/Kconfig | 5 +++++ > arch/powerpc/include/asm/fixmap.h | 5 +++++ > arch/powerpc/include/asm/kasan.h | 17 +++++++++++++++++ > arch/powerpc/mm/mem.c | 4 ++++ > arch/powerpc/mm/ptdump/ptdump.c | 8 ++++++++ > 5 files changed, 39 insertions(+) > > diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig > index 652c25260838..f446e016f4a1 100644 > --- a/arch/powerpc/Kconfig > +++ b/arch/powerpc/Kconfig > @@ -382,6 +382,11 @@ config PGTABLE_LEVELS > default 3 if PPC_64K_PAGES && !PPC_BOOK3S_64 > default 4 > > +config KASAN_SHADOW_OFFSET > + hex > + depends on KASAN > + default 0xe0000000 > + Should this live in Kconfig.debug? Regards, Daniel > source "arch/powerpc/sysdev/Kconfig" > source "arch/powerpc/platforms/Kconfig" > > diff --git a/arch/powerpc/include/asm/fixmap.h b/arch/powerpc/include/asm/fixmap.h > index b9fbed84ddca..51a1a309c919 100644 > --- a/arch/powerpc/include/asm/fixmap.h > +++ b/arch/powerpc/include/asm/fixmap.h > @@ -22,7 +22,12 @@ > #include <asm/kmap_types.h> > #endif > > +#ifdef CONFIG_KASAN > +#include <asm/kasan.h> > +#define FIXADDR_TOP KASAN_SHADOW_START > +#else > #define FIXADDR_TOP ((unsigned long)(-PAGE_SIZE)) > +#endif > > /* > * Here we define all the compile-time 'special' virtual > diff --git a/arch/powerpc/include/asm/kasan.h b/arch/powerpc/include/asm/kasan.h > index 2efd0e42cfc9..b554d3bd3e2c 100644 > --- a/arch/powerpc/include/asm/kasan.h > +++ b/arch/powerpc/include/asm/kasan.h > @@ -12,4 +12,21 @@ > #define EXPORT_SYMBOL_KASAN(fn) EXPORT_SYMBOL(fn) > #endif > > +#ifndef __ASSEMBLY__ > + > +#include <asm/page.h> > +#include <asm/pgtable-types.h> > + > +#define KASAN_SHADOW_SCALE_SHIFT 3 > + > +#define KASAN_SHADOW_OFFSET ASM_CONST(CONFIG_KASAN_SHADOW_OFFSET) > + > +#define KASAN_SHADOW_START (KASAN_SHADOW_OFFSET + \ > + (PAGE_OFFSET >> KASAN_SHADOW_SCALE_SHIFT)) > + > +#define KASAN_SHADOW_END 0UL > + > +#define KASAN_SHADOW_SIZE (KASAN_SHADOW_END - KASAN_SHADOW_START) > + > +#endif /* __ASSEMBLY */ > #endif > diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c > index f6787f90e158..4e7fa4eb2dd3 100644 > --- a/arch/powerpc/mm/mem.c > +++ b/arch/powerpc/mm/mem.c > @@ -309,6 +309,10 @@ void __init mem_init(void) > mem_init_print_info(NULL); > #ifdef CONFIG_PPC32 > pr_info("Kernel virtual memory layout:\n"); > +#ifdef CONFIG_KASAN > + pr_info(" * 0x%08lx..0x%08lx : kasan shadow mem\n", > + KASAN_SHADOW_START, KASAN_SHADOW_END); > +#endif > pr_info(" * 0x%08lx..0x%08lx : fixmap\n", FIXADDR_START, FIXADDR_TOP); > #ifdef CONFIG_HIGHMEM > pr_info(" * 0x%08lx..0x%08lx : highmem PTEs\n", > diff --git a/arch/powerpc/mm/ptdump/ptdump.c b/arch/powerpc/mm/ptdump/ptdump.c > index 37138428ab55..812ed680024f 100644 > --- a/arch/powerpc/mm/ptdump/ptdump.c > +++ b/arch/powerpc/mm/ptdump/ptdump.c > @@ -101,6 +101,10 @@ static struct addr_marker address_markers[] = { > { 0, "Fixmap start" }, > { 0, "Fixmap end" }, > #endif > +#ifdef CONFIG_KASAN > + { 0, "kasan shadow mem start" }, > + { 0, "kasan shadow mem end" }, > +#endif > { -1, NULL }, > }; > > @@ -322,6 +326,10 @@ static void populate_markers(void) > #endif > address_markers[i++].start_address = FIXADDR_START; > address_markers[i++].start_address = FIXADDR_TOP; > +#ifdef CONFIG_KASAN > + address_markers[i++].start_address = KASAN_SHADOW_START; > + address_markers[i++].start_address = KASAN_SHADOW_END; > +#endif > #endif /* CONFIG_PPC64 */ > } > > -- > 2.13.3