qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 2/3] target-mips: add support for CP0_Config5


From: Eric Johnson
Subject: Re: [Qemu-devel] [PATCH 2/3] target-mips: add support for CP0_Config5
Date: Wed, 22 Jan 2014 19:09:01 +0000

Hi Petar,

When Config5 exists, Config4 must exist.  So it wouldn't be reserved anymore.  
You change does not seem to set Config3.M or Config4.M either.  They must be 
set when Config5 is present.

Eric

-----Original Message-----
From: address@hidden [mailto:address@hidden On Behalf Of Petar Jovanovic
Sent: Wednesday, January 22, 2014 10:32 AM
To: address@hidden
Cc: Petar Jovanovic; address@hidden
Subject: [Qemu-devel] [PATCH 2/3] target-mips: add support for CP0_Config5

From: Petar Jovanovic <address@hidden>

Add CP0_Config5, define rw_bitmask and enable modifications.

Signed-off-by: Petar Jovanovic <address@hidden>
---
 target-mips/cpu.h            |   10 ++++++++++
 target-mips/helper.h         |    1 +
 target-mips/op_helper.c      |    5 +++++
 target-mips/translate.c      |   16 ++++++++++++++--
 target-mips/translate_init.c |   10 ++++++++++
 5 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/target-mips/cpu.h b/target-mips/cpu.h index 9caf447..25bbe3c 100644
--- a/target-mips/cpu.h
+++ b/target-mips/cpu.h
@@ -73,6 +73,7 @@ struct CPUMIPSFPUContext {
     float_status fp_status;
     /* fpu implementation/revision register (fir) */
     uint32_t fcr0;
+#define FCR0_UFRP 28
 #define FCR0_F64 22
 #define FCR0_L 21
 #define FCR0_W 20
@@ -368,6 +369,15 @@ struct CPUMIPSState {
 #define CP0C3_MT   2
 #define CP0C3_SM   1
 #define CP0C3_TL   0
+    int32_t CP0_Config5;
+    uint32_t CP0_Config5_rw_bitmask;
+#define CP0C5_M          31
+#define CP0C5_K          30
+#define CP0C5_CV         29
+#define CP0C5_EVA        28
+#define CP0C5_MSAEn      27
+#define CP0C5_UFR        2
+#define CP0C5_NFExists   0
     int32_t CP0_Config6;
     int32_t CP0_Config7;
     /* XXX: Maybe make LLAddr per-TC? */ diff --git a/target-mips/helper.h 
b/target-mips/helper.h index 1a8b86d..1f52728 100644
--- a/target-mips/helper.h
+++ b/target-mips/helper.h
@@ -134,6 +134,7 @@ DEF_HELPER_2(mtc0_ebase, void, env, tl)  
DEF_HELPER_2(mttc0_ebase, void, env, tl)  DEF_HELPER_2(mtc0_config0, void, env, 
tl)  DEF_HELPER_2(mtc0_config2, void, env, tl)
+DEF_HELPER_2(mtc0_config5, void, env, tl)
 DEF_HELPER_2(mtc0_lladdr, void, env, tl)  DEF_HELPER_3(mtc0_watchlo, void, 
env, tl, i32)  DEF_HELPER_3(mtc0_watchhi, void, env, tl, i32) diff --git 
a/target-mips/op_helper.c b/target-mips/op_helper.c index 8e3a6d7..9c9c022 
100644
--- a/target-mips/op_helper.c
+++ b/target-mips/op_helper.c
@@ -1489,6 +1489,11 @@ void helper_mtc0_config2(CPUMIPSState *env, target_ulong 
arg1)
     env->CP0_Config2 = (env->CP0_Config2 & 0x8FFF0FFF);  }
 
+void helper_mtc0_config5(CPUMIPSState *env, target_ulong arg1) {
+    env->CP0_Config5 = arg1 & env->CP0_Config5_rw_bitmask; }
+
 void helper_mtc0_lladdr(CPUMIPSState *env, target_ulong arg1)  {
     target_long mask = env->CP0_LLAddr_rw_bitmask; diff --git 
a/target-mips/translate.c b/target-mips/translate.c index ef0a2c3..437b58a 
100644
--- a/target-mips/translate.c
+++ b/target-mips/translate.c
@@ -4405,7 +4405,11 @@ static void gen_mfc0(DisasContext *ctx, TCGv arg, int 
reg, int sel)
             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config3));
             rn = "Config3";
             break;
-        /* 4,5 are reserved */
+        /* 4 is reserved */
+        case 5:
+            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config5));
+            rn = "Config5";
+            break;
         /* 6,7 are implementation dependent */
         case 6:
             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config6)); @@ 
