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=-10.7 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS 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 71D45C432BE for ; Sun, 29 Aug 2021 14:12:57 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2C86560F23 for ; Sun, 29 Aug 2021 14:12:57 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 2C86560F23 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:Subject:Message-ID:Date:From: In-Reply-To:References:MIME-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=apL7JPq3W+/aPx9lnVq3SU8Wptq+7bg5mdBTlkV8q/I=; b=Ho2+2Gp89y2tcF +m2dvsB7YLY0dYZ1kKrI+5Xku52ob6AljpwOdte1u6lBx2hohT0bRJUtojfWJQ3JkF9bemBEEdNjv ggahN3u4NiNILyyUc4rwrDr+GAytB+w1U4+Uj2K9OdqBCcwvTN4iLKq5IldW6sNXEl2kPcMIcPPEP DpXXrOk7ph4MEGuKoIZYBfc8As+NO/8j6qaIwBWPLMXp+YY6qruhs6cMMKh4pfNqoRXrrT2YizvxH Vbcul2vot0nWV9MqoeoGSH5hndgzuY65Pvu4dPe5GhU9zHIxx9B86yYbzGcGP2WVqNbRX/Yme93u8 ajiQTCMyIZWNUkm2BtOA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mKLWO-00Fbcg-RG; Sun, 29 Aug 2021 14:10:53 +0000 Received: from mail-ed1-x535.google.com ([2a00:1450:4864:20::535]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mKLWH-00FbcK-Q8 for linux-arm-kernel@lists.infradead.org; Sun, 29 Aug 2021 14:10:50 +0000 Received: by mail-ed1-x535.google.com with SMTP id s25so17562846edw.0 for ; Sun, 29 Aug 2021 07:10:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=NgonOINUPhiqzIP1951y+/JXhge1GyY8ENUa2+4J8u0=; b=uhC+KKLwUbGE08wtjRgF6srsto6swX2i4u3+fKNpRnpAaWvHMWeDtY15md6Dhk3/rx JR0YtXHPjc4YZXAHAK6ZQJExJeVrZLmSgpayfSp/yOK450/w9xShCf2KYLFngs0hNHr+ vGI7jJNf0FvsH+0jsFGDR0iCkLvQdJtczDOhzIHiqW+Atr9iidPM5BC1GkfQ8jFggK6s j6xFcCuuP+EhqhvF5K1K+bciu2YkhWJJykPMDlHTWE8DQGZcV41YjiqjBjV9K4gjut0Z g7DRJm1srtEosTpRHVWLe0BBLs088E+b7kddmkQNfgBAOpvPxxyDSnQFOhc/qvGuSrbf CcIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=NgonOINUPhiqzIP1951y+/JXhge1GyY8ENUa2+4J8u0=; b=Xk7E/fc57Ld+OjqhV/MYNl1dPVzzQYRdv6w7d2vQbaJswHDon1kQ37uYlGgAWehOK+ 1NRSXrkf5zUHj0XalNyeCfPRHpZa4rnYrese483J92R4Aa8cwb9SCRfh7k5X50Bpf8Am HoHosz72yNJcl3YqmiM389QDuTG3fSgWi6pjivp5NXgUU6tL6sfleAZiP7tY5IJMbnSh dzKTQ19+6r88uI9TOD4cZc/5ttoFHfX8Vl/vjOOyOQm0zM8aAc3lsWtfldPpxvO0wR2R wshYUVkkd8QUPO/CTAoxY14w4cb5AzCNpCg17pWHx4ychJeHG2bhbR3RFt8jMVBCVUNJ zQsg== X-Gm-Message-State: AOAM531VoURFNe2hggE3jy1ny77wW2vv5yuiGwcdMD6Nn6jajXtea1Bk CQVuJiRwsAXQmYZJVDuNEzwdAFjkyBw26ttXl+Q= X-Google-Smtp-Source: ABdhPJzpNKwwwzffo5Bv4AupBI/GzxGzDPfWe1guKA6eDvhv530c72xRdYTRHsMCF8738Gtu798p8FX2L2pci/5VYjA= X-Received: by 2002:a05:6402:318c:: with SMTP id di12mr19489641edb.55.1630246242585; Sun, 29 Aug 2021 07:10:42 -0700 (PDT) MIME-Version: 1.0 References: <20210827030748.587710-1-pcc@google.com> In-Reply-To: <20210827030748.587710-1-pcc@google.com> From: Andrey Konovalov Date: Sun, 29 Aug 2021 16:10:31 +0200 Message-ID: Subject: Re: [PATCH] arm64: kasan: mte: move GCR_EL1 switch to task switch when KASAN disabled To: Peter Collingbourne Cc: Catalin Marinas , Vincenzo Frascino , Will Deacon , Evgenii Stepanov , Linux ARM X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210829_071045_916463_063AEB5D X-CRM114-Status: GOOD ( 28.16 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Fri, Aug 27, 2021 at 5:07 AM Peter Collingbourne wrote: > > It is not necessary to write to GCR_EL1 on every kernel entry and > exit when HW tag-based KASAN is disabled because the kernel will not > execute any IRG instructions in that mode. Since accessing GCR_EL1 > can be expensive on some microarchitectures, avoid doing so by moving > the access to task switch when HW tag-based KASAN is disabled. > > Signed-off-by: Peter Collingbourne > --- > arch/arm64/kernel/entry.S | 10 +++++----- > arch/arm64/kernel/mte.c | 24 +++++++++++++++++++++--- > include/linux/kasan.h | 9 +++++++-- > 3 files changed, 33 insertions(+), 10 deletions(-) > > diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S > index 923ee2ac85fd..e12ed892cde8 100644 > --- a/arch/arm64/kernel/entry.S > +++ b/arch/arm64/kernel/entry.S > @@ -178,9 +178,9 @@ alternative_else_nop_endif > > .macro mte_set_kernel_gcr, tmp, tmp2 > #ifdef CONFIG_KASAN_HW_TAGS > -alternative_if_not ARM64_MTE > +alternative_cb kasan_hw_tags_enable > b 1f > -alternative_else_nop_endif > +alternative_cb_end > mov \tmp, KERNEL_GCR_EL1 > msr_s SYS_GCR_EL1, \tmp > 1: > @@ -188,10 +188,10 @@ alternative_else_nop_endif > .endm > > .macro mte_set_user_gcr, tsk, tmp, tmp2 > -#ifdef CONFIG_ARM64_MTE > -alternative_if_not ARM64_MTE > +#ifdef CONFIG_KASAN_HW_TAGS > +alternative_cb kasan_hw_tags_enable > b 1f > -alternative_else_nop_endif > +alternative_cb_end > ldr \tmp, [\tsk, #THREAD_MTE_CTRL] > > mte_set_gcr \tmp, \tmp2 > diff --git a/arch/arm64/kernel/mte.c b/arch/arm64/kernel/mte.c > index 9d314a3bad3b..0e8edb5d5861 100644 > --- a/arch/arm64/kernel/mte.c > +++ b/arch/arm64/kernel/mte.c > @@ -162,7 +162,7 @@ void mte_check_tfsr_el1(void) > } > #endif > > -static void mte_update_sctlr_user(struct task_struct *task) > +static void mte_update_sctlr_user_and_gcr_excl(struct task_struct *task) > { > /* > * This must be called with preemption disabled and can only be called > @@ -182,6 +182,24 @@ static void mte_update_sctlr_user(struct task_struct *task) > else if (resolved_mte_tcf & MTE_CTRL_TCF_SYNC) > sctlr |= SCTLR_EL1_TCF0_SYNC; > task->thread.sctlr_user = sctlr; > + > + /* > + * SYS_GCR_EL1 will be set to current->thread.mte_ctrl value by > + * mte_set_user_gcr() in kernel_exit, but only if KASAN is enabled. > + */ > + if (!kasan_hw_tags_enabled()) > + write_sysreg_s(((mte_ctrl >> MTE_CTRL_GCR_USER_EXCL_SHIFT) & > + SYS_GCR_EL1_EXCL_MASK) | SYS_GCR_EL1_RRND, > + SYS_GCR_EL1); > +} > + > +void __init kasan_hw_tags_enable(struct alt_instr *alt, __le32 *origptr, > + __le32 *updptr, int nr_inst) > +{ > + BUG_ON(nr_inst != 1); /* Branch -> NOP */ > + > + if (kasan_hw_tags_enabled()) > + *updptr = cpu_to_le32(aarch64_insn_gen_nop()); > } > > void mte_thread_init_user(void) > @@ -199,7 +217,7 @@ void mte_thread_init_user(void) > > void mte_thread_switch(struct task_struct *next) > { > - mte_update_sctlr_user(next); > + mte_update_sctlr_user_and_gcr_excl(next); > > /* > * Check if an async tag exception occurred at EL1. > @@ -244,7 +262,7 @@ long set_mte_ctrl(struct task_struct *task, unsigned long arg) > task->thread.mte_ctrl = mte_ctrl; > if (task == current) { > preempt_disable(); > - mte_update_sctlr_user(task); > + mte_update_sctlr_user_and_gcr_excl(task); > update_sctlr_el1(task->thread.sctlr_user); > preempt_enable(); > } > diff --git a/include/linux/kasan.h b/include/linux/kasan.h > index dd874a1ee862..de5f5913374d 100644 > --- a/include/linux/kasan.h > +++ b/include/linux/kasan.h > @@ -89,7 +89,7 @@ static __always_inline bool kasan_enabled(void) > return static_branch_likely(&kasan_flag_enabled); > } > > -static inline bool kasan_has_integrated_init(void) > +static inline bool kasan_hw_tags_enabled(void) > { > return kasan_enabled(); > } > @@ -104,7 +104,7 @@ static inline bool kasan_enabled(void) > return IS_ENABLED(CONFIG_KASAN); > } > > -static inline bool kasan_has_integrated_init(void) > +static inline bool kasan_hw_tags_enabled(void) > { > return false; > } > @@ -125,6 +125,11 @@ static __always_inline void kasan_free_pages(struct page *page, > > #endif /* CONFIG_KASAN_HW_TAGS */ > > +static inline bool kasan_has_integrated_init(void) > +{ > + return kasan_hw_tags_enabled(); > +} > + > #ifdef CONFIG_KASAN > > struct kasan_cache { > -- > 2.33.0.259.gc128427fd7-goog > Acked-by: Andrey Konovalov for non-arm-specific KASAN parts. _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel