]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - arch/powerpc/kvm/book3s_pr_papr.c
KVM: PPC: Add support for multiple-TCE hcalls
[karo-tx-linux.git] / arch / powerpc / kvm / book3s_pr_papr.c
index f2c75a1e0536c7b13fdb329be3067691f3f2c284..02176fd52f84b85187f8a57a5e434bd56299a151 100644 (file)
@@ -280,6 +280,37 @@ static int kvmppc_h_pr_logical_ci_store(struct kvm_vcpu *vcpu)
        return EMULATE_DONE;
 }
 
+static int kvmppc_h_pr_put_tce_indirect(struct kvm_vcpu *vcpu)
+{
+       unsigned long liobn = kvmppc_get_gpr(vcpu, 4);
+       unsigned long ioba = kvmppc_get_gpr(vcpu, 5);
+       unsigned long tce = kvmppc_get_gpr(vcpu, 6);
+       unsigned long npages = kvmppc_get_gpr(vcpu, 7);
+       long rc;
+
+       rc = kvmppc_h_put_tce_indirect(vcpu, liobn, ioba,
+                       tce, npages);
+       if (rc == H_TOO_HARD)
+               return EMULATE_FAIL;
+       kvmppc_set_gpr(vcpu, 3, rc);
+       return EMULATE_DONE;
+}
+
+static int kvmppc_h_pr_stuff_tce(struct kvm_vcpu *vcpu)
+{
+       unsigned long liobn = kvmppc_get_gpr(vcpu, 4);
+       unsigned long ioba = kvmppc_get_gpr(vcpu, 5);
+       unsigned long tce_value = kvmppc_get_gpr(vcpu, 6);
+       unsigned long npages = kvmppc_get_gpr(vcpu, 7);
+       long rc;
+
+       rc = kvmppc_h_stuff_tce(vcpu, liobn, ioba, tce_value, npages);
+       if (rc == H_TOO_HARD)
+               return EMULATE_FAIL;
+       kvmppc_set_gpr(vcpu, 3, rc);
+       return EMULATE_DONE;
+}
+
 static int kvmppc_h_pr_xics_hcall(struct kvm_vcpu *vcpu, u32 cmd)
 {
        long rc = kvmppc_xics_hcall(vcpu, cmd);
@@ -306,6 +337,10 @@ int kvmppc_h_pr(struct kvm_vcpu *vcpu, unsigned long cmd)
                return kvmppc_h_pr_bulk_remove(vcpu);
        case H_PUT_TCE:
                return kvmppc_h_pr_put_tce(vcpu);
+       case H_PUT_TCE_INDIRECT:
+               return kvmppc_h_pr_put_tce_indirect(vcpu);
+       case H_STUFF_TCE:
+               return kvmppc_h_pr_stuff_tce(vcpu);
        case H_CEDE:
                kvmppc_set_msr_fast(vcpu, kvmppc_get_msr(vcpu) | MSR_EE);
                kvm_vcpu_block(vcpu);