|
@@ -120,7 +120,7 @@ static void kvmppc_core_vcpu_put_pr(struct kvm_vcpu *vcpu)
|
|
#ifdef CONFIG_PPC_BOOK3S_64
|
|
#ifdef CONFIG_PPC_BOOK3S_64
|
|
struct kvmppc_book3s_shadow_vcpu *svcpu = svcpu_get(vcpu);
|
|
struct kvmppc_book3s_shadow_vcpu *svcpu = svcpu_get(vcpu);
|
|
if (svcpu->in_use) {
|
|
if (svcpu->in_use) {
|
|
- kvmppc_copy_from_svcpu(vcpu, svcpu);
|
|
|
|
|
|
+ kvmppc_copy_from_svcpu(vcpu);
|
|
}
|
|
}
|
|
memcpy(to_book3s(vcpu)->slb_shadow, svcpu->slb, sizeof(svcpu->slb));
|
|
memcpy(to_book3s(vcpu)->slb_shadow, svcpu->slb, sizeof(svcpu->slb));
|
|
to_book3s(vcpu)->slb_shadow_max = svcpu->slb_max;
|
|
to_book3s(vcpu)->slb_shadow_max = svcpu->slb_max;
|
|
@@ -142,9 +142,10 @@ static void kvmppc_core_vcpu_put_pr(struct kvm_vcpu *vcpu)
|
|
}
|
|
}
|
|
|
|
|
|
/* Copy data needed by real-mode code from vcpu to shadow vcpu */
|
|
/* Copy data needed by real-mode code from vcpu to shadow vcpu */
|
|
-void kvmppc_copy_to_svcpu(struct kvmppc_book3s_shadow_vcpu *svcpu,
|
|
|
|
- struct kvm_vcpu *vcpu)
|
|
|
|
|
|
+void kvmppc_copy_to_svcpu(struct kvm_vcpu *vcpu)
|
|
{
|
|
{
|
|
|
|
+ struct kvmppc_book3s_shadow_vcpu *svcpu = svcpu_get(vcpu);
|
|
|
|
+
|
|
svcpu->gpr[0] = vcpu->arch.gpr[0];
|
|
svcpu->gpr[0] = vcpu->arch.gpr[0];
|
|
svcpu->gpr[1] = vcpu->arch.gpr[1];
|
|
svcpu->gpr[1] = vcpu->arch.gpr[1];
|
|
svcpu->gpr[2] = vcpu->arch.gpr[2];
|
|
svcpu->gpr[2] = vcpu->arch.gpr[2];
|
|
@@ -176,17 +177,14 @@ void kvmppc_copy_to_svcpu(struct kvmppc_book3s_shadow_vcpu *svcpu,
|
|
if (cpu_has_feature(CPU_FTR_ARCH_207S))
|
|
if (cpu_has_feature(CPU_FTR_ARCH_207S))
|
|
vcpu->arch.entry_ic = mfspr(SPRN_IC);
|
|
vcpu->arch.entry_ic = mfspr(SPRN_IC);
|
|
svcpu->in_use = true;
|
|
svcpu->in_use = true;
|
|
|
|
+
|
|
|
|
+ svcpu_put(svcpu);
|
|
}
|
|
}
|
|
|
|
|
|
/* Copy data touched by real-mode code from shadow vcpu back to vcpu */
|
|
/* Copy data touched by real-mode code from shadow vcpu back to vcpu */
|
|
-void kvmppc_copy_from_svcpu(struct kvm_vcpu *vcpu,
|
|
|
|
- struct kvmppc_book3s_shadow_vcpu *svcpu)
|
|
|
|
|
|
+void kvmppc_copy_from_svcpu(struct kvm_vcpu *vcpu)
|
|
{
|
|
{
|
|
- /*
|
|
|
|
- * vcpu_put would just call us again because in_use hasn't
|
|
|
|
- * been updated yet.
|
|
|
|
- */
|
|
|
|
- preempt_disable();
|
|
|
|
|
|
+ struct kvmppc_book3s_shadow_vcpu *svcpu = svcpu_get(vcpu);
|
|
|
|
|
|
/*
|
|
/*
|
|
* Maybe we were already preempted and synced the svcpu from
|
|
* Maybe we were already preempted and synced the svcpu from
|
|
@@ -232,7 +230,7 @@ void kvmppc_copy_from_svcpu(struct kvm_vcpu *vcpu,
|
|
svcpu->in_use = false;
|
|
svcpu->in_use = false;
|
|
|
|
|
|
out:
|
|
out:
|
|
- preempt_enable();
|
|
|
|
|
|
+ svcpu_put(svcpu);
|
|
}
|
|
}
|
|
|
|
|
|
static int kvmppc_core_check_requests_pr(struct kvm_vcpu *vcpu)
|
|
static int kvmppc_core_check_requests_pr(struct kvm_vcpu *vcpu)
|