From: will.deacon@arm.com (Will Deacon)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/2] arm64: KVM: Add workaround for Cortex-A57 erratum 834220
Date: Tue, 17 Nov 2015 17:35:04 +0000 [thread overview]
Message-ID: <20151117173503.GM30101@arm.com> (raw)
In-Reply-To: <1447669698-15939-3-git-send-email-marc.zyngier@arm.com>
Hi Marc,
On Mon, Nov 16, 2015 at 10:28:18AM +0000, Marc Zyngier wrote:
> Cortex-A57 parts up to r1p2 can misreport Stage 2 translation faults
> when a Stage 1 permission fault or device alignment fault should
> have been reported.
>
> This patch implements the workaround (which is to validate that the
> Stage-1 translation actually succeeds) by using code patching.
>
> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
> ---
> arch/arm64/Kconfig | 21 +++++++++++++++++++++
> arch/arm64/include/asm/cpufeature.h | 3 ++-
> arch/arm64/kernel/cpu_errata.c | 9 +++++++++
> arch/arm64/kvm/hyp.S | 6 ++++++
> 4 files changed, 38 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> index 9ac16a4..746d985 100644
> --- a/arch/arm64/Kconfig
> +++ b/arch/arm64/Kconfig
> @@ -316,6 +316,27 @@ config ARM64_ERRATUM_832075
>
> If unsure, say Y.
>
> +config ARM64_ERRATUM_834220
> + bool "Cortex-A57: 834220: Stage 2 translation fault might be incorrectly reported in presence of a Stage 1 fault"
> + depends on KVM
> + default y
> + help
> + This option adds an alternative code sequence to work around ARM
> + erratum 834220 on Cortex-A57 parts up to r1p2.
> +
> + Affected Cortex-A57 parts might report a Stage 2 translation
> + fault as a the result of a Stage 1 fault for load crossing a
s/as a the/as the/
s/for load/for a load/
> + page boundary when there is a permission or device memory
> + alignment fault at Stage 1 and a translation fault at Stage 2.
> +
> + The workaround is to verify that the Stage-1 translation
Consistency between "Stage 1" and "Stage-1".
> + doesn't generate a fault before handling the Stage-2 fault.
Same here.
> + Please note that this does not necessarily enable the workaround,
> + as it depends on the alternative framework, which will only patch
> + the kernel if an affected CPU is detected.
> +
> + If unsure, say Y.
> +
> config ARM64_ERRATUM_845719
> bool "Cortex-A53: 845719: a load might read incorrect data"
> depends on COMPAT
> diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h
> index 11d5bb0f..52722ee 100644
> --- a/arch/arm64/include/asm/cpufeature.h
> +++ b/arch/arm64/include/asm/cpufeature.h
> @@ -29,8 +29,9 @@
> #define ARM64_HAS_PAN 4
> #define ARM64_HAS_LSE_ATOMICS 5
> #define ARM64_WORKAROUND_CAVIUM_23154 6
> +#define ARM64_WORKAROUND_834220 7
>
> -#define ARM64_NCAPS 7
> +#define ARM64_NCAPS 8
>
> #ifndef __ASSEMBLY__
>
> diff --git a/arch/arm64/kernel/cpu_errata.c b/arch/arm64/kernel/cpu_errata.c
> index 24926f2..feb6b4e 100644
> --- a/arch/arm64/kernel/cpu_errata.c
> +++ b/arch/arm64/kernel/cpu_errata.c
> @@ -75,6 +75,15 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
> (1 << MIDR_VARIANT_SHIFT) | 2),
> },
> #endif
> +#ifdef CONFIG_ARM64_ERRATUM_834220
> + {
> + /* Cortex-A57 r0p0 - r1p2 */
> + .desc = "ARM erratum 834220",
> + .capability = ARM64_WORKAROUND_834220,
> + MIDR_RANGE(MIDR_CORTEX_A57, 0x00,
> + (1 << MIDR_VARIANT_SHIFT) | 2),
> + },
> +#endif
> #ifdef CONFIG_ARM64_ERRATUM_845719
> {
> /* Cortex-A53 r0p[01234] */
> diff --git a/arch/arm64/kvm/hyp.S b/arch/arm64/kvm/hyp.S
> index 1599701..ff2e038 100644
> --- a/arch/arm64/kvm/hyp.S
> +++ b/arch/arm64/kvm/hyp.S
> @@ -1015,9 +1015,15 @@ el1_trap:
> b.ne 1f // Not an abort we care about
>
> /* This is an abort. Check for permission fault */
> +alternative_if_not ARM64_WORKAROUND_834220
> and x2, x1, #ESR_ELx_FSC_TYPE
> cmp x2, #FSC_PERM
> b.ne 1f // Not a permission fault
> +alternative_else
> + nop // Use the permission fault path to
> + nop // check for a valid S1 translation,
> + nop // regardless of the ESR value.
> +alternative_endif
With the cosmetic changes:
Reviewed-by: Will Deacon <will.deacon@arm.com>
Can you cc stable as well, please?
Will
next prev parent reply other threads:[~2015-11-17 17:35 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-16 10:28 [PATCH 0/2] arm64: KVM: Fixes for 4.4-rc2 Marc Zyngier
2015-11-16 10:28 ` [PATCH 1/2] arm64: KVM: Fix AArch32 to AArch64 register mapping Marc Zyngier
2015-11-17 11:27 ` Robin Murphy
2015-11-16 10:28 ` [PATCH 2/2] arm64: KVM: Add workaround for Cortex-A57 erratum 834220 Marc Zyngier
2015-11-17 17:35 ` Will Deacon [this message]
2015-11-24 16:59 ` [PATCH 0/2] arm64: KVM: Fixes for 4.4-rc2 Christoffer Dall
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=20151117173503.GM30101@arm.com \
--to=will.deacon@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
/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).