aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorblueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162>2007-11-25 12:43:10 +0000
committerblueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162>2007-11-25 12:43:10 +0000
commit3dd9a152e1776c8a99cf5030a2a89db642d6ef43 (patch)
tree5b99f6616cb1a685d279248c4321b8f10d4a24d2
parentb76482e76560345c00e7d6c89199ced204a926d2 (diff)
downloadqemu-3dd9a152e1776c8a99cf5030a2a89db642d6ef43.zip
qemu-3dd9a152e1776c8a99cf5030a2a89db642d6ef43.tar.gz
qemu-3dd9a152e1776c8a99cf5030a2a89db642d6ef43.tar.bz2
More MMU registers (Robert Reif)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3738 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r--target-sparc/cpu.h2
-rw-r--r--target-sparc/op_helper.c23
2 files changed, 18 insertions, 7 deletions
diff --git a/target-sparc/cpu.h b/target-sparc/cpu.h
index 23f9ab1..319e6e8 100644
--- a/target-sparc/cpu.h
+++ b/target-sparc/cpu.h
@@ -215,7 +215,7 @@ typedef struct CPUSPARCState {
uint64_t dtlb_tag[64];
uint64_t dtlb_tte[64];
#else
- uint32_t mmuregs[16];
+ uint32_t mmuregs[32];
uint64_t mxccdata[4];
uint64_t mxccregs[8];
#endif
diff --git a/target-sparc/op_helper.c b/target-sparc/op_helper.c
index d22b2e8..c643bdb 100644
--- a/target-sparc/op_helper.c
+++ b/target-sparc/op_helper.c
@@ -248,11 +248,15 @@ void helper_ld_asi(int asi, int size, int sign)
break;
case 4: /* read MMU regs */
{
- int reg = (T0 >> 8) & 0xf;
+ int reg = (T0 >> 8) & 0x1f;
ret = env->mmuregs[reg];
if (reg == 3) /* Fault status cleared on read */
- env->mmuregs[reg] = 0;
+ env->mmuregs[3] = 0;
+ else if (reg == 0x13) /* Fault status read */
+ ret = env->mmuregs[3];
+ else if (reg == 0x14) /* Fault address read */
+ ret = env->mmuregs[4];
DPRINTF_MMU("mmu_read: reg[%d] = 0x%08x\n", reg, ret);
}
break;
@@ -493,17 +497,18 @@ void helper_st_asi(int asi, int size)
}
case 4: /* write MMU regs */
{
- int reg = (T0 >> 8) & 0xf;
+ int reg = (T0 >> 8) & 0x1f;
uint32_t oldreg;
oldreg = env->mmuregs[reg];
switch(reg) {
case 0:
- env->mmuregs[reg] &= ~(MMU_E | MMU_NF | env->mmu_bm);
- env->mmuregs[reg] |= T1 & (MMU_E | MMU_NF | env->mmu_bm);
+ env->mmuregs[reg] = (env->mmuregs[reg] & 0xff000000) |
+ (T1 & 0x00ffffff);
// Mappings generated during no-fault mode or MMU
// disabled mode are invalid in normal mode
- if (oldreg != env->mmuregs[reg])
+ if ((oldreg & (MMU_E | MMU_NF | env->mmu_bm)) !=
+ (env->mmuregs[reg] & (MMU_E | MMU_NF | env->mmu_bm)))
tlb_flush(env, 1);
break;
case 2:
@@ -517,6 +522,12 @@ void helper_st_asi(int asi, int size)
case 3:
case 4:
break;
+ case 0x13:
+ env->mmuregs[3] = T1;
+ break;
+ case 0x14:
+ env->mmuregs[4] = T1;
+ break;
default:
env->mmuregs[reg] = T1;
break;