Revision 0e26b7b8 hw/pc.c
b/hw/pc.c | ||
---|---|---|
754 | 754 |
return env->cpu_index == 0; |
755 | 755 |
} |
756 | 756 |
|
757 |
APICState *cpu_get_current_apic(void) |
|
758 |
{ |
|
759 |
if (cpu_single_env) { |
|
760 |
return cpu_single_env->apic_state; |
|
761 |
} else { |
|
762 |
return NULL; |
|
763 |
} |
|
764 |
} |
|
765 |
|
|
757 | 766 |
/* set CMOS shutdown status register (index 0xF) as S3_resume(0xFE) |
758 | 767 |
BIOS will read it and start S3 resume at POST Entry */ |
759 | 768 |
void pc_cmos_set_s3_resume(void *opaque, int irq, int level) |
... | ... | |
774 | 783 |
} |
775 | 784 |
} |
776 | 785 |
|
786 |
static void bsp_cpu_reset(void *opaque) |
|
787 |
{ |
|
788 |
CPUState *env = opaque; |
|
789 |
|
|
790 |
cpu_reset(env); |
|
791 |
env->halted = 0; |
|
792 |
} |
|
793 |
|
|
794 |
static void ap_cpu_reset(void *opaque) |
|
795 |
{ |
|
796 |
CPUState *env = opaque; |
|
797 |
|
|
798 |
cpu_reset(env); |
|
799 |
env->halted = 1; |
|
800 |
} |
|
801 |
|
|
777 | 802 |
static CPUState *pc_new_cpu(const char *cpu_model) |
778 | 803 |
{ |
779 | 804 |
CPUState *env; |
... | ... | |
786 | 811 |
if ((env->cpuid_features & CPUID_APIC) || smp_cpus > 1) { |
787 | 812 |
env->cpuid_apic_id = env->cpu_index; |
788 | 813 |
/* APIC reset callback resets cpu */ |
789 |
apic_init(env); |
|
814 |
env->apic_state = apic_init(env, env->cpuid_apic_id); |
|
815 |
} |
|
816 |
if (cpu_is_bsp(env)) { |
|
817 |
qemu_register_reset(bsp_cpu_reset, env); |
|
818 |
env->halted = 0; |
|
790 | 819 |
} else { |
791 |
qemu_register_reset((QEMUResetHandler*)cpu_reset, env); |
|
820 |
qemu_register_reset(ap_cpu_reset, env); |
|
821 |
env->halted = 1; |
|
792 | 822 |
} |
793 | 823 |
return env; |
794 | 824 |
} |
Also available in: Unified diff