aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kvm
diff options
context:
space:
mode:
authorDavid Hildenbrand <dahi@linux.vnet.ibm.com>2016-05-31 14:06:55 -0400
committerChristian Borntraeger <borntraeger@de.ibm.com>2016-06-10 06:07:15 -0400
commitfbcb7d5157718645cc198c6be6b435ab326c1892 (patch)
tree93201e693fda3ec50d9c4a13fd4c6cc2e10f04ab /arch/s390/kvm
parent3e3c67f6a327852375247c98b0d153c44e460216 (diff)
KVM: s390: gaccess: convert guest_translate_address()
Let's use our new function for preparing translation exceptions. Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Diffstat (limited to 'arch/s390/kvm')
-rw-r--r--arch/s390/kvm/gaccess.c21
1 files changed, 6 insertions, 15 deletions
diff --git a/arch/s390/kvm/gaccess.c b/arch/s390/kvm/gaccess.c
index 61dc45ef50b9..ae9f9e8e063c 100644
--- a/arch/s390/kvm/gaccess.c
+++ b/arch/s390/kvm/gaccess.c
@@ -910,37 +910,28 @@ int access_guest_real(struct kvm_vcpu *vcpu, unsigned long gra,
910int guest_translate_address(struct kvm_vcpu *vcpu, unsigned long gva, ar_t ar, 910int guest_translate_address(struct kvm_vcpu *vcpu, unsigned long gva, ar_t ar,
911 unsigned long *gpa, enum gacc_mode mode) 911 unsigned long *gpa, enum gacc_mode mode)
912{ 912{
913 struct kvm_s390_pgm_info *pgm = &vcpu->arch.pgm;
914 psw_t *psw = &vcpu->arch.sie_block->gpsw; 913 psw_t *psw = &vcpu->arch.sie_block->gpsw;
915 struct trans_exc_code_bits *tec;
916 union asce asce; 914 union asce asce;
917 int rc; 915 int rc;
918 916
919 gva = kvm_s390_logical_to_effective(vcpu, gva); 917 gva = kvm_s390_logical_to_effective(vcpu, gva);
920 tec = (struct trans_exc_code_bits *)&pgm->trans_exc_code;
921 rc = get_vcpu_asce(vcpu, &asce, gva, ar, mode); 918 rc = get_vcpu_asce(vcpu, &asce, gva, ar, mode);
922 tec->addr = gva >> PAGE_SHIFT;
923 if (rc) 919 if (rc)
924 return rc; 920 return rc;
925 if (is_low_address(gva) && low_address_protection_enabled(vcpu, asce)) { 921 if (is_low_address(gva) && low_address_protection_enabled(vcpu, asce)) {
926 if (mode == GACC_STORE) { 922 if (mode == GACC_STORE)
927 rc = pgm->code = PGM_PROTECTION; 923 return trans_exc(vcpu, PGM_PROTECTION, gva, 0,
928 return rc; 924 mode, PROT_TYPE_LA);
929 }
930 } 925 }
931 926
932 if (psw_bits(*psw).t && !asce.r) { /* Use DAT? */ 927 if (psw_bits(*psw).t && !asce.r) { /* Use DAT? */
933 rc = guest_translate(vcpu, gva, gpa, asce, mode); 928 rc = guest_translate(vcpu, gva, gpa, asce, mode);
934 if (rc > 0) { 929 if (rc > 0)
935 if (rc == PGM_PROTECTION) 930 return trans_exc(vcpu, rc, gva, 0, mode, PROT_TYPE_DAT);
936 tec->b61 = 1;
937 pgm->code = rc;
938 }
939 } else { 931 } else {
940 rc = 0;
941 *gpa = kvm_s390_real_to_abs(vcpu, gva); 932 *gpa = kvm_s390_real_to_abs(vcpu, gva);
942 if (kvm_is_error_gpa(vcpu->kvm, *gpa)) 933 if (kvm_is_error_gpa(vcpu->kvm, *gpa))
943 rc = pgm->code = PGM_ADDRESSING; 934 return trans_exc(vcpu, rc, gva, PGM_ADDRESSING, mode, 0);
944 } 935 }
945 936
946 return rc; 937 return rc;