Skip to content

Commit

Permalink
x86: use new method to correct reset sequence
Browse files Browse the repository at this point in the history
During reset some devices (such as hpet, rtc) might send IRQ to APIC
which changes APIC's state from default one it's supposed to have
at machine startup time.
Fix this by resetting APIC after devices have been reset to cancel
any changes that qemu_devices_reset() might have done to its state.

Signed-off-by: Zhu Guihua <zhugh.fnst@cn.fujitsu.com>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
  • Loading branch information
Zhu Guihua authored and ehabkost committed Oct 2, 2015
1 parent 8d42d2d commit ae50c55
Showing 1 changed file with 20 additions and 0 deletions.
20 changes: 20 additions & 0 deletions hw/i386/pc.c
Expand Up @@ -1926,6 +1926,25 @@ static void pc_machine_initfn(Object *obj)
NULL, &error_abort);
}

static void pc_machine_reset(void)
{
CPUState *cs;
X86CPU *cpu;

qemu_devices_reset();

/* Reset APIC after devices have been reset to cancel
* any changes that qemu_devices_reset() might have done.
*/
CPU_FOREACH(cs) {
cpu = X86_CPU(cs);

if (cpu->apic_state) {
device_reset(cpu->apic_state);
}
}
}

static unsigned pc_cpu_index_to_socket_id(unsigned cpu_index)
{
X86CPUTopoInfo topo;
Expand All @@ -1947,6 +1966,7 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
mc->default_boot_order = "cad";
mc->hot_add_cpu = pc_hot_add_cpu;
mc->max_cpus = 255;
mc->reset = pc_machine_reset;
hc->plug = pc_machine_device_plug_cb;
hc->unplug_request = pc_machine_device_unplug_request_cb;
hc->unplug = pc_machine_device_unplug_cb;
Expand Down

0 comments on commit ae50c55

Please sign in to comment.