From patchwork Thu Oct 29 19:25:57 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrey Konovalov X-Patchwork-Id: 11867249 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 3EC306A2 for ; Thu, 29 Oct 2020 19:27:42 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id E1D8F204FD for ; Thu, 29 Oct 2020 19:27:39 +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="fUnZ1HtL" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E1D8F204FD 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 2235E6B00B9; Thu, 29 Oct 2020 15:27:37 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 1AE7F6B00BA; Thu, 29 Oct 2020 15:27:37 -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 F1BAF6B00BB; Thu, 29 Oct 2020 15:27:36 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0224.hostedemail.com [216.40.44.224]) by kanga.kvack.org (Postfix) with ESMTP id BAC456B00B9 for ; Thu, 29 Oct 2020 15:27:36 -0400 (EDT) Received: from smtpin12.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay04.hostedemail.com (Postfix) with ESMTP id 54EED1EE6 for ; Thu, 29 Oct 2020 19:27:36 +0000 (UTC) X-FDA: 77425947312.12.burn32_34094232728f Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin12.hostedemail.com (Postfix) with ESMTP id 34E1718009B6E for ; Thu, 29 Oct 2020 19:27:36 +0000 (UTC) X-Spam-Summary: 1,0,0,995fba04fe1d6c05,d41d8cd98f00b204,3pxebxwokceyivlzm6sv3towwotm.kwutqv25-uus3iks.wzo@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.222.201:@flex--andreyknvl.bounces.google.com:.lbl8.mailshell.net-66.100.201.100 62.18.0.100;04yfxpqk5f7rjtimfc8jg7my1omisoc8j4roxprp5gfws7gqhpxtute1qysg4tw.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,L X-HE-Tag: burn32_34094232728f X-Filterd-Recvd-Size: 6243 Received: from mail-qk1-f201.google.com (mail-qk1-f201.google.com [209.85.222.201]) by imf07.hostedemail.com (Postfix) with ESMTP for ; Thu, 29 Oct 2020 19:27:35 +0000 (UTC) Received: by mail-qk1-f201.google.com with SMTP id j20so2443057qkl.7 for ; Thu, 29 Oct 2020 12:27:35 -0700 (PDT) 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=A1ZDaKpC4XtGkLWbudlzWpby5nqFzQhbh548tIdxUT8=; b=fUnZ1HtLbb9IeH/WuZhF4kh/mpuV8GKZ4sfaw8gmpT3DtXn+eoOW6t5MtadjXyPBJA GbuwW72HDLVL/LBIpln1Y/FmdBa7hDinu/zBSArs/8xTzYU8QrQhLlN/FmpTcFr6R7wS Azo3Zk8BD8zYRiutNjHHEERhzxExiO0ZXduvWzgjtIytdct5UAbqqvEk6j/mxjffxWY8 PZlo80tAsl+CdMScVidW9jzP2ZORihNd5NcsEOStsdjESDkbcDfpZL2mLnRfB+ZnT3xC YF3jtpPdeO/e7l2/MY9Fk6f69zcAO8IoHMVDFFN8jaNXG5Z+D1aJ46OUwKDiciDUAsBr mKfg== 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=A1ZDaKpC4XtGkLWbudlzWpby5nqFzQhbh548tIdxUT8=; b=oxS8mB/COrWJVkyEmB7IvqLLMTRIDUudL6lyL2xDe1uXXmpT8WLrvtPIjLM4l92kEs dLc8pqlxRZM10Tiut+DUuI0xXkeJzkhC3MEfErDMcQA+J4cuQbVZIchbF7cANhhr4gDo +JoPt9Oy5y0bTmTi2Ca27vZsH9DCx3KMtuYAqSg9Vct0QxhJ19og1jq1y/JsRuXYvz8p rvHEzIWrp8qDHocZLloWPFrCCDrDlw/SXpoA5Pd9oWi6qikwTKyYrW/yL9eWAg7CGkzZ BMkIWHfqtrRLqqi0htcG5FIRQN+5OqdXw2+6lI3ioVGWQBBJXDY5ye8oJ178vs7IRxpS gaRw== X-Gm-Message-State: AOAM532E/ghdk4M8xaAQfsDXH1bjY5FujiLerLnbWkyplLkT+8OD2ZIs 5n54QVOD7IWwuqRN+5yF99uMkRiwYGLE9+03 X-Google-Smtp-Source: ABdhPJwHRtPyg4bynF4sOBBjCvEnrbWrbasDBEMWkJpSpQPilWl0rTB11giuF1s9Zi0lLuvUYnUKtBzNoIx02X2Q X-Received: from andreyknvl3.muc.corp.google.com ([2a00:79e0:15:13:7220:84ff:fe09:7e9d]) (user=andreyknvl job=sendgmr) by 2002:ad4:40c6:: with SMTP id x6mr5883701qvp.20.1603999655065; Thu, 29 Oct 2020 12:27:35 -0700 (PDT) Date: Thu, 29 Oct 2020 20:25:57 +0100 In-Reply-To: Message-Id: Mime-Version: 1.0 References: X-Mailer: git-send-email 2.29.1.341.ge80a0c044ae-goog Subject: [PATCH v6 36/40] 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 7be8f3f64285..e1be919f7f55 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);