In order to allow efficient implementation of GCS implementations are
permitted to do GCS specific caching, with barriers implicit in stack
switch operations and GCSB DSYNC as an explicit barrier.  Since we do
not use GCS in the hypervisor or host kernel the hypervisor cannot rely
on any barriers being present in vCPU context switches other than those
it explicitly inserts.  Add explicit barriers when loading and saving
vCPU state.

Signed-off-by: Mark Brown <[email protected]>
Reviewed-by: Yuan Yao <[email protected]>
---
 arch/arm64/kvm/arm.c               | 7 +++++++
 arch/arm64/kvm/hyp/nvhe/hyp-main.c | 7 +++++++
 2 files changed, 14 insertions(+)

diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
index 8b080804bc90..52f53f682e6a 100644
--- a/arch/arm64/kvm/arm.c
+++ b/arch/arm64/kvm/arm.c
@@ -755,6 +755,13 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
                        vcpu_set_flag(vcpu, PKVM_HOST_STATE_DIRTY);
        }
 
+       /*
+        * Ensure any GCS memory effects from the outgoing vCPU are
+        * visible elsewhere.
+        */
+       if (kvm_has_gcs(vcpu->kvm))
+               gcsb_dsync();
+
        kvm_vcpu_put_debug(vcpu);
        kvm_arch_vcpu_put_fp(vcpu);
        if (has_vhe())
diff --git a/arch/arm64/kvm/hyp/nvhe/hyp-main.c 
b/arch/arm64/kvm/hyp/nvhe/hyp-main.c
index 9a3b92e626ad..534db037c5f6 100644
--- a/arch/arm64/kvm/hyp/nvhe/hyp-main.c
+++ b/arch/arm64/kvm/hyp/nvhe/hyp-main.c
@@ -261,6 +261,13 @@ static void sync_hyp_vcpu(struct pkvm_hyp_vcpu *hyp_vcpu)
        fpsimd_sve_sync(&hyp_vcpu->vcpu);
        sync_debug_state(hyp_vcpu);
 
+       /*
+        * Ensure any GCS memory effects from the outgoing vCPU are
+        * visible elsewhere even if the host skips syncing.
+        */
+       if (kvm_has_gcs(hyp_vcpu->vcpu.kvm))
+               gcsb_dsync();
+
        if (pkvm_hyp_vcpu_is_protected(hyp_vcpu)) {
                host_vcpu->arch.ctxt = hyp_vcpu->vcpu.arch.ctxt;
        } else {

-- 
2.47.3


Reply via email to