From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 59AFAC32771 for ; Tue, 27 Sep 2022 01:20:59 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 8BB718E0097; Mon, 26 Sep 2022 21:20:58 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 86B878E0090; Mon, 26 Sep 2022 21:20:58 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 731E78E0097; Mon, 26 Sep 2022 21:20:58 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 62F758E0090 for ; Mon, 26 Sep 2022 21:20:58 -0400 (EDT) Received: from smtpin08.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 252D5AADA3 for ; Tue, 27 Sep 2022 01:20:58 +0000 (UTC) X-FDA: 79956111396.08.C142FE4 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) by imf21.hostedemail.com (Postfix) with ESMTP id B687C1C0004 for ; Tue, 27 Sep 2022 01:20:56 +0000 (UTC) Received: by mail-pl1-f202.google.com with SMTP id k2-20020a170902c40200b001782bd6c416so5438334plk.20 for ; Mon, 26 Sep 2022 18:20:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:mime-version:message-id:date:from:to:cc:subject :date; bh=HOCMPjoy0eVPzOqsFhY6VeQ9OoDjjjrEl2+DddMJ/3E=; b=tjlHQm36/cn3skPDUexfTkEm8ByOxn3IZtlEdjzeFrtlmblRl5z2J82tOH+FAiZTKa 88tRNL6USHmwaHXSs0f00eddqaceOcK2FClnMc/zI+KrnUlZ32i8HEgK775UUUBBFDlK IuuCTNAgtNDGw5YrXRTcYDFVtFx2eBO6pBaKsc1yAN1+0BhSjs3VzB120iK+217W+2fU 5yg7MP29YyeSFs2x7WleRt9bb2cZ0SykFkbjKoFms8Hvd1DtZwtWAMbzgX8UAFLdPVIf L7/V8RZdNTnw6m9QXgyrdvxvLqjSfZ03Ny6/xhdPvbaKgMFLqjFOOVhuIOpSADHM2Gp7 JoIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:mime-version:message-id:date:x-gm-message-state :from:to:cc:subject:date; bh=HOCMPjoy0eVPzOqsFhY6VeQ9OoDjjjrEl2+DddMJ/3E=; b=JxnISjZ2C4Fdm4p5m+JxxRIikFyr1ZJFm7Zs8cJjAA35jr5gm4D2/buGt/FJB9/Yx9 z5CW54WBTMxcBremAQ90yym4dtViEL778IgG5gE3eZGn6axbNAMsm8NTV7R5nJw2xy1i 89Wei6Fvvw2FWVGRYSSRWa9qwd2Rps/gBlgCiKcW44TE4s53iyDFTPCayRDTYoRyv4Bs hR4bWEtsoLumXsvK0QOEfppwv+kpkidNGSVM4dMEL6Pd77UNuhHE0rk6n0LACc8c9rDz ctmhQBSqlUeOOpi69WUHgTVMJKmetdJAKfyFxf8RBz7OXkbx8f3lizXStPaGVuxk75FD 6evQ== X-Gm-Message-State: ACrzQf01LPuFM69eWpNkHFQvREBlflb6Lt3/kw6sLJwpWXvGF5nL5Pyi 59eyCi2Js5aiIUZFCjT699begDU= X-Google-Smtp-Source: AMsMyM7z6RW5+ciJ6daY/GLKaHCsNCRQltugXuQRDg/SkXP5D2y4rPpuFSeaTq7tsjfKXjkGsd7jwOo= X-Received: from pcc-desktop.svl.corp.google.com ([2620:15c:2ce:200:feb1:62f4:7ee4:fd92]) (user=pcc job=sendgmr) by 2002:a05:6a00:1688:b0:53b:4239:7c5c with SMTP id k8-20020a056a00168800b0053b42397c5cmr27123207pfc.81.1664241655587; Mon, 26 Sep 2022 18:20:55 -0700 (PDT) Date: Mon, 26 Sep 2022 18:20:44 -0700 Message-Id: <20220927012044.2794384-1-pcc@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.37.3.998.g577e59143f-goog Subject: [PATCH v2] kasan: also display registers for reports from HW exceptions From: Peter Collingbourne To: Catalin Marinas , Vincenzo Frascino , Andrew Morton , Andrey Konovalov Cc: Peter Collingbourne , linux-arm-kernel@lists.infradead.org, kasan-dev@googlegroups.com, linux-mm@kvack.org Content-Type: text/plain; charset="UTF-8" ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1664241656; a=rsa-sha256; cv=none; b=lgZVfJOGMhBcoJyCmSHcfxBWztrF25VeTvSgre8Y1iI1rslNpOpyW6XT34UB9W1lBlE38Z j2zwp6GRr9731D1MwVm+tBTK7Dszy8K0t7+Q6ru3S1qDziyl+j/VNNFXJ3VWio9zeLzeqv vsuovi1GisYlBNhgxuRHTqcJCGqww9c= ARC-Authentication-Results: i=1; imf21.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=tjlHQm36; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf21.hostedemail.com: domain of 3908yYwMKCIAtggksskpi.gsqpmry1-qqozego.svk@flex--pcc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=3908yYwMKCIAtggksskpi.gsqpmry1-qqozego.svk@flex--pcc.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1664241656; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding:in-reply-to: references:dkim-signature; bh=HOCMPjoy0eVPzOqsFhY6VeQ9OoDjjjrEl2+DddMJ/3E=; b=LTk5P9HQtQnR0g7eVPxo7CLdlobAiz5Bi5Frng6DuQQWv0L1JoHwa8eqqPVnoe3k1kJsP0 y2pO8a2DAU9b5mToPfLkDtrX95bcJF7MoIMUqOuEoAp9+43HFSaZyRbapFh+F6i1bHaUVo 2hmVOxOSGCLYQgK/xFJL+rHx33pxdt4= Authentication-Results: imf21.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=tjlHQm36; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf21.hostedemail.com: domain of 3908yYwMKCIAtggksskpi.gsqpmry1-qqozego.svk@flex--pcc.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=3908yYwMKCIAtggksskpi.gsqpmry1-qqozego.svk@flex--pcc.bounces.google.com X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: B687C1C0004 X-Stat-Signature: s68mhb63dde4f4bi5kuydnmbr8wrrutu X-Rspam-User: X-HE-Tag: 1664241656-455218 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: It is sometimes useful to know the values of the registers when a KASAN report is generated. We can do this easily for reports that resulted from a hardware exception by passing the struct pt_regs from the exception into the report function; do so, but only in HW tags mode because registers may have been corrupted during the check in other modes. Signed-off-by: Peter Collingbourne --- Applies to -next. v2: - only do this in HW tags mode - move pr_err to caller arch/arm64/mm/fault.c | 2 +- include/linux/kasan.h | 10 ++++++++++ mm/kasan/kasan.h | 1 + mm/kasan/report.c | 30 +++++++++++++++++++++++------- 4 files changed, 35 insertions(+), 8 deletions(-) diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index 5b391490e045..c4b91f5d8cc8 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -316,7 +316,7 @@ static void report_tag_fault(unsigned long addr, unsigned long esr, * find out access size. */ bool is_write = !!(esr & ESR_ELx_WNR); - kasan_report(addr, 0, is_write, regs->pc); + kasan_report_regs(addr, 0, is_write, regs); } #else /* Tag faults aren't enabled without CONFIG_KASAN_HW_TAGS. */ diff --git a/include/linux/kasan.h b/include/linux/kasan.h index d811b3d7d2a1..381aea149353 100644 --- a/include/linux/kasan.h +++ b/include/linux/kasan.h @@ -353,6 +353,16 @@ static inline void *kasan_reset_tag(const void *addr) bool kasan_report(unsigned long addr, size_t size, bool is_write, unsigned long ip); +/** + * kasan_report_regs - print a report about a bad memory access detected by KASAN + * @addr: address of the bad access + * @size: size of the bad access + * @is_write: whether the bad access is a write or a read + * @regs: register values at the point of the bad memory access + */ +bool kasan_report_regs(unsigned long addr, size_t size, bool is_write, + struct pt_regs *regs); + #else /* CONFIG_KASAN_SW_TAGS || CONFIG_KASAN_HW_TAGS */ static inline void *kasan_reset_tag(const void *addr) diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h index abbcc1b0eec5..39772c21a8ae 100644 --- a/mm/kasan/kasan.h +++ b/mm/kasan/kasan.h @@ -175,6 +175,7 @@ struct kasan_report_info { size_t access_size; bool is_write; unsigned long ip; + struct pt_regs *regs; /* Filled in by the common reporting code. */ void *first_bad_addr; diff --git a/mm/kasan/report.c b/mm/kasan/report.c index df3602062bfd..be8dd97940c7 100644 --- a/mm/kasan/report.c +++ b/mm/kasan/report.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -281,9 +282,6 @@ static void print_address_description(void *addr, u8 tag, { struct page *page = addr_to_page(addr); - dump_stack_lvl(KERN_ERR); - pr_err("\n"); - if (info->cache && info->object) { describe_object(addr, info); pr_err("\n"); @@ -391,11 +389,15 @@ static void print_report(struct kasan_report_info *info) kasan_print_tags(tag, info->first_bad_addr); pr_err("\n"); + if (info->regs) + show_regs(info->regs); + else + dump_stack_lvl(KERN_ERR); + if (addr_has_metadata(addr)) { + pr_err("\n"); print_address_description(addr, tag, info); print_memory_metadata(info->first_bad_addr); - } else { - dump_stack_lvl(KERN_ERR); } } @@ -467,8 +469,8 @@ void kasan_report_invalid_free(void *ptr, unsigned long ip, enum kasan_report_ty * user_access_save/restore(): kasan_report_invalid_free() cannot be called * from a UACCESS region, and kasan_report_async() is not used on x86. */ -bool kasan_report(unsigned long addr, size_t size, bool is_write, - unsigned long ip) +static bool __kasan_report(unsigned long addr, size_t size, bool is_write, + unsigned long ip, struct pt_regs *regs) { bool ret = true; void *ptr = (void *)addr; @@ -489,6 +491,7 @@ bool kasan_report(unsigned long addr, size_t size, bool is_write, info.access_size = size; info.is_write = is_write; info.ip = ip; + info.regs = regs; complete_report_info(&info); @@ -502,6 +505,19 @@ bool kasan_report(unsigned long addr, size_t size, bool is_write, return ret; } +bool kasan_report(unsigned long addr, size_t size, bool is_write, + unsigned long ip) +{ + return __kasan_report(addr, size, is_write, ip, NULL); +} + +bool kasan_report_regs(unsigned long addr, size_t size, bool is_write, + struct pt_regs *regs) +{ + return __kasan_report(addr, size, is_write, instruction_pointer(regs), + regs); +} + #ifdef CONFIG_KASAN_HW_TAGS void kasan_report_async(void) { -- 2.37.3.998.g577e59143f-goog