diff options
author | Radim Krčmář <rkrcmar@redhat.com> | 2017-04-04 08:42:51 -0400 |
---|---|---|
committer | Radim Krčmář <rkrcmar@redhat.com> | 2017-04-04 08:42:51 -0400 |
commit | 34fcf05b1557f1f8d6801d9dde30ac1d13213ba3 (patch) | |
tree | 4750c3cfb767393da19adffdbbcc7212e694cb7d | |
parent | a71c9a1c779f2499fb2afc0553e543f18aff6edf (diff) | |
parent | 232b8e3b1d4946a45e3b9dd4c282b12a085dd39d (diff) |
Merge tag 'kvm-s390-master-4.11-1' of git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux
From: Christian Borntraeger <borntraeger@de.ibm.com>
KVM: s390: Fix instruction-execution-protection/change-recording override
This is a fix that prevents translation exception errors
on valid page tables for the instruction-exection-protection
support. This feature was added during the 4.11 merge window.
We have to remove an old check that would trigger if the
change-recording override is not available (e.g. edat1 disabled
via cpu model).
-rw-r--r-- | arch/s390/kvm/gaccess.c | 7 |
1 files changed, 2 insertions, 5 deletions
diff --git a/arch/s390/kvm/gaccess.c b/arch/s390/kvm/gaccess.c index d55c829a5944..ddbffb715b40 100644 --- a/arch/s390/kvm/gaccess.c +++ b/arch/s390/kvm/gaccess.c | |||
@@ -168,8 +168,7 @@ union page_table_entry { | |||
168 | unsigned long z : 1; /* Zero Bit */ | 168 | unsigned long z : 1; /* Zero Bit */ |
169 | unsigned long i : 1; /* Page-Invalid Bit */ | 169 | unsigned long i : 1; /* Page-Invalid Bit */ |
170 | unsigned long p : 1; /* DAT-Protection Bit */ | 170 | unsigned long p : 1; /* DAT-Protection Bit */ |
171 | unsigned long co : 1; /* Change-Recording Override */ | 171 | unsigned long : 9; |
172 | unsigned long : 8; | ||
173 | }; | 172 | }; |
174 | }; | 173 | }; |
175 | 174 | ||
@@ -745,8 +744,6 @@ static unsigned long guest_translate(struct kvm_vcpu *vcpu, unsigned long gva, | |||
745 | return PGM_PAGE_TRANSLATION; | 744 | return PGM_PAGE_TRANSLATION; |
746 | if (pte.z) | 745 | if (pte.z) |
747 | return PGM_TRANSLATION_SPEC; | 746 | return PGM_TRANSLATION_SPEC; |
748 | if (pte.co && !edat1) | ||
749 | return PGM_TRANSLATION_SPEC; | ||
750 | dat_protection |= pte.p; | 747 | dat_protection |= pte.p; |
751 | raddr.pfra = pte.pfra; | 748 | raddr.pfra = pte.pfra; |
752 | real_address: | 749 | real_address: |
@@ -1182,7 +1179,7 @@ int kvm_s390_shadow_fault(struct kvm_vcpu *vcpu, struct gmap *sg, | |||
1182 | rc = gmap_read_table(sg->parent, pgt + vaddr.px * 8, &pte.val); | 1179 | rc = gmap_read_table(sg->parent, pgt + vaddr.px * 8, &pte.val); |
1183 | if (!rc && pte.i) | 1180 | if (!rc && pte.i) |
1184 | rc = PGM_PAGE_TRANSLATION; | 1181 | rc = PGM_PAGE_TRANSLATION; |
1185 | if (!rc && (pte.z || (pte.co && sg->edat_level < 1))) | 1182 | if (!rc && pte.z) |
1186 | rc = PGM_TRANSLATION_SPEC; | 1183 | rc = PGM_TRANSLATION_SPEC; |
1187 | shadow_page: | 1184 | shadow_page: |
1188 | pte.p |= dat_protection; | 1185 | pte.p |= dat_protection; |