From patchwork Mon Nov 14 17:06:30 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [02/12] s390x: make ipte 31-bit aware Date: Mon, 14 Nov 2011 07:06:30 -0000 From: Alexander Graf X-Patchwork-Id: 125581 Message-Id: <1321290400-32717-3-git-send-email-agraf@suse.de> To: qemu-devel Developers Cc: blauwirbel@gmail.com 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 --- target-s390x/op_helper.c | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/target-s390x/op_helper.c b/target-s390x/op_helper.c index e594118..2f46bdd 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 */