]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: arm64: Copy FGT traps to unprotected pKVM VCPU on VCPU load
authorAlexandru Elisei <alexandru.elisei@arm.com>
Tue, 16 Dec 2025 10:30:50 +0000 (10:30 +0000)
committerOliver Upton <oupton@kernel.org>
Thu, 8 Jan 2026 20:56:17 +0000 (12:56 -0800)
Commit fb10ddf35c1c ("KVM: arm64: Compute per-vCPU FGTs at vcpu_load()")
introduced per-VCPU FGT traps. For an unprotected pKVM VCPU, the untrusted
host FGT configuration is copied in pkvm_vcpu_init_traps(), which is called
from __pkvm_init_vcpu(). __pkvm_init_vcpu() is called once per VCPU (when
the VCPU is first run) which means that the uninitialized, zero, values for
the FGT registers end up being used for the entire lifetime of the VCPU.
This causes both unwanted traps (for the inverse polarity trap bits) and
the guest being allowed to access registers it shouldn't.

Fix it by copying the FGT traps for unprotected pKVM VCPUs when the
untrusted host loads the VCPU.

Fixes: fb10ddf35c1c ("KVM: arm64: Compute per-vCPU FGTs at vcpu_load()")
Acked-by: Will Deacon <will@kernel.org>
Tested-by: Fuad Tabba <tabba@google.com>
Reviewed-by: Fuad Tabba <tabba@google.com>
Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com>
Reviewed-by: Marc Zyngier <maz@kernel.org>
Link: https://msgid.link/20251216103053.47224-2-alexandru.elisei@arm.com
Signed-off-by: Oliver Upton <oupton@kernel.org>
arch/arm64/kvm/hyp/nvhe/hyp-main.c
arch/arm64/kvm/hyp/nvhe/pkvm.c

index a7c689152f68694fb96aadcc181ba4be8bfe9349..8ffbbce5e2ed6d49f4bb825b95eac9a2bf7f7a98 100644 (file)
@@ -180,6 +180,9 @@ static void handle___pkvm_vcpu_load(struct kvm_cpu_context *host_ctxt)
                /* Propagate WFx trapping flags */
                hyp_vcpu->vcpu.arch.hcr_el2 &= ~(HCR_TWE | HCR_TWI);
                hyp_vcpu->vcpu.arch.hcr_el2 |= hcr_el2 & (HCR_TWE | HCR_TWI);
+       } else {
+               memcpy(&hyp_vcpu->vcpu.arch.fgt, hyp_vcpu->host_vcpu->arch.fgt,
+                      sizeof(hyp_vcpu->vcpu.arch.fgt));
        }
 }
 
index 8911338961c5b19926ed6d323b2c1043c1c9cf12..12b2acfbcfd14adfe88a99c6ba2a1e9e374a82f7 100644 (file)
@@ -172,7 +172,6 @@ static int pkvm_vcpu_init_traps(struct pkvm_hyp_vcpu *hyp_vcpu)
 
                /* Trust the host for non-protected vcpu features. */
                vcpu->arch.hcrx_el2 = host_vcpu->arch.hcrx_el2;
-               memcpy(vcpu->arch.fgt, host_vcpu->arch.fgt, sizeof(vcpu->arch.fgt));
                return 0;
        }