Il 07/10/2014 10:00, [email protected] ha scritto: > From: Gonglei <[email protected]> > > when we remove bootindex form qdev.property to qom.property, > we can use those functions set/get bootindex property for all > correlative devices. Meanwhile set the initial value of > bootindex to -1. > > Signed-off-by: Gonglei <[email protected]> > Reviewed-by: Gerd Hoffmann <[email protected]> > --- > bootdevice.c | 73 > +++++++++++++++++++++++++++++++++++++++++++++++++ > include/sysemu/sysemu.h | 3 ++ > 2 files changed, 76 insertions(+) > > diff --git a/bootdevice.c b/bootdevice.c > index a38479a..69cffd8 100644 > --- a/bootdevice.c > +++ b/bootdevice.c > @@ -23,6 +23,7 @@ > */ > > #include "sysemu/sysemu.h" > +#include "qapi/visitor.h" > > typedef struct FWBootEntry FWBootEntry; > > @@ -178,3 +179,75 @@ char *get_boot_devices_list(size_t *size, bool > ignore_suffixes) > } > return list; > } > + > +typedef struct { > + int32_t *bootindex; > + const char *suffix; > + DeviceState *dev; > +} BootIndexProperty; > + > +static void device_get_bootindex(Object *obj, Visitor *v, void *opaque, > + const char *name, Error **errp) > +{ > + BootIndexProperty *prop = opaque; > + visit_type_int32(v, prop->bootindex, name, errp); > +} > + > +static void device_set_bootindex(Object *obj, Visitor *v, void *opaque, > + const char *name, Error **errp) > +{ > + BootIndexProperty *prop = opaque; > + int32_t boot_index; > + Error *local_err = NULL; > + > + visit_type_int32(v, &boot_index, name, &local_err); > + if (local_err) { > + goto out; > + } > + /* check whether bootindex is present in fw_boot_order list */ > + check_boot_index(boot_index, &local_err); > + if (local_err) { > + goto out; > + } > + /* change bootindex to a new one */ > + *prop->bootindex = boot_index; > + > +out: > + if (local_err) { > + error_propagate(errp, local_err); > + } > +} > + > +static void property_release_bootindex(Object *obj, const char *name, > + void *opaque) > + > +{ > + BootIndexProperty *prop = opaque; > + g_free(prop); > +} > + > +void device_add_bootindex_property(Object *obj, int32_t *bootindex, > + const char *name, const char *suffix, > + DeviceState *dev, Error **errp) > +{ > + Error *local_err = NULL; > + BootIndexProperty *prop = g_malloc0(sizeof(*prop)); > + > + prop->bootindex = bootindex; > + prop->suffix = suffix; > + prop->dev = dev; > + > + object_property_add(obj, name, "int32", > + device_get_bootindex, > + device_set_bootindex, > + property_release_bootindex, > + prop, &local_err); > + > + if (local_err) { > + error_propagate(errp, local_err); > + g_free(prop); > + return; > + } > + /* initialize devices' bootindex property to -1 */ > + object_property_set_int(obj, -1, name, NULL); > +} > diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h > index b3489be..0037a69 100644 > --- a/include/sysemu/sysemu.h > +++ b/include/sysemu/sysemu.h > @@ -215,6 +215,9 @@ char *get_boot_devices_list(size_t *size, bool > ignore_suffixes); > DeviceState *get_boot_device(uint32_t position); > void check_boot_index(int32_t bootindex, Error **errp); > void del_boot_device_path(DeviceState *dev, const char *suffix); > +void device_add_bootindex_property(Object *obj, int32_t *bootindex, > + const char *name, const char *suffix, > + DeviceState *dev, Error **errp); > > QemuOpts *qemu_get_machine_opts(void); > >
Acked-by: Paolo Bonzini <[email protected]>
