qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [Patch] sparc32 remove an unnecessary cpu irq set


From: Artyom Tarasenko
Subject: Re: [Qemu-devel] [Patch] sparc32 remove an unnecessary cpu irq set
Date: Thu, 13 Aug 2009 17:44:55 +0200

2009/8/12 Igor Kovalenko <address@hidden>:
> PUT_PSR is asking to be made inline function with arch-specific parts,
> the sparc64 counterpart is too similar.
Ok, here we go:

Signed-off-by: Artyom Tarasenko <address@hidden>
---
--- a/cpu-exec.c
+++ b/cpu-exec.c
@@ -485,9 +485,6 @@ int cpu_exec(CPUState *env1)
                             env->exception_index = env->interrupt_index;
                             do_interrupt(env);
                            env->interrupt_index = 0;
-#if !defined(CONFIG_USER_ONLY)
-                            cpu_check_irqs(env);
-#endif
                         next_tb = 0;
                        }
                    } else if (interrupt_request & CPU_INTERRUPT_TIMER) {
diff --git a/target-sparc/cpu.h b/target-sparc/cpu.h
index 2428bb2..19a81c4 100644
--- a/target-sparc/cpu.h
+++ b/target-sparc/cpu.h
@@ -439,6 +439,21 @@ int cpu_sparc_exec(CPUSPARCState *s);
 #endif

 #ifndef NO_CPU_IO_DEFS
+
+static inline int cpu_cwp_inc(CPUSPARCState *env1, int cwp)
+{
+    if (unlikely(cwp >= env1->nwindows))
+        cwp -= env1->nwindows;
+    return cwp;
+}
+
+static inline int cpu_cwp_dec(CPUSPARCState *env1, int cwp)
+{
+    if (unlikely(cwp < 0))
+        cwp += env1->nwindows;
+    return cwp;
+}
+#endif
 static inline void memcpy32(target_ulong *dst, const target_ulong *src)
 {
     dst[0] = src[0];
@@ -463,43 +478,30 @@ static inline void cpu_set_cwp(CPUSPARCState
*env1, int new_cwp)
     env1->regwptr = env1->regbase + (new_cwp * 16);
 }

-static inline int cpu_cwp_inc(CPUSPARCState *env1, int cwp)
-{
-    if (unlikely(cwp >= env1->nwindows))
-        cwp -= env1->nwindows;
-    return cwp;
-}
+/* sum4m.c, sun4u.c */
+void cpu_check_irqs(CPUSPARCState *env);

-static inline int cpu_cwp_dec(CPUSPARCState *env1, int cwp)
+static inline void PUT_PSR(CPUSPARCState *env, target_ulong val)
 {
-    if (unlikely(cwp < 0))
-        cwp += env1->nwindows;
-    return cwp;
-}
+    env->psr = val & PSR_ICC;
+    env->psref = (val & PSR_EF)? 1 : 0;
+#if ((!defined (TARGET_SPARC64)) && !defined(CONFIG_USER_ONLY))
+    int _newpsrpil=(val & PSR_PIL) >> 8;
+    if((_newpsrpil>env->psrpil)&& ((env->pil_in&15)>_newpsrpil)) {
+       env->psrpil = _newpsrpil;
+       cpu_check_irqs(env);
+    } else env->psrpil = _newpsrpil;
+#else
+    env->psrpil = (val & PSR_PIL) >> 8;
 #endif
-
+    env->psrs = (val & PSR_S)? 1 : 0;
+    env->psrps = (val & PSR_PS)? 1 : 0;
 #if !defined (TARGET_SPARC64)
-#define PUT_PSR(env, val) do { int _tmp = val;                          \
-        env->psr = _tmp & PSR_ICC;                                      \
-        env->psref = (_tmp & PSR_EF)? 1 : 0;                            \
-        env->psrpil = (_tmp & PSR_PIL) >> 8;                            \
-        env->psrs = (_tmp & PSR_S)? 1 : 0;                              \
-        env->psrps = (_tmp & PSR_PS)? 1 : 0;                            \
-        env->psret = (_tmp & PSR_ET)? 1 : 0;                            \
-        cpu_set_cwp(env, _tmp & PSR_CWP);                               \
-        CC_OP = CC_OP_FLAGS;                                            \
-    } while (0)
-#else
-#define PUT_PSR(env, val) do { int _tmp = val;                          \
-        env->psr = _tmp & PSR_ICC;                                      \
-        env->psref = (_tmp & PSR_EF)? 1 : 0;                            \
-        env->psrpil = (_tmp & PSR_PIL) >> 8;                            \
-        env->psrs = (_tmp & PSR_S)? 1 : 0;                              \
-        env->psrps = (_tmp & PSR_PS)? 1 : 0;                            \
-        cpu_set_cwp(env, _tmp & PSR_CWP);                               \
-        CC_OP = CC_OP_FLAGS;                                            \
-    } while (0)
+    env->psret = (val & PSR_ET)? 1 : 0;
 #endif
+    cpu_set_cwp(env, val & PSR_CWP);
+    CC_OP = CC_OP_FLAGS;
+}

 #ifdef TARGET_SPARC64
 #define GET_CCR(env) (((env->xcc >> 20) << 4) | ((env->psr & PSR_ICC) >> 20))
@@ -585,9 +587,6 @@ static inline void cpu_clone_regs(CPUState *env,
target_ulong newsp)
 #include "cpu-all.h"
 #include "exec-all.h"

-/* sum4m.c, sun4u.c */
-void cpu_check_irqs(CPUSPARCState *env);
-
 #ifdef TARGET_SPARC64
 /* sun4u.c */
 void cpu_tick_set_count(void *opaque, uint64_t count);




reply via email to

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