qdev-monitor: Check sysbus device type before creating it

Add an early check to test if the requested sysbus device type
is allowed by the current machine before creating the device. This
impacts both -device cli option and device_add qmp command.

Before this patch, the check was done well after the device has
been created (in a machine init done notifier). We can now report
the error right away.

Signed-off-by: Damien Hedde <damien.hedde@greensocs.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Acked-by: Eduardo Habkost <ehabkost@redhat.com>
Message-Id: <20211029142258.484907-3-damien.hedde@greensocs.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
This commit is contained in:
Damien Hedde 2021-10-29 16:22:57 +02:00 committed by Philippe Mathieu-Daudé
parent b5fdf4102f
commit 312e1b1f3e

View File

@ -42,6 +42,7 @@
#include "qemu/cutils.h"
#include "hw/qdev-properties.h"
#include "hw/clock.h"
#include "hw/boards.h"
/*
* Aliases were a bad idea from the start. Let's keep them
@ -254,6 +255,16 @@ static DeviceClass *qdev_get_device_class(const char **driver, Error **errp)
return NULL;
}
if (object_class_dynamic_cast(oc, TYPE_SYS_BUS_DEVICE)) {
/* sysbus devices need to be allowed by the machine */
MachineClass *mc = MACHINE_CLASS(object_get_class(qdev_get_machine()));
if (!device_type_is_dynamic_sysbus(mc, *driver)) {
error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "driver",
"a dynamic sysbus device type for the machine");
return NULL;
}
}
return dc;
}