arm: fix qemu crash on startup with -bios option
When QEMU is started with following CLI -machine virt,gic-version=3,accel=kvm -cpu host -bios AAVMF_CODE.fd it crashes with abort at accel/kvm/kvm-all.c:2164: KVM_SET_DEVICE_ATTR failed: Group 6 attr 0x000000000000c665: Invalid argument Which is caused by implicit dependency of kvm_arm_gicv3_reset() on arm_gicv3_icc_reset() where the later is called by CPU reset reset callback. However commit: 3b77f6c arm/boot: split load_dtb() from arm_load_kernel() broke CPU reset callback registration in case arm_load_kernel() ... if (!info->kernel_filename || info->firmware_loaded) branch is taken, i.e. it's sufficient to provide a firmware or do not provide kernel on CLI to skip cpu reset callback registration, where before offending commit the callback has been registered unconditionally. Fix it by registering the callback right at the beginning of arm_load_kernel() unconditionally instead of doing it at the end. NOTE: we probably should eliminate that dependency anyways as well as separate arch CPU reset parts from arm_load_kernel() into CPU itself, but that refactoring that I probably would have to do anyways later for CPU hotplug to work. Reported-by: Auger Eric <eric.auger@redhat.com> Signed-off-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Eric Auger <eric.auger@redhat.com> Tested-by: Eric Auger <eric.auger@redhat.com> Message-id: 1527070950-208350-1-git-send-email-imammedo@redhat.com Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
6c2be133a7
commit
60b8fe49cc
@ -926,6 +926,15 @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
|
|||||||
static const ARMInsnFixup *primary_loader;
|
static const ARMInsnFixup *primary_loader;
|
||||||
AddressSpace *as = arm_boot_address_space(cpu, info);
|
AddressSpace *as = arm_boot_address_space(cpu, info);
|
||||||
|
|
||||||
|
/* CPU objects (unlike devices) are not automatically reset on system
|
||||||
|
* reset, so we must always register a handler to do so. If we're
|
||||||
|
* actually loading a kernel, the handler is also responsible for
|
||||||
|
* arranging that we start it correctly.
|
||||||
|
*/
|
||||||
|
for (cs = first_cpu; cs; cs = CPU_NEXT(cs)) {
|
||||||
|
qemu_register_reset(do_cpu_reset, ARM_CPU(cs));
|
||||||
|
}
|
||||||
|
|
||||||
/* The board code is not supposed to set secure_board_setup unless
|
/* The board code is not supposed to set secure_board_setup unless
|
||||||
* running its code in secure mode is actually possible, and KVM
|
* running its code in secure mode is actually possible, and KVM
|
||||||
* doesn't support secure.
|
* doesn't support secure.
|
||||||
@ -1143,15 +1152,6 @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
|
|||||||
ARM_CPU(cs)->env.boot_info = info;
|
ARM_CPU(cs)->env.boot_info = info;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* CPU objects (unlike devices) are not automatically reset on system
|
|
||||||
* reset, so we must always register a handler to do so. If we're
|
|
||||||
* actually loading a kernel, the handler is also responsible for
|
|
||||||
* arranging that we start it correctly.
|
|
||||||
*/
|
|
||||||
for (cs = first_cpu; cs; cs = CPU_NEXT(cs)) {
|
|
||||||
qemu_register_reset(do_cpu_reset, ARM_CPU(cs));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!info->skip_dtb_autoload && have_dtb(info)) {
|
if (!info->skip_dtb_autoload && have_dtb(info)) {
|
||||||
if (arm_load_dtb(info->dtb_start, info, info->dtb_limit, as) < 0) {
|
if (arm_load_dtb(info->dtb_start, info, info->dtb_limit, as) < 0) {
|
||||||
exit(1);
|
exit(1);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user