提交 1c65781b 编写于 作者: D David Hildenbrand 提交者: Christian Borntraeger

s390/mm: push rte protection down to shadow pte

Just like we already do with ste protection, let's take rte protection
into account. This way, the host pte doesn't have to be mapped writable.
Acked-by: NMartin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: NDavid Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: NChristian Borntraeger <borntraeger@de.ibm.com>
上级 18b89809
...@@ -966,6 +966,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, ...@@ -966,6 +966,7 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr,
int rc; int rc;
*fake = 0; *fake = 0;
*dat_protection = 0;
parent = sg->parent; parent = sg->parent;
vaddr.addr = saddr; vaddr.addr = saddr;
asce.val = sg->orig_asce; asce.val = sg->orig_asce;
...@@ -1008,6 +1009,8 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, ...@@ -1008,6 +1009,8 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr,
return PGM_TRANSLATION_SPEC; return PGM_TRANSLATION_SPEC;
if (vaddr.rsx01 < rfte.tf || vaddr.rsx01 > rfte.tl) if (vaddr.rsx01 < rfte.tf || vaddr.rsx01 > rfte.tl)
return PGM_REGION_SECOND_TRANS; return PGM_REGION_SECOND_TRANS;
if (sg->edat_level >= 1)
*dat_protection |= rfte.p;
rc = gmap_shadow_r2t(sg, saddr, rfte.val); rc = gmap_shadow_r2t(sg, saddr, rfte.val);
if (rc) if (rc)
return rc; return rc;
...@@ -1026,6 +1029,9 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, ...@@ -1026,6 +1029,9 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr,
return PGM_TRANSLATION_SPEC; return PGM_TRANSLATION_SPEC;
if (vaddr.rtx01 < rste.tf || vaddr.rtx01 > rste.tl) if (vaddr.rtx01 < rste.tf || vaddr.rtx01 > rste.tl)
return PGM_REGION_THIRD_TRANS; return PGM_REGION_THIRD_TRANS;
if (sg->edat_level >= 1)
*dat_protection |= rste.p;
rste.p |= *dat_protection;
rc = gmap_shadow_r3t(sg, saddr, rste.val); rc = gmap_shadow_r3t(sg, saddr, rste.val);
if (rc) if (rc)
return rc; return rc;
...@@ -1045,18 +1051,19 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, ...@@ -1045,18 +1051,19 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr,
if (rtte.cr && asce.p && sg->edat_level >= 2) if (rtte.cr && asce.p && sg->edat_level >= 2)
return PGM_TRANSLATION_SPEC; return PGM_TRANSLATION_SPEC;
if (rtte.fc && sg->edat_level >= 2) { if (rtte.fc && sg->edat_level >= 2) {
bool prot = rtte.fc1.p; *dat_protection |= rtte.fc0.p;
*fake = 1; *fake = 1;
ptr = rtte.fc1.rfaa << 31UL; ptr = rtte.fc1.rfaa << 31UL;
rtte.val = ptr; rtte.val = ptr;
rtte.fc0.p = prot;
goto shadow_sgt; goto shadow_sgt;
} }
if (vaddr.sx01 < rtte.fc0.tf || vaddr.sx01 > rtte.fc0.tl) if (vaddr.sx01 < rtte.fc0.tf || vaddr.sx01 > rtte.fc0.tl)
return PGM_SEGMENT_TRANSLATION; return PGM_SEGMENT_TRANSLATION;
if (sg->edat_level >= 1)
*dat_protection |= rtte.fc0.p;
ptr = rtte.fc0.sto << 12UL; ptr = rtte.fc0.sto << 12UL;
shadow_sgt: shadow_sgt:
rtte.fc0.p |= *dat_protection;
rc = gmap_shadow_sgt(sg, saddr, rtte.val, *fake); rc = gmap_shadow_sgt(sg, saddr, rtte.val, *fake);
if (rc) if (rc)
return rc; return rc;
...@@ -1080,18 +1087,16 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr, ...@@ -1080,18 +1087,16 @@ static int kvm_s390_shadow_tables(struct gmap *sg, unsigned long saddr,
return PGM_TRANSLATION_SPEC; return PGM_TRANSLATION_SPEC;
if (ste.cs && asce.p) if (ste.cs && asce.p)
return PGM_TRANSLATION_SPEC; return PGM_TRANSLATION_SPEC;
*dat_protection = ste.fc0.p; *dat_protection |= ste.fc0.p;
if (ste.fc && sg->edat_level >= 1) { if (ste.fc && sg->edat_level >= 1) {
bool prot = ste.fc1.p;
*fake = 1; *fake = 1;
ptr = ste.fc1.sfaa << 20UL; ptr = ste.fc1.sfaa << 20UL;
ste.val = ptr; ste.val = ptr;
ste.fc0.p = prot;
goto shadow_pgt; goto shadow_pgt;
} }
ptr = ste.fc0.pto << 11UL; ptr = ste.fc0.pto << 11UL;
shadow_pgt: shadow_pgt:
ste.fc0.p |= *dat_protection;
rc = gmap_shadow_pgt(sg, saddr, ste.val, *fake); rc = gmap_shadow_pgt(sg, saddr, ste.val, *fake);
if (rc) if (rc)
return rc; return rc;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册