From: "Lorenzo Stoakes (ARM)" <ljs@kernel.org>
To: Mark Brown <broonie@kernel.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will@kernel.org>, Marc Zyngier <maz@kernel.org>,
Joey Gouly <joey.gouly@arm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Shuah Khan <shuah@kernel.org>, Oliver Upton <oupton@kernel.org>,
Fuad Tabba <fuad.tabba@linux.dev>,
Peter Maydell <peter.maydell@linaro.org>,
Leonardo Bras <leo.bras@arm.com>,
Wei-Lin Chang <weilin.chang@arm.com>,
Yao Yuan <yaoyuan@linux.alibaba.com>,
linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org,
kvmarm@lists.linux.dev, linux-kselftest@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v21 08/15] KVM: arm64: Enforce EXLOCK for SPSR and ELR
Date: Fri, 2 Oct 2026 12:50:48 +0100 [thread overview]
Message-ID: <ar-UxijB8qEtp4DV@gremlin> (raw)
In-Reply-To: <659cba01-3c53-4eb8-9124-7c62d266a64f@sirena.org.uk>
On Thu, Oct 01, 2026 at 10:11:49PM +0100, Mark Brown wrote:
> On Thu, Oct 01, 2026 at 05:26:41PM +0100, Lorenzo Stoakes (ARM) wrote:
> > On Wed, Sep 30, 2026 at 10:48:18PM +0100, Mark Brown wrote:
> > > As per I_CFFNS and the pseudocode for the SPSR_ELx and ELR_ELx registers
> > > a GCS exception with ExType 1 is generated for attempts to write to
> > > those registers when both GCSCR_ELx.EXLOCKEN and PSTATE.EXLOCK are set.
>
> > From [4] I see I_CFFNS is defined as:
>
> > "When an MSR instruction would write to the relevant ELR_ELx or SPSR_ELx
> > for the current Exception level ELy, the Effective value of
> > GCSCR_ELy.EXLOCKEN and PSTATE.EXLOCK may prevent the write."
>
> > So the lock applies to writes to the current EL's own ELR/SPSR rather than
> > to any ELR_ELx/SPSR_ELx the current EL can write to?
>
> VHE and NV complicate things so "own" isn't just the same ELx, but my
> text above definitely oversimplifies too much and so is wrong.
It's all incredibly tricky and I felt my brain melting out of my head going
through the psuedocode/definition yesterday so it's understandable :)
>
> For example refering to the pseudocode for ELR_EL1 and SPSR_EL1 we see
> in the MSR handling:
>
> elsif PSTATE.EL == EL2 then
> if IsFeatureImplemented(FEAT_GCS) && GetCurrentEXLOCKEN() && !Halted() && PSTATE.EXLOCK == '1' && ELIsInHost(EL2) then
> EXLOCKException();
>
> and note the use of ELx for ELR/SPSR and ELy for the current exception
> level and GCSCR in I_CFFNS (ie, ELx vs ELy). My interpretation here is
> that the use of "the relevant" rather than just using ELx throughout is
> an effort to cover the complications resulting from VHE and NV. With
> the above pseudocode writes to the EL1 register from EL2 are also
> covered when we're in host mode - the fact that we're in host mode makes
> the EL1 access relevant.
Yeah agreed.
>
> I'll reword what I've written in the commit log, like I say it's wrong.
Ack thanks!
>
> > So... TL;DR is, shouldn't this function look like:
> >
> > static inline bool sysregs_exlocked(struct kvm_vcpu *vcpu)
> > {
> > if (!kvm_has_gcs(vcpu->kvm))
> > return false;
> >
> > if (!(vcpu->arch.ctxt.regs.pstate & PSR_EXLOCK_BIT))
> > return false;
> >
> > if (is_hyp_ctxt(vcpu))
> > return false;
> >
> > return vcpu_read_sys_reg(vcpu, GCSCR_EL1) & GCSCR_ELx_EXLOCKEN;
> > }
>
> I think so, but I'll check through again.
Thanks!
>
> The confusions you identified in the bit of your mail above this were
> the result of me doing some but on all of the simplifications. I was
> trying to make things clearer by including some code that couldn't run
> so it was more obvious that things correspond to the pseudocode, but
> really that shouldn't have had any simplifications in it - we should
> either have all the simplifications or none of them. I'll add more
> comments instead.
Yeah it's all very complicated, unfortunately I think, the psuedocode had me
stumped a lot when I was reading it...
Definitely agree on all-or-nothing. If we did go the 'all' route, then we'd
need to put in the ELIsInHost(EL2) conditional too
i.e. vcpu_el2_e2h_is_set() as well.
But I think simplifying that is also valid, as the resultant function above
is a lot easier to reason about and avoids people having to figure out that
certain bits are irrelevant (though comments could square that off too!)
>
> > > + /*
> > > + * Note that the EXLOCKEN for the running EL is checked
> > > + * regardless of the register written to.
> > > + */
> >
> > This seems to contradict [4] - the register written to is what decides
> > whether the lock applies?
>
> [4] is section D11.4.1 of DDI0487 M.d, containing rule I_CFFNS discussed
> above. My intent there is to express that if EXLOCK exceptions might be
> generated we check EXLOCKEN for the running EL, not one influenced by
> the written register. Some combinations of register, EL and system
> state do not generate exceptions but those that do use the current EL's
> EXLOCKEN rather than an _ELx register using GCSCR_ELx.EXLOCKEN.
Yeah that's clear thanks!
IOW - the register/El/state decides _whether_ an exception can be raised,
the running EL's EXLOCKEN is what is consulted _when_ it can be raised.
--
Cheers, Lorenzo
next prev parent reply other threads:[~2026-10-02 11:50 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-30 21:48 [PATCH v21 00/15] KVM: arm64: Provide guest support for GCS Mark Brown
2026-09-30 21:48 ` [PATCH v21 01/15] arm64/gcs: Ensure FGTs for EL1 GCS instructions are disabled Mark Brown
2026-09-30 21:48 ` [PATCH v21 02/15] KVM: arm64: Refuse to start a guest with S1PIE or S1POE but not TCR2 Mark Brown
2026-09-30 22:05 ` sashiko-bot
2026-10-01 11:25 ` Lorenzo Stoakes (ARM)
2026-10-01 12:07 ` Mark Brown
2026-10-01 10:50 ` Lorenzo Stoakes (ARM)
2026-10-03 12:30 ` Marc Zyngier
2026-09-30 21:48 ` [PATCH v21 03/15] KVM: arm64: Manage GCS access and registers for guests Mark Brown
2026-10-01 11:28 ` Lorenzo Stoakes (ARM)
2026-09-30 21:48 ` [PATCH v21 04/15] KVM: arm64: Ensure GCS memory effects are visible Mark Brown
2026-09-30 21:48 ` [PATCH v21 05/15] KVM: arm64: Set PSTATE.EXLOCK when entering an exception Mark Brown
2026-10-01 11:37 ` Lorenzo Stoakes (ARM)
2026-09-30 21:48 ` [PATCH v21 06/15] KVM: arm64: Validate GCS exception lock when emulating ERET Mark Brown
2026-10-01 13:10 ` Lorenzo Stoakes (ARM)
2026-09-30 21:48 ` [PATCH v21 07/15] KVM: arm64: Forward GCS exceptions to nested guests Mark Brown
2026-10-01 14:25 ` Lorenzo Stoakes (ARM)
2026-09-30 21:48 ` [PATCH v21 08/15] KVM: arm64: Enforce EXLOCK for SPSR and ELR Mark Brown
2026-10-01 16:26 ` Lorenzo Stoakes (ARM)
2026-10-01 21:11 ` Mark Brown
2026-10-02 11:50 ` Lorenzo Stoakes (ARM) [this message]
2026-09-30 21:48 ` [PATCH v21 09/15] KVM: arm64: Allow GCS to be enabled for guests Mark Brown
2026-10-01 16:29 ` Lorenzo Stoakes (ARM)
2026-09-30 21:48 ` [PATCH v21 10/15] KVM: selftests: arm64: Check that invalid feature combinations are rejected Mark Brown
2026-10-01 16:35 ` Lorenzo Stoakes (ARM)
2026-09-30 21:48 ` [PATCH v21 11/15] KVM: selftests: arm64: Add GCS registers to get-reg-list Mark Brown
2026-10-01 16:36 ` Lorenzo Stoakes (ARM)
2026-09-30 21:48 ` [PATCH v21 12/15] KVM: selftests: arm64: Add GCS to set_id_regs Mark Brown
2026-10-01 16:38 ` Lorenzo Stoakes (ARM)
2026-10-01 18:14 ` Mark Brown
2026-10-02 11:27 ` Lorenzo Stoakes (ARM)
2026-09-30 21:48 ` [PATCH v21 13/15] KVM: selftests: arm64: Only restore SPSR_EL1 and ELR_EL1 if they change Mark Brown
2026-10-01 16:41 ` Lorenzo Stoakes (ARM)
2026-09-30 21:48 ` [PATCH v21 14/15] tools: Synchronise the kernel esr.h Mark Brown
2026-09-30 22:14 ` sashiko-bot
2026-10-01 16:47 ` Lorenzo Stoakes (ARM)
2026-10-01 17:27 ` Mark Brown
2026-10-02 11:31 ` Lorenzo Stoakes (ARM)
2026-09-30 21:48 ` [PATCH v21 15/15] KVM: selftests: arm64: Add GCS EXLOCK exception emulation test Mark Brown
2026-09-30 22:24 ` sashiko-bot
2026-10-01 16:53 ` Lorenzo Stoakes (ARM)
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=ar-UxijB8qEtp4DV@gremlin \
--to=ljs@kernel.org \
--cc=broonie@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=fuad.tabba@linux.dev \
--cc=joey.gouly@arm.com \
--cc=kvmarm@lists.linux.dev \
--cc=leo.bras@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=maz@kernel.org \
--cc=oupton@kernel.org \
--cc=peter.maydell@linaro.org \
--cc=shuah@kernel.org \
--cc=suzuki.poulose@arm.com \
--cc=weilin.chang@arm.com \
--cc=will@kernel.org \
--cc=yaoyuan@linux.alibaba.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.