From patchwork Mon Nov 2 16:04:17 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrey Konovalov X-Patchwork-Id: 11874335 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 B0919697 for ; Mon, 2 Nov 2020 16:06:36 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 65184222EC for ; Mon, 2 Nov 2020 16:06:36 +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="ReVmikUf" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 65184222EC 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 7DCEC6B00B9; Mon, 2 Nov 2020 11:05:59 -0500 (EST) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 766716B00BA; Mon, 2 Nov 2020 11:05:59 -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 653556B00BB; Mon, 2 Nov 2020 11:05:59 -0500 (EST) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0217.hostedemail.com [216.40.44.217]) by kanga.kvack.org (Postfix) with ESMTP id 2FD1C6B00B9 for ; Mon, 2 Nov 2020 11:05:59 -0500 (EST) Received: from smtpin22.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay04.hostedemail.com (Postfix) with ESMTP id CB42D1EE6 for ; Mon, 2 Nov 2020 16:05:58 +0000 (UTC) X-FDA: 77439954396.22.veil51_350a5f2272b1 Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin22.hostedemail.com (Postfix) with ESMTP id D087618038E6B for ; Mon, 2 Nov 2020 16:05:57 +0000 (UTC) X-Spam-Summary: 1,0,0,88043f0034e9044f,d41d8cd98f00b204,3zc6gxwokceuhukyl5ru2snvvnsl.jvtspu14-ttr2hjr.vyn@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: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:21611:21626:30012:30054:30056:30075,0,RBL:209.85.221.74:@flex--andreyknvl.bounces.google.com:.lbl8.mailshell.net-66.100.201.100 62.18.0.100;04y8wo88niaty86871z8miry5risqoc8j4roxprp5gfws7gqhpxtute1qysg4tw.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,LF X-HE-Tag: veil51_350a5f2272b1 X-Filterd-Recvd-Size: 6240 Received: from mail-wr1-f74.google.com (mail-wr1-f74.google.com [209.85.221.74]) by imf20.hostedemail.com (Postfix) with ESMTP for ; Mon, 2 Nov 2020 16:05:57 +0000 (UTC) Received: by mail-wr1-f74.google.com with SMTP id b6so6558365wrn.17 for ; Mon, 02 Nov 2020 08:05:57 -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=35WbJzPGlJ32SG4OmkQQICRjm1+Un7MaGRWzBQ2gFy8=; b=ReVmikUfyD35ZPa7hA8zZkwvxwA/5N8OqN4auSKNEZ9rVVWtp0EJoTybi+VzCtP2jp CPDFfxl55PnOIfXvOv37raQxHz8p9i2WhNdFvmcS1mpk13Y4mFxSGZPsa4PyNuUEC08p FEeFqir9iq0/DJYfPuAGWbHqFyrioDYpUXvjZ6XT4I/MnNU2KKkimPKlzRfBaNjatEYG zK4op1Kj6AIqZ/MJwI1j0Iar0T2h/5lcdIXXU9U8i//1Yj73pBnI0m2o3ZTtkH0YTce+ 3iS+OtmdE179QKxzlpL6R1UwUdrxgAUsBh+sma29bCsxbiMBVjd+rtoY/F/eL+wmifiQ dpWg== 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=35WbJzPGlJ32SG4OmkQQICRjm1+Un7MaGRWzBQ2gFy8=; b=sxfSdqWh3YCOnS6ukXCIPZ9iSopoAr9idoxmZBvhkE8lD2EVnrfNNUODwriSgKG+iw 9w5yVWHHWELeF5wnNg0jOKHplpI4zpASRzbbN0XZWmRjgIZcEEnZTNODdjspyHBVzivl xkPtAwOCrYWtXQZuc95W7SW709ETB8og+rr4Xf2kKcw17xnww7r3xavZk3c8RSIZlEy2 ZYRGrscTV/jM4dqx6I4YK8GC2jVJ3lj0ifX3L/MgaATKUX1+C0HkJAhEJkzqVxGlRA+H XEOJ0y7TJOZCeHrTPab7j4KvLldmaN51LB/5C6HjCfqjkGrGfO+71SAqTe+4soPZKthV ppRw== X-Gm-Message-State: AOAM530mQh2e6mGxrZb+s1owDJdQkXASySVLPRBpMAVDSqSIPgJTY97t lwunKSPjR+n3DrMAQhK/ubTOHV9FD7Y/0H70 X-Google-Smtp-Source: ABdhPJxQI7fzcN6hDMp0RmZiP40ZK8WVYR15Oo87hSsXTGEB+onI1lJ/cn8A6qvfXvoM+/C+Z9vvyYf6Ghc12Kxq X-Received: from andreyknvl3.muc.corp.google.com ([2a00:79e0:15:13:7220:84ff:fe09:7e9d]) (user=andreyknvl job=sendgmr) by 2002:a7b:c845:: with SMTP id c5mr7825433wml.135.1604333156027; Mon, 02 Nov 2020 08:05:56 -0800 (PST) Date: Mon, 2 Nov 2020 17:04:17 +0100 In-Reply-To: Message-Id: Mime-Version: 1.0 References: X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog Subject: [PATCH v7 37/41] kasan, arm64: print report from tag fault handler From: Andrey Konovalov To: Catalin Marinas , Will Deacon Cc: Vincenzo Frascino , kasan-dev@googlegroups.com, Dmitry Vyukov , Andrey Ryabinin , Alexander Potapenko , Marco Elver , Evgenii Stepanov , Elena Petrova , Branislav Rankov , Kevin Brodsky , Andrew Morton , 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 --- 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 fbceb14d93b1..7370e822e588 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -297,10 +298,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 8afc1a6ab202..ce06005d4052 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);