projects
/
linux-2.6-microblaze.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
KVM: PPC: Book3S HV: Implement H_SVM_INIT_ABORT hcall
[linux-2.6-microblaze.git]
/
arch
/
powerpc
/
kvm
/
book3s_hv.c
diff --git
a/arch/powerpc/kvm/book3s_hv.c
b/arch/powerpc/kvm/book3s_hv.c
index
dc53578
..
1118cff
100644
(file)
--- a/
arch/powerpc/kvm/book3s_hv.c
+++ b/
arch/powerpc/kvm/book3s_hv.c
@@
-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_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;
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;
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 {
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;
/* 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);
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)
/* 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:
return err;
up_out:
- up_read(&
current
->mm->mmap_sem);
+ up_read(&
kvm
->mm->mmap_sem);
goto out_srcu;
}
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;
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);
}
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) {
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);
}
}
uv_unregister_mem_slot(kvm->arch.lpid, memslot->id);
}
}