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 08D1BC6FA82 for ; Tue, 27 Sep 2022 18:20:37 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 7F1E18E00F5; Tue, 27 Sep 2022 14:20:37 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 779F48E00C1; Tue, 27 Sep 2022 14:20:37 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 5CCF28E00F5; Tue, 27 Sep 2022 14:20:37 -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 451C98E00C1 for ; Tue, 27 Sep 2022 14:20:37 -0400 (EDT) Received: from smtpin21.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 17B26A0571 for ; Tue, 27 Sep 2022 18:20:37 +0000 (UTC) X-FDA: 79958680914.21.7042859 Received: from mail-qv1-f50.google.com (mail-qv1-f50.google.com [209.85.219.50]) by imf21.hostedemail.com (Postfix) with ESMTP id AEEBD1C0013 for ; Tue, 27 Sep 2022 18:20:36 +0000 (UTC) Received: by mail-qv1-f50.google.com with SMTP id m18so1002731qvo.12 for ; Tue, 27 Sep 2022 11:20:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date; bh=K3EEm+yGioRUPVfrRwhSvMYbgEGQ+F2ANH5pgoFJVpo=; b=cgYtUma6MDF2fHc51hWu4kAWKtf9NuewFikGWUpyrMZUulplIMb0OGQBmwZd3y97VL UY2kcP4Qa6XS57nq9TcYXLJea9vsOiXAqQqN0FuBG3/owwpRd4algJWj+Hh23xT1XFnL RkOTqt1El+OhHuCLXAGgpNLaws9h8+ApYaAaD1TiqAtipv61BjZRwGhFaGRD3rgY7MHY 6qQzjMsbevlN8DU9TjB9SjWGG+2xSq++6ylg8JxgyUQvc2U/+L9NVDHTLccgA2N/s7OI uRUxnklVKfL8J/H5xc1kA0hCr/TMWj+hoe8jkI0L15AOdy8t4INyd7Tbx3K6M7bT4SUw t3hQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date; bh=K3EEm+yGioRUPVfrRwhSvMYbgEGQ+F2ANH5pgoFJVpo=; b=GrhfnPVhxOpqj6Ta1gEtBQiScFVKry7ZJWNC2hjw/q66XsTRwrKNjoxKjW9t1LcJ8Z nanuyd1XinYXcMnlbmN4IQY0CmoqrI+6aUCejfQgOSiHB9Na6WQMwFY+8gOegF3CgTLI oH08nJGuToK9YBLOnQcp6dzZDkXsEqQWBtemZl8c9HBuG6ylUSws0cAC3f/8A6S/AtJd pCur9dR48rZOTvXaobBLWN2oKWTjCjTnT9tgrmfvOIrAqiRzh1FbqftIj9NxtREqDmi5 4qKrgGNUBNjCyL7U7u/c8YhK1k6gh40H9hS+vfVuVZ8WikPySSN1fU2iKwAdWt8jMQMw jtcQ== X-Gm-Message-State: ACrzQf1Ifq/i7+E00JofqUKQH5+YvjLzOsriftOpl65Vrj2oBq5k8lRP 2UjKXWKu/ZXpJFc5E1AfHM5EZLAALPDsNyWuNwU= X-Google-Smtp-Source: AMsMyM4lAwuI+9Axyas0NgzfeQDF0VZhyliMP0/ACh+OYSuESAgG+hWN9kZ9CQnjA2Iw3r2lnXl97STv7OE8Qyy0axg= X-Received: by 2002:a05:6214:1d21:b0:4ad:1361:befa with SMTP id f1-20020a0562141d2100b004ad1361befamr22055161qvd.111.1664302835912; Tue, 27 Sep 2022 11:20:35 -0700 (PDT) MIME-Version: 1.0 References: <20220927012044.2794384-1-pcc@google.com> In-Reply-To: <20220927012044.2794384-1-pcc@google.com> From: Andrey Konovalov Date: Tue, 27 Sep 2022 20:20:25 +0200 Message-ID: Subject: Re: [PATCH v2] kasan: also display registers for reports from HW exceptions To: Peter Collingbourne Cc: Catalin Marinas , Vincenzo Frascino , Andrew Morton , Linux ARM , kasan-dev , Linux Memory Management List Content-Type: text/plain; charset="UTF-8" ARC-Authentication-Results: i=1; imf21.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=cgYtUma6; spf=pass (imf21.hostedemail.com: domain of andreyknvl@gmail.com designates 209.85.219.50 as permitted sender) smtp.mailfrom=andreyknvl@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1664302836; a=rsa-sha256; cv=none; b=oPN6egSHkTdbNGQxrfeIJwZoibqxP2bDk9qt/ZqwFIiiI9ztrGUUw2BR1Te38Pzl+lQnJE Fb8Xk24SOI9dHl1RdJem9UKmZ+InAICZMihSwviWSGNbYhfkRn6NPK8TfhRaHutppXE6eO 6DIN1ZoQJtUgbR+olsbrcdumT4radUk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1664302836; 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:in-reply-to:references:references:dkim-signature; bh=K3EEm+yGioRUPVfrRwhSvMYbgEGQ+F2ANH5pgoFJVpo=; b=HJu69LFR/yTksOZjY+aFo2ycW65NNyYE60b5u2VOmQsCcpl4D7ToxMuI/jboFcABJNEg0j fuK3N6C4fE1tRTBU0Dm5DrMLZfJ9g2cRlfxuDFv11PWqKB0WiEqNxFmM7qVtOLYXsyAOjo T/vhWJ0ZSdcFq2i/1kmIOy//J2y5sxA= Authentication-Results: imf21.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=cgYtUma6; spf=pass (imf21.hostedemail.com: domain of andreyknvl@gmail.com designates 209.85.219.50 as permitted sender) smtp.mailfrom=andreyknvl@gmail.com; dmarc=pass (policy=none) header.from=gmail.com X-Rspam-User: X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: AEEBD1C0013 X-Stat-Signature: rgg7cpr5kg8d6f1zhs1a9ubca95jn75t X-HE-Tag: 1664302836-371890 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: On Tue, Sep 27, 2022 at 3:20 AM Peter Collingbourne wrote: > > 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 > Reviewed-by: Andrey Konovalov Thanks!