From: sashiko-bot@kernel.org
To: "Fuad Tabba" <fuad.tabba@linux.dev>
Cc: kvmarm@lists.linux.dev, "Oliver Upton" <oupton@kernel.org>,
"Marc Zyngier" <maz@kernel.org>
Subject: Re: [PATCH 13/17] KVM: arm64: Add per-EC entry/exit state marshalling for protected guests
Date: Mon, 31 Aug 2026 22:15:39 +0000 [thread overview]
Message-ID: <20260831221539.8DB491F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260831163421.272420-14-fuad.tabba@linux.dev>
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [High] The HVC64 entry handler ignores host-requested PC increments and exception injections, causing an infinite trap loop.
- [High] Host-injected exceptions and PC advancements are silently ignored for unhandled Exception Classes, causing infinite trap loops.
- [High] handle_pvm_exit_wfx fails to marshal the WFx timeout register to x0, breaking WFET and WFIT emulation.
--
commit 0b0e245ce37c95597a108d7e1ed3684401ade81b
Author: Fuad Tabba <fuad.tabba@linux.dev>
Subject: KVM: arm64: Add per-EC entry/exit state marshalling for protected guests
This patch moves a protected guest's state between the hyp vCPU and the host
per exception class instead of copying the whole context. It adds per-EC
entry and exit handlers for various traps and routes protected guests
through them to marshal only the necessary state.
> diff --git a/arch/arm64/kvm/hyp/nvhe/hyp-main.c b/arch/arm64/kvm/hyp/nvhe/hyp-main.c
> index 5925d35abba8c..461e15cab1b92 100644
> --- a/arch/arm64/kvm/hyp/nvhe/hyp-main.c
> +++ b/arch/arm64/kvm/hyp/nvhe/hyp-main.c
[ ... ]
> -static void __maybe_unused handle_pvm_entry_hvc64(struct pkvm_hyp_vcpu *hyp_vcpu)
> +static void handle_pvm_entry_hvc64(struct pkvm_hyp_vcpu *hyp_vcpu)
> +{
> + handle_pvm_entry_psci(hyp_vcpu);
> +}
[Severity: High]
Does this code omit handling for host-requested PC increments and exception
injections?
If the guest executes an HVC instruction, which traps to EL2, and the host
handles the call (e.g., standard PSCI fallback) by setting the INCREMENT_PC
or PENDING_EXCEPTION flags, it appears handle_pvm_entry_hvc64() doesn't
apply them on re-entry. As a result, the guest's PC wouldn't advance and
it could infinitely retry the same HVC.
[ ... ]
> +static void handle_pvm_exit_wfx(struct pkvm_hyp_vcpu *hyp_vcpu)
> +{
> + hyp_vcpu->host_vcpu->arch.ctxt.regs.pstate =
> + hyp_vcpu->vcpu.arch.ctxt.regs.pstate & PSR_MODE_MASK;
> +}
[Severity: High]
Can this cause the host to read uninitialized or stale data for WFET and
WFIT timeout values?
When a protected guest traps to EL2 on a WFET/WFIT, pvm_host_esr()
deliberately masks out the RN field (the register index holding the timeout)
from the host's view of the ESR. Because of this, the host's
kvm_handle_wfx() expects the timeout register value to be marshalled into
regs[0]. It looks like handle_pvm_exit_wfx() doesn't copy the guest's RN
register to host_vcpu->arch.ctxt.regs.regs[0] before exiting to the host.
[ ... ]
> @@ -418,10 +638,16 @@ static void flush_hyp_vcpu(struct pkvm_hyp_vcpu *hyp_vcpu)
> case ARM_EXCEPTION_IL:
> break;
> case ARM_EXCEPTION_TRAP:
> - esr_ec = ESR_ELx_EC(kvm_vcpu_get_esr(&hyp_vcpu->vcpu));
> - ec_handler = entry_hyp_vm_handlers[esr_ec];
> - if (ec_handler)
> - ec_handler(hyp_vcpu);
> + /* Nothing was marshalled for this trap, see sync_hyp_vcpu(). */
> + if (ARM_SERROR_PENDING(hyp_vcpu->exit_code))
> + break;
> +
> + if (pkvm_hyp_vcpu_is_protected(hyp_vcpu)) {
> + esr_ec = ESR_ELx_EC(kvm_vcpu_get_esr(&hyp_vcpu->vcpu));
> + ec_handler = entry_hyp_pvm_handlers[esr_ec];
> + if (ec_handler)
> + ec_handler(hyp_vcpu);
> + }
> break;
[Severity: High]
Does this logic silently ignore host-injected exceptions and PC advancements
for unhandled Exception Classes?
If a protected guest executes an unhandled instruction (like SMC64), it
traps to EL2. The host cannot emulate the unknown EC and pends an exception
via the PENDING_EXCEPTION flag. Because there is no specific entry handler
for this EC in entry_hyp_pvm_handlers, ec_handler is NULL and the re-entry
skips entry handling.
Since the generic fallback was removed, the PENDING_EXCEPTION flag is
ignored, the PC is not advanced, and the guest could hang trying to retry
the failing instruction infinitely.
[ ... ]
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260831163421.272420-1-fuad.tabba@linux.dev?part=13
next prev parent reply other threads:[~2026-08-31 22:15 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-31 16:34 [PATCH 00/17] KVM: arm64: Confine protected VM vCPU state to EL2 Fuad Tabba
2026-08-31 16:34 ` [PATCH 01/17] KVM: arm64: Sync HCR_EL2.VSE back to the host vCPU under pKVM Fuad Tabba
2026-08-31 16:34 ` [PATCH 02/17] KVM: arm64: Advertise the capabilities that protected VMs support Fuad Tabba
2026-09-02 13:22 ` Vincent Donnefort
2026-09-03 16:20 ` Fuad Tabba
2026-08-31 16:34 ` [PATCH 03/17] KVM: arm64: Reject the PVTIME vCPU attribute for protected VMs Fuad Tabba
2026-09-02 13:30 ` Vincent Donnefort
2026-09-03 16:21 ` Fuad Tabba
2026-08-31 16:34 ` [PATCH 04/17] KVM: arm64: Introduce per-EC entry handlers for pKVM Fuad Tabba
2026-09-02 10:12 ` Joey Gouly
2026-09-02 11:35 ` Fuad Tabba
2026-08-31 16:34 ` [PATCH 05/17] KVM: arm64: Skip fixed-feature state flush for protected vCPUs Fuad Tabba
2026-08-31 19:58 ` sashiko-bot
2026-09-01 10:22 ` Fuad Tabba
2026-09-02 15:05 ` Vincent Donnefort
2026-09-02 15:26 ` Vincent Donnefort
2026-09-03 16:22 ` Fuad Tabba
2026-08-31 16:34 ` [PATCH 06/17] KVM: arm64: Add {flush,sync}_hyp_timer_state() primitives Fuad Tabba
2026-08-31 16:34 ` [PATCH 07/17] KVM: arm64: Add system register reset framework for protected VMs Fuad Tabba
2026-08-31 20:22 ` sashiko-bot
2026-09-01 10:17 ` Fuad Tabba
2026-09-02 15:14 ` Joey Gouly
2026-09-03 16:24 ` Fuad Tabba
2026-08-31 16:34 ` [PATCH 08/17] KVM: arm64: Implement HVC handling for protected guests at EL2 Fuad Tabba
2026-08-31 21:00 ` sashiko-bot
2026-09-01 10:19 ` Fuad Tabba
2026-09-03 15:12 ` Joey Gouly
2026-09-03 16:25 ` Fuad Tabba
2026-08-31 16:34 ` [PATCH 09/17] KVM: arm64: Handle PSCI calls for protected VMs " Fuad Tabba
2026-08-31 21:14 ` sashiko-bot
2026-09-01 10:23 ` Fuad Tabba
2026-08-31 16:34 ` [PATCH 10/17] KVM: arm64: Restrict KVM_ARM_VCPU_INIT and PSCI version for protected VMs Fuad Tabba
2026-08-31 16:34 ` [PATCH 11/17] KVM: arm64: Prevent host PC adjustments for protected vCPUs Fuad Tabba
2026-08-31 16:34 ` [PATCH 12/17] KVM: arm64: Inject an UNDEF at EL2 for unhandled protected guest exits Fuad Tabba
2026-08-31 16:34 ` [PATCH 13/17] KVM: arm64: Add per-EC entry/exit state marshalling for protected guests Fuad Tabba
2026-08-31 22:15 ` sashiko-bot [this message]
2026-09-01 10:24 ` Fuad Tabba
2026-08-31 16:34 ` [PATCH 14/17] KVM: arm64: Pend a protected guest's SError with HCR_EL2.VSE only Fuad Tabba
2026-08-31 16:34 ` [PATCH 15/17] KVM: arm64: Reject host access to protected VM private state Fuad Tabba
2026-08-31 16:34 ` [PATCH 16/17] KVM: arm64: Reject host power-on of a vCPU that EL2 holds powered off Fuad Tabba
2026-08-31 16:34 ` [PATCH 17/17] KVM: arm64: Document the protected VM userspace API Fuad Tabba
2026-08-31 19:27 ` [PATCH 00/17] KVM: arm64: Confine protected VM vCPU state to EL2 Fuad Tabba
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=20260831221539.8DB491F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=fuad.tabba@linux.dev \
--cc=kvmarm@lists.linux.dev \
--cc=maz@kernel.org \
--cc=oupton@kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/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