From patchwork Tue May 8 17:20:49 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrey Konovalov X-Patchwork-Id: 10386607 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 E1E3060353 for ; Tue, 8 May 2018 17:21:25 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CC33D290B3 for ; Tue, 8 May 2018 17:21:25 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BFE1A290B9; Tue, 8 May 2018 17:21:25 +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 81242290B3 for ; Tue, 8 May 2018 17:21:24 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4286A6B02C1; Tue, 8 May 2018 13:21:18 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 35EC06B02C2; Tue, 8 May 2018 13:21:18 -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 200FD6B02C3; Tue, 8 May 2018 13:21:18 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-wr0-f199.google.com (mail-wr0-f199.google.com [209.85.128.199]) by kanga.kvack.org (Postfix) with ESMTP id A0DC66B02C1 for ; Tue, 8 May 2018 13:21:17 -0400 (EDT) Received: by mail-wr0-f199.google.com with SMTP id p1-v6so21814466wrm.7 for ; Tue, 08 May 2018 10:21:17 -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:in-reply-to:references; bh=zxZyPeEQEDgi9UM5VUhrSZ9/lj6VU74Z67nBnAF7XSg=; b=WehOg1BNePyrEagikxaReguB/dt8owfnWHyb3yJ/CUSVEPFqWBcWxkBkhwtO9wO7mZ kvxE2pVOBc6l+Rj1FRTJTRuttk06htRNKHw/Ju9c3I0m4KQwekx+hX/NGCex61+feyZi zlZ4/g3nZoc/2C5V+41nlwoOG65wZ3UNqCKVdgnhwE43ppseHSSr9655pGtkPjRZ29bo ijXFEWlI5E5srgKDmwRsiu9ydZEOkGlstoYFBteOKT6gBwjMHKWklE3k/fmpLdoqodlo OPtqpaxvXcb/Clg+iFD2zjVXNLfieCPSXpUMeQx80M9emshZxGEMW6BlwUL9an/95efC v3Mw== X-Gm-Message-State: ALQs6tBEqBk83L0pmkb5AGBuR/aT6iLVHz1ex9DxQhuhfgUYI+cRHD1d QzEEw5KQbmF6CsHZqB1FHTSOwSx7vos/NSy5ql7qMo776+A+Ga4YJTmtGWPIOTkzwBB+vDN/RYw qymGHKRgaiioqPSS4t8Y1ZaJcruVp0Z+Lkpx9L6ttn5OJxJQmIUTKmIjUb6qAzRKZwvSnPtrDX9 AWf5XdSigSjAbPAidaksY7MbluWrt5OZX608GM8A0IdONwEAIhiW8vzheDW3oH+QgQzJQJg9BZo 4/Uv8fLxzc88e6iyiJ4ipc916bZCq1R75TjCYJ8IaJoinPs2WS1mWVAd38OGld76siFJv1mXCcA X/FdaDEEnajRrNMKm07qtWoRh0nSNPeY4jbKOPCC/P0elMHzvkT6XiNZr0V+B+N2c89eBGqeo1m n X-Received: by 2002:adf:a9aa:: with SMTP id b39-v6mr34871260wrd.36.1525800077150; Tue, 08 May 2018 10:21:17 -0700 (PDT) X-Received: by 2002:adf:a9aa:: with SMTP id b39-v6mr34871133wrd.36.1525800075746; Tue, 08 May 2018 10:21:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525800075; cv=none; d=google.com; s=arc-20160816; b=AgiM7roU/7hLSot+kODw0JJ3eMzVbEYY1PG0OrORHd+J2CZ1oSXbmtNEIvjFeIG30L PHfsQ+TtkoF+Id3NFfKNW3uJ4fxAambp9l2uVq+y1JnROLaobROnKRcNpWdJvyEeCeNE InH0WPmW/BUM56OKD1X2SRj0cRWK2umVdinP5OaHquyc3T/YTR5uRJ8YNysB+61HLwQy gkfhPeVQOF/fD8Mx9CEpyahmGGLhXZtlOYByGMoHBgYhgqvsSViYEaVLHJDdPgL1p7IP wenNlEdi2utkxIlJX19YuImq83GQZlQ5z5aIEKVwo/6eAuW7hpN4xWrGxKRzy1mXnmNr T68g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=zxZyPeEQEDgi9UM5VUhrSZ9/lj6VU74Z67nBnAF7XSg=; b=R60Vw7BXfeRYqlL0ECY8nvL7iIOtjNM2oCNad46ZJFxZ7RYBoGK5cRXzAk4qqZvOzF /WqRfs3DubHIXDHs+cj6GngbDjVaU+e1NOH53WsEmlVWR46Q5SqbhyL0VGktyJCRdxqq QeChrVLl9yCGTTC3Rqn4NQPt8MHimFOz3Q0bWwyCdm8hJHlwhnm2YviXRCGgnct8lsKm pit9tFSVNosuEN3bcFQRSiVur7oicNLNp5Aober49OFMJRsl089TDBhOudRtz7rELJJV oCQpfPcm7mZN8I4C+0+xoNp+nwxEdzEgx8VRT6LLwJufkWmFe8YEoRcXPITQeHoIoRfM 5zdg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=BBcnRZRl; 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 u12-v6sor11725647wrm.2.2018.05.08.10.21.15 for (Google Transport Security); Tue, 08 May 2018 10:21:15 -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=BBcnRZRl; 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 :in-reply-to:references; bh=zxZyPeEQEDgi9UM5VUhrSZ9/lj6VU74Z67nBnAF7XSg=; b=BBcnRZRldd/D5kieiF4us92PN40aDD9fUSKNrrd7oBPom86MuBFMP1BBZYKkRnKJFT lH9SoS8u0+bM3iKW6H9Yke7TLsWtLO1Onblen1n+iMSDMcqTj/TIlE67BW3SbW7tw3EG kbtXTNjsRAJB3O3sePSUcrb64xf5FVRS48jbg0ESCnVB4ylgsgyqVTEhBhe1iCAnc0uX PQFqOBBD+RjK6GEYyMt3gUw71K/syhqG+C2h8zaqht37m3jbr+sO5epVVCEN1bU2lgLl jwBWMk0tM3HLOAmuMLVGn4zva8Ntw9aS6qY6kJR4jULNXSfuCxO2n/oErDPO3DynkykG LzEg== X-Google-Smtp-Source: AB8JxZpDumM/TD0EjKCSoyz7ReszirZt0h9gGCRtd2LtCRQCo/ON8CiA155I5DxqaJQh8q+envuTNw== X-Received: by 2002:adf:a00d:: with SMTP id k13-v6mr33122889wrk.39.1525800074707; Tue, 08 May 2018 10:21:14 -0700 (PDT) Received: from andreyknvl0.muc.corp.google.com ([2a00:79e0:15:10:84be:a42a:826d:c530]) by smtp.gmail.com with ESMTPSA id m134sm14178311wmg.4.2018.05.08.10.21.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 08 May 2018 10:21:13 -0700 (PDT) From: Andrey Konovalov To: Andrey Ryabinin , Alexander Potapenko , Dmitry Vyukov , Jonathan Corbet , Catalin Marinas , Will Deacon , Christopher Li , Christoph Lameter , Pekka Enberg , David Rientjes , Joonsoo Kim , Andrew Morton , Masahiro Yamada , Michal Marek , Andrey Konovalov , Mark Rutland , Nick Desaulniers , Yury Norov , Marc Zyngier , Kristina Martsenko , Suzuki K Poulose , Punit Agrawal , Dave Martin , Ard Biesheuvel , James Morse , Michael Weiser , Julien Thierry , Tyler Baicar , "Eric W . Biederman" , Thomas Gleixner , Ingo Molnar , Kees Cook , Sandipan Das , David Woodhouse , Paul Lawrence , Herbert Xu , Josh Poimboeuf , Geert Uytterhoeven , Tom Lendacky , Arnd Bergmann , Dan Williams , Michal Hocko , Jan Kara , Ross Zwisler , =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , Matthew Wilcox , "Kirill A . Shutemov" , Souptick Joarder , Hugh Dickins , Davidlohr Bueso , Greg Kroah-Hartman , Philippe Ombredanne , Kate Stewart , Laura Abbott , Boris Brezillon , Vlastimil Babka , Pintu Agarwal , Doug Berger , Anshuman Khandual , Mike Rapoport , Mel Gorman , Pavel Tatashin , Tetsuo Handa , 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 , Kees Cook , Jann Horn , Mark Brand , Chintan Pandya Subject: [PATCH v1 03/16] khwasan: add CONFIG_KASAN_GENERIC and CONFIG_KASAN_HW Date: Tue, 8 May 2018 19:20:49 +0200 Message-Id: X-Mailer: git-send-email 2.17.0.441.gb46fe60e1d-goog In-Reply-To: References: 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 This commit splits the current CONFIG_KASAN config option into two: 1. CONFIG_KASAN_GENERIC, that enables the generic software-only KASAN version (the one that exists now); 2. CONFIG_KASAN_HW, that enables KHWASAN. With CONFIG_KASAN_HW enabled, compiler options are changed to instrument kernel files wiht -fsantize=hwaddress (except the ones for which KASAN_SANITIZE := n is set). Both CONFIG_KASAN_GENERIC and CONFIG_KASAN_HW support both CONFIG_KASAN_INLINE and CONFIG_KASAN_OUTLINE instrumentation modes. This commit also adds empty placeholder (for now) implementation of KHWASAN specific hooks inserted by the compiler and adjusts common hooks implementation to compile correctly with each of the config options. Signed-off-by: Andrey Konovalov --- arch/arm64/Kconfig | 1 + include/linux/compiler-clang.h | 5 ++- include/linux/compiler-gcc.h | 4 ++ include/linux/compiler.h | 3 +- include/linux/kasan.h | 16 +++++-- lib/Kconfig.kasan | 76 ++++++++++++++++++++++++++-------- mm/kasan/Makefile | 6 ++- mm/kasan/kasan.h | 11 ++++- mm/kasan/khwasan.c | 75 +++++++++++++++++++++++++++++++++ mm/slub.c | 2 +- scripts/Makefile.kasan | 27 +++++++++++- 11 files changed, 198 insertions(+), 28 deletions(-) create mode 100644 mm/kasan/khwasan.c diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index eb2cf4938f6d..6553aaa61e6a 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -88,6 +88,7 @@ config ARM64 select HAVE_ARCH_HUGE_VMAP select HAVE_ARCH_JUMP_LABEL select HAVE_ARCH_KASAN if !(ARM64_16K_PAGES && ARM64_VA_BITS_48) + select HAVE_ARCH_KASAN_HW if !(ARM64_16K_PAGES && ARM64_VA_BITS_48) select HAVE_ARCH_KGDB select HAVE_ARCH_MMAP_RND_BITS select HAVE_ARCH_MMAP_RND_COMPAT_BITS if COMPAT diff --git a/include/linux/compiler-clang.h b/include/linux/compiler-clang.h index 7d98e263e048..72681c6fd418 100644 --- a/include/linux/compiler-clang.h +++ b/include/linux/compiler-clang.h @@ -21,13 +21,16 @@ #define KASAN_ABI_VERSION 5 /* emulate gcc's __SANITIZE_ADDRESS__ flag */ -#if __has_feature(address_sanitizer) +#if __has_feature(address_sanitizer) || __has_feature(hwaddress_sanitizer) #define __SANITIZE_ADDRESS__ #endif #undef __no_sanitize_address #define __no_sanitize_address __attribute__((no_sanitize("address"))) +#undef __no_sanitize_hwaddress +#define __no_sanitize_hwaddress __attribute__((no_sanitize("hwaddress"))) + /* Clang doesn't have a way to turn it off per-function, yet. */ #ifdef __noretpoline #undef __noretpoline diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h index b4bf73f5e38f..00a51feb786d 100644 --- a/include/linux/compiler-gcc.h +++ b/include/linux/compiler-gcc.h @@ -338,6 +338,10 @@ #define __no_sanitize_address #endif +#if !defined(__no_sanitize_hwaddress) +#define __no_sanitize_hwaddress /* gcc doesn't support KHWASAN */ +#endif + /* * A trick to suppress uninitialized variable warning without generating any * code diff --git a/include/linux/compiler.h b/include/linux/compiler.h index ab4711c63601..6142bae513e8 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -195,7 +195,8 @@ void __read_once_size(const volatile void *p, void *res, int size) * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368 * '__maybe_unused' allows us to avoid defined-but-not-used warnings. */ -# define __no_kasan_or_inline __no_sanitize_address __maybe_unused +# define __no_kasan_or_inline __no_sanitize_address __no_sanitize_hwaddress \ + __maybe_unused #else # define __no_kasan_or_inline __always_inline #endif diff --git a/include/linux/kasan.h b/include/linux/kasan.h index cbdc54543803..6608aa9b35ac 100644 --- a/include/linux/kasan.h +++ b/include/linux/kasan.h @@ -45,8 +45,6 @@ void kasan_free_pages(struct page *page, unsigned int order); void kasan_cache_create(struct kmem_cache *cache, unsigned int *size, slab_flags_t *flags); -void kasan_cache_shrink(struct kmem_cache *cache); -void kasan_cache_shutdown(struct kmem_cache *cache); void kasan_poison_slab(struct page *page); void kasan_unpoison_object_data(struct kmem_cache *cache, void *object); @@ -94,8 +92,6 @@ static inline void kasan_free_pages(struct page *page, unsigned int order) {} static inline void kasan_cache_create(struct kmem_cache *cache, unsigned int *size, slab_flags_t *flags) {} -static inline void kasan_cache_shrink(struct kmem_cache *cache) {} -static inline void kasan_cache_shutdown(struct kmem_cache *cache) {} static inline void kasan_poison_slab(struct page *page) {} static inline void kasan_unpoison_object_data(struct kmem_cache *cache, @@ -141,4 +137,16 @@ static inline size_t kasan_metadata_size(struct kmem_cache *cache) { return 0; } #endif /* CONFIG_KASAN */ +#ifdef CONFIG_KASAN_GENERIC + +void kasan_cache_shrink(struct kmem_cache *cache); +void kasan_cache_shutdown(struct kmem_cache *cache); + +#else /* CONFIG_KASAN_GENERIC */ + +static inline void kasan_cache_shrink(struct kmem_cache *cache) {} +static inline void kasan_cache_shutdown(struct kmem_cache *cache) {} + +#endif /* CONFIG_KASAN_GENERIC */ + #endif /* LINUX_KASAN_H */ diff --git a/lib/Kconfig.kasan b/lib/Kconfig.kasan index 3d35d062970d..baf2619b7ff4 100644 --- a/lib/Kconfig.kasan +++ b/lib/Kconfig.kasan @@ -1,33 +1,73 @@ config HAVE_ARCH_KASAN bool +config HAVE_ARCH_KASAN_HW + bool + if HAVE_ARCH_KASAN config KASAN - bool "KASan: runtime memory debugger" + bool "KASAN: runtime memory debugger" + help + Enables KASAN (KernelAddressSANitizer) - runtime memory debugger, + designed to find out-of-bounds accesses and use-after-free bugs. + +choice + prompt "KASAN mode" + depends on KASAN + default KASAN_GENERIC + help + KASAN has two modes: KASAN (a classic version, similar to userspace + ASan, enabled with CONFIG_KASAN_GENERIC) and KHWASAN (a version + based on pointer tagging, only for arm64, similar to userspace + HWASan, enabled with CONFIG_KASAN_HW). + +config KASAN_GENERIC + bool "KASAN: the generic mode" depends on SLUB || (SLAB && !DEBUG_SLAB) select CONSTRUCTORS select STACKDEPOT help - Enables kernel address sanitizer - runtime memory debugger, - designed to find out-of-bounds accesses and use-after-free bugs. - This is strictly a debugging feature and it requires a gcc version - of 4.9.2 or later. Detection of out of bounds accesses to stack or - global variables requires gcc 5.0 or later. - This feature consumes about 1/8 of available memory and brings about - ~x3 performance slowdown. + Enables the generic mode of KASAN. + This is strictly a debugging feature and it requires a GCC version + of 4.9.2 or later. Detection of out-of-bounds accesses to stack or + global variables requires GCC 5.0 or later. + This mode consumes about 1/8 of available memory at kernel start + and introduces an overhead of ~x1.5 for the rest of the allocations. + The performance slowdown is ~x3. + For better error detection enable CONFIG_STACKTRACE. + Currently CONFIG_KASAN_GENERIC doesn't work with CONFIG_DEBUG_SLAB + (the resulting kernel does not boot). + +if HAVE_ARCH_KASAN_HW + +config KASAN_HW + bool "KHWASAN: the hardware assisted mode" + depends on SLUB || (SLAB && !DEBUG_SLAB) + select CONSTRUCTORS + select STACKDEPOT + help + Enabled KHWASAN (KASAN mode based on pointer tagging). + This mode requires Top Byte Ignore support by the CPU and therefore + only supported for arm64. + This feature requires clang revision 330044 or later. + This mode consumes about 1/16 of available memory at kernel start + and introduces an overhead of ~20% for the rest of the allocations. For better error detection enable CONFIG_STACKTRACE. - Currently CONFIG_KASAN doesn't work with CONFIG_DEBUG_SLAB + Currently CONFIG_KASAN_HW doesn't work with CONFIG_DEBUG_SLAB (the resulting kernel does not boot). +endif + +endchoice + config KASAN_EXTRA - bool "KAsan: extra checks" - depends on KASAN && DEBUG_KERNEL && !COMPILE_TEST + bool "KASAN: extra checks" + depends on KASAN_GENERIC && DEBUG_KERNEL && !COMPILE_TEST help - This enables further checks in the kernel address sanitizer, for now - it only includes the address-use-after-scope check that can lead - to excessive kernel stack usage, frame size warnings and longer - compile time. + This enables further checks in KASAN, for now it only includes the + address-use-after-scope check that can lead to excessive kernel + stack usage, frame size warnings and longer compile time. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81715 has more @@ -52,16 +92,16 @@ config KASAN_INLINE memory accesses. This is faster than outline (in some workloads it gives about x2 boost over outline instrumentation), but make kernel's .text size much bigger. - This requires a gcc version of 5.0 or later. + For CONFIG_KASAN_GENERIC this requires GCC 5.0 or later. endchoice config TEST_KASAN - tristate "Module for testing kasan for bug detection" + tristate "Module for testing KASAN for bug detection" depends on m && KASAN help This is a test module doing various nasty things like out of bounds accesses, use after free. It is useful for testing - kernel debugging features like kernel address sanitizer. + kernel debugging features like KASAN. endif diff --git a/mm/kasan/Makefile b/mm/kasan/Makefile index a6df14bffb6b..14955add96d3 100644 --- a/mm/kasan/Makefile +++ b/mm/kasan/Makefile @@ -2,6 +2,7 @@ KASAN_SANITIZE := n UBSAN_SANITIZE_common.o := n UBSAN_SANITIZE_kasan.o := n +UBSAN_SANITIZE_khwasan.o := n KCOV_INSTRUMENT := n CFLAGS_REMOVE_kasan.o = -pg @@ -10,5 +11,8 @@ CFLAGS_REMOVE_kasan.o = -pg CFLAGS_common.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector) CFLAGS_kasan.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector) +CFLAGS_khwasan.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector) -obj-y := common.o kasan.o report.o kasan_init.o quarantine.o +obj-$(CONFIG_KASAN) := common.o kasan_init.o report.o +obj-$(CONFIG_KASAN_GENERIC) += kasan.o quarantine.o +obj-$(CONFIG_KASAN_HW) += khwasan.o diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h index c39039308b98..5091a433f266 100644 --- a/mm/kasan/kasan.h +++ b/mm/kasan/kasan.h @@ -98,7 +98,15 @@ struct kasan_alloc_meta *get_alloc_info(struct kmem_cache *cache, const void *object); struct kasan_free_meta *get_free_info(struct kmem_cache *cache, const void *object); + +#ifdef CONFIG_KASAN_GENERIC unsigned int optimal_redzone(unsigned int object_size); +#else +static inline unsigned int optimal_redzone(unsigned int object_size) +{ + return 0; +} +#endif static inline const void *kasan_shadow_to_mem(const void *shadow_addr) { @@ -115,7 +123,8 @@ void kasan_report(unsigned long addr, size_t size, bool is_write, unsigned long ip); void kasan_report_invalid_free(void *object, unsigned long ip); -#if defined(CONFIG_SLAB) || defined(CONFIG_SLUB) +#if defined(CONFIG_KASAN_GENERIC) && \ + (defined(CONFIG_SLAB) || defined(CONFIG_SLUB)) void quarantine_put(struct kasan_free_meta *info, struct kmem_cache *cache); void quarantine_reduce(void); void quarantine_remove_cache(struct kmem_cache *cache); diff --git a/mm/kasan/khwasan.c b/mm/kasan/khwasan.c new file mode 100644 index 000000000000..e2c3a7f7fd1f --- /dev/null +++ b/mm/kasan/khwasan.c @@ -0,0 +1,75 @@ +/* + * This file contains core KHWASAN code. + * + * Copyright (c) 2018 Google, Inc. + * Author: Andrey Konovalov + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +#define DISABLE_BRANCH_PROFILING + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "kasan.h" +#include "../slab.h" + +void check_memory_region(unsigned long addr, size_t size, bool write, + unsigned long ret_ip) +{ +} + +#define DEFINE_HWASAN_LOAD_STORE(size) \ + void __hwasan_load##size##_noabort(unsigned long addr) \ + { \ + } \ + EXPORT_SYMBOL(__hwasan_load##size##_noabort); \ + void __hwasan_store##size##_noabort(unsigned long addr) \ + { \ + } \ + EXPORT_SYMBOL(__hwasan_store##size##_noabort) + +DEFINE_HWASAN_LOAD_STORE(1); +DEFINE_HWASAN_LOAD_STORE(2); +DEFINE_HWASAN_LOAD_STORE(4); +DEFINE_HWASAN_LOAD_STORE(8); +DEFINE_HWASAN_LOAD_STORE(16); + +void __hwasan_loadN_noabort(unsigned long addr, unsigned long size) +{ +} +EXPORT_SYMBOL(__hwasan_loadN_noabort); + +void __hwasan_storeN_noabort(unsigned long addr, unsigned long size) +{ +} +EXPORT_SYMBOL(__hwasan_storeN_noabort); + +void __hwasan_tag_memory(unsigned long addr, u8 tag, unsigned long size) +{ +} +EXPORT_SYMBOL(__hwasan_tag_memory); diff --git a/mm/slub.c b/mm/slub.c index 4fcd1442a761..b3118f7ea92a 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -2989,7 +2989,7 @@ static __always_inline void slab_free(struct kmem_cache *s, struct page *page, do_slab_free(s, page, head, tail, cnt, addr); } -#ifdef CONFIG_KASAN +#ifdef CONFIG_KASAN_GENERIC void ___cache_free(struct kmem_cache *cache, void *x, unsigned long addr) { do_slab_free(cache, virt_to_head_page(x), x, NULL, 1, addr); diff --git a/scripts/Makefile.kasan b/scripts/Makefile.kasan index 69552a39951d..47023daf5606 100644 --- a/scripts/Makefile.kasan +++ b/scripts/Makefile.kasan @@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 -ifdef CONFIG_KASAN +ifdef CONFIG_KASAN_GENERIC ifdef CONFIG_KASAN_INLINE call_threshold := 10000 else @@ -45,3 +45,28 @@ endif CFLAGS_KASAN_NOSANITIZE := -fno-builtin endif + +ifdef CONFIG_KASAN_HW + +ifdef CONFIG_KASAN_INLINE + instrumentation_flags := -mllvm -hwasan-mapping-offset=$(KASAN_SHADOW_OFFSET) +else + instrumentation_flags := -mllvm -hwasan-instrument-with-calls=1 +endif + +CFLAGS_KASAN_MINIMAL := -fsanitize=kernel-hwaddress + +ifeq ($(call cc-option, $(CFLAGS_KASAN_MINIMAL) -Werror),) + ifneq ($(CONFIG_COMPILE_TEST),y) + $(warning Cannot use CONFIG_KASAN_HW: \ + -fsanitize=hwaddress is not supported by compiler) + endif +else + CFLAGS_KASAN := $(call cc-option, -fsanitize=kernel-hwaddress \ + -mllvm -hwasan-instrument-stack=0 \ + $(instrumentation_flags)) +endif + +CFLAGS_KASAN_NOSANITIZE := -fno-builtin + +endif