KVM: PPC: Book3S HV: Implement H_SVM_INIT_ABORT hcall
[linux-2.6-microblaze.git] / arch / powerpc / kvm / book3s_hv.c
index dc53578..1118cff 100644 (file)
@@ -1091,6 +1091,9 @@ int kvmppc_pseries_do_hcall(struct kvm_vcpu *vcpu)
        case H_SVM_INIT_DONE:
                ret = kvmppc_h_svm_init_done(vcpu->kvm);
                break;
+       case H_SVM_INIT_ABORT:
+               ret = kvmppc_h_svm_init_abort(vcpu->kvm);
+               break;
 
        default:
                return RESUME_HOST;
@@ -4285,7 +4288,7 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu)
        user_vrsave = mfspr(SPRN_VRSAVE);
 
        vcpu->arch.wqp = &vcpu->arch.vcore->wq;
-       vcpu->arch.pgdir = current->mm->pgd;
+       vcpu->arch.pgdir = kvm->mm->pgd;
        vcpu->arch.state = KVMPPC_VCPU_BUSY_IN_HOST;
 
        do {
@@ -4640,14 +4643,14 @@ static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu)
 
        /* Look up the VMA for the start of this memory slot */
        hva = memslot->userspace_addr;
-       down_read(&current->mm->mmap_sem);
-       vma = find_vma(current->mm, hva);
+       down_read(&kvm->mm->mmap_sem);
+       vma = find_vma(kvm->mm, hva);
        if (!vma || vma->vm_start > hva || (vma->vm_flags & VM_IO))
                goto up_out;
 
        psize = vma_kernel_pagesize(vma);
 
-       up_read(&current->mm->mmap_sem);
+       up_read(&kvm->mm->mmap_sem);
 
        /* We can handle 4k, 64k or 16M pages in the VRMA */
        if (psize >= 0x1000000)
@@ -4680,7 +4683,7 @@ static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu)
        return err;
 
  up_out:
-       up_read(&current->mm->mmap_sem);
+       up_read(&kvm->mm->mmap_sem);
        goto out_srcu;
 }
 
@@ -4983,7 +4986,8 @@ static void kvmppc_core_destroy_vm_hv(struct kvm *kvm)
                if (nesting_enabled(kvm))
                        kvmhv_release_all_nested(kvm);
                kvm->arch.process_table = 0;
-               uv_svm_terminate(kvm->arch.lpid);
+               if (kvm->arch.secure_guest)
+                       uv_svm_terminate(kvm->arch.lpid);
                kvmhv_set_ptbl_entry(kvm->arch.lpid, 0, 0);
        }
 
@@ -5476,7 +5480,7 @@ static int kvmhv_svm_off(struct kvm *kvm)
                        continue;
 
                kvm_for_each_memslot(memslot, slots) {
-                       kvmppc_uvmem_drop_pages(memslot, kvm);
+                       kvmppc_uvmem_drop_pages(memslot, kvm, true);
                        uv_unregister_mem_slot(kvm->arch.lpid, memslot->id);
                }
        }