Query regarding ERRATUM_1418040
Will Deacon
will at kernel.org
Mon Jul 6 08:09:47 EDT 2020
On Thu, Jul 02, 2020 at 09:19:04AM +0100, Marc Zyngier wrote:
> On 2020-07-01 17:27, Will Deacon wrote:
> > On Wed, Jun 17, 2020 at 03:29:46PM +0100, Marc Zyngier wrote:
> > > On 2020-06-17 12:25, Will Deacon wrote:
> > > > Hmm, but in conjunction with the previous point, doesn't this mean if
> > > > some CPUs are affected by an erratum which requires CNTVCT trapping for
> > > > AArch64 and others are affected by 1418040, then the former won't
> > > > actually
> > > > be trapped?
> > >
> > > Indeed. Having CPUs that require opposite workarounds is one of the
> > > many
> > > fascinating aspects of BL systems... :-/ Does such a system exist
> > > today?
> >
> > I don't know, but it feels like we should either address the issue of
> > scream
> > loudly if we detect it!
>
> I have no idea how you plan to detect that.
You'd end up having to have workarounds know about each other and, yes,
it would be awful.
> > I think re-enabling on entry from a 32-bit task would be the easiest
> > thing to
> > do. Since you're playing with 32-bit timer bugs atm, do you fancy taking
> > a
> > look ;)
>
> I came up with this, tested in a guest only by fudging the detection
> code (I don't have the offending HW at hand). The use of branches vs
> NOPs is debatable, no strong opinion here.
>
> M.
>
> From 81126933d6c990dac7213d0ec66c4a9df21fe8b8 Mon Sep 17 00:00:00 2001
> From: Marc Zyngier <maz at kernel.org>
> Date: Wed, 1 Jul 2020 21:29:24 +0100
> Subject: [PATCH] arm64: Rework ARM_ERRATUM_1414080 handling
>
> The current handling of erratum 1414080 has the side effect that
> cntkctl_el1 can get changed for both 32 and 64bit tasks.
>
> This isn't a problem so far, but if we ever need to mitigate another
> of these errata on the 64bit side, we'd better keep the messing with
> cntkctl_el1 local to 32bit tasks.
>
> For that, make sure that on entering the kernel from a 32bit tasks,
> userspace access to cntvct gets enabled, and disabled returning to
> userspace, while it never gets changed for 64bit tasks.
>
> Signed-off-by: Marc Zyngier <maz at kernel.org>
> ---
> arch/arm64/kernel/entry.S | 44 +++++++++++++++++++++++++--------------
> 1 file changed, 28 insertions(+), 16 deletions(-)
Mostly looks fine, just some small nits below. Looking at it now, though,
I suspect it would make more sense to do this at context-switch. We can
do that later on.
> diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
> index 5304d193c79d..357bce62c31e 100644
> --- a/arch/arm64/kernel/entry.S
> +++ b/arch/arm64/kernel/entry.S
> @@ -167,6 +167,19 @@ alternative_cb_end
> stp x28, x29, [sp, #16 * 14]
>
> .if \el == 0
> + .if \regsize == 32
> + // If we come back from a 32bit task on a system affected by
> + // 1418040, let's reenable userspace access to the virtual counter.
> +#ifdef CONFIG_ARM64_ERRATUM_1418040
> +alternative_if_not ARM64_WORKAROUND_1418040
> + b .L__entry_wa_1418040\@
> +alternative_else_nop_endif
> + mrs x0, cntkctl_el1
> + orr x0, x0, #2 // ARCH_TIMER_USR_VCT_ACCESS_EN
> + msr cntkctl_el1, x0
> +.L__entry_wa_1418040\@:
nit: naming this .L__entry_skip_wa_1418040\@ would be clearer to me,
as we take the branch to jump over the workaround.
> +#endif
> + .endif
> clear_gp_regs
> mrs x21, sp_el0
> ldr_this_cpu tsk, __entry_task, x20
> @@ -318,7 +331,21 @@ alternative_else_nop_endif
> ldr x23, [sp, #S_SP] // load return stack pointer
> msr sp_el0, x23
> tst x22, #PSR_MODE32_BIT // native task?
> - b.eq 3f
> + b.eq 4f
> +
> +#ifdef CONFIG_ARM64_ERRATUM_1418040
> +alternative_if_not ARM64_WORKAROUND_1418040
> + b 3f
> +alternative_else_nop_endif
> + /*
> + * if (x22.mode32 == 1)
> + * cntkctl_el1.el0vcten = 0
> + */
I think we can probably drop this comment now, as I find it more confusing
that helpful.
> + mrs x1, cntkctl_el1
> + bfi x1, xzr, #1, #1 // ARCH_TIMER_USR_VCT_ACCESS_EN
Can you use BIC here?
Will
More information about the linux-arm-kernel
mailing list