From afdf8109e3c5c30d312a844436c658f7506e4189 Mon Sep 17 00:00:00 2001 From: blueswir1 Date: Mon, 12 Jan 2009 21:12:22 +0000 Subject: Fix TLB access (Jakub Jermar) git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6274 c046a42c-6fe2-441c-8c8c-71466251a162 --- target-sparc/helper.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'target-sparc') diff --git a/target-sparc/helper.c b/target-sparc/helper.c index 7943e12..d2865ee 100644 --- a/target-sparc/helper.c +++ b/target-sparc/helper.c @@ -402,12 +402,12 @@ static int get_physical_address_data(CPUState *env, mask = 0xffffffffffc00000ULL; break; } - // ctx match, vaddr match? + // ctx match, vaddr match, valid? if (env->dmmuregs[1] == (env->dtlb_tag[i] & 0x1fff) && - (address & mask) == (env->dtlb_tag[i] & ~0x1fffULL)) { - // valid, access ok? - if ((env->dtlb_tte[i] & 0x8000000000000000ULL) == 0 || - ((env->dtlb_tte[i] & 0x4) && is_user) || + (address & mask) == (env->dtlb_tag[i] & ~0x1fffULL) && + (env->dtlb_tte[i] & 0x8000000000000000ULL)) { + // access ok? + if (((env->dtlb_tte[i] & 0x4) && is_user) || (!(env->dtlb_tte[i] & 0x2) && (rw == 1))) { if (env->dmmuregs[3]) /* Fault status register */ env->dmmuregs[3] = 2; /* overflow (not read before @@ -465,12 +465,12 @@ static int get_physical_address_code(CPUState *env, mask = 0xffffffffffc00000ULL; break; } - // ctx match, vaddr match? + // ctx match, vaddr match, valid? if (env->dmmuregs[1] == (env->itlb_tag[i] & 0x1fff) && - (address & mask) == (env->itlb_tag[i] & ~0x1fffULL)) { - // valid, access ok? - if ((env->itlb_tte[i] & 0x8000000000000000ULL) == 0 || - ((env->itlb_tte[i] & 0x4) && is_user)) { + (address & mask) == (env->itlb_tag[i] & ~0x1fffULL) && + (env->itlb_tte[i] & 0x8000000000000000ULL)) { + // access ok? + if ((env->itlb_tte[i] & 0x4) && is_user) { if (env->immuregs[3]) /* Fault status register */ env->immuregs[3] = 2; /* overflow (not read before another fault) */ -- cgit v1.1