diff options
author | David Hildenbrand <dahi@linux.vnet.ibm.com> | 2016-05-31 14:06:55 -0400 |
---|---|---|
committer | Christian Borntraeger <borntraeger@de.ibm.com> | 2016-06-10 06:07:15 -0400 |
commit | fbcb7d5157718645cc198c6be6b435ab326c1892 (patch) | |
tree | 93201e693fda3ec50d9c4a13fd4c6cc2e10f04ab /arch/s390/kvm | |
parent | 3e3c67f6a327852375247c98b0d153c44e460216 (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.c | 21 |
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, | |||
910 | int guest_translate_address(struct kvm_vcpu *vcpu, unsigned long gva, ar_t ar, | 910 | int 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; |