diff options
Diffstat (limited to 'target-i386')
-rw-r--r-- | target-i386/cpu.h | 4 | ||||
-rw-r--r-- | target-i386/exec.h | 2 | ||||
-rw-r--r-- | target-i386/helper.c | 22 |
3 files changed, 28 insertions, 0 deletions
diff --git a/target-i386/cpu.h b/target-i386/cpu.h index 3cd391a01f..a50f0594b0 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 fbaf5bc984..42b471a269 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 75e7ccd454..8a76abdac5 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 |