Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp1006835pxk; Fri, 25 Sep 2020 03:53:13 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxz+CrXOhOHE4I1ZOXyp8mTCREsrk1v+inOAbMHE9BYer55tc6MhwJ+gN2t1yzA0VhO/B+6 X-Received: by 2002:a50:fc83:: with SMTP id f3mr663096edq.102.1601031193628; Fri, 25 Sep 2020 03:53:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1601031193; cv=none; d=google.com; s=arc-20160816; b=yBH+Xw1WNXwyJXCfubEIIsJirsKCajwgL0P7fSMfVlOXiCgd8L0l9c6hBrSdJp5XpV aha3DHwdeB+qTKq3w/S2krjwdmvcHQfeNBSnJhI/SRiF7FoXYiKlli25RCAQ3Mfb5tLw CrS90r6UdqlGybcCs+puhrFuHIkzDVhtr9cJymd+ruap34ZvyN6p2UsmX9XHoc/hDty0 2UwUyKNufRSNqY1P355+RWLShsOuNMvZPd+3Eo5oPlUG4yQFtCMtBaC1xNwfmVmHSZs6 PDm3g1/jg+4NGbHvmeIb+33+k0h3Q7x50fsjHtMkHWlC2OtFQzlssFNxb6WpMyFTzWX9 xzVQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:user-agent:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:from:date; bh=RwMEWS9MKtNcuU+UKA+HKgpNEtdB/Wj3LQo+DhzT2po=; b=dxNhRhkxseDmpnVT5R4+ez59DIxakYtdqp9pkhO61RaSYnjDBhkLRbeNPlsV8YAewx 4Q17L5eqzroWsdLYp8uJ04oh2S60aEpVLnYtZbkb5o8Dnx/+AciPtOcwUaJqGuJDCTOE RcDg7QvuXdS4VOn0cBLoybdZgTIccHJyYXXihrSA5MckWVxZitcMPWydjYcSfEmNNcfq c1rW/dhR+hpoe3k8H1KMxv6asPT74laYWttpoBECtjGm0hm9iAarqvgS2ZFlQEF+aLXd p+3rTVB7PgYFKYj5amyYTQK/Pbvi6F2w4cOb0n6iICdUtVJ07egU7+R3ijuGo1y0Cnwj u5Uw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id e18si1592309ejq.144.2020.09.25.03.52.49; Fri, 25 Sep 2020 03:53:13 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727733AbgIYKtj (ORCPT + 99 others); Fri, 25 Sep 2020 06:49:39 -0400 Received: from mail.kernel.org ([198.145.29.99]:58354 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727132AbgIYKtj (ORCPT ); Fri, 25 Sep 2020 06:49:39 -0400 Received: from gaia (unknown [31.124.44.166]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 5020421D91; Fri, 25 Sep 2020 10:49:36 +0000 (UTC) Date: Fri, 25 Sep 2020 11:49:33 +0100 From: Catalin Marinas To: Andrey Konovalov Cc: Dmitry Vyukov , Vincenzo Frascino , kasan-dev@googlegroups.com, 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 Subject: Re: [PATCH v3 26/39] arm64: mte: Add in-kernel tag fault handler Message-ID: <20200925104933.GD4846@gaia> References: <17ec8af55dc0a4d3ade679feb0858f0df4c80d27.1600987622.git.andreyknvl@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <17ec8af55dc0a4d3ade679feb0858f0df4c80d27.1600987622.git.andreyknvl@google.com> User-Agent: Mutt/1.10.1 (2018-07-13) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Sep 25, 2020 at 12:50:33AM +0200, Andrey Konovalov wrote: > diff --git a/arch/arm64/include/asm/uaccess.h b/arch/arm64/include/asm/uaccess.h > index 991dd5f031e4..c7fff8daf2a7 100644 > --- a/arch/arm64/include/asm/uaccess.h > +++ b/arch/arm64/include/asm/uaccess.h > @@ -200,13 +200,36 @@ do { \ > CONFIG_ARM64_PAN)); \ > } while (0) > > +/* > + * The Tag Check Flag (TCF) mode for MTE is per EL, hence TCF0 > + * affects EL0 and TCF affects EL1 irrespective of which TTBR is > + * used. > + * The kernel accesses TTBR0 usually with LDTR/STTR instructions > + * when UAO is available, so these would act as EL0 accesses using > + * TCF0. > + * However futex.h code uses exclusives which would be executed as > + * EL1, this can potentially cause a tag check fault even if the > + * user disables TCF0. > + * > + * To address the problem we set the PSTATE.TCO bit in uaccess_enable() > + * and reset it in uaccess_disable(). > + * > + * The Tag check override (TCO) bit disables temporarily the tag checking > + * preventing the issue. > + */ > static inline void uaccess_disable(void) > { > + asm volatile(ALTERNATIVE("nop", SET_PSTATE_TCO(0), > + ARM64_MTE, CONFIG_KASAN_HW_TAGS)); > + > __uaccess_disable(ARM64_HAS_PAN); > } > > static inline void uaccess_enable(void) > { > + asm volatile(ALTERNATIVE("nop", SET_PSTATE_TCO(1), > + ARM64_MTE, CONFIG_KASAN_HW_TAGS)); > + > __uaccess_enable(ARM64_HAS_PAN); > } This look fine. > diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c > index a3bd189602df..d110f382dacf 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,11 @@ 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) > +{ > +} Do we need to introduce report_tag_fault() in this patch? It's fine but add a note in the commit log that it will be populated in a subsequent patch. > + > static void __do_kernel_fault(unsigned long addr, unsigned int esr, > struct pt_regs *regs) > { > @@ -641,10 +647,40 @@ 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) > +{ > + static bool reported = false; > + > + if (!READ_ONCE(reported)) { > + report_tag_fault(addr, esr, regs); > + WRITE_ONCE(reported, true); > + } I don't mind the READ_ONCE/WRITE_ONCE here but not sure what they help with. -- Catalin