From patchwork Fri Nov 13 22:16:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrey Konovalov X-Patchwork-Id: 11904927 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D8B901391 for ; Fri, 13 Nov 2020 22:17:50 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 8D2F922255 for ; Fri, 13 Nov 2020 22:17:50 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=google.com header.i=@google.com header.b="CWWbP+Cr" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8D2F922255 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 222B96B00BD; Fri, 13 Nov 2020 17:17:49 -0500 (EST) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 157E86B00BE; Fri, 13 Nov 2020 17:17:49 -0500 (EST) 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 0203C6B00BF; Fri, 13 Nov 2020 17:17:48 -0500 (EST) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0140.hostedemail.com [216.40.44.140]) by kanga.kvack.org (Postfix) with ESMTP id BD3816B00BD for ; Fri, 13 Nov 2020 17:17:48 -0500 (EST) Received: from smtpin12.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id 66390181AEF07 for ; Fri, 13 Nov 2020 22:17:48 +0000 (UTC) X-FDA: 77480808216.12.vein77_510231127312 Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin12.hostedemail.com (Postfix) with ESMTP id 4424818014498 for ; Fri, 13 Nov 2020 22:17:48 +0000 (UTC) X-Spam-Summary: 1,0,0,4faae04767969391,d41d8cd98f00b204,3cgavxwokcnu1e4i5pbemc7ff7c5.3fdc9elo-ddbm13b.fi7@flex--andreyknvl.bounces.google.com,,RULES_HIT:41:152:355:379:541:800:960:973:982:988:989:1260:1277:1313:1314:1345:1359:1431:1437:1516:1518:1535:1542:1593:1594:1711:1730:1747:1777:1792:2393:2559:2562:2901:3138:3139:3140:3141:3142:3152:3353:3865:3866:3867:3870:3871:3872:4117:4250:4321:5007:6261:6653:6742:7901:7903:8603:9036:9969:10004:10400:11026:11232:11473:11658:11914:12043:12296:12297:12438:12555:12895:12986:14181:14394:14659:14721:21080:21324:21365:21444:21451:21626:30012:30054:30056:30075,0,RBL:209.85.128.73:@flex--andreyknvl.bounces.google.com:.lbl8.mailshell.net-66.100.201.100 62.18.0.100;04yfxcohou5kr33ze8zcf81tg93hsoc8j4roxprp9oxhgdw47cxtute1qysg4tw.copujugi9ue1soam4e3k9rianfcr3jrzccr4dmg3y98n3bhncc96ny3hpmfg17d.6-lbl8.mailshell.net-223.238.255.100,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:fp,MSBL:0,DNSBL:neutral,Custom_rules:0 :0:0,LFt X-HE-Tag: vein77_510231127312 X-Filterd-Recvd-Size: 6259 Received: from mail-wm1-f73.google.com (mail-wm1-f73.google.com [209.85.128.73]) by imf05.hostedemail.com (Postfix) with ESMTP for ; Fri, 13 Nov 2020 22:17:47 +0000 (UTC) Received: by mail-wm1-f73.google.com with SMTP id 14so4718484wmg.1 for ; Fri, 13 Nov 2020 14:17:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=xaa+VV69xly6NtD9oDw0a4fgTp58XYd2+h3RtuHf6eE=; b=CWWbP+CrzKArtLZOHT697dIqhABlh9KFuDkDt6jVUfI1BP70ptWt0ekQM0OeYO5m0S APNUU1m1/gJ8g/NqB4fVaTWBJfhdHkuzJsJ0FMlinYFq13lLmMVFEpw2oDF8wrpOzib0 19ofn1SgHBRtrBHUpRlY0C4w79GZ3dG1m38JQNg3Cv9D3s+EWna3qcOaI9s0fDJexrs7 kS5gHTAxCc8BvY4GnZyUEHmoFS/r5JKyTGOt3B3cQJ/xIYGs3FD3L8SWeMvE5NqX9V+e 48AGiSiZKTgy8sK2/RnKMaHHfA3Kn+O6Ee9oqk9knT16CM65kb46rHJ4KVr3X5GmxA5R 3K0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=xaa+VV69xly6NtD9oDw0a4fgTp58XYd2+h3RtuHf6eE=; b=U7/x13xjSP5oasdHUNMfQ+aXxSQnKrSobFNEEAmC8ppj1EfUtAwMexF2wM2g7l77nE UTK9f1GctpcAPL660L9ghYqz+wC2UZnbBEgXcCo2hoerFv65DHSKBdNLJTJMp6aiohAA ALcWWpVsxpFVyKdchk4gG406WCTjTYRWdvg0H63Kk0ZiIxYO+5EQR2DIcG/nJi4MSu80 RmN9gOpGugymM1uXdjD6medXuNJqMjBrdkBSMixdArRoBVMFp82gBpPmbZtAlRlAjzOI kM/c6lAGzxexM5jEiQ0xboOObEJDg9Q95pWcEqyA+1kgX7bDTKBPPBbqkW/FhAB7z8gQ jkqg== X-Gm-Message-State: AOAM5311vDjmyu1/0RvMWY+/gpzhuOUrpUfX+bcMT4r1DrkpNpT1mfX0 WWe3bdjcGHGsr4vYXjZXBAa23lOOvP9Uqu3i X-Google-Smtp-Source: ABdhPJyBDyYC9/PGel4BR1xfmWz+Zxo/sGgPx5xYgIlAE1YLTmCpnV5Ly2Tz5BFPPp6zu5O3ZmwShvUgo7lwtogd X-Received: from andreyknvl3.muc.corp.google.com ([2a00:79e0:15:13:7220:84ff:fe09:7e9d]) (user=andreyknvl job=sendgmr) by 2002:adf:e983:: with SMTP id h3mr5834862wrm.382.1605305866774; Fri, 13 Nov 2020 14:17:46 -0800 (PST) Date: Fri, 13 Nov 2020 23:16:06 +0100 In-Reply-To: Message-Id: <53055673bff17607e42bc518dd31b56cb3e2a3af.1605305705.git.andreyknvl@google.com> Mime-Version: 1.0 References: X-Mailer: git-send-email 2.29.2.299.gdc1121823c-goog Subject: [PATCH mm v10 38/42] kasan, arm64: print report from tag fault handler From: Andrey Konovalov To: Andrew Morton Cc: Catalin Marinas , Will Deacon , Vincenzo Frascino , Dmitry Vyukov , Andrey Ryabinin , Alexander Potapenko , Marco Elver , Evgenii Stepanov , Branislav Rankov , Kevin Brodsky , kasan-dev@googlegroups.com, linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Andrey Konovalov 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: Add error reporting for hardware tag-based KASAN. When CONFIG_KASAN_HW_TAGS is enabled, print KASAN report from the arm64 tag fault handler. SAS bits aren't set in ESR for all faults reported in EL1, so it's impossible to find out the size of the access the caused the fault. Adapt KASAN reporting code to handle this case. Signed-off-by: Andrey Konovalov Co-developed-by: Vincenzo Frascino Signed-off-by: Vincenzo Frascino Reviewed-by: Catalin Marinas Reviewed-by: Alexander Potapenko --- Change-Id: I3780fe7db6e075dff2937d3d8508f55c9322b095 --- arch/arm64/mm/fault.c | 14 ++++++++++++++ mm/kasan/report.c | 11 ++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index 1e4b9353c68a..3aac2e72f81e 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -298,10 +299,23 @@ static void die_kernel_fault(const char *msg, unsigned long addr, do_exit(SIGKILL); } +#ifdef CONFIG_KASAN_HW_TAGS static void report_tag_fault(unsigned long addr, unsigned int esr, struct pt_regs *regs) { + bool is_write = ((esr & ESR_ELx_WNR) >> ESR_ELx_WNR_SHIFT) != 0; + + /* + * SAS bits aren't set for all faults reported in EL1, so we can't + * find out access size. + */ + kasan_report(addr, 0, is_write, regs->pc); } +#else +/* Tag faults aren't enabled without CONFIG_KASAN_HW_TAGS. */ +static inline void report_tag_fault(unsigned long addr, unsigned int esr, + struct pt_regs *regs) { } +#endif static void do_tag_recovery(unsigned long addr, unsigned int esr, struct pt_regs *regs) diff --git a/mm/kasan/report.c b/mm/kasan/report.c index 2c503b667413..a69c2827a125 100644 --- a/mm/kasan/report.c +++ b/mm/kasan/report.c @@ -62,9 +62,14 @@ static void print_error_description(struct kasan_access_info *info) { pr_err("BUG: KASAN: %s in %pS\n", get_bug_type(info), (void *)info->ip); - pr_err("%s of size %zu at addr %px by task %s/%d\n", - info->is_write ? "Write" : "Read", info->access_size, - info->access_addr, current->comm, task_pid_nr(current)); + if (info->access_size) + pr_err("%s of size %zu at addr %px by task %s/%d\n", + info->is_write ? "Write" : "Read", info->access_size, + info->access_addr, current->comm, task_pid_nr(current)); + else + pr_err("%s at addr %px by task %s/%d\n", + info->is_write ? "Write" : "Read", + info->access_addr, current->comm, task_pid_nr(current)); } static DEFINE_SPINLOCK(report_lock);