Message ID | 20171124153656.30199-2-rkagan@virtuozzo.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Nov 24, 2017 at 4:36 PM, Roman Kagan <rkagan@virtuozzo.com> wrote: > UUIDs (GUIDs) are widely used in VMBus-related stuff, so a dedicated > property type becomes helpful. > > Signed-off-by: Roman Kagan <rkagan@virtuozzo.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> > --- > include/hw/qdev-properties.h | 3 +++ > hw/core/qdev-properties.c | 52 ++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 55 insertions(+) > > diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h > index e2321f1cc1..d4da7dd1f1 100644 > --- a/include/hw/qdev-properties.h > +++ b/include/hw/qdev-properties.h > @@ -30,6 +30,7 @@ extern const PropertyInfo qdev_prop_vlan; > extern const PropertyInfo qdev_prop_pci_devfn; > extern const PropertyInfo qdev_prop_blocksize; > extern const PropertyInfo qdev_prop_pci_host_devaddr; > +extern const PropertyInfo qdev_prop_uuid; > extern const PropertyInfo qdev_prop_arraylen; > extern const PropertyInfo qdev_prop_link; > > @@ -212,6 +213,8 @@ extern const PropertyInfo qdev_prop_link; > DEFINE_PROP(_n, _s, _f, qdev_prop_pci_host_devaddr, PCIHostDeviceAddress) > #define DEFINE_PROP_MEMORY_REGION(_n, _s, _f) \ > DEFINE_PROP(_n, _s, _f, qdev_prop_ptr, MemoryRegion *) > +#define DEFINE_PROP_UUID(_n, _s, _f) \ > + DEFINE_PROP(_n, _s, _f, qdev_prop_uuid, QemuUUID) > > #define DEFINE_PROP_END_OF_LIST() \ > {} > diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c > index 1dc80fcea2..49fea5a40a 100644 > --- a/hw/core/qdev-properties.c > +++ b/hw/core/qdev-properties.c > @@ -10,6 +10,7 @@ > #include "net/hub.h" > #include "qapi/visitor.h" > #include "chardev/char.h" > +#include "qemu/uuid.h" > > void qdev_prop_set_after_realize(DeviceState *dev, const char *name, > Error **errp) > @@ -883,6 +884,57 @@ const PropertyInfo qdev_prop_pci_host_devaddr = { > .set = set_pci_host_devaddr, > }; > > +/* --- UUID --- */ > + > +static void get_uuid(Object *obj, Visitor *v, const char *name, void *opaque, > + Error **errp) > +{ > + DeviceState *dev = DEVICE(obj); > + Property *prop = opaque; > + QemuUUID *uuid = qdev_get_prop_ptr(dev, prop); > + char buffer[UUID_FMT_LEN + 1]; > + char *p = buffer; > + > + qemu_uuid_unparse(uuid, buffer); > + > + visit_type_str(v, name, &p, errp); > +} > + > +static void set_uuid(Object *obj, Visitor *v, const char *name, void *opaque, > + Error **errp) > +{ > + DeviceState *dev = DEVICE(obj); > + Property *prop = opaque; > + QemuUUID *uuid = qdev_get_prop_ptr(dev, prop); > + Error *local_err = NULL; > + char *str; > + > + if (dev->realized) { > + qdev_prop_set_after_realize(dev, name, errp); > + return; > + } > + > + visit_type_str(v, name, &str, &local_err); > + if (local_err) { > + error_propagate(errp, local_err); > + return; > + } > + > + if (!strcmp(str, "auto")) { > + qemu_uuid_generate(uuid); > + } else if (qemu_uuid_parse(str, uuid) < 0) { > + error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str); > + } > + g_free(str); > +} > + > +const PropertyInfo qdev_prop_uuid = { > + .name = "str", > + .description = "UUID (aka GUID) or \"auto\" for random value", > + .get = get_uuid, > + .set = set_uuid, > +}; > + > /* --- support for array properties --- */ > > /* Used as an opaque for the object properties we add for each > -- > 2.14.3 > >
On 11/24/2017 09:36 AM, Roman Kagan wrote: > UUIDs (GUIDs) are widely used in VMBus-related stuff, so a dedicated > property type becomes helpful. > > Signed-off-by: Roman Kagan <rkagan@virtuozzo.com> > --- > include/hw/qdev-properties.h | 3 +++ > hw/core/qdev-properties.c | 52 ++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 55 insertions(+) > > diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h > index e2321f1cc1..d4da7dd1f1 100644 > --- a/include/hw/qdev-properties.h > +++ b/include/hw/qdev-properties.h > @@ -30,6 +30,7 @@ extern const PropertyInfo qdev_prop_vlan; > extern const PropertyInfo qdev_prop_pci_devfn; > extern const PropertyInfo qdev_prop_blocksize; > extern const PropertyInfo qdev_prop_pci_host_devaddr; > +extern const PropertyInfo qdev_prop_uuid; > extern const PropertyInfo qdev_prop_arraylen; > extern const PropertyInfo qdev_prop_link; > > @@ -212,6 +213,8 @@ extern const PropertyInfo qdev_prop_link; > DEFINE_PROP(_n, _s, _f, qdev_prop_pci_host_devaddr, PCIHostDeviceAddress) > #define DEFINE_PROP_MEMORY_REGION(_n, _s, _f) \ > DEFINE_PROP(_n, _s, _f, qdev_prop_ptr, MemoryRegion *) > +#define DEFINE_PROP_UUID(_n, _s, _f) \ > + DEFINE_PROP(_n, _s, _f, qdev_prop_uuid, QemuUUID) > > #define DEFINE_PROP_END_OF_LIST() \ > {} > diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c > index 1dc80fcea2..49fea5a40a 100644 > --- a/hw/core/qdev-properties.c > +++ b/hw/core/qdev-properties.c > @@ -10,6 +10,7 @@ > #include "net/hub.h" > #include "qapi/visitor.h" > #include "chardev/char.h" > +#include "qemu/uuid.h" > > void qdev_prop_set_after_realize(DeviceState *dev, const char *name, > Error **errp) > @@ -883,6 +884,57 @@ const PropertyInfo qdev_prop_pci_host_devaddr = { > .set = set_pci_host_devaddr, > }; > > +/* --- UUID --- */ > + > +static void get_uuid(Object *obj, Visitor *v, const char *name, void *opaque, > + Error **errp) > +{ > + DeviceState *dev = DEVICE(obj); > + Property *prop = opaque; > + QemuUUID *uuid = qdev_get_prop_ptr(dev, prop); > + char buffer[UUID_FMT_LEN + 1]; > + char *p = buffer; > + > + qemu_uuid_unparse(uuid, buffer); > + > + visit_type_str(v, name, &p, errp); > +} > + > +static void set_uuid(Object *obj, Visitor *v, const char *name, void *opaque, > + Error **errp) > +{ > + DeviceState *dev = DEVICE(obj); > + Property *prop = opaque; > + QemuUUID *uuid = qdev_get_prop_ptr(dev, prop); > + Error *local_err = NULL; > + char *str; > + > + if (dev->realized) { > + qdev_prop_set_after_realize(dev, name, errp); > + return; > + } > + > + visit_type_str(v, name, &str, &local_err); > + if (local_err) { > + error_propagate(errp, local_err); > + return; > + } > + > + if (!strcmp(str, "auto")) { > + qemu_uuid_generate(uuid); > + } else if (qemu_uuid_parse(str, uuid) < 0) { > + error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str); > + } > + g_free(str); > +} > + > +const PropertyInfo qdev_prop_uuid = { > + .name = "str", > + .description = "UUID (aka GUID) or \"auto\" for random value", > + .get = get_uuid, > + .set = set_uuid, There is a UUID value you can use as a default in vl.c, named qemu_uuid. Just in case you want to set a default value here. -corey > +}; > + > /* --- support for array properties --- */ > > /* Used as an opaque for the object properties we add for each
> On Nov 24, 2017, at 7:36 AM, Roman Kagan <rkagan@virtuozzo.com> wrote: > > UUIDs (GUIDs) are widely used in VMBus-related stuff, so a dedicated > property type becomes helpful. > > Signed-off-by: Roman Kagan <rkagan@virtuozzo.com> Reviewed-by: Ben Warren <ben@skyportsystems.com> > --- > include/hw/qdev-properties.h | 3 +++ > hw/core/qdev-properties.c | 52 ++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 55 insertions(+) > > diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h > index e2321f1cc1..d4da7dd1f1 100644 > --- a/include/hw/qdev-properties.h > +++ b/include/hw/qdev-properties.h > @@ -30,6 +30,7 @@ extern const PropertyInfo qdev_prop_vlan; > extern const PropertyInfo qdev_prop_pci_devfn; > extern const PropertyInfo qdev_prop_blocksize; > extern const PropertyInfo qdev_prop_pci_host_devaddr; > +extern const PropertyInfo qdev_prop_uuid; > extern const PropertyInfo qdev_prop_arraylen; > extern const PropertyInfo qdev_prop_link; > > @@ -212,6 +213,8 @@ extern const PropertyInfo qdev_prop_link; > DEFINE_PROP(_n, _s, _f, qdev_prop_pci_host_devaddr, PCIHostDeviceAddress) > #define DEFINE_PROP_MEMORY_REGION(_n, _s, _f) \ > DEFINE_PROP(_n, _s, _f, qdev_prop_ptr, MemoryRegion *) > +#define DEFINE_PROP_UUID(_n, _s, _f) \ > + DEFINE_PROP(_n, _s, _f, qdev_prop_uuid, QemuUUID) > > #define DEFINE_PROP_END_OF_LIST() \ > {} > diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c > index 1dc80fcea2..49fea5a40a 100644 > --- a/hw/core/qdev-properties.c > +++ b/hw/core/qdev-properties.c > @@ -10,6 +10,7 @@ > #include "net/hub.h" > #include "qapi/visitor.h" > #include "chardev/char.h" > +#include "qemu/uuid.h" > > void qdev_prop_set_after_realize(DeviceState *dev, const char *name, > Error **errp) > @@ -883,6 +884,57 @@ const PropertyInfo qdev_prop_pci_host_devaddr = { > .set = set_pci_host_devaddr, > }; > > +/* --- UUID --- */ > + > +static void get_uuid(Object *obj, Visitor *v, const char *name, void *opaque, > + Error **errp) > +{ > + DeviceState *dev = DEVICE(obj); > + Property *prop = opaque; > + QemuUUID *uuid = qdev_get_prop_ptr(dev, prop); > + char buffer[UUID_FMT_LEN + 1]; > + char *p = buffer; > + > + qemu_uuid_unparse(uuid, buffer); > + > + visit_type_str(v, name, &p, errp); > +} > + > +static void set_uuid(Object *obj, Visitor *v, const char *name, void *opaque, > + Error **errp) > +{ > + DeviceState *dev = DEVICE(obj); > + Property *prop = opaque; > + QemuUUID *uuid = qdev_get_prop_ptr(dev, prop); > + Error *local_err = NULL; > + char *str; > + > + if (dev->realized) { > + qdev_prop_set_after_realize(dev, name, errp); > + return; > + } > + > + visit_type_str(v, name, &str, &local_err); > + if (local_err) { > + error_propagate(errp, local_err); > + return; > + } > + > + if (!strcmp(str, "auto")) { > + qemu_uuid_generate(uuid); > + } else if (qemu_uuid_parse(str, uuid) < 0) { > + error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str); > + } > + g_free(str); > +} > + > +const PropertyInfo qdev_prop_uuid = { > + .name = "str", > + .description = "UUID (aka GUID) or \"auto\" for random value", > + .get = get_uuid, > + .set = set_uuid, > +}; > + > /* --- support for array properties --- */ > > /* Used as an opaque for the object properties we add for each > -- > 2.14.3 >
On Fri, Nov 24, 2017 at 08:36:53PM -0600, Corey Minyard wrote: > On 11/24/2017 09:36 AM, Roman Kagan wrote: > > UUIDs (GUIDs) are widely used in VMBus-related stuff, so a dedicated > > property type becomes helpful. > > > > Signed-off-by: Roman Kagan <rkagan@virtuozzo.com> > > --- > > include/hw/qdev-properties.h | 3 +++ > > hw/core/qdev-properties.c | 52 ++++++++++++++++++++++++++++++++++++++++++++ > > 2 files changed, 55 insertions(+) > > > > diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h > > index e2321f1cc1..d4da7dd1f1 100644 > > --- a/include/hw/qdev-properties.h > > +++ b/include/hw/qdev-properties.h > > @@ -30,6 +30,7 @@ extern const PropertyInfo qdev_prop_vlan; > > extern const PropertyInfo qdev_prop_pci_devfn; > > extern const PropertyInfo qdev_prop_blocksize; > > extern const PropertyInfo qdev_prop_pci_host_devaddr; > > +extern const PropertyInfo qdev_prop_uuid; > > extern const PropertyInfo qdev_prop_arraylen; > > extern const PropertyInfo qdev_prop_link; > > @@ -212,6 +213,8 @@ extern const PropertyInfo qdev_prop_link; > > DEFINE_PROP(_n, _s, _f, qdev_prop_pci_host_devaddr, PCIHostDeviceAddress) > > #define DEFINE_PROP_MEMORY_REGION(_n, _s, _f) \ > > DEFINE_PROP(_n, _s, _f, qdev_prop_ptr, MemoryRegion *) > > +#define DEFINE_PROP_UUID(_n, _s, _f) \ > > + DEFINE_PROP(_n, _s, _f, qdev_prop_uuid, QemuUUID) > > #define DEFINE_PROP_END_OF_LIST() \ > > {} > > diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c > > index 1dc80fcea2..49fea5a40a 100644 > > --- a/hw/core/qdev-properties.c > > +++ b/hw/core/qdev-properties.c > > @@ -10,6 +10,7 @@ > > #include "net/hub.h" > > #include "qapi/visitor.h" > > #include "chardev/char.h" > > +#include "qemu/uuid.h" > > void qdev_prop_set_after_realize(DeviceState *dev, const char *name, > > Error **errp) > > @@ -883,6 +884,57 @@ const PropertyInfo qdev_prop_pci_host_devaddr = { > > .set = set_pci_host_devaddr, > > }; > > +/* --- UUID --- */ > > + > > +static void get_uuid(Object *obj, Visitor *v, const char *name, void *opaque, > > + Error **errp) > > +{ > > + DeviceState *dev = DEVICE(obj); > > + Property *prop = opaque; > > + QemuUUID *uuid = qdev_get_prop_ptr(dev, prop); > > + char buffer[UUID_FMT_LEN + 1]; > > + char *p = buffer; > > + > > + qemu_uuid_unparse(uuid, buffer); > > + > > + visit_type_str(v, name, &p, errp); > > +} > > + > > +static void set_uuid(Object *obj, Visitor *v, const char *name, void *opaque, > > + Error **errp) > > +{ > > + DeviceState *dev = DEVICE(obj); > > + Property *prop = opaque; > > + QemuUUID *uuid = qdev_get_prop_ptr(dev, prop); > > + Error *local_err = NULL; > > + char *str; > > + > > + if (dev->realized) { > > + qdev_prop_set_after_realize(dev, name, errp); > > + return; > > + } > > + > > + visit_type_str(v, name, &str, &local_err); > > + if (local_err) { > > + error_propagate(errp, local_err); > > + return; > > + } > > + > > + if (!strcmp(str, "auto")) { > > + qemu_uuid_generate(uuid); > > + } else if (qemu_uuid_parse(str, uuid) < 0) { > > + error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str); > > + } > > + g_free(str); > > +} > > + > > +const PropertyInfo qdev_prop_uuid = { > > + .name = "str", > > + .description = "UUID (aka GUID) or \"auto\" for random value", > > + .get = get_uuid, > > + .set = set_uuid, > > There is a UUID value you can use as a default in vl.c, named qemu_uuid. > Just in case you want to set a default value here. I'm not sure what a common non-null default for all uuid properties would mean... IMO most of the time it makes sense to default to "auto". I'll have a look if I can do it within this patch. Thanks, Roman.
On Fri, Nov 24, 2017 at 08:36:53PM -0600, Corey Minyard wrote: > On 11/24/2017 09:36 AM, Roman Kagan wrote: > > UUIDs (GUIDs) are widely used in VMBus-related stuff, so a dedicated > > property type becomes helpful. > > > > Signed-off-by: Roman Kagan <rkagan@virtuozzo.com> > > --- > > include/hw/qdev-properties.h | 3 +++ > > hw/core/qdev-properties.c | 52 ++++++++++++++++++++++++++++++++++++++++++++ > > 2 files changed, 55 insertions(+) > > > > diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h > > index e2321f1cc1..d4da7dd1f1 100644 > > --- a/include/hw/qdev-properties.h > > +++ b/include/hw/qdev-properties.h > > @@ -30,6 +30,7 @@ extern const PropertyInfo qdev_prop_vlan; > > extern const PropertyInfo qdev_prop_pci_devfn; > > extern const PropertyInfo qdev_prop_blocksize; > > extern const PropertyInfo qdev_prop_pci_host_devaddr; > > +extern const PropertyInfo qdev_prop_uuid; > > extern const PropertyInfo qdev_prop_arraylen; > > extern const PropertyInfo qdev_prop_link; > > @@ -212,6 +213,8 @@ extern const PropertyInfo qdev_prop_link; > > DEFINE_PROP(_n, _s, _f, qdev_prop_pci_host_devaddr, PCIHostDeviceAddress) > > #define DEFINE_PROP_MEMORY_REGION(_n, _s, _f) \ > > DEFINE_PROP(_n, _s, _f, qdev_prop_ptr, MemoryRegion *) > > +#define DEFINE_PROP_UUID(_n, _s, _f) \ > > + DEFINE_PROP(_n, _s, _f, qdev_prop_uuid, QemuUUID) > > #define DEFINE_PROP_END_OF_LIST() \ > > {} > > diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c > > index 1dc80fcea2..49fea5a40a 100644 > > --- a/hw/core/qdev-properties.c > > +++ b/hw/core/qdev-properties.c > > @@ -10,6 +10,7 @@ > > #include "net/hub.h" > > #include "qapi/visitor.h" > > #include "chardev/char.h" > > +#include "qemu/uuid.h" > > void qdev_prop_set_after_realize(DeviceState *dev, const char *name, > > Error **errp) > > @@ -883,6 +884,57 @@ const PropertyInfo qdev_prop_pci_host_devaddr = { > > .set = set_pci_host_devaddr, > > }; > > +/* --- UUID --- */ > > + > > +static void get_uuid(Object *obj, Visitor *v, const char *name, void *opaque, > > + Error **errp) > > +{ > > + DeviceState *dev = DEVICE(obj); > > + Property *prop = opaque; > > + QemuUUID *uuid = qdev_get_prop_ptr(dev, prop); > > + char buffer[UUID_FMT_LEN + 1]; > > + char *p = buffer; > > + > > + qemu_uuid_unparse(uuid, buffer); > > + > > + visit_type_str(v, name, &p, errp); > > +} > > + > > +static void set_uuid(Object *obj, Visitor *v, const char *name, void *opaque, > > + Error **errp) > > +{ > > + DeviceState *dev = DEVICE(obj); > > + Property *prop = opaque; > > + QemuUUID *uuid = qdev_get_prop_ptr(dev, prop); > > + Error *local_err = NULL; > > + char *str; > > + > > + if (dev->realized) { > > + qdev_prop_set_after_realize(dev, name, errp); > > + return; > > + } > > + > > + visit_type_str(v, name, &str, &local_err); > > + if (local_err) { > > + error_propagate(errp, local_err); > > + return; > > + } > > + > > + if (!strcmp(str, "auto")) { > > + qemu_uuid_generate(uuid); > > + } else if (qemu_uuid_parse(str, uuid) < 0) { > > + error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str); > > + } > > + g_free(str); > > +} > > + > > +const PropertyInfo qdev_prop_uuid = { > > + .name = "str", > > + .description = "UUID (aka GUID) or \"auto\" for random value", > > + .get = get_uuid, > > + .set = set_uuid, > > There is a UUID value you can use as a default in vl.c, named qemu_uuid. > Just in case you want to set a default value here. I don't think that would be a good idea. If this UUID property is used in a device type and the default were used, then every instance of the device would use the same UUID, at which point it is a non-unique ID. Much better to ue a random UUID, unless you know there is guaranteed to only ever be one instance of the device type. Regards, Daniel
On 11/27/2017 04:06 AM, Roman Kagan wrote: > On Fri, Nov 24, 2017 at 08:36:53PM -0600, Corey Minyard wrote: >> On 11/24/2017 09:36 AM, Roman Kagan wrote: snip >>> + >>> +const PropertyInfo qdev_prop_uuid = { >>> + .name = "str", >>> + .description = "UUID (aka GUID) or \"auto\" for random value", >>> + .get = get_uuid, >>> + .set = set_uuid, >> There is a UUID value you can use as a default in vl.c, named qemu_uuid. >> Just in case you want to set a default value here. > I'm not sure what a common non-null default for all uuid properties > would mean... It depends on what the uuid is for. If you are trying to uniquely identify devices to QEMU or the OS, then it make no sense. If you are trying to identify qemu or what is running in it to outside entities, then it might make sense. I didn't know the purpose of this uuid, so I thought I would suggest. -corey > IMO most of the time it makes sense to default to "auto". I'll have a > look if I can do it within this patch. > > Thanks, > Roman. >
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h index e2321f1cc1..d4da7dd1f1 100644 --- a/include/hw/qdev-properties.h +++ b/include/hw/qdev-properties.h @@ -30,6 +30,7 @@ extern const PropertyInfo qdev_prop_vlan; extern const PropertyInfo qdev_prop_pci_devfn; extern const PropertyInfo qdev_prop_blocksize; extern const PropertyInfo qdev_prop_pci_host_devaddr; +extern const PropertyInfo qdev_prop_uuid; extern const PropertyInfo qdev_prop_arraylen; extern const PropertyInfo qdev_prop_link; @@ -212,6 +213,8 @@ extern const PropertyInfo qdev_prop_link; DEFINE_PROP(_n, _s, _f, qdev_prop_pci_host_devaddr, PCIHostDeviceAddress) #define DEFINE_PROP_MEMORY_REGION(_n, _s, _f) \ DEFINE_PROP(_n, _s, _f, qdev_prop_ptr, MemoryRegion *) +#define DEFINE_PROP_UUID(_n, _s, _f) \ + DEFINE_PROP(_n, _s, _f, qdev_prop_uuid, QemuUUID) #define DEFINE_PROP_END_OF_LIST() \ {} diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c index 1dc80fcea2..49fea5a40a 100644 --- a/hw/core/qdev-properties.c +++ b/hw/core/qdev-properties.c @@ -10,6 +10,7 @@ #include "net/hub.h" #include "qapi/visitor.h" #include "chardev/char.h" +#include "qemu/uuid.h" void qdev_prop_set_after_realize(DeviceState *dev, const char *name, Error **errp) @@ -883,6 +884,57 @@ const PropertyInfo qdev_prop_pci_host_devaddr = { .set = set_pci_host_devaddr, }; +/* --- UUID --- */ + +static void get_uuid(Object *obj, Visitor *v, const char *name, void *opaque, + Error **errp) +{ + DeviceState *dev = DEVICE(obj); + Property *prop = opaque; + QemuUUID *uuid = qdev_get_prop_ptr(dev, prop); + char buffer[UUID_FMT_LEN + 1]; + char *p = buffer; + + qemu_uuid_unparse(uuid, buffer); + + visit_type_str(v, name, &p, errp); +} + +static void set_uuid(Object *obj, Visitor *v, const char *name, void *opaque, + Error **errp) +{ + DeviceState *dev = DEVICE(obj); + Property *prop = opaque; + QemuUUID *uuid = qdev_get_prop_ptr(dev, prop); + Error *local_err = NULL; + char *str; + + if (dev->realized) { + qdev_prop_set_after_realize(dev, name, errp); + return; + } + + visit_type_str(v, name, &str, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + if (!strcmp(str, "auto")) { + qemu_uuid_generate(uuid); + } else if (qemu_uuid_parse(str, uuid) < 0) { + error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str); + } + g_free(str); +} + +const PropertyInfo qdev_prop_uuid = { + .name = "str", + .description = "UUID (aka GUID) or \"auto\" for random value", + .get = get_uuid, + .set = set_uuid, +}; + /* --- support for array properties --- */ /* Used as an opaque for the object properties we add for each
UUIDs (GUIDs) are widely used in VMBus-related stuff, so a dedicated property type becomes helpful. Signed-off-by: Roman Kagan <rkagan@virtuozzo.com> --- include/hw/qdev-properties.h | 3 +++ hw/core/qdev-properties.c | 52 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+)