Lines Matching refs:vcpu
260 int ipte_lock_held(struct kvm_vcpu *vcpu) in ipte_lock_held() argument
262 union ipte_control *ic = &vcpu->kvm->arch.sca->ipte_control; in ipte_lock_held()
264 if (vcpu->arch.sie_block->eca & 1) in ipte_lock_held()
266 return vcpu->kvm->arch.ipte_lock_count != 0; in ipte_lock_held()
269 static void ipte_lock_simple(struct kvm_vcpu *vcpu) in ipte_lock_simple() argument
273 mutex_lock(&vcpu->kvm->arch.ipte_mutex); in ipte_lock_simple()
274 vcpu->kvm->arch.ipte_lock_count++; in ipte_lock_simple()
275 if (vcpu->kvm->arch.ipte_lock_count > 1) in ipte_lock_simple()
277 ic = &vcpu->kvm->arch.sca->ipte_control; in ipte_lock_simple()
288 mutex_unlock(&vcpu->kvm->arch.ipte_mutex); in ipte_lock_simple()
291 static void ipte_unlock_simple(struct kvm_vcpu *vcpu) in ipte_unlock_simple() argument
295 mutex_lock(&vcpu->kvm->arch.ipte_mutex); in ipte_unlock_simple()
296 vcpu->kvm->arch.ipte_lock_count--; in ipte_unlock_simple()
297 if (vcpu->kvm->arch.ipte_lock_count) in ipte_unlock_simple()
299 ic = &vcpu->kvm->arch.sca->ipte_control; in ipte_unlock_simple()
305 wake_up(&vcpu->kvm->arch.ipte_wq); in ipte_unlock_simple()
307 mutex_unlock(&vcpu->kvm->arch.ipte_mutex); in ipte_unlock_simple()
310 static void ipte_lock_siif(struct kvm_vcpu *vcpu) in ipte_lock_siif() argument
314 ic = &vcpu->kvm->arch.sca->ipte_control; in ipte_lock_siif()
327 static void ipte_unlock_siif(struct kvm_vcpu *vcpu) in ipte_unlock_siif() argument
331 ic = &vcpu->kvm->arch.sca->ipte_control; in ipte_unlock_siif()
340 wake_up(&vcpu->kvm->arch.ipte_wq); in ipte_unlock_siif()
343 void ipte_lock(struct kvm_vcpu *vcpu) in ipte_lock() argument
345 if (vcpu->arch.sie_block->eca & 1) in ipte_lock()
346 ipte_lock_siif(vcpu); in ipte_lock()
348 ipte_lock_simple(vcpu); in ipte_lock()
351 void ipte_unlock(struct kvm_vcpu *vcpu) in ipte_unlock() argument
353 if (vcpu->arch.sie_block->eca & 1) in ipte_unlock()
354 ipte_unlock_siif(vcpu); in ipte_unlock()
356 ipte_unlock_simple(vcpu); in ipte_unlock()
359 static int ar_translation(struct kvm_vcpu *vcpu, union asce *asce, ar_t ar, in ar_translation() argument
373 save_access_regs(vcpu->run->s.regs.acrs); in ar_translation()
374 alet.val = vcpu->run->s.regs.acrs[ar]; in ar_translation()
377 asce->val = vcpu->arch.sie_block->gcr[1]; in ar_translation()
380 asce->val = vcpu->arch.sie_block->gcr[7]; in ar_translation()
388 ald_addr = vcpu->arch.sie_block->gcr[5]; in ar_translation()
390 ald_addr = vcpu->arch.sie_block->gcr[2]; in ar_translation()
393 rc = read_guest_real(vcpu, ald_addr + 16, &ald.val, sizeof(union ald)); in ar_translation()
403 rc = read_guest_real(vcpu, ald.alo * 128 + alet.alen * 16, &ale, in ar_translation()
413 rc = read_guest_real(vcpu, ale.asteo * 64, &aste, sizeof(struct aste)); in ar_translation()
423 eax = (vcpu->arch.sie_block->gcr[8] >> 16) & 0xffff; in ar_translation()
430 rc = read_guest_real(vcpu, authority_table_addr, in ar_translation()
463 static int get_vcpu_asce(struct kvm_vcpu *vcpu, union asce *asce, in get_vcpu_asce() argument
467 psw_t *psw = &vcpu->arch.sie_block->gpsw; in get_vcpu_asce()
468 struct kvm_s390_pgm_info *pgm = &vcpu->arch.pgm; in get_vcpu_asce()
482 switch (psw_bits(vcpu->arch.sie_block->gpsw).as) { in get_vcpu_asce()
484 asce->val = vcpu->arch.sie_block->gcr[1]; in get_vcpu_asce()
487 asce->val = vcpu->arch.sie_block->gcr[7]; in get_vcpu_asce()
490 asce->val = vcpu->arch.sie_block->gcr[13]; in get_vcpu_asce()
493 rc = ar_translation(vcpu, asce, ar, write); in get_vcpu_asce()
500 vcpu->arch.pgm.exc_access_id = ar; in get_vcpu_asce()
539 static unsigned long guest_translate(struct kvm_vcpu *vcpu, unsigned long gva, in guest_translate() argument
551 ctlreg0.val = vcpu->arch.sie_block->gcr[0]; in guest_translate()
552 edat1 = ctlreg0.edat && test_kvm_facility(vcpu->kvm, 8); in guest_translate()
553 edat2 = edat1 && test_kvm_facility(vcpu->kvm, 78); in guest_translate()
589 if (kvm_is_error_gpa(vcpu->kvm, ptr)) in guest_translate()
591 if (deref_table(vcpu->kvm, ptr, &rfte.val)) in guest_translate()
607 if (kvm_is_error_gpa(vcpu->kvm, ptr)) in guest_translate()
609 if (deref_table(vcpu->kvm, ptr, &rste.val)) in guest_translate()
625 if (kvm_is_error_gpa(vcpu->kvm, ptr)) in guest_translate()
627 if (deref_table(vcpu->kvm, ptr, &rtte.val)) in guest_translate()
652 if (kvm_is_error_gpa(vcpu->kvm, ptr)) in guest_translate()
654 if (deref_table(vcpu->kvm, ptr, &ste.val)) in guest_translate()
671 if (kvm_is_error_gpa(vcpu->kvm, ptr)) in guest_translate()
673 if (deref_table(vcpu->kvm, ptr, &pte.val)) in guest_translate()
684 raddr.addr = kvm_s390_real_to_abs(vcpu, raddr.addr); in guest_translate()
688 if (kvm_is_error_gpa(vcpu->kvm, raddr.addr)) in guest_translate()
700 static int low_address_protection_enabled(struct kvm_vcpu *vcpu, in low_address_protection_enabled() argument
703 union ctlreg0 ctlreg0 = {.val = vcpu->arch.sie_block->gcr[0]}; in low_address_protection_enabled()
704 psw_t *psw = &vcpu->arch.sie_block->gpsw; in low_address_protection_enabled()
713 static int guest_page_range(struct kvm_vcpu *vcpu, unsigned long ga, in guest_page_range() argument
717 struct kvm_s390_pgm_info *pgm = &vcpu->arch.pgm; in guest_page_range()
718 psw_t *psw = &vcpu->arch.sie_block->gpsw; in guest_page_range()
723 lap_enabled = low_address_protection_enabled(vcpu, asce); in guest_page_range()
725 ga = kvm_s390_logical_to_effective(vcpu, ga); in guest_page_range()
733 rc = guest_translate(vcpu, ga, pages, asce, write); in guest_page_range()
741 *pages = kvm_s390_real_to_abs(vcpu, ga); in guest_page_range()
742 if (kvm_is_error_gpa(vcpu->kvm, *pages)) in guest_page_range()
754 int access_guest(struct kvm_vcpu *vcpu, unsigned long ga, ar_t ar, void *data, in access_guest() argument
757 psw_t *psw = &vcpu->arch.sie_block->gpsw; in access_guest()
767 rc = get_vcpu_asce(vcpu, &asce, ar, write); in access_guest()
778 ipte_lock(vcpu); in access_guest()
779 rc = guest_page_range(vcpu, ga, pages, nr_pages, asce, write); in access_guest()
784 rc = kvm_write_guest(vcpu->kvm, gpa, data, _len); in access_guest()
786 rc = kvm_read_guest(vcpu->kvm, gpa, data, _len); in access_guest()
792 ipte_unlock(vcpu); in access_guest()
798 int access_guest_real(struct kvm_vcpu *vcpu, unsigned long gra, in access_guest_real() argument
805 gpa = kvm_s390_real_to_abs(vcpu, gra); in access_guest_real()
808 rc = write_guest_abs(vcpu, gpa, data, _len); in access_guest_real()
810 rc = read_guest_abs(vcpu, gpa, data, _len); in access_guest_real()
827 int guest_translate_address(struct kvm_vcpu *vcpu, unsigned long gva, ar_t ar, in guest_translate_address() argument
830 struct kvm_s390_pgm_info *pgm = &vcpu->arch.pgm; in guest_translate_address()
831 psw_t *psw = &vcpu->arch.sie_block->gpsw; in guest_translate_address()
836 gva = kvm_s390_logical_to_effective(vcpu, gva); in guest_translate_address()
838 rc = get_vcpu_asce(vcpu, &asce, ar, write); in guest_translate_address()
842 if (is_low_address(gva) && low_address_protection_enabled(vcpu, asce)) { in guest_translate_address()
850 rc = guest_translate(vcpu, gva, gpa, asce, write); in guest_translate_address()
858 *gpa = kvm_s390_real_to_abs(vcpu, gva); in guest_translate_address()
859 if (kvm_is_error_gpa(vcpu->kvm, *gpa)) in guest_translate_address()
869 int check_gva_range(struct kvm_vcpu *vcpu, unsigned long gva, ar_t ar, in check_gva_range() argument
876 ipte_lock(vcpu); in check_gva_range()
879 rc = guest_translate_address(vcpu, gva, ar, &gpa, is_write); in check_gva_range()
883 ipte_unlock(vcpu); in check_gva_range()
897 int kvm_s390_check_low_addr_prot_real(struct kvm_vcpu *vcpu, unsigned long gra) in kvm_s390_check_low_addr_prot_real() argument
899 struct kvm_s390_pgm_info *pgm = &vcpu->arch.pgm; in kvm_s390_check_low_addr_prot_real()
900 psw_t *psw = &vcpu->arch.sie_block->gpsw; in kvm_s390_check_low_addr_prot_real()
902 union ctlreg0 ctlreg0 = {.val = vcpu->arch.sie_block->gcr[0]}; in kvm_s390_check_low_addr_prot_real()