From patchwork Tue Jun 26 13:15:15 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrey Konovalov X-Patchwork-Id: 10488899 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id DC85C601A0 for ; Tue, 26 Jun 2018 13:15:55 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CA73728907 for ; Tue, 26 Jun 2018 13:15:55 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BE8B62893B; Tue, 26 Jun 2018 13:15:55 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, USER_IN_DEF_DKIM_WL autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3856728907 for ; Tue, 26 Jun 2018 13:15:55 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 6B5966B026C; Tue, 26 Jun 2018 09:15:44 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 68C146B026D; Tue, 26 Jun 2018 09:15:44 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 556B76B026E; Tue, 26 Jun 2018 09:15:44 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-wr0-f200.google.com (mail-wr0-f200.google.com [209.85.128.200]) by kanga.kvack.org (Postfix) with ESMTP id E0A286B026C for ; Tue, 26 Jun 2018 09:15:43 -0400 (EDT) Received: by mail-wr0-f200.google.com with SMTP id k11-v6so7866737wrm.19 for ; Tue, 26 Jun 2018 06:15:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:dkim-signature:from:to:cc:subject:date :message-id:in-reply-to:references; bh=d0nWZ+rdDycj8ZcGpcXHZ6Mt7ZJeTMJyiNbRRjCIKKw=; b=ugrJMF6cM9LIPfYtCdgtYaTJG3Y99g22Jv4guM/BllIHwQD3BluKeWFrveJrbrEOiJ 3Gun+4vF6wRF1BUtnUsJwnaBi9HZZkbNP+4BuJlLlRfCxj7EVuihA+c2c0OBvNBOe3Z9 9blqDo9HXAk1nyTymHfbTxNZR1ttABMfDu2mjJLJK4z1OlrBK3+UTjbTFYielo7TsWlb zz4Akd72EQ0UkLEZxy4H9HdF56ynZSfUyEs/5sOfuv2LDFw0WCqbMmlmL5OWg27tLN31 zRypvds41ljiXFtt6O+qozwBr0dU6yRwm5ulSK6eUiy5GB9dMGIK+sSqzytg80YieRLI xnZg== X-Gm-Message-State: APt69E19FLdoqT25CBIOPdLSG6tyWOK0omJIIH1S48WI8NHg2x8iLI8o 8eNbfh2mQ+zsbZSnRzhNq1IlsMm4DjpUjyWR2wlXEK9ls/6JOFRS0wLAIDkdlQ0kxl8wndDia0L NAMxlTr+a0xFX7QnNtgpcR6htYGRscCdG6D0+f5EGTIIa0iLkK7xcZ9eWjzPK8HIxAaPciRszvk rjm9m0jV8hd+W6ZoMbSsf1CJQ2TPWL8sxXZda6XFWqU641NS4c/AP5xckhtIZjDxHL4Ezo0s586 XfX1gmHWRNVQEy3goiRT9A5BhyEULJ6knyyYHeIaQyqztnv7AxCKJ92xJF4lX9nZv5wvlczEL/j SkZzX03Edz86VZMy8TNQVTrWV39B8/en0sg5PJilM1buS6yo5ejEur7CYTVbrVLLNn3L1hzrX6X d X-Received: by 2002:a1c:1c8f:: with SMTP id c137-v6mr1617706wmc.142.1530018943450; Tue, 26 Jun 2018 06:15:43 -0700 (PDT) X-Received: by 2002:a1c:1c8f:: with SMTP id c137-v6mr1617647wmc.142.1530018942526; Tue, 26 Jun 2018 06:15:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530018942; cv=none; d=google.com; s=arc-20160816; b=xH0Qqhck4kbAhJxdr5HPH8gHZEs/lJ6MiH2g0aA8hsKeDHz/Q1EG4p44RM5NllvX7q yFuhc8jvmDb6NiWVYBd7PhC032laRQ3Ji6ZKIiljDgexnRRrF5p8x2+Id+dnVyYOfHZH fh75TvkgY6F+iQQvxeK/7jgzOQ0U2JRb7Fn+DWJ4/FN6EBvWCQOm2JWVUxVrmLH6QNLU yPjOOCH4PYnQSgACiAxOO8G62XS/pNT4TCMm6tvSH2+8hZoJZLadoOkqLgLr7K2iWrxE FJchVpv8fjet2ik/UYWNj4E2r8tT7z/yfbBwv+m9VK1wimhckn/z4YBpvWFVTmoouVC9 rD2w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=d0nWZ+rdDycj8ZcGpcXHZ6Mt7ZJeTMJyiNbRRjCIKKw=; b=mUzv7S8qnTzdvNTjE2+1Y1Tv+SzdCeim7HX7yLARxigvF5xXKvDG3dPZ9dUupoG6C9 pVFBbOiRlgHsRWCbEE8aFwbyHPwwi4JCCJJ/AyvG+OCM7b5NpZRnMTdVp9huUPnGFpgb dHWONf0Z1I1BQi142aZ0gS6gMEPnDsx0k67WQ+76dEAHI+OBHuML1XbYgV5rhTt3bUsN L2VPEkAAufJ49p3/DIi1qsLO19ArAIl2WnBnBH5wAU/n6mrXbIdFFYv+GjtHXfDg60le sCW1qf79mzKXELDBsAP92F/Vo5H9xxQ+8KjtbO/fleujKRca++pnLtIzjs6euJGRFBid XF5g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b="HG/lRs+B"; spf=pass (google.com: domain of andreyknvl@google.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=andreyknvl@google.com; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id 63-v6sor609192wms.13.2018.06.26.06.15.42 for (Google Transport Security); Tue, 26 Jun 2018 06:15:42 -0700 (PDT) Received-SPF: pass (google.com: domain of andreyknvl@google.com designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b="HG/lRs+B"; spf=pass (google.com: domain of andreyknvl@google.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=andreyknvl@google.com; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=d0nWZ+rdDycj8ZcGpcXHZ6Mt7ZJeTMJyiNbRRjCIKKw=; b=HG/lRs+BzcPtm1IVT2IVXkG2FaU4/qNYJHreY3GF0sPTFCDGNz2dMXAbxRxTh60rrM lYgQeZlnq4g4tbq/2Pb7e81kAo8L0wzUe8gGe0Y7XyC4eOToxEDgLvro/K08Jw5d+YNw TxSTP+hIkK7izWSldpVgv8m4HAyCMKgRv+BFw3nH9Xfty68R7puhNfJ2pFP5zG1Nr2AM s1KtWMdCdrIUv5LpzPhSLtDHVHpLvXsYv4IQU4glXwtmYXH+4uFzc66juUgLQMYWvJIs DYENUBy7zgCLxktSeCqvQ5j6wllfmJIofPi8ngftTeVfegK+6MTf54dNAUhqZoplKoKj R+Vw== X-Google-Smtp-Source: AAOMgpekLX86Zwdd9ztlWa3ibDTwlSnpcisR9N+S2hbuaOiRrzpi15ft95kVXz4Z4ahpydT2JpS/3A== X-Received: by 2002:a1c:5585:: with SMTP id j127-v6mr1576632wmb.102.1530018941558; Tue, 26 Jun 2018 06:15:41 -0700 (PDT) Received: from andreyknvl0.muc.corp.google.com ([2a00:79e0:15:10:84be:a42a:826d:c530]) by smtp.gmail.com with ESMTPSA id w15-v6sm2162639wrn.25.2018.06.26.06.15.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 26 Jun 2018 06:15:40 -0700 (PDT) From: Andrey Konovalov To: Andrey Ryabinin , Alexander Potapenko , Dmitry Vyukov , Catalin Marinas , Will Deacon , Christoph Lameter , Andrew Morton , Mark Rutland , Nick Desaulniers , Marc Zyngier , Dave Martin , Ard Biesheuvel , "Eric W . Biederman" , Ingo Molnar , Paul Lawrence , Geert Uytterhoeven , Arnd Bergmann , "Kirill A . Shutemov" , Greg Kroah-Hartman , Kate Stewart , Mike Rapoport , kasan-dev@googlegroups.com, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sparse@vger.kernel.org, linux-mm@kvack.org, linux-kbuild@vger.kernel.org Cc: Kostya Serebryany , Evgeniy Stepanov , Lee Smith , Ramana Radhakrishnan , Jacob Bramley , Ruben Ayrapetyan , Jann Horn , Mark Brand , Chintan Pandya , Andrey Konovalov Subject: [PATCH v4 05/17] khwasan: initialize shadow to 0xff Date: Tue, 26 Jun 2018 15:15:15 +0200 Message-Id: <4f11b60d5ace61e1a07ad4962ee11dab4f4ee48e.1530018818.git.andreyknvl@google.com> X-Mailer: git-send-email 2.18.0.rc2.346.g013aa6912e-goog In-Reply-To: References: X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP A KHWASAN shadow memory cell contains a memory tag, that corresponds to the tag in the top byte of the pointer, that points to that memory. The native top byte value of kernel pointers is 0xff, so with KHWASAN we need to initialize shadow memory to 0xff. This commit does that. Signed-off-by: Andrey Konovalov --- arch/arm64/mm/kasan_init.c | 16 ++++++++++++++-- include/linux/kasan.h | 8 ++++++++ mm/kasan/common.c | 3 ++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/arch/arm64/mm/kasan_init.c b/arch/arm64/mm/kasan_init.c index 12145874c02b..7a31e8ccbad2 100644 --- a/arch/arm64/mm/kasan_init.c +++ b/arch/arm64/mm/kasan_init.c @@ -44,6 +44,15 @@ static phys_addr_t __init kasan_alloc_zeroed_page(int node) return __pa(p); } +static phys_addr_t __init kasan_alloc_raw_page(int node) +{ + void *p = memblock_virt_alloc_try_nid_raw(PAGE_SIZE, PAGE_SIZE, + __pa(MAX_DMA_ADDRESS), + MEMBLOCK_ALLOC_ACCESSIBLE, + node); + return __pa(p); +} + static pte_t *__init kasan_pte_offset(pmd_t *pmdp, unsigned long addr, int node, bool early) { @@ -89,7 +98,9 @@ static void __init kasan_pte_populate(pmd_t *pmdp, unsigned long addr, do { phys_addr_t page_phys = early ? __pa_symbol(kasan_zero_page) - : kasan_alloc_zeroed_page(node); + : kasan_alloc_raw_page(node); + if (!early) + memset(__va(page_phys), KASAN_SHADOW_INIT, PAGE_SIZE); next = addr + PAGE_SIZE; set_pte(ptep, pfn_pte(__phys_to_pfn(page_phys), PAGE_KERNEL)); } while (ptep++, addr = next, addr != end && pte_none(READ_ONCE(*ptep))); @@ -139,6 +150,7 @@ asmlinkage void __init kasan_early_init(void) KASAN_SHADOW_END - (1UL << (64 - KASAN_SHADOW_SCALE_SHIFT))); BUILD_BUG_ON(!IS_ALIGNED(KASAN_SHADOW_START, PGDIR_SIZE)); BUILD_BUG_ON(!IS_ALIGNED(KASAN_SHADOW_END, PGDIR_SIZE)); + kasan_pgd_populate(KASAN_SHADOW_START, KASAN_SHADOW_END, NUMA_NO_NODE, true); } @@ -235,7 +247,7 @@ void __init kasan_init(void) set_pte(&kasan_zero_pte[i], pfn_pte(sym_to_pfn(kasan_zero_page), PAGE_KERNEL_RO)); - memset(kasan_zero_page, 0, PAGE_SIZE); + memset(kasan_zero_page, KASAN_SHADOW_INIT, PAGE_SIZE); cpu_replace_ttbr1(lm_alias(swapper_pg_dir)); /* At this point kasan is fully initialized. Enable error messages */ diff --git a/include/linux/kasan.h b/include/linux/kasan.h index 6608aa9b35ac..336385baf926 100644 --- a/include/linux/kasan.h +++ b/include/linux/kasan.h @@ -139,6 +139,8 @@ static inline size_t kasan_metadata_size(struct kmem_cache *cache) { return 0; } #ifdef CONFIG_KASAN_GENERIC +#define KASAN_SHADOW_INIT 0 + void kasan_cache_shrink(struct kmem_cache *cache); void kasan_cache_shutdown(struct kmem_cache *cache); @@ -149,4 +151,10 @@ static inline void kasan_cache_shutdown(struct kmem_cache *cache) {} #endif /* CONFIG_KASAN_GENERIC */ +#ifdef CONFIG_KASAN_HW + +#define KASAN_SHADOW_INIT 0xFF + +#endif /* CONFIG_KASAN_HW */ + #endif /* LINUX_KASAN_H */ diff --git a/mm/kasan/common.c b/mm/kasan/common.c index e78ebeff1f4c..656baa8984c7 100644 --- a/mm/kasan/common.c +++ b/mm/kasan/common.c @@ -473,11 +473,12 @@ int kasan_module_alloc(void *addr, size_t size) ret = __vmalloc_node_range(shadow_size, 1, shadow_start, shadow_start + shadow_size, - GFP_KERNEL | __GFP_ZERO, + GFP_KERNEL, PAGE_KERNEL, VM_NO_GUARD, NUMA_NO_NODE, __builtin_return_address(0)); if (ret) { + __memset(ret, KASAN_SHADOW_INIT, shadow_size); find_vm_area(addr)->flags |= VM_KASAN; kmemleak_ignore(ret); return 0;