From patchwork Mon Apr 8 16:02:13 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marc Zyngier X-Patchwork-Id: 10889795 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 3E455139A for ; Mon, 8 Apr 2019 16:02:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 226B4286D1 for ; Mon, 8 Apr 2019 16:02:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 17357286DE; Mon, 8 Apr 2019 16:02:38 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id AFCEF286D1 for ; Mon, 8 Apr 2019 16:02:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=BY7PtSHIlhFYkvAODuw6gYsTWk43MR+tZHWeCnAc3O8=; b=YqxcX5r7EqZE56 smtifVffoAhhYLKiuxZcz7S0NLzPGP9IT6i7JomM6Gvb+hmTaIRmkxOSTuUcWP7wiMvb2QhCYV8vG yG6hZHfBDhSzv8ynK872nRhDUYbm87zpATk+fXvCbNNNJQ9DvUrNR9Nbw1Ngq7HMEvvhzWRPGgqC/ pHWhODYaHE0YodgdsRS2hkpmzapUpMZuUGOm11NnLtztD/QdJmN1/cUBRhSmXcp4csAAKUTeHWSUq 2APR33zOdbOpxAopOpCn+NbV6i1/TY4pPz/or07tPdJG34aGzEwKgmukOXSZZBTj6TDl12hEs3/xz g9AO75SOuePUuiHLamJg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1hDWjC-0003ge-Ix; Mon, 08 Apr 2019 16:02:34 +0000 Received: from foss.arm.com ([217.140.101.70]) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1hDWj2-0003Y8-Hu for linux-arm-kernel@lists.infradead.org; Mon, 08 Apr 2019 16:02:25 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 635B515BE; Mon, 8 Apr 2019 09:02:24 -0700 (PDT) Received: from filthy-habits.cambridge.arm.com (filthy-habits.cambridge.arm.com [10.1.196.92]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 53FB53F557; Mon, 8 Apr 2019 09:02:23 -0700 (PDT) From: Marc Zyngier To: linux-arm-kernel@lists.infradead.org Subject: [PATCH 1/4] arm64: Restrict ARM64_ERRATUM_1188873 mitigation to AArch32 Date: Mon, 8 Apr 2019 17:02:13 +0100 Message-Id: <20190408160216.223871-2-marc.zyngier@arm.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190408160216.223871-1-marc.zyngier@arm.com> References: <20190408160216.223871-1-marc.zyngier@arm.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190408_090224_594978_2F43F8B9 X-CRM114-Status: GOOD ( 11.83 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Mark Rutland , Catalin Marinas , Daniel Lezcano , Will Deacon Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP We currently deal with ARM64_ERRATUM_1188873 by always trapping EL0 accesses for both instruction sets. Although nothing wrong comes out of that, people trying to squeeze the last drop of performance from buggy HW find this over the top. Oh well. Let's change the mitigation by flipping the counter enable bit on return to userspace. Non-broken HW gets an extra branch on the fast path, which is hopefully not the end of the world. The arch timer workaround it also removed. Signed-off-by: Marc Zyngier Acked-by: Daniel Lezcano --- arch/arm64/kernel/entry.S | 23 +++++++++++++++++++++++ drivers/clocksource/arm_arch_timer.c | 15 --------------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index c50a7a75f2e0..e0aed21ab402 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -336,6 +336,29 @@ alternative_if ARM64_WORKAROUND_845719 alternative_else_nop_endif #endif 3: +#ifdef CONFIG_ARM64_ERRATUM_1188873 +alternative_if_not ARM64_WORKAROUND_1188873 + b 1f +alternative_else_nop_endif + + ubfx x0, x22, #4, #1 // Extract PSR_MODE32 + eor x0, x0, #1 // Negate it +alternative_if_not ARM64_HAS_VIRT_HOST_EXTN + mrs x1, cntkctl_el1 +alternative_else + mrs x1, cnthctl_el2 +alternative_endif + ubfx x2, x1, #1, #1 // Extract EL0VCTEN + cmp x2, x0 + b.eq 1f // Matches, nothing to do + bfi x1, x0, #1, #1 // Move EL0VCTEN in place +alternative_if_not ARM64_HAS_VIRT_HOST_EXTN + msr cntkctl_el1, x1 +alternative_else + msr cnthctl_el2, x1 +alternative_endif +1: +#endif apply_ssbd 0, x0, x1 .endif diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c index 5fcccc467868..27acc9eb0f7c 100644 --- a/drivers/clocksource/arm_arch_timer.c +++ b/drivers/clocksource/arm_arch_timer.c @@ -339,13 +339,6 @@ static u64 notrace arm64_858921_read_cntvct_el0(void) } #endif -#ifdef CONFIG_ARM64_ERRATUM_1188873 -static u64 notrace arm64_1188873_read_cntvct_el0(void) -{ - return read_sysreg(cntvct_el0); -} -#endif - #ifdef CONFIG_SUN50I_ERRATUM_UNKNOWN1 /* * The low bits of the counter registers are indeterminate while bit 10 or @@ -476,14 +469,6 @@ static const struct arch_timer_erratum_workaround ool_workarounds[] = { .read_cntvct_el0 = arm64_858921_read_cntvct_el0, }, #endif -#ifdef CONFIG_ARM64_ERRATUM_1188873 - { - .match_type = ate_match_local_cap_id, - .id = (void *)ARM64_WORKAROUND_1188873, - .desc = "ARM erratum 1188873", - .read_cntvct_el0 = arm64_1188873_read_cntvct_el0, - }, -#endif #ifdef CONFIG_SUN50I_ERRATUM_UNKNOWN1 { .match_type = ate_match_dt,