Lines Matching refs:kvm
21 bool kvm_s390_pv_is_protected(struct kvm *kvm) in kvm_s390_pv_is_protected() argument
23 lockdep_assert_held(&kvm->lock); in kvm_s390_pv_is_protected()
24 return !!kvm_s390_pv_get_handle(kvm); in kvm_s390_pv_is_protected()
58 static void kvm_s390_clear_pv_state(struct kvm *kvm) in kvm_s390_clear_pv_state() argument
60 kvm->arch.pv.handle = 0; in kvm_s390_clear_pv_state()
61 kvm->arch.pv.guest_len = 0; in kvm_s390_clear_pv_state()
62 kvm->arch.pv.stor_base = 0; in kvm_s390_clear_pv_state()
63 kvm->arch.pv.stor_var = NULL; in kvm_s390_clear_pv_state()
75 KVM_UV_EVENT(vcpu->kvm, 3, "PROTVIRT DESTROY VCPU %d: rc %x rrc %x", in kvm_s390_pv_destroy_cpu()
118 uvcb.guest_handle = kvm_s390_pv_get_handle(vcpu->kvm); in kvm_s390_pv_create_cpu()
135 KVM_UV_EVENT(vcpu->kvm, 3, in kvm_s390_pv_create_cpu()
150 vcpu->arch.sie_block->pv_handle_config = kvm_s390_pv_get_handle(vcpu->kvm); in kvm_s390_pv_create_cpu()
157 static void kvm_s390_pv_dealloc_vm(struct kvm *kvm) in kvm_s390_pv_dealloc_vm() argument
159 vfree(kvm->arch.pv.stor_var); in kvm_s390_pv_dealloc_vm()
160 free_pages(kvm->arch.pv.stor_base, in kvm_s390_pv_dealloc_vm()
162 kvm_s390_clear_pv_state(kvm); in kvm_s390_pv_dealloc_vm()
165 static int kvm_s390_pv_alloc_vm(struct kvm *kvm) in kvm_s390_pv_alloc_vm() argument
171 kvm->arch.pv.stor_var = NULL; in kvm_s390_pv_alloc_vm()
172 kvm->arch.pv.stor_base = __get_free_pages(GFP_KERNEL_ACCOUNT, get_order(base)); in kvm_s390_pv_alloc_vm()
173 if (!kvm->arch.pv.stor_base) in kvm_s390_pv_alloc_vm()
182 mutex_lock(&kvm->slots_lock); in kvm_s390_pv_alloc_vm()
183 npages = kvm_s390_get_gfn_end(kvm_memslots(kvm)); in kvm_s390_pv_alloc_vm()
184 mutex_unlock(&kvm->slots_lock); in kvm_s390_pv_alloc_vm()
186 kvm->arch.pv.guest_len = npages * PAGE_SIZE; in kvm_s390_pv_alloc_vm()
191 kvm->arch.pv.stor_var = vzalloc(vlen); in kvm_s390_pv_alloc_vm()
192 if (!kvm->arch.pv.stor_var) in kvm_s390_pv_alloc_vm()
197 kvm_s390_pv_dealloc_vm(kvm); in kvm_s390_pv_alloc_vm()
214 static int kvm_s390_pv_dispose_one_leftover(struct kvm *kvm, in kvm_s390_pv_dispose_one_leftover() argument
224 KVM_UV_EVENT(kvm, 3, "PROTVIRT DESTROY LEFTOVER VM: rc %x rrc %x", *rc, *rrc); in kvm_s390_pv_dispose_one_leftover()
238 atomic_dec(&kvm->mm->context.protected_count); in kvm_s390_pv_dispose_one_leftover()
249 static void kvm_s390_destroy_lower_2g(struct kvm *kvm) in kvm_s390_destroy_lower_2g() argument
256 srcu_idx = srcu_read_lock(&kvm->srcu); in kvm_s390_destroy_lower_2g()
259 slot = gfn_to_memslot(kvm, 0); in kvm_s390_destroy_lower_2g()
263 s390_uv_destroy_range(kvm->mm, slot->userspace_addr, slot->userspace_addr + len); in kvm_s390_destroy_lower_2g()
265 slot = gfn_to_memslot(kvm, slot->base_gfn + slot->npages); in kvm_s390_destroy_lower_2g()
268 srcu_read_unlock(&kvm->srcu, srcu_idx); in kvm_s390_destroy_lower_2g()
271 static int kvm_s390_pv_deinit_vm_fast(struct kvm *kvm, u16 *rc, u16 *rrc) in kvm_s390_pv_deinit_vm_fast() argument
276 .handle = kvm_s390_pv_get_handle(kvm), in kvm_s390_pv_deinit_vm_fast()
285 WRITE_ONCE(kvm->arch.gmap->guest_handle, 0); in kvm_s390_pv_deinit_vm_fast()
286 KVM_UV_EVENT(kvm, 3, "PROTVIRT DESTROY VM FAST: rc %x rrc %x", in kvm_s390_pv_deinit_vm_fast()
290 kvm_s390_pv_get_handle(kvm), uvcb.header.rc, uvcb.header.rrc); in kvm_s390_pv_deinit_vm_fast()
293 kvm_s390_pv_dealloc_vm(kvm); in kvm_s390_pv_deinit_vm_fast()
320 int kvm_s390_pv_set_aside(struct kvm *kvm, u16 *rc, u16 *rrc) in kvm_s390_pv_set_aside() argument
325 lockdep_assert_held(&kvm->lock); in kvm_s390_pv_set_aside()
330 if (kvm->arch.pv.set_aside) in kvm_s390_pv_set_aside()
334 if ((kvm->arch.gmap->asce & _ASCE_TYPE_MASK) == _ASCE_TYPE_SEGMENT) in kvm_s390_pv_set_aside()
342 res = kvm_s390_pv_deinit_vm_fast(kvm, rc, rrc); in kvm_s390_pv_set_aside()
344 priv->stor_var = kvm->arch.pv.stor_var; in kvm_s390_pv_set_aside()
345 priv->stor_base = kvm->arch.pv.stor_base; in kvm_s390_pv_set_aside()
346 priv->handle = kvm_s390_pv_get_handle(kvm); in kvm_s390_pv_set_aside()
347 priv->old_gmap_table = (unsigned long)kvm->arch.gmap->table; in kvm_s390_pv_set_aside()
348 WRITE_ONCE(kvm->arch.gmap->guest_handle, 0); in kvm_s390_pv_set_aside()
349 if (s390_replace_asce(kvm->arch.gmap)) in kvm_s390_pv_set_aside()
358 kvm_s390_destroy_lower_2g(kvm); in kvm_s390_pv_set_aside()
359 kvm_s390_clear_pv_state(kvm); in kvm_s390_pv_set_aside()
360 kvm->arch.pv.set_aside = priv; in kvm_s390_pv_set_aside()
386 int kvm_s390_pv_deinit_vm(struct kvm *kvm, u16 *rc, u16 *rrc) in kvm_s390_pv_deinit_vm() argument
390 cc = uv_cmd_nodata(kvm_s390_pv_get_handle(kvm), in kvm_s390_pv_deinit_vm()
392 WRITE_ONCE(kvm->arch.gmap->guest_handle, 0); in kvm_s390_pv_deinit_vm()
394 atomic_dec(&kvm->mm->context.protected_count); in kvm_s390_pv_deinit_vm()
395 kvm_s390_pv_dealloc_vm(kvm); in kvm_s390_pv_deinit_vm()
398 s390_replace_asce(kvm->arch.gmap); in kvm_s390_pv_deinit_vm()
400 KVM_UV_EVENT(kvm, 3, "PROTVIRT DESTROY VM: rc %x rrc %x", *rc, *rrc); in kvm_s390_pv_deinit_vm()
422 int kvm_s390_pv_deinit_cleanup_all(struct kvm *kvm, u16 *rc, u16 *rrc) in kvm_s390_pv_deinit_cleanup_all() argument
433 if (!atomic_inc_not_zero(&kvm->mm->context.protected_count)) in kvm_s390_pv_deinit_cleanup_all()
438 if (kvm_s390_pv_get_handle(kvm)) { in kvm_s390_pv_deinit_cleanup_all()
439 cc = kvm_s390_pv_deinit_vm(kvm, rc, rrc); in kvm_s390_pv_deinit_cleanup_all()
444 if (kvm->arch.pv.set_aside) { in kvm_s390_pv_deinit_cleanup_all()
445 list_add(kvm->arch.pv.set_aside, &kvm->arch.pv.need_cleanup); in kvm_s390_pv_deinit_cleanup_all()
446 kvm->arch.pv.set_aside = NULL; in kvm_s390_pv_deinit_cleanup_all()
450 while (!list_empty(&kvm->arch.pv.need_cleanup)) { in kvm_s390_pv_deinit_cleanup_all()
451 cur = list_first_entry(&kvm->arch.pv.need_cleanup, typeof(*cur), list); in kvm_s390_pv_deinit_cleanup_all()
453 if (kvm_s390_pv_dispose_one_leftover(kvm, cur, &_rc, &_rrc)) { in kvm_s390_pv_deinit_cleanup_all()
474 if (need_zap && mmget_not_zero(kvm->mm)) { in kvm_s390_pv_deinit_cleanup_all()
475 s390_uv_destroy_range(kvm->mm, 0, TASK_SIZE); in kvm_s390_pv_deinit_cleanup_all()
476 mmput(kvm->mm); in kvm_s390_pv_deinit_cleanup_all()
480 atomic_dec(&kvm->mm->context.protected_count); in kvm_s390_pv_deinit_cleanup_all()
499 int kvm_s390_pv_deinit_aside_vm(struct kvm *kvm, u16 *rc, u16 *rrc) in kvm_s390_pv_deinit_aside_vm() argument
504 lockdep_assert_not_held(&kvm->lock); in kvm_s390_pv_deinit_aside_vm()
505 mutex_lock(&kvm->lock); in kvm_s390_pv_deinit_aside_vm()
506 p = kvm->arch.pv.set_aside; in kvm_s390_pv_deinit_aside_vm()
507 kvm->arch.pv.set_aside = NULL; in kvm_s390_pv_deinit_aside_vm()
508 mutex_unlock(&kvm->lock); in kvm_s390_pv_deinit_aside_vm()
513 if (s390_uv_destroy_range_interruptible(kvm->mm, 0, TASK_SIZE_MAX)) in kvm_s390_pv_deinit_aside_vm()
515 if (kvm_s390_pv_dispose_one_leftover(kvm, p, rc, rrc)) in kvm_s390_pv_deinit_aside_vm()
525 mutex_lock(&kvm->lock); in kvm_s390_pv_deinit_aside_vm()
526 list_add(&p->list, &kvm->arch.pv.need_cleanup); in kvm_s390_pv_deinit_aside_vm()
527 mutex_unlock(&kvm->lock); in kvm_s390_pv_deinit_aside_vm()
538 struct kvm *kvm = container_of(subscription, struct kvm, arch.pv.mmu_notifier); in kvm_s390_pv_mmu_notifier_release() local
549 r = kvm_s390_cpus_from_pv(kvm, &dummy, &dummy); in kvm_s390_pv_mmu_notifier_release()
550 if (!r && is_destroy_fast_available() && kvm_s390_pv_get_handle(kvm)) in kvm_s390_pv_mmu_notifier_release()
551 kvm_s390_pv_deinit_vm_fast(kvm, &dummy, &dummy); in kvm_s390_pv_mmu_notifier_release()
558 int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc) in kvm_s390_pv_init_vm() argument
567 ret = kvm_s390_pv_alloc_vm(kvm); in kvm_s390_pv_init_vm()
573 uvcb.guest_stor_len = kvm->arch.pv.guest_len; in kvm_s390_pv_init_vm()
574 uvcb.guest_asce = kvm->arch.gmap->asce; in kvm_s390_pv_init_vm()
575 uvcb.guest_sca = virt_to_phys(kvm->arch.sca); in kvm_s390_pv_init_vm()
577 virt_to_phys((void *)kvm->arch.pv.stor_base); in kvm_s390_pv_init_vm()
578 uvcb.conf_virt_stor_origin = (u64)kvm->arch.pv.stor_var; in kvm_s390_pv_init_vm()
579 uvcb.flags.ap_allow_instr = kvm->arch.model.uv_feat_guest.ap; in kvm_s390_pv_init_vm()
580 uvcb.flags.ap_instr_intr = kvm->arch.model.uv_feat_guest.ap_intr; in kvm_s390_pv_init_vm()
585 KVM_UV_EVENT(kvm, 3, "PROTVIRT CREATE VM: handle %llx len %llx rc %x rrc %x flags %04x", in kvm_s390_pv_init_vm()
589 kvm->arch.pv.handle = uvcb.guest_handle; in kvm_s390_pv_init_vm()
591 atomic_inc(&kvm->mm->context.protected_count); in kvm_s390_pv_init_vm()
594 kvm_s390_pv_deinit_vm(kvm, &dummy, &dummy); in kvm_s390_pv_init_vm()
596 atomic_dec(&kvm->mm->context.protected_count); in kvm_s390_pv_init_vm()
597 kvm_s390_pv_dealloc_vm(kvm); in kvm_s390_pv_init_vm()
601 kvm->arch.gmap->guest_handle = uvcb.guest_handle; in kvm_s390_pv_init_vm()
603 if (kvm->arch.pv.mmu_notifier.ops != &kvm_s390_pv_mmu_notifier_ops) { in kvm_s390_pv_init_vm()
604 kvm->arch.pv.mmu_notifier.ops = &kvm_s390_pv_mmu_notifier_ops; in kvm_s390_pv_init_vm()
605 mmu_notifier_register(&kvm->arch.pv.mmu_notifier, kvm->mm); in kvm_s390_pv_init_vm()
610 int kvm_s390_pv_set_sec_parms(struct kvm *kvm, void *hdr, u64 length, u16 *rc, in kvm_s390_pv_set_sec_parms() argument
618 .guest_handle = kvm_s390_pv_get_handle(kvm), in kvm_s390_pv_set_sec_parms()
624 KVM_UV_EVENT(kvm, 3, "PROTVIRT VM SET PARMS: rc %x rrc %x", in kvm_s390_pv_set_sec_parms()
629 static int unpack_one(struct kvm *kvm, unsigned long addr, u64 tweak, in unpack_one() argument
635 .guest_handle = kvm_s390_pv_get_handle(kvm), in unpack_one()
640 int ret = gmap_make_secure(kvm->arch.gmap, addr, &uvcb); in unpack_one()
646 KVM_UV_EVENT(kvm, 3, "PROTVIRT VM UNPACK: failed addr %llx with rc %x rrc %x", in unpack_one()
651 int kvm_s390_pv_unpack(struct kvm *kvm, unsigned long addr, unsigned long size, in kvm_s390_pv_unpack() argument
660 KVM_UV_EVENT(kvm, 3, "PROTVIRT VM UNPACK: start addr %lx size %lx", in kvm_s390_pv_unpack()
664 ret = unpack_one(kvm, addr, tweak, offset, rc, rrc); in kvm_s390_pv_unpack()
677 KVM_UV_EVENT(kvm, 3, "%s", "PROTVIRT VM UNPACK: successful"); in kvm_s390_pv_unpack()
692 KVM_UV_EVENT(vcpu->kvm, 3, "PROTVIRT SET CPU %d STATE %d rc %x rrc %x", in kvm_s390_pv_set_cpu_state()
746 int kvm_s390_pv_dump_stor_state(struct kvm *kvm, void __user *buff_user, in kvm_s390_pv_dump_stor_state() argument
752 .config_handle = kvm->arch.pv.handle, in kvm_s390_pv_dump_stor_state()
825 KVM_UV_EVENT(kvm, 3, in kvm_s390_pv_dump_stor_state()
854 int kvm_s390_pv_dump_complete(struct kvm *kvm, void __user *buff_user, in kvm_s390_pv_dump_complete() argument
860 .config_handle = kvm_s390_pv_get_handle(kvm), in kvm_s390_pv_dump_complete()
874 KVM_UV_EVENT(kvm, 3, "PROTVIRT DUMP COMPLETE: rc %x rrc %x", in kvm_s390_pv_dump_complete()
883 kvm->arch.pv.dumping = false; in kvm_s390_pv_dump_complete()
884 kvm_s390_vcpu_unblock_all(kvm); in kvm_s390_pv_dump_complete()