Commit afdf8109e3c5c30d312a844436c658f7506e4189
1 parent
164ef2e0
Fix TLB access (Jakub Jermar)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6274 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
10 additions
and
10 deletions
target-sparc/helper.c
@@ -402,12 +402,12 @@ static int get_physical_address_data(CPUState *env, | @@ -402,12 +402,12 @@ static int get_physical_address_data(CPUState *env, | ||
402 | mask = 0xffffffffffc00000ULL; | 402 | mask = 0xffffffffffc00000ULL; |
403 | break; | 403 | break; |
404 | } | 404 | } |
405 | - // ctx match, vaddr match? | 405 | + // ctx match, vaddr match, valid? |
406 | if (env->dmmuregs[1] == (env->dtlb_tag[i] & 0x1fff) && | 406 | if (env->dmmuregs[1] == (env->dtlb_tag[i] & 0x1fff) && |
407 | - (address & mask) == (env->dtlb_tag[i] & ~0x1fffULL)) { | ||
408 | - // valid, access ok? | ||
409 | - if ((env->dtlb_tte[i] & 0x8000000000000000ULL) == 0 || | ||
410 | - ((env->dtlb_tte[i] & 0x4) && is_user) || | 407 | + (address & mask) == (env->dtlb_tag[i] & ~0x1fffULL) && |
408 | + (env->dtlb_tte[i] & 0x8000000000000000ULL)) { | ||
409 | + // access ok? | ||
410 | + if (((env->dtlb_tte[i] & 0x4) && is_user) || | ||
411 | (!(env->dtlb_tte[i] & 0x2) && (rw == 1))) { | 411 | (!(env->dtlb_tte[i] & 0x2) && (rw == 1))) { |
412 | if (env->dmmuregs[3]) /* Fault status register */ | 412 | if (env->dmmuregs[3]) /* Fault status register */ |
413 | env->dmmuregs[3] = 2; /* overflow (not read before | 413 | env->dmmuregs[3] = 2; /* overflow (not read before |
@@ -465,12 +465,12 @@ static int get_physical_address_code(CPUState *env, | @@ -465,12 +465,12 @@ static int get_physical_address_code(CPUState *env, | ||
465 | mask = 0xffffffffffc00000ULL; | 465 | mask = 0xffffffffffc00000ULL; |
466 | break; | 466 | break; |
467 | } | 467 | } |
468 | - // ctx match, vaddr match? | 468 | + // ctx match, vaddr match, valid? |
469 | if (env->dmmuregs[1] == (env->itlb_tag[i] & 0x1fff) && | 469 | if (env->dmmuregs[1] == (env->itlb_tag[i] & 0x1fff) && |
470 | - (address & mask) == (env->itlb_tag[i] & ~0x1fffULL)) { | ||
471 | - // valid, access ok? | ||
472 | - if ((env->itlb_tte[i] & 0x8000000000000000ULL) == 0 || | ||
473 | - ((env->itlb_tte[i] & 0x4) && is_user)) { | 470 | + (address & mask) == (env->itlb_tag[i] & ~0x1fffULL) && |
471 | + (env->itlb_tte[i] & 0x8000000000000000ULL)) { | ||
472 | + // access ok? | ||
473 | + if ((env->itlb_tte[i] & 0x4) && is_user) { | ||
474 | if (env->immuregs[3]) /* Fault status register */ | 474 | if (env->immuregs[3]) /* Fault status register */ |
475 | env->immuregs[3] = 2; /* overflow (not read before | 475 | env->immuregs[3] = 2; /* overflow (not read before |
476 | another fault) */ | 476 | another fault) */ |