Received: by 2002:a25:c593:0:0:0:0:0 with SMTP id v141csp925870ybe; Wed, 11 Sep 2019 06:54:03 -0700 (PDT) X-Google-Smtp-Source: APXvYqxXwKIpGU4/J2Nq9BEAfUbEvApZhT5a9HDGguwzm6TWIN7kABl3UedIYYT7xmSFopUwrEL1 X-Received: by 2002:a05:6402:614:: with SMTP id n20mr36736467edv.237.1568210043119; Wed, 11 Sep 2019 06:54:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1568210043; cv=none; d=google.com; s=arc-20160816; b=Wt9KMiPEXYesPryFTkucfxYI20fjvxgXUBBDmPWIsxr1+zjOXgIYarKjgfPVmGK7Y9 Dl5xuDl6QP3/XHfcoTp3syksxQElmb21Hhuz4ew/wMaQ8qm9GALbdbrM6xaL0y6rE3Op tZaDcjM0ruR2IuOWi5VFp/Ce/SnkuPtWhd6dW3pxDnhmgOxLn071XYAroFeeZUrn7vII FgE3MT1P2KS5S+8rDegkDUfMZ0pR7nLScClHsSgzE+HG1k8Bskiyf4WYiNEA9F9ZVXfi 8JkEoCFqqVDGDbL4SDCyybbigZYhuDxf+Sa8ywIG4tzas5HhDAzPWUSpDAF0/cWaI55D YN+A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:date:cc:to:subject:from:message-id :dkim-signature; bh=aFoR0EE25KxrXQBvyb70fW7SuTw+tqYJ2ji2+VGVo/I=; b=O9GnzsiE0o7dt6hz3wwznRAfZmQiFE3stp2UtOuRJwb4MOvaPUI26EGSUDFSGqezx1 +5HHRnvjlolEWLJdzNwd2NRYn0yV5OTNRPdzqdDqmEbmmt75xvdxSnWxXrpHbwKVLDV0 1XV+BMTAyk94ZIQ2/Lc+t3fXHdU4s3P84S692a250m6qDmKDxKRptEsD03vI0kyMJfqU 63IqMo/qdu9ygVszIRFBHCUoGLHJ+T5VSkwJkMeCAFGycDk011GaXB66RMd3P18MK/Qg RYkwZQNWbRPYu2Y+Q35RohCMAOxMgVqWjlzarQrPcNvgQ6IMdOzabTRl2Q4c7Be3AMlZ YLbQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@c-s.fr header.s=mail header.b="GMqpO/CD"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k34si13721512edd.138.2019.09.11.06.53.39; Wed, 11 Sep 2019 06:54:03 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@c-s.fr header.s=mail header.b="GMqpO/CD"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728212AbfIKNv0 (ORCPT + 99 others); Wed, 11 Sep 2019 09:51:26 -0400 Received: from pegase1.c-s.fr ([93.17.236.30]:19671 "EHLO pegase1.c-s.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728068AbfIKNv0 (ORCPT ); Wed, 11 Sep 2019 09:51:26 -0400 Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id 46T3GL3TBkzB09Zl; Wed, 11 Sep 2019 15:51:22 +0200 (CEST) Authentication-Results: localhost; dkim=pass reason="1024-bit key; insecure key" header.d=c-s.fr header.i=@c-s.fr header.b=GMqpO/CD; dkim-adsp=pass; dkim-atps=neutral X-Virus-Scanned: Debian amavisd-new at c-s.fr Received: from pegase1.c-s.fr ([192.168.12.234]) by localhost (pegase1.c-s.fr [192.168.12.234]) (amavisd-new, port 10024) with ESMTP id gkiGr0Q8LTXV; Wed, 11 Sep 2019 15:51:22 +0200 (CEST) Received: from messagerie.si.c-s.fr (messagerie.si.c-s.fr [192.168.25.192]) by pegase1.c-s.fr (Postfix) with ESMTP id 46T3GL20Z1zB09Zk; Wed, 11 Sep 2019 15:51:22 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=c-s.fr; s=mail; t=1568209882; bh=aFoR0EE25KxrXQBvyb70fW7SuTw+tqYJ2ji2+VGVo/I=; h=From:Subject:To:Cc:Date:From; b=GMqpO/CD6k/T039tPPd+RCv2yO1ifh84PKQBKzkz21m+ocSJB/iirJdtqSOeD1oiy zGkNCSXNjkDgHApz/uQOucDHDoDf8axy4O6cwSb6HcsSGXqYv3qcP8W3DDwZJtStUn mc2OGv05QtQGvfovBm528XkdhXj/aZ5mNXtls+xk= Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id B9C328B8D1; Wed, 11 Sep 2019 15:51:23 +0200 (CEST) X-Virus-Scanned: amavisd-new at c-s.fr Received: from messagerie.si.c-s.fr ([127.0.0.1]) by localhost (messagerie.si.c-s.fr [127.0.0.1]) (amavisd-new, port 10023) with ESMTP id s8WrJoXk0Ydr; Wed, 11 Sep 2019 15:51:23 +0200 (CEST) Received: from localhost.localdomain (po15451.idsi0.si.c-s.fr [172.25.230.103]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 8A7258B8CB; Wed, 11 Sep 2019 15:51:23 +0200 (CEST) Received: by localhost.localdomain (Postfix, from userid 0) id 4FCEE6B723; Wed, 11 Sep 2019 13:51:23 +0000 (UTC) Message-Id: <01c3846a26faf47b11ba580fccded281c3b0a6ee.1568209870.git.christophe.leroy@c-s.fr> From: Christophe Leroy Subject: [PATCH] powerpc/32: add support of KASAN_VMALLOC To: Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman , dja@axtens.net Cc: linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, kasan-dev@googlegroups.com, linux-mm@kvack.org Date: Wed, 11 Sep 2019 13:51:23 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add support of KASAN_VMALLOC on PPC32. To allow this, the early shadow covering the VMALLOC space need to be removed once high_memory var is set and before freeing memblock. And the VMALLOC area need to be aligned such that boundaries are covered by a full shadow page. Signed-off-by: Christophe Leroy --- Applies on top of Daniel's series which add KASAN_VMALLOC support. --- arch/powerpc/Kconfig | 1 + arch/powerpc/include/asm/book3s/32/pgtable.h | 5 +++++ arch/powerpc/include/asm/kasan.h | 2 ++ arch/powerpc/include/asm/nohash/32/pgtable.h | 5 +++++ arch/powerpc/mm/kasan/kasan_init_32.c | 31 ++++++++++++++++++++++++++++ arch/powerpc/mm/mem.c | 3 +++ 6 files changed, 47 insertions(+) diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 6a7c797fa9d2..9d270d50ac9e 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -172,6 +172,7 @@ config PPC select HAVE_ARCH_HUGE_VMAP if PPC_BOOK3S_64 && PPC_RADIX_MMU select HAVE_ARCH_JUMP_LABEL select HAVE_ARCH_KASAN if PPC32 + select HAVE_ARCH_KASAN_VMALLOC 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/include/asm/book3s/32/pgtable.h b/arch/powerpc/include/asm/book3s/32/pgtable.h index 0796533d37dd..5b39c11e884a 100644 --- a/arch/powerpc/include/asm/book3s/32/pgtable.h +++ b/arch/powerpc/include/asm/book3s/32/pgtable.h @@ -193,7 +193,12 @@ int map_kernel_page(unsigned long va, phys_addr_t pa, pgprot_t prot); #else #define VMALLOC_START ((((long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))) #endif + +#ifdef CONFIG_KASAN_VMALLOC +#define VMALLOC_END _ALIGN_DOWN(ioremap_bot, PAGE_SIZE << KASAN_SHADOW_SCALE_SHIFT) +#else #define VMALLOC_END ioremap_bot +#endif #ifndef __ASSEMBLY__ #include diff --git a/arch/powerpc/include/asm/kasan.h b/arch/powerpc/include/asm/kasan.h index 296e51c2f066..fbff9ff9032e 100644 --- a/arch/powerpc/include/asm/kasan.h +++ b/arch/powerpc/include/asm/kasan.h @@ -31,9 +31,11 @@ void kasan_early_init(void); void kasan_mmu_init(void); void kasan_init(void); +void kasan_late_init(void); #else static inline void kasan_init(void) { } static inline void kasan_mmu_init(void) { } +static inline void kasan_late_init(void) { } #endif #endif /* __ASSEMBLY */ diff --git a/arch/powerpc/include/asm/nohash/32/pgtable.h b/arch/powerpc/include/asm/nohash/32/pgtable.h index 552b96eef0c8..60c4d829152e 100644 --- a/arch/powerpc/include/asm/nohash/32/pgtable.h +++ b/arch/powerpc/include/asm/nohash/32/pgtable.h @@ -114,7 +114,12 @@ int map_kernel_page(unsigned long va, phys_addr_t pa, pgprot_t prot); #else #define VMALLOC_START ((((long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))) #endif + +#ifdef CONFIG_KASAN_VMALLOC +#define VMALLOC_END _ALIGN_DOWN(ioremap_bot, PAGE_SIZE << KASAN_SHADOW_SCALE_SHIFT) +#else #define VMALLOC_END ioremap_bot +#endif /* * Bits in a linux-style PTE. These match the bits in the diff --git a/arch/powerpc/mm/kasan/kasan_init_32.c b/arch/powerpc/mm/kasan/kasan_init_32.c index 0e6ed4413eea..fb3cd8037f19 100644 --- a/arch/powerpc/mm/kasan/kasan_init_32.c +++ b/arch/powerpc/mm/kasan/kasan_init_32.c @@ -129,6 +129,31 @@ static void __init kasan_remap_early_shadow_ro(void) flush_tlb_kernel_range(KASAN_SHADOW_START, KASAN_SHADOW_END); } +static void __init kasan_unmap_early_shadow_vmalloc(void) +{ + unsigned long k_start = (unsigned long)kasan_mem_to_shadow((void *)VMALLOC_START); + unsigned long k_end = (unsigned long)kasan_mem_to_shadow((void *)VMALLOC_END); + unsigned long k_cur; + phys_addr_t pa = __pa(kasan_early_shadow_page); + + if (!early_mmu_has_feature(MMU_FTR_HPTE_TABLE)) { + int ret = kasan_init_shadow_page_tables(k_start, k_end); + + if (ret) + panic("kasan: kasan_init_shadow_page_tables() failed"); + } + for (k_cur = k_start & PAGE_MASK; k_cur < k_end; 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 ((pte_val(*ptep) & PTE_RPN_MASK) != pa) + continue; + + __set_pte_at(&init_mm, k_cur, ptep, __pte(0), 0); + } + flush_tlb_kernel_range(k_start, k_end); +} + void __init kasan_mmu_init(void) { int ret; @@ -165,6 +190,12 @@ void __init kasan_init(void) pr_info("KASAN init done\n"); } +void __init kasan_late_init(void) +{ + if (IS_ENABLED(CONFIG_KASAN_VMALLOC)) + kasan_unmap_early_shadow_vmalloc(); +} + #ifdef CONFIG_MODULES void *module_alloc(unsigned long size) { diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index be941d382c8d..34bfe2c81f15 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c @@ -265,6 +265,9 @@ void __init mem_init(void) high_memory = (void *) __va(max_low_pfn * PAGE_SIZE); set_max_mapnr(max_pfn); + + kasan_late_init(); + memblock_free_all(); #ifdef CONFIG_HIGHMEM -- 2.13.3