Kaynağa Gözat

More MMU registers (Robert Reif)

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3738 c046a42c-6fe2-441c-8c8c-71466251a162
blueswir1 18 yıl önce
ebeveyn
işleme
3dd9a152e1
2 değiştirilmiş dosya ile 18 ekleme ve 7 silme
  1. 1 1
      target-sparc/cpu.h
  2. 17 6
      target-sparc/op_helper.c

+ 1 - 1
target-sparc/cpu.h

@@ -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

+ 17 - 6
target-sparc/op_helper.c

@@ -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] |= 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
                 // 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;