[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties.
From: |
Blue Swirl |
Subject: |
Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties. |
Date: |
Fri, 19 Oct 2012 17:18:46 +0000 |
On Wed, Oct 17, 2012 at 8:14 PM, Eduardo Habkost <address@hidden> wrote:
> On Wed, Jul 15, 2009 at 01:43:31PM +0200, Gerd Hoffmann wrote:
> [...]
>> diff --git a/hw/qdev-properties.c b/hw/qdev-properties.c
>> new file mode 100644
>> index 0000000..8b0d0ff
>> --- /dev/null
>> +++ b/hw/qdev-properties.c
>> @@ -0,0 +1,246 @@
>
> Gerd, could you clarify what's the copyright/license of this file? (I
> mean, at least the copyright/license of the initial version of the file
> you wrote, below).
>
> I am CCing all other authors that touched the file (according to git
> logs), so they can clarify what's the license they assumed for the file
> and their contributions.
I can't remember what I assumed, but I'm fine with GPLv2+.
Furthermore, in my opinion, my changes were either trivial
(446333cd5b5c985f6517dee7004e542ecacd21c,
73538c31a8f2d5aba3d82d8e60dadcb40d59061b,
bc19fcaa1b6d2a89b96793c7e8890978fc477f51) or copied heavily from other
existing code (5a053d1f2e75e6a87c483bb3ff5cc6cdf29e1569) so I think
that my consent should not be required in case Gerd and others want to
relicense in the future.
>
>
>
>> +#include "qdev.h"
>> +
>> +void *qdev_get_prop_ptr(DeviceState *dev, Property *prop)
>> +{
>> + void *ptr = dev;
>> + ptr += prop->offset;
>> + return ptr;
>> +}
>> +
>> +/* --- 16bit integer --- */
>> +
>> +static int parse_uint16(DeviceState *dev, Property *prop, const char *str)
>> +{
>> + uint16_t *ptr = qdev_get_prop_ptr(dev, prop);
>> + const char *fmt;
>> +
>> + /* accept both hex and decimal */
>> + fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx16 : "%" PRIu16;
>> + if (sscanf(str, fmt, ptr) != 1)
>> + return -1;
>> + return 0;
>> +}
>> +
>> +static int print_uint16(DeviceState *dev, Property *prop, char *dest,
>> size_t len)
>> +{
>> + uint16_t *ptr = qdev_get_prop_ptr(dev, prop);
>> + return snprintf(dest, len, "%" PRIu16, *ptr);
>> +}
>> +
>> +PropertyInfo qdev_prop_uint16 = {
>> + .name = "uint16",
>> + .type = PROP_TYPE_UINT16,
>> + .size = sizeof(uint16_t),
>> + .parse = parse_uint16,
>> + .print = print_uint16,
>> +};
>> +
>> +/* --- 32bit integer --- */
>> +
>> +static int parse_uint32(DeviceState *dev, Property *prop, const char *str)
>> +{
>> + uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
>> + const char *fmt;
>> +
>> + /* accept both hex and decimal */
>> + fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx32 : "%" PRIu32;
>> + if (sscanf(str, fmt, ptr) != 1)
>> + return -1;
>> + return 0;
>> +}
>> +
>> +static int print_uint32(DeviceState *dev, Property *prop, char *dest,
>> size_t len)
>> +{
>> + uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
>> + return snprintf(dest, len, "%" PRIu32, *ptr);
>> +}
>> +
>> +PropertyInfo qdev_prop_uint32 = {
>> + .name = "uint32",
>> + .type = PROP_TYPE_UINT32,
>> + .size = sizeof(uint32_t),
>> + .parse = parse_uint32,
>> + .print = print_uint32,
>> +};
>> +
>> +/* --- 32bit hex value --- */
>> +
>> +static int parse_hex32(DeviceState *dev, Property *prop, const char *str)
>> +{
>> + uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
>> +
>> + if (sscanf(str, "%" PRIx32, ptr) != 1)
>> + return -1;
>> + return 0;
>> +}
>> +
>> +static int print_hex32(DeviceState *dev, Property *prop, char *dest, size_t
>> len)
>> +{
>> + uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
>> + return snprintf(dest, len, "0x%" PRIx32, *ptr);
>> +}
>> +
>> +PropertyInfo qdev_prop_hex32 = {
>> + .name = "hex32",
>> + .type = PROP_TYPE_UINT32,
>> + .size = sizeof(uint32_t),
>> + .parse = parse_hex32,
>> + .print = print_hex32,
>> +};
>> +
>> +/* --- pointer --- */
>> +
>> +static int print_ptr(DeviceState *dev, Property *prop, char *dest, size_t
>> len)
>> +{
>> + void **ptr = qdev_get_prop_ptr(dev, prop);
>> + return snprintf(dest, len, "<%p>", *ptr);
>> +}
>> +
>> +PropertyInfo qdev_prop_ptr = {
>> + .name = "ptr",
>> + .type = PROP_TYPE_PTR,
>> + .size = sizeof(void*),
>> + .print = print_ptr,
>> +};
>> +
>> +/* --- mac address --- */
>> +
>> +/*
>> + * accepted syntax versions:
>> + * 01:02:03:04:05:06
>> + * 01-02-03-04-05-06
>> + */
>> +static int parse_mac(DeviceState *dev, Property *prop, const char *str)
>> +{
>> + uint8_t *mac = qdev_get_prop_ptr(dev, prop);
>> + int i, pos;
>> + char *p;
>> +
>> + for (i = 0, pos = 0; i < 6; i++, pos += 3) {
>> + if (!isxdigit(str[pos]))
>> + return -1;
>> + if (!isxdigit(str[pos+1]))
>> + return -1;
>> + if (i == 5 && str[pos+2] != '\0')
>> + return -1;
>> + if (str[pos+2] != ':' && str[pos+2] != '-')
>> + return -1;
>> + mac[i] = strtol(str+pos, &p, 16);
>> + }
>> + return 0;
>> +}
>> +
>> +static int print_mac(DeviceState *dev, Property *prop, char *dest, size_t
>> len)
>> +{
>> + uint8_t *mac = qdev_get_prop_ptr(dev, prop);
>> + return snprintf(dest, len, "%02x:%02x:%02x:%02x:%02x:%02x",
>> + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
>> +}
>> +
>> +PropertyInfo qdev_prop_macaddr = {
>> + .name = "mac-addr",
>> + .type = PROP_TYPE_MACADDR,
>> + .size = 6,
>> + .parse = parse_mac,
>> + .print = print_mac,
>> +};
>> +
>> +/* --- public helpers --- */
>> +
>> +static Property *qdev_prop_walk(Property *props, const char *name)
>> +{
>> + if (!props)
>> + return NULL;
>> + while (props->name) {
>> + if (strcmp(props->name, name) == 0)
>> + return props;
>> + props++;
>> + }
>> + return NULL;
>> +}
>> +
>> +static Property *qdev_prop_find(DeviceState *dev, const char *name)
>> +{
>> + Property *prop;
>> +
>> + /* device properties */
>> + prop = qdev_prop_walk(dev->info->props, name);
>> + if (prop)
>> + return prop;
>> +
>> + /* bus properties */
>> + prop = qdev_prop_walk(dev->parent_bus->info->props, name);
>> + if (prop)
>> + return prop;
>> +
>> + return NULL;
>> +}
>> +
>> +int qdev_prop_parse(DeviceState *dev, const char *name, const char *value)
>> +{
>> + Property *prop;
>> +
>> + prop = qdev_prop_find(dev, name);
>> + if (!prop) {
>> + fprintf(stderr, "property \"%s.%s\" not found\n",
>> + dev->info->name, name);
>> + return -1;
>> + }
>> + if (!prop->info->parse) {
>> + fprintf(stderr, "property \"%s.%s\" has no parser\n",
>> + dev->info->name, name);
>> + return -1;
>> + }
>> + return prop->info->parse(dev, prop, value);
>> +}
>> +
>> +void qdev_prop_set(DeviceState *dev, const char *name, void *src, enum
>> PropertyType type)
>> +{
>> + Property *prop;
>> + void *dst;
>> +
>> + prop = qdev_prop_find(dev, name);
>> + if (!prop) {
>> + fprintf(stderr, "%s: property \"%s.%s\" not found\n",
>> + __FUNCTION__, dev->info->name, name);
>> + abort();
>> + }
>> + if (prop->info->type != type) {
>> + fprintf(stderr, "%s: property \"%s.%s\" type mismatch\n",
>> + __FUNCTION__, dev->info->name, name);
>> + abort();
>> + }
>> + dst = qdev_get_prop_ptr(dev, prop);
>> + memcpy(dst, src, prop->info->size);
>> +}
>> +
>> +void qdev_prop_set_uint16(DeviceState *dev, const char *name, uint16_t
>> value)
>> +{
>> + qdev_prop_set(dev, name, &value, PROP_TYPE_UINT16);
>> +}
>> +
>> +void qdev_prop_set_uint32(DeviceState *dev, const char *name, uint32_t
>> value)
>> +{
>> + qdev_prop_set(dev, name, &value, PROP_TYPE_UINT32);
>> +}
>> +
>> +void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value)
>> +{
>> + qdev_prop_set(dev, name, &value, PROP_TYPE_PTR);
>> +}
>> +
>> +void qdev_prop_set_defaults(DeviceState *dev, Property *props)
>> +{
>> + char *dst;
>> +
>> + if (!props)
>> + return;
>> + while (props->name) {
>> + if (props->defval) {
>> + dst = qdev_get_prop_ptr(dev, props);
>> + memcpy(dst, props->defval, props->info->size);
>> + }
>> + props++;
>> + }
>> +}
>> +
>
> --
> Eduardo
- Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties., Eduardo Habkost, 2012/10/17
- Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties., Stefan Weil, 2012/10/17
- Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties., Gerd Hoffmann, 2012/10/18
- Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties., Christian Borntraeger, 2012/10/18
- Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties., Jan Kiszka, 2012/10/18
- Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties., Markus Armbruster, 2012/10/19
- Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties., Michael S. Tsirkin, 2012/10/19
- Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties.,
Blue Swirl <=
- Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties., Amit Shah, 2012/10/22
- Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties., Isaku Yamahata, 2012/10/22