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=-9.8 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,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 58403C282DD for ; Wed, 8 Jan 2020 19:01:21 +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 2EBF620678 for ; Wed, 8 Jan 2020 19:01:21 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="t/X8hWd9" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2EBF620678 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org 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:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id: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=+ArpmF9w5EefC9+648ggV9/4RQDsQrvPhm99bLPcz38=; b=t/X8hWd9/qPGQ6d/3ETzsXcm6l YWTAUrsikpntjbjCCqmVzaHH+0zdmt2oCVZ95AQQzcQFZF5NShE6Q8G5tBEIkv+kSvgjpCd2hqPGo pqfMoJLFG10WyA2O8DKpA5/BXAo+MOmGaU5Uaj0rYS1DMRZX15YZFhdlzy3Q+CKtdo6BjeIkwhM5a e19OEcQLmMLW49JnjdrXNBmlJG2bRCaB7PC5uwOUyUTjMAp6H9F1XL2qUQqdExId0xKWTfJnqjcyU MZCWrk4YsiQjKxxhIcA/uU8d/WL0DyuPwZUG/3ezRRXCrEXlrRWirlki9NpcB3Mc5phlinuWCs35+ t/dKcrjg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1ipGZu-00048y-Eb; Wed, 08 Jan 2020 19:01:14 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1ipGWF-0007px-QC for linux-arm-kernel@lists.infradead.org; Wed, 08 Jan 2020 18:57:29 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 16FF81FB; Wed, 8 Jan 2020 10:57:27 -0800 (PST) Received: from lakrids.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 876243F534; Wed, 8 Jan 2020 10:57:25 -0800 (PST) From: Mark Rutland To: linux-arm-kernel@lists.infradead.org, catalin.marinas@arm.com, will@kernel.org, james.morse@arm.com Subject: [PATCH 16/17] arm64: entry: move ARM64_ERRATUM_1418040 workaround to C Date: Wed, 8 Jan 2020 18:56:33 +0000 Message-Id: <20200108185634.1163-17-mark.rutland@arm.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20200108185634.1163-1-mark.rutland@arm.com> References: <20200108185634.1163-1-mark.rutland@arm.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200108_105727_977390_4AE59363 X-CRM114-Status: GOOD ( 11.86 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mark.rutland@arm.com, keescook@chromium.org, maz@kernel.org, broonie@kernel.org, labbott@redhat.com, robin.murphy@arm.com, julien.thierry.kdev@gmail.com, alex.popov@linux.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org To make the entry code less of a rats nest of overlapping labels and shared state, and to make the code easier to debug and maintain, lets move the workaround for ARM64_ERRATUM_1418040 to C. The workaround requires us to disable EL0 access to the virtual counter, and emulate these accesses when they are trapped. The assembly code is only responsible for manipulating the trap control, which we can safely do in C code. Signed-off-by: Mark Rutland Cc: Catalin Marinas Cc: James Morse Cc: Marc Zyngier Cc: Robin Murphy Cc: Will Deacon --- arch/arm64/kernel/entry-common.c | 20 ++++++++++++++++++++ arch/arm64/kernel/entry.S | 15 --------------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/arch/arm64/kernel/entry-common.c b/arch/arm64/kernel/entry-common.c index 28b241cfd8f0..a7bebc3ce2a4 100644 --- a/arch/arm64/kernel/entry-common.c +++ b/arch/arm64/kernel/entry-common.c @@ -28,6 +28,8 @@ #include #include +#include + static void notrace el1_abort(struct pt_regs *regs, unsigned long esr) { unsigned long far = read_sysreg(far_el1); @@ -136,6 +138,23 @@ static void notrace workaround_arm64_erratum_845719(void) } NOKPROBE_SYMBOL(workaround_arm64_erratum_845719); +static void notrace workaround_arm64_erratum_1418040(void) +{ + unsigned long clear = 0, set = 0; + + if (!IS_ENABLED(CONFIG_ARM64_ERRATUM_1418040) || + !cpus_have_const_cap(ARM64_WORKAROUND_1418040)) + return; + + if (is_compat_task()) + clear = ARCH_TIMER_USR_VCT_ACCESS_EN; + else + set = ARCH_TIMER_USR_VCT_ACCESS_EN; + + sysreg_clear_set(cntkctl_el1, clear, set); +} +NOKPROBE_SYMBOL(workaround_arm64_erratum_1418040); + static void notrace el0_prepare_return(struct pt_regs *regs) { unsigned long flags; @@ -154,6 +173,7 @@ static void notrace el0_prepare_return(struct pt_regs *regs) user_enter(); workaround_arm64_erratum_845719(); + workaround_arm64_erratum_1418040(); stackleak_erase(); } diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index a7340e551589..537b44c413df 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -288,21 +288,6 @@ alternative_else_nop_endif .if \el == 0 ldr x23, [sp, #S_SP] // load return stack pointer msr sp_el0, x23 -#ifdef CONFIG_ARM64_ERRATUM_1418040 -alternative_if_not ARM64_WORKAROUND_1418040 - b 4f -alternative_else_nop_endif - /* - * if (x22.mode32 == cntkctl_el1.el0vcten) - * cntkctl_el1.el0vcten = ~cntkctl_el1.el0vcten - */ - mrs x1, cntkctl_el1 - eon x0, x1, x22, lsr #3 - tbz x0, #1, 4f - eor x1, x1, #2 // ARCH_TIMER_USR_VCT_ACCESS_EN - msr cntkctl_el1, x1 -4: -#endif apply_ssbd 0, x0, x1 .endif -- 2.11.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel