From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:38246) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TPHlh-0007pG-Ge for qemu-devel@nongnu.org; Fri, 19 Oct 2012 14:58:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TPHlf-0003wg-Uf for qemu-devel@nongnu.org; Fri, 19 Oct 2012 14:58:01 -0400 Received: from mail-ob0-f173.google.com ([209.85.214.173]:44915) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TPHlf-0003wT-KD for qemu-devel@nongnu.org; Fri, 19 Oct 2012 14:57:59 -0400 Received: by mail-ob0-f173.google.com with SMTP id wc18so707083obb.4 for ; Fri, 19 Oct 2012 11:57:59 -0700 (PDT) Sender: fluxion Date: Fri, 19 Oct 2012 13:57:51 -0500 From: Michael Roth Message-ID: <20121019185751.GZ16157@illuin> References: <1247658216-511-1-git-send-email-kraxel@redhat.com> <1247658216-511-2-git-send-email-kraxel@redhat.com> <20121017201414.GA5665@otherpad.lan.raisama.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: Subject: Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Blue Swirl Cc: "Michael S. Tsirkin" , Jan Kiszka , qemu-devel@nongnu.org, dunrong huang , Stefan Weil , Zhi Yong Wu , Donald Dutile , Gerd Hoffmann , Stefan Hajnoczi , Juan Quintela , Markus Armbruster , Isaku Yamahata , Anthony PERARD , Kusanagi Kouichi , Eduardo Habkost , Stefan Weil , Anthony Liguori , Jan Kiszka , Christian Borntraeger , Kevin Wolf , David 'Digit' Turner , Christoph Egger , Amit Shah , Paolo Bonzini On Fri, Oct 19, 2012 at 05:18:46PM +0000, Blue Swirl wrote: > On Wed, Oct 17, 2012 at 8:14 PM, Eduardo Habkost 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. > Same goes for me (c08fb2ac) > > > > > > > >> +#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 >