diff options
author | Andreas Färber <afaerber@suse.de> | 2013-07-27 02:53:25 +0200 |
---|---|---|
committer | Andreas Färber <afaerber@suse.de> | 2013-07-29 15:29:15 +0200 |
commit | 14a10fc39923b3af07c8c46d22cb20843bee3a72 (patch) | |
tree | 5dc9c362f2ef73a3f28e62483e14d0602e439b33 /target-sh4 | |
parent | fdc43322c978d78e79e692872dcec7b4f6a447f1 (diff) | |
download | qemu-14a10fc39923b3af07c8c46d22cb20843bee3a72.tar.gz qemu-14a10fc39923b3af07c8c46d22cb20843bee3a72.tar.bz2 qemu-14a10fc39923b3af07c8c46d22cb20843bee3a72.zip |
cpu: Partially revert "cpu: Change qemu_init_vcpu() argument to CPUState"
Commit c643bed99 moved qemu_init_vcpu() calls to common CPUState code.
This causes x86 cpu-add to fail with "KVM: setting VAPIC address failed".
The reason for the failure is that CPUClass::kvm_fd is not yet
initialized in the following call graph:
->x86_cpu_realizefn
->x86_cpu_apic_realize
->qdev_init
->device_set_realized
->device_reset (hotplugged == 1)
->apic_reset_common
->vapic_base_update
->kvm_apic_vapic_base_update
This causes attempted KVM vCPU ioctls to fail.
By contrast, in the non-hotplug case the APIC is reset much later, when
the vCPU is already initialized.
As a quick and safe solution, move the qemu_init_vcpu() call back into
the targets' realize functions.
Reported-by: Chen Fan <chen.fan.fnst@cn.fujitsu.com>
Acked-by: Igor Mammedov <imammedo@redhat.com> (for i386)
Tested-by: Jia Liu <proljc@gmail.com> (for openrisc)
Signed-off-by: Andreas Färber <afaerber@suse.de>
Diffstat (limited to 'target-sh4')
-rw-r--r-- | target-sh4/cpu.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/target-sh4/cpu.c b/target-sh4/cpu.c index bda3c5112c..34b2b57ba7 100644 --- a/target-sh4/cpu.c +++ b/target-sh4/cpu.c @@ -240,10 +240,11 @@ static const TypeInfo sh7785_type_info = { static void superh_cpu_realizefn(DeviceState *dev, Error **errp) { - SuperHCPU *cpu = SUPERH_CPU(dev); + CPUState *cs = CPU(dev); SuperHCPUClass *scc = SUPERH_CPU_GET_CLASS(dev); - cpu_reset(CPU(cpu)); + cpu_reset(cs); + qemu_init_vcpu(cs); scc->parent_realize(dev, errp); } |