linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Will Deacon <will.deacon@arm.com>
To: linux-arm-kernel@lists.infradead.org
Cc: linux-kernel@vger.kernel.org, catalin.marinas@arm.com,
	mark.rutland@arm.com, ard.biesheuvel@linaro.org,
	sboyd@codeaurora.org, dave.hansen@linux.intel.com,
	keescook@chromium.org, msalter@redhat.com, labbott@redhat.com,
	tglx@linutronix.de, Will Deacon <will.deacon@arm.com>
Subject: [PATCH v2 14/18] arm64: erratum: Work around Falkor erratum #E1003 in trampoline code
Date: Thu, 30 Nov 2017 16:39:42 +0000	[thread overview]
Message-ID: <1512059986-21325-15-git-send-email-will.deacon@arm.com> (raw)
In-Reply-To: <1512059986-21325-1-git-send-email-will.deacon@arm.com>

We rely on an atomic swizzling of TTBR1 when transitioning from the entry
trampoline to the kernel proper on an exception. We can't rely on this
atomicity in the face of Falkor erratum #E1003, so on affected cores we
can issue a TLB invalidation to invalidate the walk cache prior to
jumping into the kernel. There is still the possibility of a TLB conflict
here due to conflicting walk cache entries prior to the invalidation, but
this doesn't appear to be the case on these CPUs in practice.

Signed-off-by: Will Deacon <will.deacon@arm.com>
---
 arch/arm64/Kconfig        | 17 +++++------------
 arch/arm64/kernel/entry.S | 10 ++++++++++
 2 files changed, 15 insertions(+), 12 deletions(-)

diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index a93339f5178f..fdcc7b9bb15d 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -522,20 +522,13 @@ config CAVIUM_ERRATUM_30115
 config QCOM_FALKOR_ERRATUM_1003
 	bool "Falkor E1003: Incorrect translation due to ASID change"
 	default y
-	select ARM64_PAN if ARM64_SW_TTBR0_PAN
 	help
 	  On Falkor v1, an incorrect ASID may be cached in the TLB when ASID
-	  and BADDR are changed together in TTBRx_EL1. The workaround for this
-	  issue is to use a reserved ASID in cpu_do_switch_mm() before
-	  switching to the new ASID. Saying Y here selects ARM64_PAN if
-	  ARM64_SW_TTBR0_PAN is selected. This is done because implementing and
-	  maintaining the E1003 workaround in the software PAN emulation code
-	  would be an unnecessary complication. The affected Falkor v1 CPU
-	  implements ARMv8.1 hardware PAN support and using hardware PAN
-	  support versus software PAN emulation is mutually exclusive at
-	  runtime.
-
-	  If unsure, say Y.
+	  and BADDR are changed together in TTBRx_EL1. Since we keep the ASID
+	  in TTBR1_EL1, this situation only occurs in the entry trampoline and
+	  then only for entries in the walk cache, since the leaf translation
+	  is unchanged. Work around the erratum by invalidating the walk cache
+	  entries for the trampoline before entering the kernel proper.
 
 config QCOM_FALKOR_ERRATUM_1009
 	bool "Falkor E1009: Prematurely complete a DSB after a TLBI"
diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
index 99d105048663..a5ec6ab5c711 100644
--- a/arch/arm64/kernel/entry.S
+++ b/arch/arm64/kernel/entry.S
@@ -989,6 +989,16 @@ __ni_sys_trace:
 	sub	\tmp, \tmp, #(SWAPPER_DIR_SIZE + RESERVED_TTBR0_SIZE)
 	bic	\tmp, \tmp, #USER_ASID_FLAG
 	msr	ttbr1_el1, \tmp
+#ifdef CONFIG_QCOM_FALKOR_ERRATUM_1003
+alternative_if ARM64_WORKAROUND_QCOM_FALKOR_E1003
+	movk	\tmp, #:abs_g2_nc:(TRAMP_VALIAS >> 12)
+	movk	\tmp, #:abs_g1_nc:(TRAMP_VALIAS >> 12)
+	movk	\tmp, #:abs_g0_nc:((TRAMP_VALIAS & (SZ_2M - 1)) >> 12)
+	isb
+	tlbi	vae1, \tmp
+	dsb	nsh
+alternative_else_nop_endif
+#endif /* CONFIG_QCOM_FALKOR_ERRATUM_1003 */
 	.endm
 
 	.macro tramp_unmap_kernel, tmp
