Fix TLB access (Jakub Jermar)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6274 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
164ef2e002
commit
afdf8109e3
@ -402,12 +402,12 @@ static int get_physical_address_data(CPUState *env,
|
|||||||
mask = 0xffffffffffc00000ULL;
|
mask = 0xffffffffffc00000ULL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// ctx match, vaddr match?
|
// ctx match, vaddr match, valid?
|
||||||
if (env->dmmuregs[1] == (env->dtlb_tag[i] & 0x1fff) &&
|
if (env->dmmuregs[1] == (env->dtlb_tag[i] & 0x1fff) &&
|
||||||
(address & mask) == (env->dtlb_tag[i] & ~0x1fffULL)) {
|
(address & mask) == (env->dtlb_tag[i] & ~0x1fffULL) &&
|
||||||
// valid, access ok?
|
(env->dtlb_tte[i] & 0x8000000000000000ULL)) {
|
||||||
if ((env->dtlb_tte[i] & 0x8000000000000000ULL) == 0 ||
|
// access ok?
|
||||||
((env->dtlb_tte[i] & 0x4) && is_user) ||
|
if (((env->dtlb_tte[i] & 0x4) && is_user) ||
|
||||||
(!(env->dtlb_tte[i] & 0x2) && (rw == 1))) {
|
(!(env->dtlb_tte[i] & 0x2) && (rw == 1))) {
|
||||||
if (env->dmmuregs[3]) /* Fault status register */
|
if (env->dmmuregs[3]) /* Fault status register */
|
||||||
env->dmmuregs[3] = 2; /* overflow (not read before
|
env->dmmuregs[3] = 2; /* overflow (not read before
|
||||||
@ -465,12 +465,12 @@ static int get_physical_address_code(CPUState *env,
|
|||||||
mask = 0xffffffffffc00000ULL;
|
mask = 0xffffffffffc00000ULL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// ctx match, vaddr match?
|
// ctx match, vaddr match, valid?
|
||||||
if (env->dmmuregs[1] == (env->itlb_tag[i] & 0x1fff) &&
|
if (env->dmmuregs[1] == (env->itlb_tag[i] & 0x1fff) &&
|
||||||
(address & mask) == (env->itlb_tag[i] & ~0x1fffULL)) {
|
(address & mask) == (env->itlb_tag[i] & ~0x1fffULL) &&
|
||||||
// valid, access ok?
|
(env->itlb_tte[i] & 0x8000000000000000ULL)) {
|
||||||
if ((env->itlb_tte[i] & 0x8000000000000000ULL) == 0 ||
|
// access ok?
|
||||||
((env->itlb_tte[i] & 0x4) && is_user)) {
|
if ((env->itlb_tte[i] & 0x4) && is_user) {
|
||||||
if (env->immuregs[3]) /* Fault status register */
|
if (env->immuregs[3]) /* Fault status register */
|
||||||
env->immuregs[3] = 2; /* overflow (not read before
|
env->immuregs[3] = 2; /* overflow (not read before
|
||||||
another fault) */
|
another fault) */
|
||||||
|
Loading…
Reference in New Issue
Block a user