-4982,7 +4986,13 @@ static void gen_mtc0(DisasContext *ctx, TCGv arg, int reg, 
int sel)
             /* ignored, read only */
             rn = "Config3";
             break;
-        /* 4,5 are reserved */
+        /* 4 is reserved */
+        case 5:
+            gen_helper_mtc0_config5(cpu_env, arg);
+            rn = "Config5";
+            /* Stop translation as we may have switched the execution mode */
+            ctx->bstate = BS_STOP;
+            break;
         /* 6,7 are implementation dependent */
         case 6:
             /* ignored */
@@ -15916,6 +15926,8 @@ void cpu_state_reset(CPUMIPSState *env)
     env->CP0_Config1 = env->cpu_model->CP0_Config1;
     env->CP0_Config2 = env->cpu_model->CP0_Config2;
     env->CP0_Config3 = env->cpu_model->CP0_Config3;
+    env->CP0_Config5 = env->cpu_model->CP0_Config5;
+    env->CP0_Config5_rw_bitmask = 
+ env->cpu_model->CP0_Config5_rw_bitmask;
     env->CP0_Config6 = env->cpu_model->CP0_Config6;
     env->CP0_Config7 = env->cpu_model->CP0_Config7;
     env->CP0_LLAddr_rw_bitmask = env->cpu_model->CP0_LLAddr_rw_bitmask
diff --git a/target-mips/translate_init.c b/target-mips/translate_init.c index 
6ab6b73..09938f9 100644
--- a/target-mips/translate_init.c
+++ b/target-mips/translate_init.c
@@ -45,6 +45,9 @@
  (0 << CP0C3_VEIC) | (0 << CP0C3_VInt) | (0 << CP0C3_SP) |        \
  (0 << CP0C3_SM) | (0 << CP0C3_TL))
 
+#define MIPS_CONFIG5                                              \
+((0 << CP0C5_M))
+
 /* MMU types, the first four entries have the same layout as the
    CP0C0_MT field.  */
 enum mips_mmu_types {
@@ -64,6 +67,8 @@ struct mips_def_t {
     int32_t CP0_Config1;
     int32_t CP0_Config2;
     int32_t CP0_Config3;
+    int32_t CP0_Config5;
+    int32_t CP0_Config5_rw_bitmask;
     int32_t CP0_Config6;
     int32_t CP0_Config7;
     target_ulong CP0_LLAddr_rw_bitmask; @@ -346,6 +351,11 @@ static const 
mips_def_t mips_defs[] =
                        (1 << CP0C1_CA),
         .CP0_Config2 = MIPS_CONFIG2,
         .CP0_Config3 = MIPS_CONFIG3 | (0 << CP0C3_VInt) | (1 << CP0C3_DSPP),
+        .CP0_Config5 = MIPS_CONFIG5,
+        .CP0_Config5_rw_bitmask = (0 << CP0C5_M) | (1 << CP0C5_K) |
+                                  (1 << CP0C5_CV) | (0 << CP0C5_EVA) |
+                                  (1 << CP0C5_MSAEn) | (0 << CP0C5_UFR) |
+                                  (0 << CP0C5_NFExists),
         .CP0_LLAddr_rw_bitmask = 0,
         .CP0_LLAddr_shift = 4,
         .SYNCI_Step = 32,
--
1.7.9.5






reply via email to

[Prev in Thread] Current Thread [Next in Thread]