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:
parent
b76482e765
commit
3dd9a152e1
@ -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
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user