summaryrefslogtreecommitdiffstats
path: root/target-i386
diff options
context:
space:
mode:
Diffstat (limited to 'target-i386')
-rw-r--r--target-i386/cpu.h4
-rw-r--r--target-i386/exec.h2
-rw-r--r--target-i386/helper.c22
3 files changed, 28 insertions, 0 deletions
diff --git a/target-i386/cpu.h b/target-i386/cpu.h
index 3cd391a..a50f059 100644
--- a/target-i386/cpu.h
+++ b/target-i386/cpu.h
@@ -888,4 +888,8 @@ static inline void cpu_get_tb_cpu_state(CPUState *env, target_ulong *pc,
(env->eflags & (IOPL_MASK | TF_MASK | RF_MASK | VM_MASK));
}
+void apic_init_reset(CPUState *env);
+void apic_sipi(CPUState *env);
+void do_cpu_init(CPUState *env);
+void do_cpu_sipi(CPUState *env);
#endif /* CPU_I386_H */
diff --git a/target-i386/exec.h b/target-i386/exec.h
index fbaf5bc..42b471a 100644
--- a/target-i386/exec.h
+++ b/target-i386/exec.h
@@ -345,6 +345,8 @@ static inline int cpu_has_work(CPUState *env)
work = (env->interrupt_request & CPU_INTERRUPT_HARD) &&
(env->eflags & IF_MASK);
work |= env->interrupt_request & CPU_INTERRUPT_NMI;
+ work |= env->interrupt_request & CPU_INTERRUPT_INIT;
+ work |= env->interrupt_request & CPU_INTERRUPT_SIPI;
return work;
}
diff --git a/target-i386/helper.c b/target-i386/helper.c
index 75e7ccd..8a76abd 100644
--- a/target-i386/helper.c
+++ b/target-i386/helper.c
@@ -1738,3 +1738,25 @@ CPUX86State *cpu_x86_init(const char *cpu_model)
return env;
}
+
+#if !defined(CONFIG_USER_ONLY)
+void do_cpu_init(CPUState *env)
+{
+ int sipi = env->interrupt_request & CPU_INTERRUPT_SIPI;
+ cpu_reset(env);
+ env->interrupt_request = sipi;
+ apic_init_reset(env);
+}
+
+void do_cpu_sipi(CPUState *env)
+{
+ apic_sipi(env);
+}
+#else
+void do_cpu_init(CPUState *env)
+{
+}
+void do_cpu_sipi(CPUState *env)
+{
+}
+#endif
OpenPOWER on IntegriCloud