aboutsummaryrefslogtreecommitdiff
path: root/target-s390x
diff options
context:
space:
mode:
authorAlexander Graf <agraf@suse.de>2011-07-14 11:45:07 +0200
committerAlexander Graf <agraf@suse.de>2011-11-14 17:47:26 +0100
commit09ed75f7848522f5d6f7ccca4bc9d0ab76006142 (patch)
treeb2f8e962952a4d9861c7807fe4024840b3cf3d5f /target-s390x
parent27b5979d9d5dbc5f2ef21a96481f766bf3959b57 (diff)
s390x: make ipte 31-bit aware
When running 31-bit code we can potentially map the same virtual address twice - once as 0x0yyyyyyy and once as 0x8yyyyyyy, because the upper bit gets ignored. This also should be reflected in the tlb invalidation path, so we really invalidate also the transparently created tlb entries. Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'target-s390x')
-rw-r--r--target-s390x/op_helper.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/target-s390x/op_helper.c b/target-s390x/op_helper.c
index e5941187ae..2f46bdd0ff 100644
--- a/target-s390x/op_helper.c
+++ b/target-s390x/op_helper.c
@@ -2950,6 +2950,13 @@ void HELPER(ipte)(uint64_t pte_addr, uint64_t vaddr)
/* XXX we exploit the fact that Linux passes the exact virtual
address here - it's not obliged to! */
tlb_flush_page(env, page);
+
+ /* XXX 31-bit hack */
+ if (page & 0x80000000) {
+ tlb_flush_page(env, page & ~0x80000000);
+ } else {
+ tlb_flush_page(env, page | 0x80000000);
+ }
}
/* flush local tlb */