From 1698f20d7e4b13e498cfc23e184ad4eb15952e7e Mon Sep 17 00:00:00 2001 From: Fuad Tabba Date: Thu, 24 Feb 2022 14:41:13 +0000 Subject: [PATCH] ANDROID: KVM: arm64: Refactor __sync_vcpu_state() Split it into two functions, sync/flush, which correspond to the direction the data is going. Remove the need to explicitly pass the host vcpu since the shadow already has a trusted pointer to it. Bug: 220830416 Signed-off-by: Fuad Tabba Change-Id: Ibb5a34d66254788782b219565833e061c664abb2 --- arch/arm64/kvm/hyp/nvhe/hyp-main.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/arch/arm64/kvm/hyp/nvhe/hyp-main.c b/arch/arm64/kvm/hyp/nvhe/hyp-main.c index 2e85ee068bb2..69e509544804 100644 --- a/arch/arm64/kvm/hyp/nvhe/hyp-main.c +++ b/arch/arm64/kvm/hyp/nvhe/hyp-main.c @@ -485,7 +485,7 @@ static void sync_timer_state(struct pkvm_loaded_state *state) __vcpu_sys_reg(shadow_vcpu, CNTV_CTL_EL0) = read_sysreg_el0(SYS_CNTV_CTL); } -static void __sync_vcpu_state(struct kvm_vcpu *from_vcpu, +static void __copy_vcpu_state(const struct kvm_vcpu *from_vcpu, struct kvm_vcpu *to_vcpu) { int i; @@ -507,6 +507,20 @@ static void __sync_vcpu_state(struct kvm_vcpu *from_vcpu, } } +static void __sync_vcpu_state(struct kvm_vcpu *shadow_vcpu) +{ + struct kvm_vcpu *host_vcpu = shadow_vcpu->arch.pkvm.host_vcpu; + + __copy_vcpu_state(shadow_vcpu, host_vcpu); +} + +static void __flush_vcpu_state(struct kvm_vcpu *shadow_vcpu) +{ + struct kvm_vcpu *host_vcpu = shadow_vcpu->arch.pkvm.host_vcpu; + + __copy_vcpu_state(host_vcpu, shadow_vcpu); +} + static void flush_shadow_state(struct pkvm_loaded_state *state) { struct kvm_vcpu *shadow_vcpu = state->vcpu; @@ -524,7 +538,7 @@ static void flush_shadow_state(struct pkvm_loaded_state *state) */ if (!state->is_protected) { if (READ_ONCE(host_vcpu->arch.flags) & KVM_ARM64_PKVM_STATE_DIRTY) - __sync_vcpu_state(host_vcpu, shadow_vcpu); + __flush_vcpu_state(shadow_vcpu); state->vcpu->arch.hcr_el2 = HCR_GUEST_FLAGS & ~(HCR_RW | HCR_TWI | HCR_TWE); state->vcpu->arch.hcr_el2 |= host_vcpu->arch.hcr_el2; @@ -664,7 +678,7 @@ static void handle___pkvm_vcpu_put(struct kvm_cpu_context *host_ctxt) if (!state->is_protected && !(READ_ONCE(vcpu->arch.flags) & KVM_ARM64_PKVM_STATE_DIRTY)) - __sync_vcpu_state(state->vcpu, vcpu); + __sync_vcpu_state(state->vcpu); put_shadow_vcpu(state->vcpu); @@ -687,7 +701,7 @@ static void handle___pkvm_vcpu_sync_state(struct kvm_cpu_context *host_ctxt) state->vcpu->arch.pkvm.host_vcpu != vcpu) return; - __sync_vcpu_state(state->vcpu, vcpu); + __sync_vcpu_state(state->vcpu); } }