diff options
Diffstat (limited to 'target-i386/cpu.c')
-rw-r--r-- | target-i386/cpu.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 6b9659f9e7..365c2ffae9 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -1686,8 +1686,24 @@ static void x86_cpu_reset(CPUState *s) env->dr[7] = DR7_FIXED_1; cpu_breakpoint_remove_all(env, BP_CPU); cpu_watchpoint_remove_all(env, BP_CPU); + +#if !defined(CONFIG_USER_ONLY) + /* We hard-wire the BSP to the first CPU. */ + if (env->cpu_index == 0) { + apic_designate_bsp(env->apic_state); + } + + env->halted = !cpu_is_bsp(cpu); +#endif } +#ifndef CONFIG_USER_ONLY +bool cpu_is_bsp(X86CPU *cpu) +{ + return cpu_get_apic_base(cpu->env.apic_state) & MSR_IA32_APICBASE_BSP; +} +#endif + static void mce_init(X86CPU *cpu) { CPUX86State *cenv = &cpu->env; |