m68k: use caller supplied CPUState for interrupt related stuff
authorBlue Swirl <blauwirbel@gmail.com>
Sat, 21 May 2011 07:55:24 +0000 (07:55 +0000)
committerBlue Swirl <blauwirbel@gmail.com>
Sun, 26 Jun 2011 18:25:21 +0000 (18:25 +0000)
Pass CPUState to do_interrupt(). This is needed by later patches.

It would be cleaner to move the function to helper.c, but there are
a few dependencies between do_interrupt() and other functions.

Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
cpu-exec.c
target-m68k/cpu.h
target-m68k/op_helper.c

index 1f3c4bb4beab8f723475bcd2efc6f8fde3b61466..6440f12b978db9d689b24229aa3024ba82493dca 100644 (file)
@@ -294,7 +294,7 @@ int cpu_exec(CPUState *env1)
 #elif defined(TARGET_CRIS)
                     do_interrupt(env);
 #elif defined(TARGET_M68K)
-                    do_interrupt(0);
+                    do_interrupt(env);
 #elif defined(TARGET_S390X)
                     do_interrupt(env);
 #endif
@@ -529,7 +529,7 @@ int cpu_exec(CPUState *env1)
                            provide/save the vector when the interrupt is
                            first signalled.  */
                         env->exception_index = env->pending_vector;
-                        do_interrupt(1);
+                        do_interrupt_m68k_hardirq(env);
                         next_tb = 0;
                     }
 #elif defined(TARGET_S390X) && !defined(CONFIG_USER_ONLY)
index b025b6689d6f100ff11d70aea7e8c340fda2cef3..4d8ba287b1dc110bd7da86a1f6d409cb7bfe8199 100644 (file)
@@ -119,7 +119,8 @@ void m68k_tcg_init(void);
 CPUM68KState *cpu_m68k_init(const char *cpu_model);
 int cpu_m68k_exec(CPUM68KState *s);
 void cpu_m68k_close(CPUM68KState *s);
-void do_interrupt(int is_hw);
+void do_interrupt(CPUState *env1);
+void do_interrupt_m68k_hardirq(CPUState *env1);
 /* you can call this signal handler from your SIGBUS and SIGSEGV
    signal handlers to inform the virtual CPU of exceptions. non zero
    is returned if the signal was handled by the virtual CPU.  */
index 084a182adb73fd699f2ea0f18f1b10810564cdd6..237fc4cb54e1245b1d02d0e5d0c46c18ed3b46f5 100644 (file)
 
 #if defined(CONFIG_USER_ONLY)
 
-void do_interrupt(int is_hw)
+void do_interrupt(CPUState *env1)
+{
+    env1->exception_index = -1;
+}
+
+void do_interrupt_m68k_hardirq(CPUState *env1)
 {
-    env->exception_index = -1;
 }
 
 #else
@@ -90,7 +94,7 @@ static void do_rte(void)
     env->aregs[7] = sp + 8;
 }
 
-void do_interrupt(int is_hw)
+static void do_interrupt_all(int is_hw)
 {
     uint32_t sp;
     uint32_t fmt;
@@ -155,6 +159,25 @@ void do_interrupt(int is_hw)
     env->pc = ldl_kernel(env->vbr + vector);
 }
 
+void do_interrupt(CPUState *env1)
+{
+    CPUState *saved_env;
+
+    saved_env = env;
+    env = env1;
+    do_interrupt_all(0);
+    env = saved_env;
+}
+
+void do_interrupt_m68k_hardirq(CPUState *env1)
+{
+    CPUState *saved_env;
+
+    saved_env = env;
+    env = env1;
+    do_interrupt_all(1);
+    env = saved_env;
+}
 #endif
 
 static void raise_exception(int tt)