More MMU registers (Robert Reif)

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3738 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
blueswir1 2007-11-25 12:43:10 +00:00
parent b76482e765
commit 3dd9a152e1
2 changed files with 18 additions and 7 deletions

View File

@ -215,7 +215,7 @@ typedef struct CPUSPARCState {
uint64_t dtlb_tag[64]; uint64_t dtlb_tag[64];
uint64_t dtlb_tte[64]; uint64_t dtlb_tte[64];
#else #else
uint32_t mmuregs[16]; uint32_t mmuregs[32];
uint64_t mxccdata[4]; uint64_t mxccdata[4];
uint64_t mxccregs[8]; uint64_t mxccregs[8];
#endif #endif

View File

@ -248,11 +248,15 @@ void helper_ld_asi(int asi, int size, int sign)
break; break;
case 4: /* read MMU regs */ case 4: /* read MMU regs */
{ {
int reg = (T0 >> 8) & 0xf; int reg = (T0 >> 8) & 0x1f;
ret = env->mmuregs[reg]; ret = env->mmuregs[reg];
if (reg == 3) /* Fault status cleared on read */ 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); DPRINTF_MMU("mmu_read: reg[%d] = 0x%08x\n", reg, ret);
} }
break; break;
@ -493,17 +497,18 @@ void helper_st_asi(int asi, int size)
} }
case 4: /* write MMU regs */ case 4: /* write MMU regs */
{ {
int reg = (T0 >> 8) & 0xf; int reg = (T0 >> 8) & 0x1f;
uint32_t oldreg; uint32_t oldreg;
oldreg = env->mmuregs[reg]; oldreg = env->mmuregs[reg];
switch(reg) { switch(reg) {
case 0: case 0:
env->mmuregs[reg] &= ~(MMU_E | MMU_NF | env->mmu_bm); env->mmuregs[reg] = (env->mmuregs[reg] & 0xff000000) |
env->mmuregs[reg] |= T1 & (MMU_E | MMU_NF | env->mmu_bm); (T1 & 0x00ffffff);
// Mappings generated during no-fault mode or MMU // Mappings generated during no-fault mode or MMU
// disabled mode are invalid in normal mode // 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); tlb_flush(env, 1);
break; break;
case 2: case 2:
@ -517,6 +522,12 @@ void helper_st_asi(int asi, int size)
case 3: case 3:
case 4: case 4:
break; break;
case 0x13:
env->mmuregs[3] = T1;
break;
case 0x14:
env->mmuregs[4] = T1;
break;
default: default:
env->mmuregs[reg] = T1; env->mmuregs[reg] = T1;
break; break;