|
@@ -267,6 +267,8 @@ static int kvmppc_h_pr_xics_hcall(struct kvm_vcpu *vcpu, u32 cmd)
|
|
|
|
|
|
int kvmppc_h_pr(struct kvm_vcpu *vcpu, unsigned long cmd)
|
|
|
{
|
|
|
+ int rc, idx;
|
|
|
+
|
|
|
if (cmd <= MAX_HCALL_OPCODE &&
|
|
|
!test_bit(cmd/4, vcpu->kvm->arch.enabled_hcalls))
|
|
|
return EMULATE_FAIL;
|
|
@@ -299,8 +301,11 @@ int kvmppc_h_pr(struct kvm_vcpu *vcpu, unsigned long cmd)
|
|
|
break;
|
|
|
case H_RTAS:
|
|
|
if (list_empty(&vcpu->kvm->arch.rtas_tokens))
|
|
|
- return RESUME_HOST;
|
|
|
- if (kvmppc_rtas_hcall(vcpu))
|
|
|
+ break;
|
|
|
+ idx = srcu_read_lock(&vcpu->kvm->srcu);
|
|
|
+ rc = kvmppc_rtas_hcall(vcpu);
|
|
|
+ srcu_read_unlock(&vcpu->kvm->srcu, idx);
|
|
|
+ if (rc)
|
|
|
break;
|
|
|
kvmppc_set_gpr(vcpu, 3, 0);
|
|
|
return EMULATE_DONE;
|