Commit b6b611446077537b542c20804d3c850daff27845
Committed by
Anthony Liguori
1 parent
81ebb98b
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>
Showing
5 changed files
with
41 additions
and
0 deletions
hw/boards.h
... | ... | @@ -3,6 +3,8 @@ |
3 | 3 | #ifndef HW_BOARDS_H |
4 | 4 | #define HW_BOARDS_H |
5 | 5 | |
6 | +#include "qdev.h" | |
7 | + | |
6 | 8 | typedef void QEMUMachineInitFunc(ram_addr_t ram_size, |
7 | 9 | const char *boot_device, |
8 | 10 | const char *kernel_filename, |
... | ... | @@ -17,6 +19,7 @@ typedef struct QEMUMachine { |
17 | 19 | int use_scsi; |
18 | 20 | int max_cpus; |
19 | 21 | int is_default; |
22 | + CompatProperty *compat_props; | |
20 | 23 | struct QEMUMachine *next; |
21 | 24 | } QEMUMachine; |
22 | 25 | ... | ... |
hw/qdev-properties.c
... | ... | @@ -244,3 +244,26 @@ void qdev_prop_set_defaults(DeviceState *dev, Property *props) |
244 | 244 | } |
245 | 245 | } |
246 | 246 | |
247 | +static CompatProperty *compat_props; | |
248 | + | |
249 | +void qdev_prop_register_compat(CompatProperty *props) | |
250 | +{ | |
251 | + compat_props = props; | |
252 | +} | |
253 | + | |
254 | +void qdev_prop_set_compat(DeviceState *dev) | |
255 | +{ | |
256 | + CompatProperty *prop; | |
257 | + | |
258 | + if (!compat_props) { | |
259 | + return; | |
260 | + } | |
261 | + for (prop = compat_props; prop->driver != NULL; prop++) { | |
262 | + if (strcmp(dev->info->name, prop->driver) != 0) { | |
263 | + continue; | |
264 | + } | |
265 | + if (qdev_prop_parse(dev, prop->property, prop->value) != 0) { | |
266 | + abort(); | |
267 | + } | |
268 | + } | |
269 | +} | ... | ... |
hw/qdev.c
... | ... | @@ -85,6 +85,7 @@ DeviceState *qdev_create(BusState *bus, const char *name) |
85 | 85 | dev->parent_bus = bus; |
86 | 86 | qdev_prop_set_defaults(dev, dev->info->props); |
87 | 87 | qdev_prop_set_defaults(dev, dev->parent_bus->info->props); |
88 | + qdev_prop_set_compat(dev); | |
88 | 89 | LIST_INSERT_HEAD(&bus->children, dev, sibling); |
89 | 90 | return dev; |
90 | 91 | } | ... | ... |
hw/qdev.h
... | ... | @@ -8,6 +8,8 @@ typedef struct Property Property; |
8 | 8 | |
9 | 9 | typedef struct PropertyInfo PropertyInfo; |
10 | 10 | |
11 | +typedef struct CompatProperty CompatProperty; | |
12 | + | |
11 | 13 | typedef struct DeviceInfo DeviceInfo; |
12 | 14 | |
13 | 15 | typedef struct BusState BusState; |
... | ... | @@ -68,6 +70,12 @@ struct PropertyInfo { |
68 | 70 | int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len); |
69 | 71 | }; |
70 | 72 | |
73 | +struct CompatProperty { | |
74 | + const char *driver; | |
75 | + const char *property; | |
76 | + const char *value; | |
77 | +}; | |
78 | + | |
71 | 79 | /*** Board API. This should go away once we have a machine config file. ***/ |
72 | 80 | |
73 | 81 | 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); |
147 | 155 | void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value); |
148 | 156 | void qdev_prop_set_defaults(DeviceState *dev, Property *props); |
149 | 157 | |
158 | +void qdev_prop_register_compat(CompatProperty *props); | |
159 | +void qdev_prop_set_compat(DeviceState *dev); | |
160 | + | |
150 | 161 | #endif | ... | ... |
vl.c
... | ... | @@ -5946,6 +5946,9 @@ int main(int argc, char **argv, char **envp) |
5946 | 5946 | |
5947 | 5947 | module_call_init(MODULE_INIT_DEVICE); |
5948 | 5948 | |
5949 | + if (machine->compat_props) { | |
5950 | + qdev_prop_register_compat(machine->compat_props); | |
5951 | + } | |
5949 | 5952 | machine->init(ram_size, boot_devices, |
5950 | 5953 | kernel_filename, kernel_cmdline, initrd_filename, cpu_model); |
5951 | 5954 | ... | ... |