Message ID | e51647fdac60d523892cd3eab3217c3a4d8d356b.1550596242.git.christophe.leroy@c-s.fr (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KASAN for powerpc/32 | expand |
Le 19/02/2019 à 18:23, Christophe Leroy a écrit : > This patch adds KASAN support for PPC32. > > The KASAN shadow area is located between the vmalloc area and the > fixmap area. > > KASAN_SHADOW_OFFSET is calculated in asm/kasan.h and extracted > by Makefile prepare rule via asm-offsets.h > > For modules, the shadow area is allocated at module_alloc(). > > Note that on book3s it will only work on the 603 because the other > ones use hash table and can therefore not share a single PTE table > covering the entire early KASAN shadow area. > > Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> > --- > arch/powerpc/Kconfig | 1 + > arch/powerpc/Makefile | 7 ++ > arch/powerpc/include/asm/book3s/32/pgtable.h | 2 + > arch/powerpc/include/asm/highmem.h | 10 +- > arch/powerpc/include/asm/kasan.h | 23 ++++ > arch/powerpc/include/asm/nohash/32/pgtable.h | 2 + > arch/powerpc/include/asm/setup.h | 5 + > arch/powerpc/kernel/Makefile | 9 +- > arch/powerpc/kernel/asm-offsets.c | 4 + > arch/powerpc/kernel/head_32.S | 3 + > arch/powerpc/kernel/head_40x.S | 3 + > arch/powerpc/kernel/head_44x.S | 3 + > arch/powerpc/kernel/head_8xx.S | 3 + > arch/powerpc/kernel/head_fsl_booke.S | 3 + > arch/powerpc/kernel/setup-common.c | 2 + > arch/powerpc/lib/Makefile | 8 ++ > arch/powerpc/mm/Makefile | 1 + > arch/powerpc/mm/kasan/Makefile | 5 + > arch/powerpc/mm/kasan/kasan_init_32.c | 147 ++++++++++++++++++++++++++ > arch/powerpc/mm/mem.c | 4 + > arch/powerpc/mm/ptdump/dump_linuxpagetables.c | 8 ++ @Daniel (and others), note that to apply properly, this requires my other patch which moves the dumping files in a arch/powerpc/mm/ptdump/ subdir. Christophe > arch/powerpc/purgatory/Makefile | 3 + > arch/powerpc/xmon/Makefile | 1 + > 23 files changed, 253 insertions(+), 4 deletions(-) > create mode 100644 arch/powerpc/mm/kasan/Makefile > create mode 100644 arch/powerpc/mm/kasan/kasan_init_32.c > > diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig > index 08908219fba9..850b06def84f 100644 > --- a/arch/powerpc/Kconfig > +++ b/arch/powerpc/Kconfig > @@ -175,6 +175,7 @@ config PPC > select GENERIC_TIME_VSYSCALL > select HAVE_ARCH_AUDITSYSCALL > select HAVE_ARCH_JUMP_LABEL > + select HAVE_ARCH_KASAN if PPC32 > select HAVE_ARCH_KGDB > select HAVE_ARCH_MMAP_RND_BITS > select HAVE_ARCH_MMAP_RND_COMPAT_BITS if COMPAT > diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile > index ac033341ed55..f0738099e31e 100644 > --- a/arch/powerpc/Makefile > +++ b/arch/powerpc/Makefile > @@ -427,6 +427,13 @@ else > endif > endif > > +ifdef CONFIG_KASAN > +prepare: kasan_prepare > + > +kasan_prepare: prepare0 > + $(eval KASAN_SHADOW_OFFSET = $(shell awk '{if ($$2 == "KASAN_SHADOW_OFFSET") print $$3;}' include/generated/asm-offsets.h)) > +endif > + > # Check toolchain versions: > # - gcc-4.6 is the minimum kernel-wide version so nothing required. > checkbin: > diff --git a/arch/powerpc/include/asm/book3s/32/pgtable.h b/arch/powerpc/include/asm/book3s/32/pgtable.h > index 49d76adb9bc5..4543016f80ca 100644 > --- a/arch/powerpc/include/asm/book3s/32/pgtable.h > +++ b/arch/powerpc/include/asm/book3s/32/pgtable.h > @@ -141,6 +141,8 @@ static inline bool pte_user(pte_t pte) > */ > #ifdef CONFIG_HIGHMEM > #define KVIRT_TOP PKMAP_BASE > +#elif defined(CONFIG_KASAN) > +#define KVIRT_TOP KASAN_SHADOW_START > #else > #define KVIRT_TOP (0xfe000000UL) /* for now, could be FIXMAP_BASE ? */ > #endif > diff --git a/arch/powerpc/include/asm/highmem.h b/arch/powerpc/include/asm/highmem.h > index a4b65b186ec6..483b90025bef 100644 > --- a/arch/powerpc/include/asm/highmem.h > +++ b/arch/powerpc/include/asm/highmem.h > @@ -28,6 +28,7 @@ > #include <asm/cacheflush.h> > #include <asm/page.h> > #include <asm/fixmap.h> > +#include <asm/kasan.h> > > extern pte_t *kmap_pte; > extern pgprot_t kmap_prot; > @@ -50,10 +51,15 @@ extern pte_t *pkmap_page_table; > #define PKMAP_ORDER 9 > #endif > #define LAST_PKMAP (1 << PKMAP_ORDER) > +#ifdef CONFIG_KASAN > +#define PKMAP_TOP KASAN_SHADOW_START > +#else > +#define PKMAP_TOP FIXADDR_START > +#endif > #ifndef CONFIG_PPC_4K_PAGES > -#define PKMAP_BASE (FIXADDR_START - PAGE_SIZE*(LAST_PKMAP + 1)) > +#define PKMAP_BASE (PKMAP_TOP - PAGE_SIZE*(LAST_PKMAP + 1)) > #else > -#define PKMAP_BASE ((FIXADDR_START - PAGE_SIZE*(LAST_PKMAP + 1)) & PMD_MASK) > +#define PKMAP_BASE ((PKMAP_TOP - PAGE_SIZE*(LAST_PKMAP + 1)) & PMD_MASK) > #endif > #define LAST_PKMAP_MASK (LAST_PKMAP-1) > #define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT) > diff --git a/arch/powerpc/include/asm/kasan.h b/arch/powerpc/include/asm/kasan.h > index 2efd0e42cfc9..0bc9148f5d87 100644 > --- a/arch/powerpc/include/asm/kasan.h > +++ b/arch/powerpc/include/asm/kasan.h > @@ -12,4 +12,27 @@ > #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 (KASAN_SHADOW_START - \ > + (PAGE_OFFSET >> KASAN_SHADOW_SCALE_SHIFT)) > + > +#define KASAN_SHADOW_END (KASAN_SHADOW_START + KASAN_SHADOW_SIZE) > + > +#include <asm/fixmap.h> > + > +#define KASAN_SHADOW_START (ALIGN_DOWN(FIXADDR_START - KASAN_SHADOW_SIZE, \ > + PGDIR_SIZE)) > + > +#define KASAN_SHADOW_SIZE ((~0UL - PAGE_OFFSET + 1) >> KASAN_SHADOW_SCALE_SHIFT) > + > +void kasan_early_init(void); > +void kasan_init(void); > + > +#endif /* __ASSEMBLY */ > #endif > diff --git a/arch/powerpc/include/asm/nohash/32/pgtable.h b/arch/powerpc/include/asm/nohash/32/pgtable.h > index bed433358260..b3b52f02be1a 100644 > --- a/arch/powerpc/include/asm/nohash/32/pgtable.h > +++ b/arch/powerpc/include/asm/nohash/32/pgtable.h > @@ -71,6 +71,8 @@ extern int icache_44x_need_flush; > */ > #ifdef CONFIG_HIGHMEM > #define KVIRT_TOP PKMAP_BASE > +#elif defined(CONFIG_KASAN) > +#define KVIRT_TOP KASAN_SHADOW_START > #else > #define KVIRT_TOP (0xfe000000UL) /* for now, could be FIXMAP_BASE ? */ > #endif > diff --git a/arch/powerpc/include/asm/setup.h b/arch/powerpc/include/asm/setup.h > index 65676e2325b8..da7768aa996a 100644 > --- a/arch/powerpc/include/asm/setup.h > +++ b/arch/powerpc/include/asm/setup.h > @@ -74,6 +74,11 @@ static inline void setup_spectre_v2(void) {}; > #endif > void do_btb_flush_fixups(void); > > +#ifndef CONFIG_KASAN > +static inline void kasan_early_init(void) { } > +static inline void kasan_init(void) { } > +#endif > + > #endif /* !__ASSEMBLY__ */ > > #endif /* _ASM_POWERPC_SETUP_H */ > diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile > index 879b36602748..fc4c42262694 100644 > --- a/arch/powerpc/kernel/Makefile > +++ b/arch/powerpc/kernel/Makefile > @@ -16,8 +16,9 @@ CFLAGS_prom_init.o += -fPIC > CFLAGS_btext.o += -fPIC > endif > > -CFLAGS_cputable.o += $(DISABLE_LATENT_ENTROPY_PLUGIN) > -CFLAGS_prom_init.o += $(DISABLE_LATENT_ENTROPY_PLUGIN) > +CFLAGS_early_32.o += -DDISABLE_BRANCH_PROFILING > +CFLAGS_cputable.o += $(DISABLE_LATENT_ENTROPY_PLUGIN) -DDISABLE_BRANCH_PROFILING > +CFLAGS_prom_init.o += $(DISABLE_LATENT_ENTROPY_PLUGIN) -DDISABLE_BRANCH_PROFILING > CFLAGS_btext.o += $(DISABLE_LATENT_ENTROPY_PLUGIN) > CFLAGS_prom.o += $(DISABLE_LATENT_ENTROPY_PLUGIN) > > @@ -31,6 +32,10 @@ CFLAGS_REMOVE_btext.o = $(CC_FLAGS_FTRACE) > CFLAGS_REMOVE_prom.o = $(CC_FLAGS_FTRACE) > endif > > +KASAN_SANITIZE_early_32.o := n > +KASAN_SANITIZE_cputable.o := n > +KASAN_SANITIZE_prom_init.o := n > + > obj-y := cputable.o ptrace.o syscalls.o \ > irq.o align.o signal_32.o pmc.o vdso.o \ > process.o systbl.o idle.o \ > diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c > index 9ffc72ded73a..846fb30b1190 100644 > --- a/arch/powerpc/kernel/asm-offsets.c > +++ b/arch/powerpc/kernel/asm-offsets.c > @@ -783,5 +783,9 @@ int main(void) > DEFINE(VIRT_IMMR_BASE, (u64)__fix_to_virt(FIX_IMMR_BASE)); > #endif > > +#ifdef CONFIG_KASAN > + DEFINE(KASAN_SHADOW_OFFSET, KASAN_SHADOW_OFFSET); > +#endif > + > return 0; > } > diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S > index 05b08db3901d..0ec9dec06bc2 100644 > --- a/arch/powerpc/kernel/head_32.S > +++ b/arch/powerpc/kernel/head_32.S > @@ -962,6 +962,9 @@ start_here: > * Do early platform-specific initialization, > * and set up the MMU. > */ > +#ifdef CONFIG_KASAN > + bl kasan_early_init > +#endif > li r3,0 > mr r4,r31 > bl machine_init > diff --git a/arch/powerpc/kernel/head_40x.S b/arch/powerpc/kernel/head_40x.S > index b19d78410511..5d6ff8fa7e2b 100644 > --- a/arch/powerpc/kernel/head_40x.S > +++ b/arch/powerpc/kernel/head_40x.S > @@ -848,6 +848,9 @@ start_here: > /* > * Decide what sort of machine this is and initialize the MMU. > */ > +#ifdef CONFIG_KASAN > + bl kasan_early_init > +#endif > li r3,0 > mr r4,r31 > bl machine_init > diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S > index bf23c19c92d6..7ca14dff6192 100644 > --- a/arch/powerpc/kernel/head_44x.S > +++ b/arch/powerpc/kernel/head_44x.S > @@ -203,6 +203,9 @@ _ENTRY(_start); > /* > * Decide what sort of machine this is and initialize the MMU. > */ > +#ifdef CONFIG_KASAN > + bl kasan_early_init > +#endif > li r3,0 > mr r4,r31 > bl machine_init > diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S > index fe2857ef0309..88f0cb34cef4 100644 > --- a/arch/powerpc/kernel/head_8xx.S > +++ b/arch/powerpc/kernel/head_8xx.S > @@ -823,6 +823,9 @@ start_here: > /* > * Decide what sort of machine this is and initialize the MMU. > */ > +#ifdef CONFIG_KASAN > + bl kasan_early_init > +#endif > li r3,0 > mr r4,r31 > bl machine_init > diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S > index 2386ce2a9c6e..4f4585a68850 100644 > --- a/arch/powerpc/kernel/head_fsl_booke.S > +++ b/arch/powerpc/kernel/head_fsl_booke.S > @@ -274,6 +274,9 @@ set_ivor: > /* > * Decide what sort of machine this is and initialize the MMU. > */ > +#ifdef CONFIG_KASAN > + bl kasan_early_init > +#endif > mr r3,r30 > mr r4,r31 > bl machine_init > diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c > index ca00fbb97cf8..16ff1ea66805 100644 > --- a/arch/powerpc/kernel/setup-common.c > +++ b/arch/powerpc/kernel/setup-common.c > @@ -978,6 +978,8 @@ void __init setup_arch(char **cmdline_p) > > paging_init(); > > + kasan_init(); > + > /* Initialize the MMU context management stuff. */ > mmu_context_init(); > > diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile > index ee08a7e1bcdf..7efbd5122c74 100644 > --- a/arch/powerpc/lib/Makefile > +++ b/arch/powerpc/lib/Makefile > @@ -8,6 +8,14 @@ ccflags-$(CONFIG_PPC64) := $(NO_MINIMAL_TOC) > CFLAGS_REMOVE_code-patching.o = $(CC_FLAGS_FTRACE) > CFLAGS_REMOVE_feature-fixups.o = $(CC_FLAGS_FTRACE) > > +KASAN_SANITIZE_code-patching.o := n > +KASAN_SANITIZE_feature-fixups.o := n > + > +ifdef CONFIG_KASAN > +CFLAGS_code-patching.o += -DDISABLE_BRANCH_PROFILING > +CFLAGS_feature-fixups.o += -DDISABLE_BRANCH_PROFILING > +endif > + > obj-y += alloc.o code-patching.o feature-fixups.o > > ifndef CONFIG_KASAN > diff --git a/arch/powerpc/mm/Makefile b/arch/powerpc/mm/Makefile > index ee1efa3b3382..292b96ce1efc 100644 > --- a/arch/powerpc/mm/Makefile > +++ b/arch/powerpc/mm/Makefile > @@ -47,3 +47,4 @@ obj-$(CONFIG_PPC_COPRO_BASE) += copro_fault.o > obj-$(CONFIG_SPAPR_TCE_IOMMU) += mmu_context_iommu.o > obj-$(CONFIG_PPC_PTDUMP) += ptdump/ > obj-$(CONFIG_PPC_MEM_KEYS) += pkeys.o > +obj-$(CONFIG_KASAN) += kasan/ > diff --git a/arch/powerpc/mm/kasan/Makefile b/arch/powerpc/mm/kasan/Makefile > new file mode 100644 > index 000000000000..6577897673dd > --- /dev/null > +++ b/arch/powerpc/mm/kasan/Makefile > @@ -0,0 +1,5 @@ > +# SPDX-License-Identifier: GPL-2.0 > + > +KASAN_SANITIZE := n > + > +obj-$(CONFIG_PPC32) += kasan_init_32.o > diff --git a/arch/powerpc/mm/kasan/kasan_init_32.c b/arch/powerpc/mm/kasan/kasan_init_32.c > new file mode 100644 > index 000000000000..495c908d6ee6 > --- /dev/null > +++ b/arch/powerpc/mm/kasan/kasan_init_32.c > @@ -0,0 +1,147 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +#define DISABLE_BRANCH_PROFILING > + > +#include <linux/kasan.h> > +#include <linux/printk.h> > +#include <linux/memblock.h> > +#include <linux/sched/task.h> > +#include <linux/vmalloc.h> > +#include <asm/pgalloc.h> > + > +void __init kasan_early_init(void) > +{ > + unsigned long addr = KASAN_SHADOW_START; > + unsigned long end = KASAN_SHADOW_END; > + unsigned long next; > + pmd_t *pmd = pmd_offset(pud_offset(pgd_offset_k(addr), addr), addr); > + int i; > + phys_addr_t pa = __pa(kasan_early_shadow_page); > + > + BUILD_BUG_ON(KASAN_SHADOW_START & ~PGDIR_MASK); > + > + if (early_mmu_has_feature(MMU_FTR_HPTE_TABLE)) > + panic("KASAN not supported with Hash MMU\n"); > + > + for (i = 0; i < PTRS_PER_PTE; i++) > + __set_pte_at(&init_mm, (unsigned long)kasan_early_shadow_page, > + kasan_early_shadow_pte + i, > + pfn_pte(PHYS_PFN(pa), PAGE_KERNEL), 0); > + > + do { > + next = pgd_addr_end(addr, end); > + pmd_populate_kernel(&init_mm, pmd, kasan_early_shadow_pte); > + } while (pmd++, addr = next, addr != end); > +} > + > +static void __ref *kasan_get_one_page(void) > +{ > + if (slab_is_available()) > + return (void *)__get_free_page(GFP_KERNEL|__GFP_ZERO); > + > + return memblock_alloc(PAGE_SIZE, PAGE_SIZE); > +} > + > +static int __ref kasan_init_region(void *start, size_t size) > +{ > + void *end = start + size; > + unsigned long k_start, k_end, k_cur, k_next; > + pmd_t *pmd; > + void *block = NULL; > + > + if (start >= end) > + return 0; > + > + k_start = (unsigned long)kasan_mem_to_shadow(start); > + k_end = (unsigned long)kasan_mem_to_shadow(end); > + pmd = pmd_offset(pud_offset(pgd_offset_k(k_start), k_start), k_start); > + > + for (k_cur = k_start; k_cur != k_end; k_cur = k_next, pmd++) { > + k_next = pgd_addr_end(k_cur, k_end); > + if ((void *)pmd_page_vaddr(*pmd) == kasan_early_shadow_pte) { > + pte_t *new = pte_alloc_one_kernel(&init_mm); > + > + if (!new) > + return -ENOMEM; > + memcpy(new, kasan_early_shadow_pte, PTE_TABLE_SIZE); > + pmd_populate_kernel(&init_mm, pmd, new); > + } > + }; > + > + if (!slab_is_available()) > + block = memblock_alloc(k_end - k_start, PAGE_SIZE); > + > + for (k_cur = k_start; k_cur < k_end; k_cur += PAGE_SIZE) { > + void *va = block ? block + k_cur - k_start : > + kasan_get_one_page(); > + pte_t pte = pfn_pte(PHYS_PFN(__pa(va)), PAGE_KERNEL); > + > + if (!va) > + return -ENOMEM; > + > + pmd = pmd_offset(pud_offset(pgd_offset_k(k_cur), k_cur), k_cur); > + pte_update(pte_offset_kernel(pmd, k_cur), ~0, pte_val(pte)); > + } > + flush_tlb_kernel_range(k_start, k_end); > + return 0; > +} > + > +static void __init kasan_remap_early_shadow_ro(void) > +{ > + unsigned long k_cur; > + phys_addr_t pa = __pa(kasan_early_shadow_page); > + int i; > + > + for (i = 0; i < PTRS_PER_PTE; i++) > + ptep_set_wrprotect(&init_mm, 0, kasan_early_shadow_pte + i); > + > + for (k_cur = PAGE_OFFSET & PAGE_MASK; k_cur; k_cur += PAGE_SIZE) { > + pmd_t *pmd = pmd_offset(pud_offset(pgd_offset_k(k_cur), k_cur), k_cur); > + pte_t *ptep = pte_offset_kernel(pmd, k_cur); > + > + if ((void *)pmd_page_vaddr(*pmd) == kasan_early_shadow_pte) > + continue; > + if ((pte_val(*ptep) & PAGE_MASK) != pa) > + continue; > + > + ptep_set_wrprotect(&init_mm, k_cur, ptep); > + } > + flush_tlb_mm(&init_mm); > +} > + > +void __init kasan_init(void) > +{ > + struct memblock_region *reg; > + > + for_each_memblock(memory, reg) { > + int ret = kasan_init_region(__va(reg->base), reg->size); > + > + if (ret) > + panic("kasan: kasan_init_region() failed"); > + } > + > + kasan_remap_early_shadow_ro(); > + > + clear_page(kasan_early_shadow_page); > + > + /* At this point kasan is fully initialized. Enable error messages */ > + init_task.kasan_depth = 0; > + pr_info("KASAN init done\n"); > +} > + > +#ifdef CONFIG_MODULES > +void *module_alloc(unsigned long size) > +{ > + void *base = vmalloc_exec(size); > + > + if (!base) > + return NULL; > + > + if (!kasan_init_region(base, size)) > + return base; > + > + vfree(base); > + > + return NULL; > +} > +#endif > diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c > index 81f251fc4169..1bb055775e60 100644 > --- a/arch/powerpc/mm/mem.c > +++ b/arch/powerpc/mm/mem.c > @@ -336,6 +336,10 @@ void __init mem_init(void) > pr_info(" * 0x%08lx..0x%08lx : highmem PTEs\n", > PKMAP_BASE, PKMAP_ADDR(LAST_PKMAP)); > #endif /* CONFIG_HIGHMEM */ > +#ifdef CONFIG_KASAN > + pr_info(" * 0x%08lx..0x%08lx : kasan shadow mem\n", > + KASAN_SHADOW_START, KASAN_SHADOW_END); > +#endif > #ifdef CONFIG_NOT_COHERENT_CACHE > pr_info(" * 0x%08lx..0x%08lx : consistent mem\n", > IOREMAP_TOP, IOREMAP_TOP + CONFIG_CONSISTENT_SIZE); > diff --git a/arch/powerpc/mm/ptdump/dump_linuxpagetables.c b/arch/powerpc/mm/ptdump/dump_linuxpagetables.c > index b0da447197d4..4a03910974e2 100644 > --- a/arch/powerpc/mm/ptdump/dump_linuxpagetables.c > +++ b/arch/powerpc/mm/ptdump/dump_linuxpagetables.c > @@ -94,6 +94,10 @@ static struct addr_marker address_markers[] = { > { 0, "Consistent mem start" }, > { 0, "Consistent mem end" }, > #endif > +#ifdef CONFIG_KASAN > + { 0, "kasan shadow mem start" }, > + { 0, "kasan shadow mem end" }, > +#endif > #ifdef CONFIG_HIGHMEM > { 0, "Highmem PTEs start" }, > { 0, "Highmem PTEs end" }, > @@ -316,6 +320,10 @@ static void populate_markers(void) > address_markers[i++].start_address = IOREMAP_TOP + > CONFIG_CONSISTENT_SIZE; > #endif > +#ifdef CONFIG_KASAN > + address_markers[i++].start_address = KASAN_SHADOW_START; > + address_markers[i++].start_address = KASAN_SHADOW_END; > +#endif > #ifdef CONFIG_HIGHMEM > address_markers[i++].start_address = PKMAP_BASE; > address_markers[i++].start_address = PKMAP_ADDR(LAST_PKMAP); > diff --git a/arch/powerpc/purgatory/Makefile b/arch/powerpc/purgatory/Makefile > index 4314ba5baf43..7c6d8b14f440 100644 > --- a/arch/powerpc/purgatory/Makefile > +++ b/arch/powerpc/purgatory/Makefile > @@ -1,4 +1,7 @@ > # SPDX-License-Identifier: GPL-2.0 > + > +KASAN_SANITIZE := n > + > targets += trampoline.o purgatory.ro kexec-purgatory.c > > LDFLAGS_purgatory.ro := -e purgatory_start -r --no-undefined > diff --git a/arch/powerpc/xmon/Makefile b/arch/powerpc/xmon/Makefile > index 878f9c1d3615..064f7062c0a3 100644 > --- a/arch/powerpc/xmon/Makefile > +++ b/arch/powerpc/xmon/Makefile > @@ -6,6 +6,7 @@ subdir-ccflags-y := $(call cc-disable-warning, builtin-requires-header) > > GCOV_PROFILE := n > UBSAN_SANITIZE := n > +KASAN_SANITIZE := n > > # Disable ftrace for the entire directory > ORIG_CFLAGS := $(KBUILD_CFLAGS) >
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 08908219fba9..850b06def84f 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -175,6 +175,7 @@ config PPC select GENERIC_TIME_VSYSCALL select HAVE_ARCH_AUDITSYSCALL select HAVE_ARCH_JUMP_LABEL + select HAVE_ARCH_KASAN if PPC32 select HAVE_ARCH_KGDB select HAVE_ARCH_MMAP_RND_BITS select HAVE_ARCH_MMAP_RND_COMPAT_BITS if COMPAT diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile index ac033341ed55..f0738099e31e 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile @@ -427,6 +427,13 @@ else endif endif +ifdef CONFIG_KASAN +prepare: kasan_prepare + +kasan_prepare: prepare0 + $(eval KASAN_SHADOW_OFFSET = $(shell awk '{if ($$2 == "KASAN_SHADOW_OFFSET") print $$3;}' include/generated/asm-offsets.h)) +endif + # Check toolchain versions: # - gcc-4.6 is the minimum kernel-wide version so nothing required. checkbin: diff --git a/arch/powerpc/include/asm/book3s/32/pgtable.h b/arch/powerpc/include/asm/book3s/32/pgtable.h index 49d76adb9bc5..4543016f80ca 100644 --- a/arch/powerpc/include/asm/book3s/32/pgtable.h +++ b/arch/powerpc/include/asm/book3s/32/pgtable.h @@ -141,6 +141,8 @@ static inline bool pte_user(pte_t pte) */ #ifdef CONFIG_HIGHMEM #define KVIRT_TOP PKMAP_BASE +#elif defined(CONFIG_KASAN) +#define KVIRT_TOP KASAN_SHADOW_START #else #define KVIRT_TOP (0xfe000000UL) /* for now, could be FIXMAP_BASE ? */ #endif diff --git a/arch/powerpc/include/asm/highmem.h b/arch/powerpc/include/asm/highmem.h index a4b65b186ec6..483b90025bef 100644 --- a/arch/powerpc/include/asm/highmem.h +++ b/arch/powerpc/include/asm/highmem.h @@ -28,6 +28,7 @@ #include <asm/cacheflush.h> #include <asm/page.h> #include <asm/fixmap.h> +#include <asm/kasan.h> extern pte_t *kmap_pte; extern pgprot_t kmap_prot; @@ -50,10 +51,15 @@ extern pte_t *pkmap_page_table; #define PKMAP_ORDER 9 #endif #define LAST_PKMAP (1 << PKMAP_ORDER) +#ifdef CONFIG_KASAN +#define PKMAP_TOP KASAN_SHADOW_START +#else +#define PKMAP_TOP FIXADDR_START +#endif #ifndef CONFIG_PPC_4K_PAGES -#define PKMAP_BASE (FIXADDR_START - PAGE_SIZE*(LAST_PKMAP + 1)) +#define PKMAP_BASE (PKMAP_TOP - PAGE_SIZE*(LAST_PKMAP + 1)) #else -#define PKMAP_BASE ((FIXADDR_START - PAGE_SIZE*(LAST_PKMAP + 1)) & PMD_MASK) +#define PKMAP_BASE ((PKMAP_TOP - PAGE_SIZE*(LAST_PKMAP + 1)) & PMD_MASK) #endif #define LAST_PKMAP_MASK (LAST_PKMAP-1) #define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT) diff --git a/arch/powerpc/include/asm/kasan.h b/arch/powerpc/include/asm/kasan.h index 2efd0e42cfc9..0bc9148f5d87 100644 --- a/arch/powerpc/include/asm/kasan.h +++ b/arch/powerpc/include/asm/kasan.h @@ -12,4 +12,27 @@ #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 (KASAN_SHADOW_START - \ + (PAGE_OFFSET >> KASAN_SHADOW_SCALE_SHIFT)) + +#define KASAN_SHADOW_END (KASAN_SHADOW_START + KASAN_SHADOW_SIZE) + +#include <asm/fixmap.h> + +#define KASAN_SHADOW_START (ALIGN_DOWN(FIXADDR_START - KASAN_SHADOW_SIZE, \ + PGDIR_SIZE)) + +#define KASAN_SHADOW_SIZE ((~0UL - PAGE_OFFSET + 1) >> KASAN_SHADOW_SCALE_SHIFT) + +void kasan_early_init(void); +void kasan_init(void); + +#endif /* __ASSEMBLY */ #endif diff --git a/arch/powerpc/include/asm/nohash/32/pgtable.h b/arch/powerpc/include/asm/nohash/32/pgtable.h index bed433358260..b3b52f02be1a 100644 --- a/arch/powerpc/include/asm/nohash/32/pgtable.h +++ b/arch/powerpc/include/asm/nohash/32/pgtable.h @@ -71,6 +71,8 @@ extern int icache_44x_need_flush; */ #ifdef CONFIG_HIGHMEM #define KVIRT_TOP PKMAP_BASE +#elif defined(CONFIG_KASAN) +#define KVIRT_TOP KASAN_SHADOW_START #else #define KVIRT_TOP (0xfe000000UL) /* for now, could be FIXMAP_BASE ? */ #endif diff --git a/arch/powerpc/include/asm/setup.h b/arch/powerpc/include/asm/setup.h index 65676e2325b8..da7768aa996a 100644 --- a/arch/powerpc/include/asm/setup.h +++ b/arch/powerpc/include/asm/setup.h @@ -74,6 +74,11 @@ static inline void setup_spectre_v2(void) {}; #endif void do_btb_flush_fixups(void); +#ifndef CONFIG_KASAN +static inline void kasan_early_init(void) { } +static inline void kasan_init(void) { } +#endif + #endif /* !__ASSEMBLY__ */ #endif /* _ASM_POWERPC_SETUP_H */ diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index 879b36602748..fc4c42262694 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile @@ -16,8 +16,9 @@ CFLAGS_prom_init.o += -fPIC CFLAGS_btext.o += -fPIC endif -CFLAGS_cputable.o += $(DISABLE_LATENT_ENTROPY_PLUGIN) -CFLAGS_prom_init.o += $(DISABLE_LATENT_ENTROPY_PLUGIN) +CFLAGS_early_32.o += -DDISABLE_BRANCH_PROFILING +CFLAGS_cputable.o += $(DISABLE_LATENT_ENTROPY_PLUGIN) -DDISABLE_BRANCH_PROFILING +CFLAGS_prom_init.o += $(DISABLE_LATENT_ENTROPY_PLUGIN) -DDISABLE_BRANCH_PROFILING CFLAGS_btext.o += $(DISABLE_LATENT_ENTROPY_PLUGIN) CFLAGS_prom.o += $(DISABLE_LATENT_ENTROPY_PLUGIN) @@ -31,6 +32,10 @@ CFLAGS_REMOVE_btext.o = $(CC_FLAGS_FTRACE) CFLAGS_REMOVE_prom.o = $(CC_FLAGS_FTRACE) endif +KASAN_SANITIZE_early_32.o := n +KASAN_SANITIZE_cputable.o := n +KASAN_SANITIZE_prom_init.o := n + obj-y := cputable.o ptrace.o syscalls.o \ irq.o align.o signal_32.o pmc.o vdso.o \ process.o systbl.o idle.o \ diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c index 9ffc72ded73a..846fb30b1190 100644 --- a/arch/powerpc/kernel/asm-offsets.c +++ b/arch/powerpc/kernel/asm-offsets.c @@ -783,5 +783,9 @@ int main(void) DEFINE(VIRT_IMMR_BASE, (u64)__fix_to_virt(FIX_IMMR_BASE)); #endif +#ifdef CONFIG_KASAN + DEFINE(KASAN_SHADOW_OFFSET, KASAN_SHADOW_OFFSET); +#endif + return 0; } diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S index 05b08db3901d..0ec9dec06bc2 100644 --- a/arch/powerpc/kernel/head_32.S +++ b/arch/powerpc/kernel/head_32.S @@ -962,6 +962,9 @@ start_here: * Do early platform-specific initialization, * and set up the MMU. */ +#ifdef CONFIG_KASAN + bl kasan_early_init +#endif li r3,0 mr r4,r31 bl machine_init diff --git a/arch/powerpc/kernel/head_40x.S b/arch/powerpc/kernel/head_40x.S index b19d78410511..5d6ff8fa7e2b 100644 --- a/arch/powerpc/kernel/head_40x.S +++ b/arch/powerpc/kernel/head_40x.S @@ -848,6 +848,9 @@ start_here: /* * Decide what sort of machine this is and initialize the MMU. */ +#ifdef CONFIG_KASAN + bl kasan_early_init +#endif li r3,0 mr r4,r31 bl machine_init diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S index bf23c19c92d6..7ca14dff6192 100644 --- a/arch/powerpc/kernel/head_44x.S +++ b/arch/powerpc/kernel/head_44x.S @@ -203,6 +203,9 @@ _ENTRY(_start); /* * Decide what sort of machine this is and initialize the MMU. */ +#ifdef CONFIG_KASAN + bl kasan_early_init +#endif li r3,0 mr r4,r31 bl machine_init diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S index fe2857ef0309..88f0cb34cef4 100644 --- a/arch/powerpc/kernel/head_8xx.S +++ b/arch/powerpc/kernel/head_8xx.S @@ -823,6 +823,9 @@ start_here: /* * Decide what sort of machine this is and initialize the MMU. */ +#ifdef CONFIG_KASAN + bl kasan_early_init +#endif li r3,0 mr r4,r31 bl machine_init diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S index 2386ce2a9c6e..4f4585a68850 100644 --- a/arch/powerpc/kernel/head_fsl_booke.S +++ b/arch/powerpc/kernel/head_fsl_booke.S @@ -274,6 +274,9 @@ set_ivor: /* * Decide what sort of machine this is and initialize the MMU. */ +#ifdef CONFIG_KASAN + bl kasan_early_init +#endif mr r3,r30 mr r4,r31 bl machine_init diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c index ca00fbb97cf8..16ff1ea66805 100644 --- a/arch/powerpc/kernel/setup-common.c +++ b/arch/powerpc/kernel/setup-common.c @@ -978,6 +978,8 @@ void __init setup_arch(char **cmdline_p) paging_init(); + kasan_init(); + /* Initialize the MMU context management stuff. */ mmu_context_init(); diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile index ee08a7e1bcdf..7efbd5122c74 100644 --- a/arch/powerpc/lib/Makefile +++ b/arch/powerpc/lib/Makefile @@ -8,6 +8,14 @@ ccflags-$(CONFIG_PPC64) := $(NO_MINIMAL_TOC) CFLAGS_REMOVE_code-patching.o = $(CC_FLAGS_FTRACE) CFLAGS_REMOVE_feature-fixups.o = $(CC_FLAGS_FTRACE) +KASAN_SANITIZE_code-patching.o := n +KASAN_SANITIZE_feature-fixups.o := n + +ifdef CONFIG_KASAN +CFLAGS_code-patching.o += -DDISABLE_BRANCH_PROFILING +CFLAGS_feature-fixups.o += -DDISABLE_BRANCH_PROFILING +endif + obj-y += alloc.o code-patching.o feature-fixups.o ifndef CONFIG_KASAN diff --git a/arch/powerpc/mm/Makefile b/arch/powerpc/mm/Makefile index ee1efa3b3382..292b96ce1efc 100644 --- a/arch/powerpc/mm/Makefile +++ b/arch/powerpc/mm/Makefile @@ -47,3 +47,4 @@ obj-$(CONFIG_PPC_COPRO_BASE) += copro_fault.o obj-$(CONFIG_SPAPR_TCE_IOMMU) += mmu_context_iommu.o obj-$(CONFIG_PPC_PTDUMP) += ptdump/ obj-$(CONFIG_PPC_MEM_KEYS) += pkeys.o +obj-$(CONFIG_KASAN) += kasan/ diff --git a/arch/powerpc/mm/kasan/Makefile b/arch/powerpc/mm/kasan/Makefile new file mode 100644 index 000000000000..6577897673dd --- /dev/null +++ b/arch/powerpc/mm/kasan/Makefile @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0 + +KASAN_SANITIZE := n + +obj-$(CONFIG_PPC32) += kasan_init_32.o diff --git a/arch/powerpc/mm/kasan/kasan_init_32.c b/arch/powerpc/mm/kasan/kasan_init_32.c new file mode 100644 index 000000000000..495c908d6ee6 --- /dev/null +++ b/arch/powerpc/mm/kasan/kasan_init_32.c @@ -0,0 +1,147 @@ +// SPDX-License-Identifier: GPL-2.0 + +#define DISABLE_BRANCH_PROFILING + +#include <linux/kasan.h> +#include <linux/printk.h> +#include <linux/memblock.h> +#include <linux/sched/task.h> +#include <linux/vmalloc.h> +#include <asm/pgalloc.h> + +void __init kasan_early_init(void) +{ + unsigned long addr = KASAN_SHADOW_START; + unsigned long end = KASAN_SHADOW_END; + unsigned long next; + pmd_t *pmd = pmd_offset(pud_offset(pgd_offset_k(addr), addr), addr); + int i; + phys_addr_t pa = __pa(kasan_early_shadow_page); + + BUILD_BUG_ON(KASAN_SHADOW_START & ~PGDIR_MASK); + + if (early_mmu_has_feature(MMU_FTR_HPTE_TABLE)) + panic("KASAN not supported with Hash MMU\n"); + + for (i = 0; i < PTRS_PER_PTE; i++) + __set_pte_at(&init_mm, (unsigned long)kasan_early_shadow_page, + kasan_early_shadow_pte + i, + pfn_pte(PHYS_PFN(pa), PAGE_KERNEL), 0); + + do { + next = pgd_addr_end(addr, end); + pmd_populate_kernel(&init_mm, pmd, kasan_early_shadow_pte); + } while (pmd++, addr = next, addr != end); +} + +static void __ref *kasan_get_one_page(void) +{ + if (slab_is_available()) + return (void *)__get_free_page(GFP_KERNEL|__GFP_ZERO); + + return memblock_alloc(PAGE_SIZE, PAGE_SIZE); +} + +static int __ref kasan_init_region(void *start, size_t size) +{ + void *end = start + size; + unsigned long k_start, k_end, k_cur, k_next; + pmd_t *pmd; + void *block = NULL; + + if (start >= end) + return 0; + + k_start = (unsigned long)kasan_mem_to_shadow(start); + k_end = (unsigned long)kasan_mem_to_shadow(end); + pmd = pmd_offset(pud_offset(pgd_offset_k(k_start), k_start), k_start); + + for (k_cur = k_start; k_cur != k_end; k_cur = k_next, pmd++) { + k_next = pgd_addr_end(k_cur, k_end); + if ((void *)pmd_page_vaddr(*pmd) == kasan_early_shadow_pte) { + pte_t *new = pte_alloc_one_kernel(&init_mm); + + if (!new) + return -ENOMEM; + memcpy(new, kasan_early_shadow_pte, PTE_TABLE_SIZE); + pmd_populate_kernel(&init_mm, pmd, new); + } + }; + + if (!slab_is_available()) + block = memblock_alloc(k_end - k_start, PAGE_SIZE); + + for (k_cur = k_start; k_cur < k_end; k_cur += PAGE_SIZE) { + void *va = block ? block + k_cur - k_start : + kasan_get_one_page(); + pte_t pte = pfn_pte(PHYS_PFN(__pa(va)), PAGE_KERNEL); + + if (!va) + return -ENOMEM; + + pmd = pmd_offset(pud_offset(pgd_offset_k(k_cur), k_cur), k_cur); + pte_update(pte_offset_kernel(pmd, k_cur), ~0, pte_val(pte)); + } + flush_tlb_kernel_range(k_start, k_end); + return 0; +} + +static void __init kasan_remap_early_shadow_ro(void) +{ + unsigned long k_cur; + phys_addr_t pa = __pa(kasan_early_shadow_page); + int i; + + for (i = 0; i < PTRS_PER_PTE; i++) + ptep_set_wrprotect(&init_mm, 0, kasan_early_shadow_pte + i); + + for (k_cur = PAGE_OFFSET & PAGE_MASK; k_cur; k_cur += PAGE_SIZE) { + pmd_t *pmd = pmd_offset(pud_offset(pgd_offset_k(k_cur), k_cur), k_cur); + pte_t *ptep = pte_offset_kernel(pmd, k_cur); + + if ((void *)pmd_page_vaddr(*pmd) == kasan_early_shadow_pte) + continue; + if ((pte_val(*ptep) & PAGE_MASK) != pa) + continue; + + ptep_set_wrprotect(&init_mm, k_cur, ptep); + } + flush_tlb_mm(&init_mm); +} + +void __init kasan_init(void) +{ + struct memblock_region *reg; + + for_each_memblock(memory, reg) { + int ret = kasan_init_region(__va(reg->base), reg->size); + + if (ret) + panic("kasan: kasan_init_region() failed"); + } + + kasan_remap_early_shadow_ro(); + + clear_page(kasan_early_shadow_page); + + /* At this point kasan is fully initialized. Enable error messages */ + init_task.kasan_depth = 0; + pr_info("KASAN init done\n"); +} + +#ifdef CONFIG_MODULES +void *module_alloc(unsigned long size) +{ + void *base = vmalloc_exec(size); + + if (!base) + return NULL; + + if (!kasan_init_region(base, size)) + return base; + + vfree(base); + + return NULL; +} +#endif diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index 81f251fc4169..1bb055775e60 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c @@ -336,6 +336,10 @@ void __init mem_init(void) pr_info(" * 0x%08lx..0x%08lx : highmem PTEs\n", PKMAP_BASE, PKMAP_ADDR(LAST_PKMAP)); #endif /* CONFIG_HIGHMEM */ +#ifdef CONFIG_KASAN + pr_info(" * 0x%08lx..0x%08lx : kasan shadow mem\n", + KASAN_SHADOW_START, KASAN_SHADOW_END); +#endif #ifdef CONFIG_NOT_COHERENT_CACHE pr_info(" * 0x%08lx..0x%08lx : consistent mem\n", IOREMAP_TOP, IOREMAP_TOP + CONFIG_CONSISTENT_SIZE); diff --git a/arch/powerpc/mm/ptdump/dump_linuxpagetables.c b/arch/powerpc/mm/ptdump/dump_linuxpagetables.c index b0da447197d4..4a03910974e2 100644 --- a/arch/powerpc/mm/ptdump/dump_linuxpagetables.c +++ b/arch/powerpc/mm/ptdump/dump_linuxpagetables.c @@ -94,6 +94,10 @@ static struct addr_marker address_markers[] = { { 0, "Consistent mem start" }, { 0, "Consistent mem end" }, #endif +#ifdef CONFIG_KASAN + { 0, "kasan shadow mem start" }, + { 0, "kasan shadow mem end" }, +#endif #ifdef CONFIG_HIGHMEM { 0, "Highmem PTEs start" }, { 0, "Highmem PTEs end" }, @@ -316,6 +320,10 @@ static void populate_markers(void) address_markers[i++].start_address = IOREMAP_TOP + CONFIG_CONSISTENT_SIZE; #endif +#ifdef CONFIG_KASAN + address_markers[i++].start_address = KASAN_SHADOW_START; + address_markers[i++].start_address = KASAN_SHADOW_END; +#endif #ifdef CONFIG_HIGHMEM address_markers[i++].start_address = PKMAP_BASE; address_markers[i++].start_address = PKMAP_ADDR(LAST_PKMAP); diff --git a/arch/powerpc/purgatory/Makefile b/arch/powerpc/purgatory/Makefile index 4314ba5baf43..7c6d8b14f440 100644 --- a/arch/powerpc/purgatory/Makefile +++ b/arch/powerpc/purgatory/Makefile @@ -1,4 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 + +KASAN_SANITIZE := n + targets += trampoline.o purgatory.ro kexec-purgatory.c LDFLAGS_purgatory.ro := -e purgatory_start -r --no-undefined diff --git a/arch/powerpc/xmon/Makefile b/arch/powerpc/xmon/Makefile index 878f9c1d3615..064f7062c0a3 100644 --- a/arch/powerpc/xmon/Makefile +++ b/arch/powerpc/xmon/Makefile @@ -6,6 +6,7 @@ subdir-ccflags-y := $(call cc-disable-warning, builtin-requires-header) GCOV_PROFILE := n UBSAN_SANITIZE := n +KASAN_SANITIZE := n # Disable ftrace for the entire directory ORIG_CFLAGS := $(KBUILD_CFLAGS)
This patch adds KASAN support for PPC32. The KASAN shadow area is located between the vmalloc area and the fixmap area. KASAN_SHADOW_OFFSET is calculated in asm/kasan.h and extracted by Makefile prepare rule via asm-offsets.h For modules, the shadow area is allocated at module_alloc(). Note that on book3s it will only work on the 603 because the other ones use hash table and can therefore not share a single PTE table covering the entire early KASAN shadow area. Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> --- arch/powerpc/Kconfig | 1 + arch/powerpc/Makefile | 7 ++ arch/powerpc/include/asm/book3s/32/pgtable.h | 2 + arch/powerpc/include/asm/highmem.h | 10 +- arch/powerpc/include/asm/kasan.h | 23 ++++ arch/powerpc/include/asm/nohash/32/pgtable.h | 2 + arch/powerpc/include/asm/setup.h | 5 + arch/powerpc/kernel/Makefile | 9 +- arch/powerpc/kernel/asm-offsets.c | 4 + arch/powerpc/kernel/head_32.S | 3 + arch/powerpc/kernel/head_40x.S | 3 + arch/powerpc/kernel/head_44x.S | 3 + arch/powerpc/kernel/head_8xx.S | 3 + arch/powerpc/kernel/head_fsl_booke.S | 3 + arch/powerpc/kernel/setup-common.c | 2 + arch/powerpc/lib/Makefile | 8 ++ arch/powerpc/mm/Makefile | 1 + arch/powerpc/mm/kasan/Makefile | 5 + arch/powerpc/mm/kasan/kasan_init_32.c | 147 ++++++++++++++++++++++++++ arch/powerpc/mm/mem.c | 4 + arch/powerpc/mm/ptdump/dump_linuxpagetables.c | 8 ++ arch/powerpc/purgatory/Makefile | 3 + arch/powerpc/xmon/Makefile | 1 + 23 files changed, 253 insertions(+), 4 deletions(-) create mode 100644 arch/powerpc/mm/kasan/Makefile create mode 100644 arch/powerpc/mm/kasan/kasan_init_32.c