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 <kraxel@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
Gerd Hoffmann 2009-07-15 13:48:21 +02:00 committed by Anthony Liguori
parent 81ebb98b24
commit b6b6114460
5 changed files with 41 additions and 0 deletions

View File

@ -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;

View File

@ -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();
}
}
}

View File

@ -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;
}

View File

@ -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

3
vl.c
View File

@ -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);