From b6b611446077537b542c20804d3c850daff27845 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 15 Jul 2009 13:48:21 +0200 Subject: qdev/compat: compat property infrastructure. This add support for switching devices into a compatibility mode using device properties. Machine types can have a list of properties for specific devices attached to allow the easy creation of machine types compatible to older qemu versions. Signed-off-by: Gerd Hoffmann Signed-off-by: Anthony Liguori --- hw/boards.h | 3 +++ hw/qdev-properties.c | 23 +++++++++++++++++++++++ hw/qdev.c | 1 + hw/qdev.h | 11 +++++++++++ vl.c | 3 +++ 5 files changed, 41 insertions(+) diff --git a/hw/boards.h b/hw/boards.h index f6733b7..11acb89 100644 --- a/hw/boards.h +++ b/hw/boards.h @@ -3,6 +3,8 @@ #ifndef HW_BOARDS_H #define HW_BOARDS_H +#include "qdev.h" + typedef void QEMUMachineInitFunc(ram_addr_t ram_size, const char *boot_device, const char *kernel_filename, @@ -17,6 +19,7 @@ typedef struct QEMUMachine { int use_scsi; int max_cpus; int is_default; + CompatProperty *compat_props; struct QEMUMachine *next; } QEMUMachine; diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c index 8b0d0ff..06c25af 100644 --- a/hw/qdev-properties.c +++ b/hw/qdev-properties.c @@ -244,3 +244,26 @@ void qdev_prop_set_defaults(DeviceState *dev, Property *props) } } +static CompatProperty *compat_props; + +void qdev_prop_register_compat(CompatProperty *props) +{ + compat_props = props; +} + +void qdev_prop_set_compat(DeviceState *dev) +{ + CompatProperty *prop; + + if (!compat_props) { + return; + } + for (prop = compat_props; prop->driver != NULL; prop++) { + if (strcmp(dev->info->name, prop->driver) != 0) { + continue; + } + if (qdev_prop_parse(dev, prop->property, prop->value) != 0) { + abort(); + } + } +} diff --git a/hw/qdev.c b/hw/qdev.c index a53125d..cca242f 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -85,6 +85,7 @@ DeviceState *qdev_create(BusState *bus, const char *name) dev->parent_bus = bus; qdev_prop_set_defaults(dev, dev->info->props); qdev_prop_set_defaults(dev, dev->parent_bus->info->props); + qdev_prop_set_compat(dev); LIST_INSERT_HEAD(&bus->children, dev, sibling); return dev; } diff --git a/hw/qdev.h b/hw/qdev.h index 9ecc9ec..a8a4bcb 100644 --- a/hw/qdev.h +++ b/hw/qdev.h @@ -8,6 +8,8 @@ typedef struct Property Property; typedef struct PropertyInfo PropertyInfo; +typedef struct CompatProperty CompatProperty; + typedef struct DeviceInfo DeviceInfo; typedef struct BusState BusState; @@ -68,6 +70,12 @@ struct PropertyInfo { int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len); }; +struct CompatProperty { + const char *driver; + const char *property; + const char *value; +}; + /*** Board API. This should go away once we have a machine config file. ***/ DeviceState *qdev_create(BusState *bus, const char *name); @@ -147,4 +155,7 @@ void qdev_prop_set_uint32(DeviceState *dev, const char *name, uint32_t value); void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value); void qdev_prop_set_defaults(DeviceState *dev, Property *props); +void qdev_prop_register_compat(CompatProperty *props); +void qdev_prop_set_compat(DeviceState *dev); + #endif diff --git a/vl.c b/vl.c index 24173ef..f475693 100644 --- a/vl.c +++ b/vl.c @@ -5946,6 +5946,9 @@ int main(int argc, char **argv, char **envp) module_call_init(MODULE_INIT_DEVICE); + if (machine->compat_props) { + qdev_prop_register_compat(machine->compat_props); + } machine->init(ram_size, boot_devices, kernel_filename, kernel_cmdline, initrd_filename, cpu_model); -- cgit v1.1