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 4681CECAAD5 for ; Sat, 10 Sep 2022 05:24:38 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 438188D0002; Sat, 10 Sep 2022 01:24:37 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 3C0926B0072; Sat, 10 Sep 2022 01:24:37 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 261718D0002; Sat, 10 Sep 2022 01:24:37 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 105696B0071 for ; Sat, 10 Sep 2022 01:24:37 -0400 (EDT) Received: from smtpin27.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id CACF51A0CF8 for ; Sat, 10 Sep 2022 05:24:36 +0000 (UTC) X-FDA: 79895035752.27.5DDF2A2 Received: from mail-yb1-f202.google.com (mail-yb1-f202.google.com [209.85.219.202]) by imf01.hostedemail.com (Postfix) with ESMTP id 7619740081 for ; Sat, 10 Sep 2022 05:24:36 +0000 (UTC) Received: by mail-yb1-f202.google.com with SMTP id 62-20020a250341000000b006a93b57e2daso3325567ybd.2 for ; Fri, 09 Sep 2022 22:24:36 -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=JqNTfVNEPEGXKtb8DKwwJsm47BWKuJspxKDX7cLnwDc=; b=Ig0ItrD1iczS7H38nUKbOU606qXdEQtNSM96un0caH//+ONB9TQpdDpE4eu82EJw7y WoAqBkZSgql1AIhXAHRL7nAVuXoNr/D/WzArKgxqAYDCA21hcIcs7v007A/nlNSwAIug 43TD4bxRN5G8PJU4kuGlp5EUqagVzBq+cFqCHZcMt8xxunmlJoHGKE/Gd+jKK2lrEWOe PcEVcU6aMmioTQDYc7UQl2k7aNfBJE6XGxsrV+z2GZ2E866ESFZMuHmDNB2z3OxagXPN NLgt2sDvVJ+9hmtGKDFuQWVRLh+pL9yV3ZmTl7VfAXmVLhNCp9Crm3doadgGMAqEyl27 Tezw== 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=JqNTfVNEPEGXKtb8DKwwJsm47BWKuJspxKDX7cLnwDc=; b=jJhoAGb+cgSpTBGqZY0pWWcy350nDQLz9sF390/Gp4r/opzvZIf4pdZ7S9k3Vitk03 hTFbsNAVDxSD0VjFd1nmqG8qzG4Qf33YbHTsKmDODFi0dTpj5ajo1oV0FnFaqvI93ALh 5xbpYHZBJf3duAM6BjaatO5MLErK+yKgmYRP4augh6536jcChP6+N/+q6lcKxhACdVhm 5jGV2XUsjkjdtBPUSy2vRlq28+Sw6q6Sdu+575faP936DjBaZkFeXyib049wPOYRQbaw uDm/Hoik+nL4+BZk81lFWDlf+AOJ0NW+LZOJYBhwxs6Khi4AtFB07Fp9vWJmeG+QcGoU gEMw== X-Gm-Message-State: ACgBeo1ewBzpl66e7GJ2kPL4CWrmeXT39KJAr7ZMphS074TDVaHXiTUo tuazLBgn2rleCKMOvqpceydRr/g= X-Google-Smtp-Source: AA6agR7J+MJ4CbmGf5il6MSSbTeMp6GnYimb+kijqjPdd5RmvTmVZMOjZnDxlbd2gvC/bBmap4i7erI= X-Received: from pcc-desktop.svl.corp.google.com ([2620:15c:2ce:200:853c:a4e2:939a:fb56]) (user=pcc job=sendgmr) by 2002:a25:bb82:0:b0:696:4351:8f5f with SMTP id y2-20020a25bb82000000b0069643518f5fmr14192400ybg.90.1662787475684; Fri, 09 Sep 2022 22:24:35 -0700 (PDT) Date: Fri, 9 Sep 2022 22:24:26 -0700 Message-Id: <20220910052426.943376-1-pcc@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.37.2.789.g6183377224-goog Subject: [PATCH] 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=1662787476; a=rsa-sha256; cv=none; b=jq9Upo0uzHTqjjeZwMMztueyauA5CFZoFPOURnDAyxMsM19e1BEciojmTx1f4U2XHpgzmK DNBKIV4YR5gm05/byODX9mueCOA1QkmVo8Pril32hFghuKE4cRK9YjTRQc+h2GSJdpuNJe XekwKiGScXVGT3etl/LCAD2DzvpcuyU= ARC-Authentication-Results: i=1; imf01.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=Ig0ItrD1; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf01.hostedemail.com: domain of 3kx8cYwMKCGIPCCGOOGLE.COMLINUX-MMKVACK.ORG@flex--pcc.bounces.google.com designates 209.85.219.202 as permitted sender) smtp.mailfrom=3kx8cYwMKCGIPCCGOOGLE.COMLINUX-MMKVACK.ORG@flex--pcc.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1662787476; 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=JqNTfVNEPEGXKtb8DKwwJsm47BWKuJspxKDX7cLnwDc=; b=mPXLiS3wBO+1j/nuCWgsLP9NAGrOnRQdqulMeu2LrQzDHAG4Je0vHMiWtzvakatywIsonk l9ZxnFwRnzdOuh5qPJ9GHK5rXH61dDWVHDzcOILhSADWovtAnTNjayTO4bCFUIXATNnr5x QHPdb+haLF44KFUZUEUHjfkY1TZVMOY= X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: 7619740081 Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=Ig0ItrD1; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf01.hostedemail.com: domain of 3kx8cYwMKCGIPCCGOOGLE.COMLINUX-MMKVACK.ORG@flex--pcc.bounces.google.com designates 209.85.219.202 as permitted sender) smtp.mailfrom=3kx8cYwMKCGIPCCGOOGLE.COMLINUX-MMKVACK.ORG@flex--pcc.bounces.google.com X-Stat-Signature: ny8uehhhx797nexcu7k7xxj5p4kpjpd3 X-Rspam-User: X-HE-Tag: 1662787476-28766 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. Signed-off-by: Peter Collingbourne --- Applies to -next. arch/arm64/kernel/traps.c | 3 +-- arch/arm64/mm/fault.c | 2 +- include/linux/kasan.h | 10 ++++++++++ mm/kasan/kasan.h | 1 + mm/kasan/report.c | 27 ++++++++++++++++++++++----- 5 files changed, 35 insertions(+), 8 deletions(-) diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c index b7fed33981f7..42f05f38c90a 100644 --- a/arch/arm64/kernel/traps.c +++ b/arch/arm64/kernel/traps.c @@ -1019,9 +1019,8 @@ static int kasan_handler(struct pt_regs *regs, unsigned long esr) bool write = esr & KASAN_ESR_WRITE; size_t size = KASAN_ESR_SIZE(esr); u64 addr = regs->regs[0]; - u64 pc = regs->pc; - kasan_report(addr, size, write, pc); + kasan_report_regs(addr, size, write, regs); /* * The instrumentation allows to control whether we can proceed after 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 39e8e5a80b82..eac9cd45b4a1 100644 --- a/mm/kasan/report.c +++ b/mm/kasan/report.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -284,7 +285,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) { @@ -394,11 +394,14 @@ 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)) { print_address_description(addr, tag, info); print_memory_metadata(info->first_bad_addr); - } else { - dump_stack_lvl(KERN_ERR); } } @@ -458,8 +461,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; @@ -480,6 +483,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); @@ -493,6 +497,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.2.789.g6183377224-goog