On Sat, Aug 12, 2017 at 10:38:10AM +0200, Thomas Huth wrote: > QEMU currently crashes when the user tries to add a spapr-cpu-core > on a non-pseries machine: > > $ qemu-system-ppc64 -S -machine ppce500,accel=tcg \ > -device POWER5+_v2.1-spapr-cpu-core > hw/ppc/spapr_cpu_core.c:178:spapr_cpu_core_realize_child: > Object 0x55cee1f55160 is not an instance of type spapr-machine > Aborted (core dumped) > > So let's add a proper check for the correct machine time with > a more friendly error message here. > > Reported-by: Eduardo Habkost <ehabk...@redhat.com> > Signed-off-by: Thomas Huth <th...@redhat.com> > --- > hw/ppc/spapr_cpu_core.c | 9 ++++++++- > scripts/device-crash-test | 1 + > 2 files changed, 9 insertions(+), 1 deletion(-) > > diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c > index ea278ce..0f3d653 100644 > --- a/hw/ppc/spapr_cpu_core.c > +++ b/hw/ppc/spapr_cpu_core.c > @@ -175,11 +175,18 @@ static void spapr_cpu_core_unrealizefn(DeviceState > *dev, Error **errp) > static void spapr_cpu_core_realize_child(Object *child, Error **errp) > { > Error *local_err = NULL; > - sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine()); > + sPAPRMachineState *spapr; > CPUState *cs = CPU(child); > PowerPCCPU *cpu = POWERPC_CPU(cs); > Object *obj; > > + spapr = (sPAPRMachineState *)object_dynamic_cast(qdev_get_machine(), > + TYPE_SPAPR_MACHINE); > + if (!spapr) { > + error_setg(errp, "spapr-cpu-core needs a pseries machine"); > + return; > + } > + > object_property_set_bool(child, true, "realized", &local_err); > if (local_err) { > goto error; > diff --git a/scripts/device-crash-test b/scripts/device-crash-test > index e77b693..8eb2d02 100755 > --- a/scripts/device-crash-test > +++ b/scripts/device-crash-test > @@ -200,6 +200,7 @@ ERROR_WHITELIST = [ > {'log':r"Multiple VT220 operator consoles are not supported"}, > {'log':r"core 0 already populated"}, > {'log':r"could not find stage1 bootloader"}, > + {'log':r"spapr-cpu-core needs a pseries machine"},
device/machine whitelist entries are preferred, if possible. This way, we can set expected=True and device-crash-test will avoid testing a device/machine combination known to be incompatible (when running in quick mode), or print a warning if it doesn't fail as expected (when running in full mode). I suggest the following (untested): # "spapr-cpu-core needs a pseries machine" {'machine':'(?!pseries.*)', 'device':'.*-spapr-cpu-core', 'expected':True}, -- Eduardo