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 X-Spam-Level: X-Spam-Status: No, score=-20.4 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 78D66C433DF for ; Mon, 12 Oct 2020 20:47:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3953F20708 for ; Mon, 12 Oct 2020 20:47:27 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="tK2nFqlN" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388750AbgJLUrZ (ORCPT ); Mon, 12 Oct 2020 16:47:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40950 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731443AbgJLUqq (ORCPT ); Mon, 12 Oct 2020 16:46:46 -0400 Received: from mail-qv1-xf4a.google.com (mail-qv1-xf4a.google.com [IPv6:2607:f8b0:4864:20::f4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 879AEC0613DE for ; Mon, 12 Oct 2020 13:46:19 -0700 (PDT) Received: by mail-qv1-xf4a.google.com with SMTP id u17so11428464qvt.23 for ; Mon, 12 Oct 2020 13:46:19 -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=4P0nIsUWr4hug9uTHV4YbGNkHcxo9uGG3eroRt4rLtQ=; b=tK2nFqlN57/q71Tot88KthjVsgp3ftylfLLdqBnRG5+1mHcgjCLO7yEozlYm/HGAzF u0T1T8+6O/jAGiiOdff2OL13p/fvCzhmemS5M5WOLXtnqclFoxVh9BoKG4MYDsv1efJf ZsitIrLaug+l0v4LIv7Iy5zhvhrHmsANIYyA7UH4HvkvZicF/hxY76glhGOYHi4WLBae FRwSWk9yaH9yu3NuuowqoVK7V0Yaz7/rT3Oa/pGHSIkn0GZCGa9VS2XuyPXdlqI4huoa 2Y6oCMJdSjlXFwTHyBp7kpYVxMdLDO3j58PXc97yv2iiO3wx3nBYt8JNMvr3st2uePSy VkIg== 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=4P0nIsUWr4hug9uTHV4YbGNkHcxo9uGG3eroRt4rLtQ=; b=nn34usjbz/Sw2p/cYftkWFU5/sNYhSCepge2W/SIsTWncxFWkY9Nt2SBsvXI7xsfL0 amV5yOCeU4SYPxAAwrgNRPzW3oXzQhPTcoHi1UMeG9jZPext54fbXQ9SL95VZlvlqRsJ bsvRiQBplKYyzeFwnLYd275AxNqz5ORZUXysSQxbr265AwxDo0Zyif/bErKaxeBUMT6B 9Ki/MTJDBsxlTBwfIwcy73B0ct9Cv8iCfhVK+RHUIfuB9Fg5GSDNGnIyzshQLE53HsLh TE+Q564Sabv70DOxiAAK9SqyznD4oumoNwoOv+eoat3f8RDVDFB2N6AiWKLkWLpzaZ6h 7q6w== X-Gm-Message-State: AOAM531Al3ooKjuWRjU03bQqKaxhkHw0YXBL1+eBEltZoV0ZqIMA+ZLs ugla7Krr1IZ2HJbbAiR3ZQrfIT4O6N0U9fX0 X-Google-Smtp-Source: ABdhPJz77TKrsxVAoOnXQO0jvWsuPcjw3BjnjrDnfdxih5v5g1MOG1VkqmdyD3DmVZGH0OxARZCVtuug9rxwjQLW Sender: "andreyknvl via sendgmr" X-Received: from andreyknvl3.muc.corp.google.com ([2a00:79e0:15:13:7220:84ff:fe09:7e9d]) (user=andreyknvl job=sendgmr) by 2002:ad4:59cf:: with SMTP id el15mr27782436qvb.17.1602535578726; Mon, 12 Oct 2020 13:46:18 -0700 (PDT) Date: Mon, 12 Oct 2020 22:44:42 +0200 In-Reply-To: Message-Id: <7c8b0dcdf1cebeb0a596c7aa4be48863cc8b2c9b.1602535397.git.andreyknvl@google.com> Mime-Version: 1.0 References: X-Mailer: git-send-email 2.28.0.1011.ga647a8990f-goog Subject: [PATCH v5 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 Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 d110f382dacf..1c314e6f7918 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -295,10 +296,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_kernel_fault(unsigned long addr, unsigned int esr, struct pt_regs *regs) diff --git a/mm/kasan/report.c b/mm/kasan/report.c index 3924127b4786..f8817d5685a7 100644 --- a/mm/kasan/report.c +++ b/mm/kasan/report.c @@ -60,9 +60,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); -- 2.28.0.1011.ga647a8990f-goog