-- 
2.1.4

  parent reply	other threads:[~2017-11-30 16:40 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-30 16:39 [PATCH v2 00/18] arm64: Unmap the kernel whilst running in userspace (KAISER) Will Deacon
2017-11-30 16:39 ` [PATCH v2 01/18] arm64: mm: Use non-global mappings for kernel space Will Deacon
2017-11-30 16:39 ` [PATCH v2 02/18] arm64: mm: Temporarily disable ARM64_SW_TTBR0_PAN Will Deacon
2017-11-30 16:39 ` [PATCH v2 03/18] arm64: mm: Move ASID from TTBR0 to TTBR1 Will Deacon
2017-11-30 17:36   ` Mark Rutland
2017-11-30 16:39 ` [PATCH v2 04/18] arm64: mm: Remove pre_ttbr0_update_workaround for Falkor erratum #E1003 Will Deacon
2017-11-30 16:39 ` [PATCH v2 05/18] arm64: mm: Rename post_ttbr0_update_workaround Will Deacon
2017-11-30 16:39 ` [PATCH v2 06/18] arm64: mm: Fix and re-enable ARM64_SW_TTBR0_PAN Will Deacon
2017-12-01 11:48   ` Mark Rutland
2017-11-30 16:39 ` [PATCH v2 07/18] arm64: mm: Allocate ASIDs in pairs Will Deacon
2017-11-30 16:39 ` [PATCH v2 08/18] arm64: mm: Add arm64_kernel_unmapped_at_el0 helper Will Deacon
2017-11-30 16:39 ` [PATCH v2 09/18] arm64: mm: Invalidate both kernel and user ASIDs when performing TLBI Will Deacon
2017-11-30 16:39 ` [PATCH v2 10/18] arm64: entry: Add exception trampoline page for exceptions from EL0 Will Deacon
2017-12-01 13:31   ` Mark Rutland
2017-12-06 10:25   ` Ard Biesheuvel
2017-11-30 16:39 ` [PATCH v2 11/18] arm64: mm: Map entry trampoline into trampoline and kernel page tables Will Deacon
2017-11-30 18:29   ` Mark Rutland
2017-11-30 16:39 ` [PATCH v2 12/18] arm64: entry: Explicitly pass exception level to kernel_ventry macro Will Deacon
2017-12-01 11:58   ` Mark Rutland
2017-12-01 17:51     ` Will Deacon
2017-12-01 18:00       ` Mark Rutland
2017-11-30 16:39 ` [PATCH v2 13/18] arm64: entry: Hook up entry trampoline to exception vectors Will Deacon
2017-12-01 13:53   ` Mark Rutland
2017-12-01 17:40     ` Will Deacon
2017-11-30 16:39 ` Will Deacon [this message]
2017-11-30 17:06   ` [PATCH v2 14/18] arm64: erratum: Work around Falkor erratum #E1003 in trampoline code Robin Murphy
2017-11-30 17:19     ` Will Deacon
2017-11-30 16:39 ` [PATCH v2 15/18] arm64: tls: Avoid unconditional zeroing of tpidrro_el0 for native tasks Will Deacon
2017-11-30 16:39 ` [PATCH v2 16/18] arm64: entry: Add fake CPU feature for unmapping the kernel at EL0 Will Deacon
2017-12-01 13:55   ` Mark Rutland
2017-11-30 16:39 ` [PATCH v2 17/18] arm64: Kconfig: Add CONFIG_UNMAP_KERNEL_AT_EL0 Will Deacon
2017-12-12  8:44   ` Geert Uytterhoeven
2017-12-12 10:28     ` Will Deacon
2017-11-30 16:39 ` [PATCH v2 18/18] perf: arm_spe: Disallow userspace profiling when arm_kernel_unmapped_at_el0() Will Deacon
2017-12-01 12:15   ` Mark Rutland
2017-12-01 16:49     ` Will Deacon
2017-12-01 16:26   ` Stephen Boyd
2017-12-01 14:04 ` [PATCH v2 00/18] arm64: Unmap the kernel whilst running in userspace (KAISER) Mark Rutland
2017-12-01 17:50   ` Will Deacon
2017-12-01 17:58     ` Mark Rutland
2017-12-01 18:02       ` Dave Hansen
2017-12-01 18:14         ` Will Deacon
2017-12-11  2:24           ` Shanker Donthineni
2017-12-04 23:47 ` Laura Abbott

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1512059986-21325-15-git-send-email-will.deacon@arm.com \
    --to=will.deacon@arm.com \
    --cc=ard.biesheuvel@linaro.org \
    --cc=catalin.marinas@arm.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=keescook@chromium.org \
    --cc=labbott@redhat.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=msalter@redhat.com \
    --cc=sboyd@codeaurora.org \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).