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=-12.5 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_INVALID,DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham 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 C7823C43461 for ; Tue, 15 Sep 2020 21:17:23 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 6D20820770 for ; Tue, 15 Sep 2020 21:17:23 +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="vmOgCDX4" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6D20820770 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 A506190008C; Tue, 15 Sep 2020 17:17:22 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id A341990008A; Tue, 15 Sep 2020 17:17:22 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 8ECE390008C; Tue, 15 Sep 2020 17:17:22 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0005.hostedemail.com [216.40.44.5]) by kanga.kvack.org (Postfix) with ESMTP id 760EF90008A for ; Tue, 15 Sep 2020 17:17:22 -0400 (EDT) Received: from smtpin11.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay03.hostedemail.com (Postfix) with ESMTP id 2FF328249980 for ; Tue, 15 Sep 2020 21:17:22 +0000 (UTC) X-FDA: 77266556724.11.toys18_2a0bbfb27114 Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin11.hostedemail.com (Postfix) with ESMTP id 0236F180F8B80 for ; Tue, 15 Sep 2020 21:17:21 +0000 (UTC) X-HE-Tag: toys18_2a0bbfb27114 X-Filterd-Recvd-Size: 6037 Received: from mail-qk1-f201.google.com (mail-qk1-f201.google.com [209.85.222.201]) by imf01.hostedemail.com (Postfix) with ESMTP for ; Tue, 15 Sep 2020 21:17:21 +0000 (UTC) Received: by mail-qk1-f201.google.com with SMTP id 205so4115192qkd.2 for ; Tue, 15 Sep 2020 14:17:21 -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=8gCy5LzCrZ4Ippif5C2Kr6pI1Q8A3vPTLrXylwHP5Is=; b=vmOgCDX4Ovlo+g3q/YjlH2gzNXCBg6oYk1uHca7WFAJy0wEyxCaO7diA4/HQFhbfTm vZCxg8qtkEXtSmNVkwvmd3y9aPHfb1O3HzVcCMYG5GkvRSxpNmSqOEo731jm0j0k1tVu OEKw5b06tRh6HL9jAeFZXqBsP1qLSDni5lS66o6K10BKTIu2Gh3yDizNmuHcNyx++XHH tHYzDWRe+6TQkK1QpWT99yOl6ce7cDGFlAIEDlSgVkns9356jlEzO60Y5PwCulcoS0Vx tVwDbjoZHJktHkYmPTJ4GRQBmCpdAnlxFId4luoMymcP63yZ58/CEn/wg3c6xs89g66t gxGA== 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=8gCy5LzCrZ4Ippif5C2Kr6pI1Q8A3vPTLrXylwHP5Is=; b=D4vzuee78GCAbPgUtIpzpWPxSShi3Dlyz7wkf3dbWbt6rL+cdGaloYvf8nlP0yD/mW 1vWUoXVxH5QZ1+pR9RI71xaumeK/jIcFkeuBHpXsBIA1iYaCrg9iAknnCQ7uI9Rqfmu8 XMEdwHN0n+STnp4+iwoGYryFBonuILSf7HQFGGsl71ga89oK9g9/X7ZLYQtDOlecRfYt 7dPN57Xkd60EZVaeVheJoTEJxsOtZYzQyc/Qlu6DbtG1QhgjLHfCz6rSidEPN7cTdCjW lxe3dxlQ1ZiduQ7Dc+WILK6EYY9p+rToIvixLaO0fZyjrO+3W/zwXufHvWzHefPeo9cc 9Qtw== X-Gm-Message-State: AOAM532Ycq7pYL4Dngousd7c/iuOOFr89z8mCS0t6ryZOh8be4xNRP3o Y/b2QBxOwWcXz8GMJ1eZAbd/qO+LDyh6C4vN X-Google-Smtp-Source: ABdhPJx1hOhDWmjDE0HlzEorlVjxg9QmeE8fIeKQfK3gTvzMzRC6zTbmaUqg7dVWWCVncgIssdu5E4KU6Pu81Z6R X-Received: from andreyknvl3.muc.corp.google.com ([2a00:79e0:15:13:7220:84ff:fe09:7e9d]) (user=andreyknvl job=sendgmr) by 2002:ad4:5745:: with SMTP id q5mr19950252qvx.29.1600204640737; Tue, 15 Sep 2020 14:17:20 -0700 (PDT) Date: Tue, 15 Sep 2020 23:16:06 +0200 In-Reply-To: Message-Id: <7866d9e6f11f12f1bad42c895bf4947addba71c2.1600204505.git.andreyknvl@google.com> Mime-Version: 1.0 References: X-Mailer: git-send-email 2.28.0.618.gf4bc123cb7-goog Subject: [PATCH v2 24/37] arm64: mte: Add in-kernel tag fault handler From: Andrey Konovalov To: Dmitry Vyukov , Vincenzo Frascino , Catalin Marinas , kasan-dev@googlegroups.com Cc: Andrey Ryabinin , Alexander Potapenko , Marco Elver , Evgenii Stepanov , Elena Petrova , Branislav Rankov , Kevin Brodsky , Will Deacon , 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" X-Rspamd-Queue-Id: 0236F180F8B80 X-Spamd-Result: default: False [0.00 / 100.00] X-Rspamd-Server: rspam05 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: From: Vincenzo Frascino Add the implementation of the in-kernel fault handler. When a tag fault happens on a kernel address: * a warning is logged, * MTE is disabled on the current CPU, * the execution continues. When a tag fault happens on a user address: * the kernel executes do_bad_area() and panics. Signed-off-by: Vincenzo Frascino Co-developed-by: Andrey Konovalov Signed-off-by: Andrey Konovalov --- Change-Id: I9b8aa79567f7c45f4d6a1290efcf34567e620717 --- arch/arm64/mm/fault.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index a3bd189602df..cdc23662691c 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -294,6 +295,18 @@ static void die_kernel_fault(const char *msg, unsigned long addr, do_exit(SIGKILL); } +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; + + pr_alert("Memory Tagging Extension Fault in %pS\n", (void *)regs->pc); + pr_alert(" %s at address %lx\n", is_write ? "Write" : "Read", addr); + pr_alert(" Pointer tag: [%02x], memory tag: [%02x]\n", + mte_get_ptr_tag(addr), + mte_get_mem_tag((void *)addr)); +} + static void __do_kernel_fault(unsigned long addr, unsigned int esr, struct pt_regs *regs) { @@ -641,10 +654,31 @@ static int do_sea(unsigned long addr, unsigned int esr, struct pt_regs *regs) return 0; } +static void do_tag_recovery(unsigned long addr, unsigned int esr, + struct pt_regs *regs) +{ + report_tag_fault(addr, esr, regs); + + /* + * Disable Memory Tagging Extension Tag Checking on the local CPU + * for the current EL. + * It will be done lazily on the other CPUs when they will hit a + * tag fault. + */ + sysreg_clear_set(sctlr_el1, SCTLR_ELx_TCF_MASK, SCTLR_ELx_TCF_NONE); + isb(); +} + + static int do_tag_check_fault(unsigned long addr, unsigned int esr, struct pt_regs *regs) { - do_bad_area(addr, esr, regs); + /* The tag check fault (TCF) is per TTBR */ + if (is_ttbr0_addr(addr)) + do_bad_area(addr, esr, regs); + else + do_tag_recovery(addr, esr, regs); + return 0; } -- 2.28.0.618.gf4bc123cb7-goog