diff options
author | Igor Kovalenko <igor.v.kovalenko@gmail.com> | 2009-04-27 23:06:33 +0400 |
---|---|---|
committer | Blue Swirl <blauwirbel@gmail.com> | 2009-04-27 19:14:40 +0000 |
commit | 82f2cfc31b0189c7b9d88af49e5a2b8c9a335c3e (patch) | |
tree | 166cc04587ff9b3aa583d7ab1f1b0602e59a32af /target-sparc | |
parent | Synch to VGA (diff) | |
download | qemu-kvm-82f2cfc31b0189c7b9d88af49e5a2b8c9a335c3e.tar.gz qemu-kvm-82f2cfc31b0189c7b9d88af49e5a2b8c9a335c3e.tar.bz2 qemu-kvm-82f2cfc31b0189c7b9d88af49e5a2b8c9a335c3e.zip |
sparc64 fix TLB match code
TLB match code must respect page size, otherwise 4M page mappings may
be not found.
Also correct a typo in get_physical_address_code which should use IMMU
registers.
Signed-off-by: Igor V. Kovalenko <igor.v.kovalenko@gmail.com>
--
Kind regards,
Igor V. Kovalenko
Diffstat (limited to 'target-sparc')
-rw-r--r-- | target-sparc/helper.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/target-sparc/helper.c b/target-sparc/helper.c index 428f97d53..09a2829a5 100644 --- a/target-sparc/helper.c +++ b/target-sparc/helper.c @@ -404,7 +404,7 @@ static int get_physical_address_data(CPUState *env, } // ctx match, vaddr match, valid? if (env->dmmuregs[1] == (env->dtlb_tag[i] & 0x1fff) && - (address & mask) == (env->dtlb_tag[i] & ~0x1fffULL) && + (address & mask) == (env->dtlb_tag[i] & mask) && (env->dtlb_tte[i] & 0x8000000000000000ULL)) { // access ok? if (((env->dtlb_tte[i] & 0x4) && is_user) || @@ -420,8 +420,8 @@ static int get_physical_address_data(CPUState *env, #endif return 1; } - *physical = (env->dtlb_tte[i] & mask & 0x1fffffff000ULL) + - (address & ~mask & 0x1fffffff000ULL); + *physical = ((env->dtlb_tte[i] & mask) | (address & ~mask)) & + 0x1ffffffe000ULL; *prot = PAGE_READ; if (env->dtlb_tte[i] & 0x2) *prot |= PAGE_WRITE; @@ -467,7 +467,7 @@ static int get_physical_address_code(CPUState *env, } // ctx match, vaddr match, valid? if (env->dmmuregs[1] == (env->itlb_tag[i] & 0x1fff) && - (address & mask) == (env->itlb_tag[i] & ~0x1fffULL) && + (address & mask) == (env->itlb_tag[i] & mask) && (env->itlb_tte[i] & 0x8000000000000000ULL)) { // access ok? if ((env->itlb_tte[i] & 0x4) && is_user) { @@ -481,8 +481,8 @@ static int get_physical_address_code(CPUState *env, #endif return 1; } - *physical = (env->itlb_tte[i] & mask & 0x1fffffff000ULL) + - (address & ~mask & 0x1fffffff000ULL); + *physical = ((env->itlb_tte[i] & mask) | (address & ~mask)) & + 0x1ffffffe000ULL; *prot = PAGE_EXEC; return 0; } @@ -490,7 +490,7 @@ static int get_physical_address_code(CPUState *env, #ifdef DEBUG_MMU printf("TMISS at 0x%" PRIx64 "\n", address); #endif - env->immuregs[6] = (address & ~0x1fffULL) | (env->dmmuregs[1] & 0x1fff); + env->immuregs[6] = (address & ~0x1fffULL) | (env->immuregs[1] & 0x1fff); env->exception_index = TT_TMISS; return 1; } |