From patchwork Fri Feb 15 00:04:37 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Axtens X-Patchwork-Id: 1042532 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 440trD2Zwrz9s5c for ; Fri, 15 Feb 2019 11:07:56 +1100 (AEDT) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=axtens.net Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=axtens.net header.i=@axtens.net header.b="p7euoJqP"; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 440trD1DtqzDqWc for ; Fri, 15 Feb 2019 11:07:56 +1100 (AEDT) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=axtens.net (client-ip=2607:f8b0:4864:20::441; helo=mail-pf1-x441.google.com; envelope-from=dja@axtens.net; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=axtens.net Authentication-Results: lists.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=axtens.net header.i=@axtens.net header.b="p7euoJqP"; dkim-atps=neutral Received: from mail-pf1-x441.google.com (mail-pf1-x441.google.com [IPv6:2607:f8b0:4864:20::441]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 440tmp0mQ8zDqTj for ; Fri, 15 Feb 2019 11:04:58 +1100 (AEDT) Received: by mail-pf1-x441.google.com with SMTP id n22so3931743pfa.3 for ; Thu, 14 Feb 2019 16:04:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=axtens.net; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=69XOFaUt1Sn73qwRTNzOBLCHHueomRAslHtiV5tNof4=; b=p7euoJqPQFQkISmJHLegGwf3FVJobCyfd3R88dyHZAAn706p+Qd9QDwRjtUxQ24A+1 TkMu2vTWdbWmyi7MOu7RNDduyYBxhSHZymYAWBeo6A6cAoEZ+eTTgq8tWVHLi9vKvdRK 8Ii/QtMJO83g6IsLSh7YSwyW6ZuXHSiErJzFY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=69XOFaUt1Sn73qwRTNzOBLCHHueomRAslHtiV5tNof4=; b=a619MpkSRaYCF7E4aKTSNJJdvaiXEmjoIll2CDYX6IASLhu1qDOi0E18YQdlreTvfD bOyB9+57M9RNRTVrNIGu8Oh9gmyeEUiKbVFZeh9ltlrP13TzvPcyiTYpP3kgk/olzSqT H8hfXw2e5u+YTVewg51QF9lIUd5Zo5LxWxxfqM9r4bclvFMQ5wdppO9ak/PFNprFJkd5 U3S1VqGwYwkMnC9XL+25Gegf7VUfMYE975PdGJbe6GlpHZbfwqk7ECHrDoJa7PxQ/DU8 t4yCdOzKX6lwrKNfSBU3yN75ZSq1zZy+audlPghHgTC+oYZFvgpuXCoMluzvpgMy9Tqo pRoA== X-Gm-Message-State: AHQUAubEl8f0RySa8qz47EClgeqUNtP1Z/nbBTle/lOfrMOlBfPDrGK9 8tps4Vt8G4viTnt/JoHIzh5c0aooxa4= X-Google-Smtp-Source: AHgI3IanI2WiJzv/j2O1y0gD2M6CMVbp5eSMjzsZPO2QASpXjYNn5GDm8rGRD9b72J02f53id7D8+Q== X-Received: by 2002:a63:2c8a:: with SMTP id s132mr2549442pgs.440.1550189096253; Thu, 14 Feb 2019 16:04:56 -0800 (PST) Received: from localhost (124-171-165-212.dyn.iinet.net.au. [124.171.165.212]) by smtp.gmail.com with ESMTPSA id j5sm4386120pfe.84.2019.02.14.16.04.54 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 14 Feb 2019 16:04:55 -0800 (PST) From: Daniel Axtens To: aneesh.kumar@linux.ibm.com, christophe.leroy@c-s.fr, bsingharora@gmail.com Subject: [RFC PATCH 1/5] kasan: do not open-code addr_has_shadow Date: Fri, 15 Feb 2019 11:04:37 +1100 Message-Id: <20190215000441.14323-2-dja@axtens.net> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190215000441.14323-1-dja@axtens.net> References: <20190215000441.14323-1-dja@axtens.net> MIME-Version: 1.0 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linuxppc-dev@lists.ozlabs.org, kasan-dev@googlegroups.com, Daniel Axtens Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" We have a couple of places checking for the existence of a shadow mapping for an address by open-coding the inverse of the check in addr_has_shadow. Replace the open-coded versions with the helper. This will be needed in future to allow architectures to override the layout of the shadow mapping. Signed-off-by: Daniel Axtens Reviewed-by: Andrew Donnellan Reviewed-by: Dmitry Vyukov --- mm/kasan/generic.c | 3 +-- mm/kasan/tags.c | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/mm/kasan/generic.c b/mm/kasan/generic.c index ccb6207276e3..ffc64a9a97a5 100644 --- a/mm/kasan/generic.c +++ b/mm/kasan/generic.c @@ -173,8 +173,7 @@ static __always_inline void check_memory_region_inline(unsigned long addr, if (unlikely(size == 0)) return; - if (unlikely((void *)addr < - kasan_shadow_to_mem((void *)KASAN_SHADOW_START))) { + if (unlikely(!addr_has_shadow((void *)addr))) { kasan_report(addr, size, write, ret_ip); return; } diff --git a/mm/kasan/tags.c b/mm/kasan/tags.c index 0777649e07c4..bc759f8f1c67 100644 --- a/mm/kasan/tags.c +++ b/mm/kasan/tags.c @@ -109,8 +109,7 @@ void check_memory_region(unsigned long addr, size_t size, bool write, return; untagged_addr = reset_tag((const void *)addr); - if (unlikely(untagged_addr < - kasan_shadow_to_mem((void *)KASAN_SHADOW_START))) { + if (unlikely(!addr_has_shadow(untagged_addr))) { kasan_report(addr, size, write, ret_ip); return; } From patchwork Fri Feb 15 00:04:38 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Axtens X-Patchwork-Id: 1042533 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 440tst2q4wz9s5c for ; Fri, 15 Feb 2019 11:09:22 +1100 (AEDT) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=axtens.net Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=axtens.net header.i=@axtens.net header.b="MQcNb/lD"; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 440tst1v17zDqVp for ; Fri, 15 Feb 2019 11:09:22 +1100 (AEDT) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=axtens.net (client-ip=2607:f8b0:4864:20::641; helo=mail-pl1-x641.google.com; envelope-from=dja@axtens.net; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=axtens.net Authentication-Results: lists.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=axtens.net header.i=@axtens.net header.b="MQcNb/lD"; dkim-atps=neutral Received: from mail-pl1-x641.google.com (mail-pl1-x641.google.com [IPv6:2607:f8b0:4864:20::641]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 440tms6t0pzDqW6 for ; Fri, 15 Feb 2019 11:05:01 +1100 (AEDT) Received: by mail-pl1-x641.google.com with SMTP id b5so4018548plr.4 for ; Thu, 14 Feb 2019 16:05:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=axtens.net; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=reIvZujlRlaW1QSePQN68vjqnN4BTGKA/65ygZGxFlM=; b=MQcNb/lD2iW2CHmAdLCRzj+hF5NsCkD9NjYEoDeGebrMUvIFj4RkOAT/OlVBYVp700 QOmIsCrgF4H+TXVxZPvbZC7FQK/kcNFDToZY4uZcYDawQK6FUXF49nVp3jmt+/M1U6lH IR71g92Yebs+SIkj/G1HUENlPKFcKbVMVu9G4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=reIvZujlRlaW1QSePQN68vjqnN4BTGKA/65ygZGxFlM=; b=sGM0nIog2DgScig+Gxe9T3VxZysVvlDB+pOMvmOkKnjh0pFTZtnLpj4g4ljxnnFUQP FIJsjDia4FG8EQgt4T4PE4wL/0u0LAx16Eqkz/756mfKajSNN9zNlHUAm+xUMHuZSzCb lOwLwIcnpMbn4YmfssPGx8BeXMBVigbxPbX2i8GQNw3Ivuytuw5z31yMj3dFtf+i1Vc/ iMu172Cqy/FH76P+zkx5fIRsdE0RmCipvebE4F8hYH3nUWkurfkOAld4HH+JP+qsuWys pr6l3WHx34o5sB+n6tQOR6XkgrOil2+qEhgaEhwvtgM2uzF0nMSuxutO5oUD0NX9qwZi t1Wg== X-Gm-Message-State: AHQUAuY3MZeTqsusFnVs73TtKVFzjtA7wgxAC7ier5saOJDk2zcpnLwt HXI0kypjGKYIcOLXZKxp37Kqiw== X-Google-Smtp-Source: AHgI3IZ+UfCn/SDcXbpn4uePscEZ+0tTNsGlHtutsQs/b5DPx9ZqliM7kjdI00CP/yiXYvWew7khdA== X-Received: by 2002:a17:902:a588:: with SMTP id az8mr7034803plb.77.1550189100192; Thu, 14 Feb 2019 16:05:00 -0800 (PST) Received: from localhost (124-171-165-212.dyn.iinet.net.au. [124.171.165.212]) by smtp.gmail.com with ESMTPSA id t3sm6745256pfa.50.2019.02.14.16.04.58 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 14 Feb 2019 16:04:59 -0800 (PST) From: Daniel Axtens To: aneesh.kumar@linux.ibm.com, christophe.leroy@c-s.fr, bsingharora@gmail.com Subject: [RFC PATCH 2/5] kasan: allow architectures to manage the memory-to-shadow mapping Date: Fri, 15 Feb 2019 11:04:38 +1100 Message-Id: <20190215000441.14323-3-dja@axtens.net> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190215000441.14323-1-dja@axtens.net> References: <20190215000441.14323-1-dja@axtens.net> MIME-Version: 1.0 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linuxppc-dev@lists.ozlabs.org, kasan-dev@googlegroups.com, Daniel Axtens Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" Currently, shadow addresses are always addr >> shift + offset. However, for powerpc, the virtual address space is fragmented in ways that make this simple scheme impractical. Allow architectures to override: - kasan_shadow_to_mem - kasan_mem_to_shadow - addr_has_shadow Rename addr_has_shadow to kasan_addr_has_shadow as if it is overridden it will be available in more places, increasing the risk of collisions. If architectures do not #define their own versions, the generic code will continue to run as usual. Signed-off-by: Daniel Axtens Reviewed-by: Dmitry Vyukov --- include/linux/kasan.h | 2 ++ mm/kasan/generic.c | 2 +- mm/kasan/generic_report.c | 2 +- mm/kasan/kasan.h | 6 +++++- mm/kasan/report.c | 6 +++--- mm/kasan/tags.c | 2 +- 6 files changed, 13 insertions(+), 7 deletions(-) diff --git a/include/linux/kasan.h b/include/linux/kasan.h index b40ea104dd36..f6261840f94c 100644 --- a/include/linux/kasan.h +++ b/include/linux/kasan.h @@ -23,11 +23,13 @@ extern p4d_t kasan_early_shadow_p4d[MAX_PTRS_PER_P4D]; int kasan_populate_early_shadow(const void *shadow_start, const void *shadow_end); +#ifndef kasan_mem_to_shadow static inline void *kasan_mem_to_shadow(const void *addr) { return (void *)((unsigned long)addr >> KASAN_SHADOW_SCALE_SHIFT) + KASAN_SHADOW_OFFSET; } +#endif /* Enable reporting bugs after kasan_disable_current() */ extern void kasan_enable_current(void); diff --git a/mm/kasan/generic.c b/mm/kasan/generic.c index ffc64a9a97a5..bafa2f986660 100644 --- a/mm/kasan/generic.c +++ b/mm/kasan/generic.c @@ -173,7 +173,7 @@ static __always_inline void check_memory_region_inline(unsigned long addr, if (unlikely(size == 0)) return; - if (unlikely(!addr_has_shadow((void *)addr))) { + if (unlikely(!kasan_addr_has_shadow((void *)addr))) { kasan_report(addr, size, write, ret_ip); return; } diff --git a/mm/kasan/generic_report.c b/mm/kasan/generic_report.c index 5e12035888f2..854f4de1fe10 100644 --- a/mm/kasan/generic_report.c +++ b/mm/kasan/generic_report.c @@ -110,7 +110,7 @@ static const char *get_wild_bug_type(struct kasan_access_info *info) const char *get_bug_type(struct kasan_access_info *info) { - if (addr_has_shadow(info->access_addr)) + if (kasan_addr_has_shadow(info->access_addr)) return get_shadow_bug_type(info); return get_wild_bug_type(info); } diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h index ea51b2d898ec..57ec24cf7bd1 100644 --- a/mm/kasan/kasan.h +++ b/mm/kasan/kasan.h @@ -111,16 +111,20 @@ struct kasan_alloc_meta *get_alloc_info(struct kmem_cache *cache, struct kasan_free_meta *get_free_info(struct kmem_cache *cache, const void *object); +#ifndef kasan_shadow_to_mem static inline const void *kasan_shadow_to_mem(const void *shadow_addr) { return (void *)(((unsigned long)shadow_addr - KASAN_SHADOW_OFFSET) << KASAN_SHADOW_SCALE_SHIFT); } +#endif -static inline bool addr_has_shadow(const void *addr) +#ifndef kasan_addr_has_shadow +static inline bool kasan_addr_has_shadow(const void *addr) { return (addr >= kasan_shadow_to_mem((void *)KASAN_SHADOW_START)); } +#endif void kasan_poison_shadow(const void *address, size_t size, u8 value); diff --git a/mm/kasan/report.c b/mm/kasan/report.c index ca9418fe9232..bc3355ee2dd0 100644 --- a/mm/kasan/report.c +++ b/mm/kasan/report.c @@ -298,7 +298,7 @@ void kasan_report(unsigned long addr, size_t size, untagged_addr = reset_tag(tagged_addr); info.access_addr = tagged_addr; - if (addr_has_shadow(untagged_addr)) + if (kasan_addr_has_shadow(untagged_addr)) info.first_bad_addr = find_first_bad_addr(tagged_addr, size); else info.first_bad_addr = untagged_addr; @@ -309,11 +309,11 @@ void kasan_report(unsigned long addr, size_t size, start_report(&flags); print_error_description(&info); - if (addr_has_shadow(untagged_addr)) + if (kasan_addr_has_shadow(untagged_addr)) print_tags(get_tag(tagged_addr), info.first_bad_addr); pr_err("\n"); - if (addr_has_shadow(untagged_addr)) { + if (kasan_addr_has_shadow(untagged_addr)) { print_address_description(untagged_addr); pr_err("\n"); print_shadow_for_address(info.first_bad_addr); diff --git a/mm/kasan/tags.c b/mm/kasan/tags.c index bc759f8f1c67..cdefd0fe1f5d 100644 --- a/mm/kasan/tags.c +++ b/mm/kasan/tags.c @@ -109,7 +109,7 @@ void check_memory_region(unsigned long addr, size_t size, bool write, return; untagged_addr = reset_tag((const void *)addr); - if (unlikely(!addr_has_shadow(untagged_addr))) { + if (unlikely(!kasan_addr_has_shadow(untagged_addr))) { kasan_report(addr, size, write, ret_ip); return; } From patchwork Fri Feb 15 00:04:39 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Axtens X-Patchwork-Id: 1042534 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 440tvk3jdtz9s5c for ; Fri, 15 Feb 2019 11:10:58 +1100 (AEDT) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=axtens.net Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=axtens.net header.i=@axtens.net header.b="bSeL2yPp"; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 440tvk2S85zDqCR for ; Fri, 15 Feb 2019 11:10:58 +1100 (AEDT) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=axtens.net (client-ip=2607:f8b0:4864:20::644; helo=mail-pl1-x644.google.com; envelope-from=dja@axtens.net; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=axtens.net Authentication-Results: lists.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=axtens.net header.i=@axtens.net header.b="bSeL2yPp"; dkim-atps=neutral Received: from mail-pl1-x644.google.com (mail-pl1-x644.google.com [IPv6:2607:f8b0:4864:20::644]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 440tmy04z2zDqXd for ; Fri, 15 Feb 2019 11:05:05 +1100 (AEDT) Received: by mail-pl1-x644.google.com with SMTP id k15so4003387pls.8 for ; Thu, 14 Feb 2019 16:05:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=axtens.net; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=p2egav4fAG375GOuS+egjg+nfkVekpMJLDtsBFpP9fc=; b=bSeL2yPpLtP2R+D9Ijw2mOdNvMzXbbrqce8VboBkFX+McvnSJuD9u5HZDZ2hztx5A2 NdIMc5u0mnd25ywHI7G/bt6ndkqbBp+ZuJ5OxJIj3v+T91ypez743hFtTKj7kH2VJjET k/mrCn1/kbqqKFVzyNWK/C/M0s16vgT5TySeU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=p2egav4fAG375GOuS+egjg+nfkVekpMJLDtsBFpP9fc=; b=TgtGwvm7Pjj/eOpAZiM/haJ9NhAns4msYrQpDhlUdTQGZeQ4TdRciDbtoq34GS1wPW t0BJzIC2DFS8TqBsM5mxso0RgILL5p+qGFxJ11PvJ3ox6JRhnXiSNZ8bWehUzDqPInb5 LBKvNv48FRk/jzyVjhGKiu+xT2MeKLCnKw7ar99qXgciac2/d7ZqtT/YWZl90s6CDAGg kmA/e7uu9AcbtgZM233F7KgJJtb2EOxEfzBmP6ZqhwUliZw/QT3oXVAkIyv5yoKvtcdR g6953r12BJmO/pe/qyImkvR/cQLz8N+LI8FGB4Yy24AktPVV8HvDuJRy8PRKByv9m/DC KODw== X-Gm-Message-State: AHQUAuYRMgLtQYSdlOsosizWgw91qdfhjcmk9w7OrStOgonlTeci9fbo oehhkHiMlS3NIqgc4BgHNJ3A2w== X-Google-Smtp-Source: AHgI3IYTQMiSTPyCPDtg6l0gBhkxTjusDGcckdrJt+0prsWEB0nOhZTeSuwE88O7sP8igwZTxrwC6w== X-Received: by 2002:a17:902:8690:: with SMTP id g16mr7208049plo.81.1550189104139; Thu, 14 Feb 2019 16:05:04 -0800 (PST) Received: from localhost (124-171-165-212.dyn.iinet.net.au. [124.171.165.212]) by smtp.gmail.com with ESMTPSA id b12sm6082023pfb.30.2019.02.14.16.05.02 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 14 Feb 2019 16:05:03 -0800 (PST) From: Daniel Axtens To: aneesh.kumar@linux.ibm.com, christophe.leroy@c-s.fr, bsingharora@gmail.com Subject: [RFC PATCH 3/5] kasan: allow architectures to provide an outline readiness check Date: Fri, 15 Feb 2019 11:04:39 +1100 Message-Id: <20190215000441.14323-4-dja@axtens.net> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190215000441.14323-1-dja@axtens.net> References: <20190215000441.14323-1-dja@axtens.net> MIME-Version: 1.0 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linuxppc-dev@lists.ozlabs.org, "Aneesh Kumar K . V" , kasan-dev@googlegroups.com, Daniel Axtens Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" In powerpc (as I understand it), we spend a lot of time in boot running in real mode before MMU paging is initalised. During this time we call a lot of generic code, including printk(). If we try to access the shadow region during this time, things fail. My attempts to move early init before the first printk have not been successful. (Both previous RFCs for ppc64 - by 2 different people - have needed this trick too!) So, allow architectures to define a check_return_arch_not_ready() hook that bails out of check_memory_region_inline() unless the arch has done all of the init. Link: https://lore.kernel.org/patchwork/patch/592820/ # ppc64 hash series Link: https://patchwork.ozlabs.org/patch/795211/ # ppc radix series Originally-by: Balbir Singh Cc: Aneesh Kumar K.V Signed-off-by: Daniel Axtens --- include/linux/kasan.h | 4 ++++ mm/kasan/generic.c | 2 ++ 2 files changed, 6 insertions(+) diff --git a/include/linux/kasan.h b/include/linux/kasan.h index f6261840f94c..83edc5e2b6a0 100644 --- a/include/linux/kasan.h +++ b/include/linux/kasan.h @@ -14,6 +14,10 @@ struct task_struct; #include #include +#ifndef check_return_arch_not_ready +#define check_return_arch_not_ready() do { } while (0) +#endif + extern unsigned char kasan_early_shadow_page[PAGE_SIZE]; extern pte_t kasan_early_shadow_pte[PTRS_PER_PTE]; extern pmd_t kasan_early_shadow_pmd[PTRS_PER_PMD]; diff --git a/mm/kasan/generic.c b/mm/kasan/generic.c index bafa2f986660..4c18bbd09a20 100644 --- a/mm/kasan/generic.c +++ b/mm/kasan/generic.c @@ -170,6 +170,8 @@ static __always_inline void check_memory_region_inline(unsigned long addr, size_t size, bool write, unsigned long ret_ip) { + check_return_arch_not_ready(); + if (unlikely(size == 0)) return; From patchwork Fri Feb 15 00:04:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Axtens X-Patchwork-Id: 1042535 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 440txw0lMCz9s5c for ; Fri, 15 Feb 2019 11:12:52 +1100 (AEDT) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=axtens.net Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=axtens.net header.i=@axtens.net header.b="XXLoczJW"; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 440txv6mZ5zDqLY for ; Fri, 15 Feb 2019 11:12:51 +1100 (AEDT) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=axtens.net (client-ip=2607:f8b0:4864:20::643; helo=mail-pl1-x643.google.com; envelope-from=dja@axtens.net; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=axtens.net Authentication-Results: lists.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=axtens.net header.i=@axtens.net header.b="XXLoczJW"; dkim-atps=neutral Received: from mail-pl1-x643.google.com (mail-pl1-x643.google.com [IPv6:2607:f8b0:4864:20::643]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 440tn24ZzdzDqTj for ; Fri, 15 Feb 2019 11:05:10 +1100 (AEDT) Received: by mail-pl1-x643.google.com with SMTP id y10so4025667plp.0 for ; Thu, 14 Feb 2019 16:05:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=axtens.net; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Qo3C0jeBqokfe3NtfWTYRIQXW1jGrTc8UlmM+hz7MCc=; b=XXLoczJWpS72wIAmROXzXe/45g/oIGzhnsxwn7GFajwz4rkkuMOFs/t+4KQdqjYvrR 41dm9Dj45q8vuC+0xWG9vnSwZSYX870pdRTfFIfNLLou4q9vjj51Z6eDk7WfDIaKzKg9 JC5RQHSd4h/pxXadQr9gVi+b6ugwuiu44pPBM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Qo3C0jeBqokfe3NtfWTYRIQXW1jGrTc8UlmM+hz7MCc=; b=cGhsTQiuNxWZVvsiulcZDRw7z6lDJA5l1dKj5h80RI/rQwesOQHFJmsfih9sstrvmv vQKLy3wVVzj80a8OayxQJ59flVB/h7upmYJYAibOUXB30Dl4OmkWs0nfxz0Znb4q8zKF vl6HmVf3QOZT1Uc8+P6E8llvkVMVnDYpamalzKRvIplYYyS4xfY3xQMiaOSWyRtkLkZR wO2KkFH6HmpxR0fo9dc8/K/a4dwyPx0EyTuVR6lL267m4mAHZHK1GU7cjZRMZvlc1W3K p58AIrD1ZJxmksB0MXtsb6Ze1zL12WexWdegbIQUXPL4zpzRHJaqWwoK6VGJy60DmDGN SRwA== X-Gm-Message-State: AHQUAubQSZ/LqEYXcq1l03JH+Rg6o5aCi1za7CCU+A3nHaQ4NHoNArDJ ItC1FyZxtxQp7rPrf3a/8Zk2mg== X-Google-Smtp-Source: AHgI3IZZ8W7wqpvA4LT/o/TQvqEK3dO37wCtHoDRA2Dd0DW2sO/oLHN2Q+LQrFhi+8lRGhVS5T7+zw== X-Received: by 2002:a17:902:3143:: with SMTP id w61mr7167138plb.253.1550189108375; Thu, 14 Feb 2019 16:05:08 -0800 (PST) Received: from localhost (124-171-165-212.dyn.iinet.net.au. [124.171.165.212]) by smtp.gmail.com with ESMTPSA id w65sm4571002pfb.23.2019.02.14.16.05.06 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 14 Feb 2019 16:05:07 -0800 (PST) From: Daniel Axtens To: aneesh.kumar@linux.ibm.com, christophe.leroy@c-s.fr, bsingharora@gmail.com Subject: [RFC PATCH 4/5] powerpc: move KASAN into its own subdirectory Date: Fri, 15 Feb 2019 11:04:40 +1100 Message-Id: <20190215000441.14323-5-dja@axtens.net> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190215000441.14323-1-dja@axtens.net> References: <20190215000441.14323-1-dja@axtens.net> MIME-Version: 1.0 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linuxppc-dev@lists.ozlabs.org, kasan-dev@googlegroups.com, Daniel Axtens Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" In preparation for adding ppc64 implementations, break out the code into its own subdirectory. Signed-off-by: Daniel Axtens --- arch/powerpc/mm/Makefile | 4 +--- arch/powerpc/mm/kasan/Makefile | 5 +++++ arch/powerpc/mm/{kasan_init.c => kasan/kasan_init_32.c} | 0 3 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 arch/powerpc/mm/kasan/Makefile rename arch/powerpc/mm/{kasan_init.c => kasan/kasan_init_32.c} (100%) diff --git a/arch/powerpc/mm/Makefile b/arch/powerpc/mm/Makefile index d6b76f25f6de..457c0ea2b5e7 100644 --- a/arch/powerpc/mm/Makefile +++ b/arch/powerpc/mm/Makefile @@ -7,8 +7,6 @@ ccflags-$(CONFIG_PPC64) := $(NO_MINIMAL_TOC) CFLAGS_REMOVE_slb.o = $(CC_FLAGS_FTRACE) -KASAN_SANITIZE_kasan_init.o := n - obj-y := fault.o mem.o pgtable.o mmap.o \ init_$(BITS).o pgtable_$(BITS).o \ init-common.o mmu_context.o drmem.o @@ -57,4 +55,4 @@ obj-$(CONFIG_PPC_BOOK3S_64) += dump_linuxpagetables-book3s64.o endif obj-$(CONFIG_PPC_HTDUMP) += dump_hashpagetable.o obj-$(CONFIG_PPC_MEM_KEYS) += pkeys.o -obj-$(CONFIG_KASAN) += kasan_init.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_init.c b/arch/powerpc/mm/kasan/kasan_init_32.c similarity index 100% rename from arch/powerpc/mm/kasan_init.c rename to arch/powerpc/mm/kasan/kasan_init_32.c From patchwork Fri Feb 15 00:04:41 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Axtens X-Patchwork-Id: 1042537 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 440tzj1nThz9s5c for ; Fri, 15 Feb 2019 11:14:25 +1100 (AEDT) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=axtens.net Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=axtens.net header.i=@axtens.net header.b="HXsCCvpa"; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 440tzj0TtJzDqXZ for ; Fri, 15 Feb 2019 11:14:25 +1100 (AEDT) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=axtens.net (client-ip=2607:f8b0:4864:20::444; helo=mail-pf1-x444.google.com; envelope-from=dja@axtens.net; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=axtens.net Authentication-Results: lists.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=axtens.net header.i=@axtens.net header.b="HXsCCvpa"; dkim-atps=neutral Received: from mail-pf1-x444.google.com (mail-pf1-x444.google.com [IPv6:2607:f8b0:4864:20::444]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 440tn652N9zDqWL for ; Fri, 15 Feb 2019 11:05:14 +1100 (AEDT) Received: by mail-pf1-x444.google.com with SMTP id q17so3913021pfh.10 for ; Thu, 14 Feb 2019 16:05:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=axtens.net; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=GM9/nYKTm6TxIzUund2XoyTrafcr94IFkiDCn6T5gK4=; b=HXsCCvpaoaAC0KuhG7s8GHgdKzhgxY2KZAxt4mtL3SErsCT/6YpvLVOyEF85m0tIZ4 ein1Hstmrm/pOst39VeJ7U9cOl+mYLtbJQ7IXsRHLYB4G+Nj4G/aQ7wnJDnWp5bFI0o6 OKsIAOiNbQO6POn8v1IIH52cpZRZFevlnsv/g= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=GM9/nYKTm6TxIzUund2XoyTrafcr94IFkiDCn6T5gK4=; b=ugoC9vDXeevyn40A/7Bs35QUZmO5dGUizGs2V4FKiiGoIgJ+xfcTlJ/rxFea+teirn yHiW064PjDtu8rQTO5VOObl5ory9eohbE0ZxfXkbI+zynYR0JQuO5F80KuoPxiv95ESZ 9OFA4Cde1Lcoh7JX3gCCkcyRK1AYXmHRJ9lxh6ZKCIlbWnE3SS9LXChRojekjiyqlIGv KQNwQsWTDIR5XPDvLw5J0gqrB0nhCtxu3uiH0NRAm61v3/svmTARfgTiG6G268GYM7Ag gA0QqCzp3vi08E9nB9nCPYdz2W58E5Vduxj4NvDoWUsuKEuuXbR/4rghQV4/shuVJCbw 8qAQ== X-Gm-Message-State: AHQUAuZDQ5ERVf1DF1CrsIgxkH3OW1Ffw6iNP+mBGChepc8+VP6OMuPn psilcxZ5mtbckYIKcoI56qmJqscBasw= X-Google-Smtp-Source: AHgI3IZBXtmiZ4bJDtQrK2ygwARUA9N65UFmdsrNlGigF+BTGHTUqJ3wr0rSvWZTl2Mu4Nt8qGDQgA== X-Received: by 2002:a62:9917:: with SMTP id d23mr7081026pfe.88.1550189112769; Thu, 14 Feb 2019 16:05:12 -0800 (PST) Received: from localhost (124-171-165-212.dyn.iinet.net.au. [124.171.165.212]) by smtp.gmail.com with ESMTPSA id x11sm3660259pgp.88.2019.02.14.16.05.11 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 14 Feb 2019 16:05:12 -0800 (PST) From: Daniel Axtens To: aneesh.kumar@linux.ibm.com, christophe.leroy@c-s.fr, bsingharora@gmail.com Subject: [RFC PATCH 5/5] powerpc: KASAN for 64bit Book3E Date: Fri, 15 Feb 2019 11:04:41 +1100 Message-Id: <20190215000441.14323-6-dja@axtens.net> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190215000441.14323-1-dja@axtens.net> References: <20190215000441.14323-1-dja@axtens.net> MIME-Version: 1.0 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linuxppc-dev@lists.ozlabs.org, "Aneesh Kumar K . V" , kasan-dev@googlegroups.com, Daniel Axtens Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" Wire up KASAN. Only outline instrumentation is supported. The KASAN shadow area is mapped into vmemmap space: 0x8000 0400 0000 0000 to 0x8000 0600 0000 0000. To do this we require that vmemmap be disabled. (This is the default in the kernel config that QorIQ provides for the machine in their SDK anyway - they use flat memory.) Only the kernel linear mapping (0xc000...) is checked. The vmalloc and ioremap areas (also in 0x800...) are all mapped to a zero page. As with the Book3S hash series, this requires overriding the memory <-> shadow mapping. Also, as with both previous 64-bit series, early instrumentation is not supported. It would allow us to drop the check_return_arch_not_ready() hook in the KASAN core, but it's tricky to get it set up early enough: we need it setup before the first call to instrumented code like printk(). Perhaps in the future. Only KASAN_MINIMAL works. Lightly tested on e6500. KVM, kexec and xmon have not been tested. The test_kasan module fires warnings as expected, except for the following tests: - Expected/by design: kasan test: memcg_accounted_kmem_cache allocate memcg accounted object - Due to only supporting KASAN_MINIMAL: kasan test: kasan_stack_oob out-of-bounds on stack kasan test: kasan_global_oob out-of-bounds global variable kasan test: kasan_alloca_oob_left out-of-bounds to left on alloca kasan test: kasan_alloca_oob_right out-of-bounds to right on alloca kasan test: use_after_scope_test use-after-scope on int kasan test: use_after_scope_test use-after-scope on array Thanks to those who have done the heavy lifting over the past several years: - Christophe's 32 bit series: https://lists.ozlabs.org/pipermail/linuxppc-dev/2019-February/185379.html - Aneesh's Book3S hash series: https://lwn.net/Articles/655642/ - Balbir's Book3S radix series: https://patchwork.ozlabs.org/patch/795211/ Cc: Christophe Leroy Cc: Aneesh Kumar K.V Cc: Balbir Singh Signed-off-by: Daniel Axtens --- While useful if you have a book3e device, this is mostly intended as a warm-up exercise for reviving Aneesh's series for book3s hash. In particular, changes to the kasan core are going to be required for hash and radix as well. --- arch/powerpc/Kconfig | 1 + arch/powerpc/Makefile | 2 + arch/powerpc/include/asm/kasan.h | 77 ++++++++++++++++++-- arch/powerpc/include/asm/ppc_asm.h | 7 ++ arch/powerpc/include/asm/string.h | 7 +- arch/powerpc/lib/mem_64.S | 6 +- arch/powerpc/lib/memcmp_64.S | 5 +- arch/powerpc/lib/memcpy_64.S | 3 +- arch/powerpc/lib/string.S | 15 ++-- arch/powerpc/mm/Makefile | 2 + arch/powerpc/mm/kasan/Makefile | 1 + arch/powerpc/mm/kasan/kasan_init_book3e_64.c | 53 ++++++++++++++ arch/powerpc/purgatory/Makefile | 3 + arch/powerpc/xmon/Makefile | 1 + 14 files changed, 164 insertions(+), 19 deletions(-) create mode 100644 arch/powerpc/mm/kasan/kasan_init_book3e_64.c diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 850b06def84f..2c7c20d52778 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -176,6 +176,7 @@ config PPC select HAVE_ARCH_AUDITSYSCALL select HAVE_ARCH_JUMP_LABEL select HAVE_ARCH_KASAN if PPC32 + select HAVE_ARCH_KASAN if PPC_BOOK3E_64 && !SPARSEMEM_VMEMMAP 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 f0738099e31e..21c2dadf0315 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile @@ -428,11 +428,13 @@ endif endif ifdef CONFIG_KASAN +ifdef CONFIG_PPC32 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 +endif # Check toolchain versions: # - gcc-4.6 is the minimum kernel-wide version so nothing required. diff --git a/arch/powerpc/include/asm/kasan.h b/arch/powerpc/include/asm/kasan.h index 5d0088429b62..c2f6f05dfaa3 100644 --- a/arch/powerpc/include/asm/kasan.h +++ b/arch/powerpc/include/asm/kasan.h @@ -5,20 +5,85 @@ #ifndef __ASSEMBLY__ #include +#include #include -#include #define KASAN_SHADOW_SCALE_SHIFT 3 -#define KASAN_SHADOW_SIZE ((~0UL - PAGE_OFFSET + 1) >> KASAN_SHADOW_SCALE_SHIFT) -#define KASAN_SHADOW_START (ALIGN_DOWN(FIXADDR_START - KASAN_SHADOW_SIZE, \ - PGDIR_SIZE)) -#define KASAN_SHADOW_END (KASAN_SHADOW_START + KASAN_SHADOW_SIZE) #define KASAN_SHADOW_OFFSET (KASAN_SHADOW_START - \ (PAGE_OFFSET >> KASAN_SHADOW_SCALE_SHIFT)) +#define KASAN_SHADOW_END (KASAN_SHADOW_START + KASAN_SHADOW_SIZE) + + +#ifdef CONFIG_PPC32 +#include +#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); + +#endif /* CONFIG_PPC32 */ + +#ifdef CONFIG_PPC_BOOK3E_64 +#define KASAN_SHADOW_START VMEMMAP_BASE +#define KASAN_SHADOW_SIZE (KERN_VIRT_SIZE >> KASAN_SHADOW_SCALE_SHIFT) + +extern struct static_key_false powerpc_kasan_enabled_key; +#define check_return_arch_not_ready() \ + do { \ + if (!static_branch_likely(&powerpc_kasan_enabled_key)) \ + return; \ + } while (0) + +extern unsigned char kasan_zero_page[PAGE_SIZE]; +static inline void *kasan_mem_to_shadow_book3e(const void *addr) +{ + if ((unsigned long)addr >= KERN_VIRT_START && + (unsigned long)addr < (KERN_VIRT_START + KERN_VIRT_SIZE)) { + return (void *)kasan_zero_page; + } + + return (void *)((unsigned long)addr >> KASAN_SHADOW_SCALE_SHIFT) + + KASAN_SHADOW_OFFSET; +} +#define kasan_mem_to_shadow kasan_mem_to_shadow_book3e + +static inline void *kasan_shadow_to_mem_book3e(const void *shadow_addr) +{ + /* + * We map the entire non-linear virtual mapping onto the zero page so if + * we are asked to map the zero page back just pick the beginning of that + * area. + */ + if (shadow_addr >= (void *)kasan_zero_page && + shadow_addr < (void *)(kasan_zero_page + PAGE_SIZE)) { + return (void *)KERN_VIRT_START; + } + + return (void *)(((unsigned long)shadow_addr - KASAN_SHADOW_OFFSET) + << KASAN_SHADOW_SCALE_SHIFT); +} +#define kasan_shadow_to_mem kasan_shadow_to_mem_book3e + +static inline bool kasan_addr_has_shadow_book3e(const void *addr) +{ + /* + * We want to specifically assert that the addresses in the 0x8000... + * region have a shadow, otherwise they are considered by the kasan + * core to be wild pointers + */ + if ((unsigned long)addr >= KERN_VIRT_START && + (unsigned long)addr < (KERN_VIRT_START + KERN_VIRT_SIZE)) { + return true; + } + return (addr >= kasan_shadow_to_mem((void *)KASAN_SHADOW_START)); +} +#define kasan_addr_has_shadow kasan_addr_has_shadow_book3e + +#endif /* CONFIG_PPC_BOOK3E_64 */ + void kasan_init(void); -#endif +#endif /* CONFIG_KASAN */ #endif diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h index dba2c1038363..fd7c9fa9d307 100644 --- a/arch/powerpc/include/asm/ppc_asm.h +++ b/arch/powerpc/include/asm/ppc_asm.h @@ -251,10 +251,17 @@ GLUE(.,name): #define _GLOBAL_TOC(name) _GLOBAL(name) +#endif /* 32-bit */ + +/* KASAN helpers */ #define KASAN_OVERRIDE(x, y) \ .weak x; \ .set x, y +#ifdef CONFIG_KASAN +#define EXPORT_SYMBOL_NOKASAN(x) +#else +#define EXPORT_SYMBOL_NOKASAN(x) EXPORT_SYMBOL(x) #endif /* diff --git a/arch/powerpc/include/asm/string.h b/arch/powerpc/include/asm/string.h index 64d44d4836b4..e2801d517d57 100644 --- a/arch/powerpc/include/asm/string.h +++ b/arch/powerpc/include/asm/string.h @@ -4,13 +4,16 @@ #ifdef __KERNEL__ +#ifndef CONFIG_KASAN #define __HAVE_ARCH_STRNCPY #define __HAVE_ARCH_STRNCMP +#define __HAVE_ARCH_MEMCHR +#define __HAVE_ARCH_MEMCMP +#endif + #define __HAVE_ARCH_MEMSET #define __HAVE_ARCH_MEMCPY #define __HAVE_ARCH_MEMMOVE -#define __HAVE_ARCH_MEMCMP -#define __HAVE_ARCH_MEMCHR #define __HAVE_ARCH_MEMSET16 #define __HAVE_ARCH_MEMCPY_FLUSHCACHE diff --git a/arch/powerpc/lib/mem_64.S b/arch/powerpc/lib/mem_64.S index 3c3be02f33b7..3ff4c6b45505 100644 --- a/arch/powerpc/lib/mem_64.S +++ b/arch/powerpc/lib/mem_64.S @@ -30,7 +30,8 @@ EXPORT_SYMBOL(__memset16) EXPORT_SYMBOL(__memset32) EXPORT_SYMBOL(__memset64) -_GLOBAL(memset) +_GLOBAL(__memset) +KASAN_OVERRIDE(memset, __memset) neg r0,r3 rlwimi r4,r4,8,16,23 andi. r0,r0,7 /* # bytes to be 8-byte aligned */ @@ -97,7 +98,8 @@ _GLOBAL(memset) blr EXPORT_SYMBOL(memset) -_GLOBAL_TOC(memmove) +_GLOBAL_TOC(__memmove) +KASAN_OVERRIDE(memmove, __memmove) cmplw 0,r3,r4 bgt backwards_memcpy b memcpy diff --git a/arch/powerpc/lib/memcmp_64.S b/arch/powerpc/lib/memcmp_64.S index 844d8e774492..21aee60de2cd 100644 --- a/arch/powerpc/lib/memcmp_64.S +++ b/arch/powerpc/lib/memcmp_64.S @@ -102,7 +102,8 @@ * 2) src/dst has different offset to the 8 bytes boundary. The handlers * are named like .Ldiffoffset_xxxx */ -_GLOBAL_TOC(memcmp) +_GLOBAL_TOC(__memcmp) +KASAN_OVERRIDE(memcmp, __memcmp) cmpdi cr1,r5,0 /* Use the short loop if the src/dst addresses are not @@ -630,4 +631,4 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) b .Lcmp_lt32bytes #endif -EXPORT_SYMBOL(memcmp) +EXPORT_SYMBOL_NOKASAN(memcmp) diff --git a/arch/powerpc/lib/memcpy_64.S b/arch/powerpc/lib/memcpy_64.S index 273ea67e60a1..e9092a0e531a 100644 --- a/arch/powerpc/lib/memcpy_64.S +++ b/arch/powerpc/lib/memcpy_64.S @@ -18,7 +18,8 @@ #endif .align 7 -_GLOBAL_TOC(memcpy) +_GLOBAL_TOC(__memcpy) +KASAN_OVERRIDE(memcpy, __memcpy) BEGIN_FTR_SECTION #ifdef __LITTLE_ENDIAN__ cmpdi cr7,r5,0 diff --git a/arch/powerpc/lib/string.S b/arch/powerpc/lib/string.S index 4b41970e9ed8..09deaac6e5f1 100644 --- a/arch/powerpc/lib/string.S +++ b/arch/powerpc/lib/string.S @@ -16,7 +16,8 @@ /* This clears out any unused part of the destination buffer, just as the libc version does. -- paulus */ -_GLOBAL(strncpy) +_GLOBAL(__strncpy) +KASAN_OVERRIDE(strncpy, __strncpy) PPC_LCMPI 0,r5,0 beqlr mtctr r5 @@ -34,9 +35,10 @@ _GLOBAL(strncpy) 2: stbu r0,1(r6) /* clear it out if so */ bdnz 2b blr -EXPORT_SYMBOL(strncpy) +EXPORT_SYMBOL_NOKASAN(strncpy) -_GLOBAL(strncmp) +_GLOBAL(__strncmp) +KASAN_OVERRIDE(strncmp, __strncmp) PPC_LCMPI 0,r5,0 beq- 2f mtctr r5 @@ -52,9 +54,10 @@ _GLOBAL(strncmp) blr 2: li r3,0 blr -EXPORT_SYMBOL(strncmp) +EXPORT_SYMBOL_NOKASAN(strncmp) -_GLOBAL(memchr) +_GLOBAL(__memchr) +KASAN_OVERRIDE(memchr, __memchr) PPC_LCMPI 0,r5,0 beq- 2f mtctr r5 @@ -66,4 +69,4 @@ _GLOBAL(memchr) beqlr 2: li r3,0 blr -EXPORT_SYMBOL(memchr) +EXPORT_SYMBOL_NOKASAN(memchr) diff --git a/arch/powerpc/mm/Makefile b/arch/powerpc/mm/Makefile index 457c0ea2b5e7..d974f7bcb177 100644 --- a/arch/powerpc/mm/Makefile +++ b/arch/powerpc/mm/Makefile @@ -7,6 +7,8 @@ ccflags-$(CONFIG_PPC64) := $(NO_MINIMAL_TOC) CFLAGS_REMOVE_slb.o = $(CC_FLAGS_FTRACE) +KASAN_SANITIZE_fsl_booke_mmu.o := n + obj-y := fault.o mem.o pgtable.o mmap.o \ init_$(BITS).o pgtable_$(BITS).o \ init-common.o mmu_context.o drmem.o diff --git a/arch/powerpc/mm/kasan/Makefile b/arch/powerpc/mm/kasan/Makefile index 6577897673dd..f8f164ad8ade 100644 --- a/arch/powerpc/mm/kasan/Makefile +++ b/arch/powerpc/mm/kasan/Makefile @@ -3,3 +3,4 @@ KASAN_SANITIZE := n obj-$(CONFIG_PPC32) += kasan_init_32.o +obj-$(CONFIG_PPC_BOOK3E_64) += kasan_init_book3e_64.o diff --git a/arch/powerpc/mm/kasan/kasan_init_book3e_64.c b/arch/powerpc/mm/kasan/kasan_init_book3e_64.c new file mode 100644 index 000000000000..93b9afcf1020 --- /dev/null +++ b/arch/powerpc/mm/kasan/kasan_init_book3e_64.c @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: GPL-2.0 + +#define DISABLE_BRANCH_PROFILING + +#include +#include +#include +#include +#include + +DEFINE_STATIC_KEY_FALSE(powerpc_kasan_enabled_key); +EXPORT_SYMBOL(powerpc_kasan_enabled_key); +unsigned char kasan_zero_page[PAGE_SIZE] __page_aligned_bss; + +static void __init kasan_init_region(struct memblock_region *reg) +{ + void *start = __va(reg->base); + void *end = __va(reg->base + reg->size); + unsigned long k_start, k_end, k_cur; + + if (start >= end) + return; + + k_start = (unsigned long)kasan_mem_to_shadow(start); + k_end = (unsigned long)kasan_mem_to_shadow(end); + + for (k_cur = k_start; k_cur < k_end; k_cur += PAGE_SIZE) { + void *va = memblock_alloc(PAGE_SIZE, PAGE_SIZE); + map_kernel_page(k_cur, __pa(va), PAGE_KERNEL); + } + flush_tlb_kernel_range(k_start, k_end); +} + +void __init kasan_init(void) +{ + struct memblock_region *reg; + + for_each_memblock(memory, reg) + kasan_init_region(reg); + + /* map the zero page RO */ + map_kernel_page((unsigned long)kasan_zero_page, + __pa(kasan_zero_page), PAGE_KERNEL_RO); + + kasan_init_tags(); + + /* Turn on checking */ + static_branch_inc(&powerpc_kasan_enabled_key); + + /* Enable error messages */ + init_task.kasan_depth = 0; + pr_info("KASAN init done (64-bit Book3E)\n"); +} 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)