From 4eb79e14378e1c3901204602b58caa4358516d17 Mon Sep 17 00:00:00 2001 From: blueswir1 Date: Sun, 25 Nov 2007 12:43:10 +0000 Subject: [PATCH] More MMU registers (Robert Reif) --- target-sparc/cpu.h | 2 +- target-sparc/op_helper.c | 23 +++++++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/target-sparc/cpu.h b/target-sparc/cpu.h index 23f9ab136e..319e6e896a 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 d22b2e8d37..c643bdb364 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; -- 2.11.4.GIT