All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/6] qdev patches: properties, id=<tag>, more device info
@ 2009-07-15 11:43 Gerd Hoffmann
  2009-07-15 11:43 ` [Qemu-devel] [PATCH 1/6] qdev: rework device properties Gerd Hoffmann
                   ` (5 more replies)
  0 siblings, 6 replies; 21+ messages in thread
From: Gerd Hoffmann @ 2009-07-15 11:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gerd Hoffmann

  Hi,

qdev properties patch series again, rebased and updated according to
Pauls review comments.  Replaces the qdev patches in anthonys queue.

What is in there?

First the qdev property rework.  Quite big one, but as it puts the way
properties work upside down it can hardly be split into smaller pieces.
Since I posted it last time it got a bit larger due to some sparc
devices being converted to qdev by BlueSwirl.  The qdev_prop_set_*
functions got typechecking support.  They will also abort on failure.

The other patches are building on top of the properties.  They are a
bunch of little, self-contained and friendly patches.  They bring:

 * Support for attaching user-specified ids to devices (not fixed length
   any more).
 * Add more info to DeviceInfo (alias, description).

The -device switch support has been removed due to concepts still being
debated.  These patches will be posted as separate patch series.  So
this patch series should be finally ready for merge.

cheers,
  Gerd

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH 1/6] qdev: rework device properties.
  2009-07-15 11:43 [Qemu-devel] [PATCH 0/6] qdev patches: properties, id=<tag>, more device info Gerd Hoffmann
@ 2009-07-15 11:43 ` Gerd Hoffmann
  2012-10-17 20:14   ` Eduardo Habkost
  2009-07-15 11:43 ` [Qemu-devel] [PATCH 2/6] qdev: factor out driver search to qdev_find_info() Gerd Hoffmann
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 21+ messages in thread
From: Gerd Hoffmann @ 2009-07-15 11:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gerd Hoffmann

This patch is a major overhaul of the device properties.  The properties
are saved directly in the device state struct now, the linked list of
property values is gone.

Advantages:
  * We don't have to maintain the list with the property values.
  * The value in the property list and the value actually used by
    the device can't go out of sync any more (used to happen for
    the pci.devfn == -1 case) because there is only one place where
    the value is stored.
  * A record describing the property is required now, you can't set
    random properties any more.

There are bus-specific and device-specific properties.  The former
should be used for properties common to all bus drivers.  Typical
use case is bus addressing, i.e. pci.devfn and i2c.address.

Properties have a PropertyInfo struct attached with name, size and
function pointers to parse and print properties.  A few common property
types have PropertyInfos defined in qdev-properties.c.  Drivers are free
to implement their own very special property parsers if needed.

Properties can have default values.  If unset they are zero-filled.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 Makefile              |    2 +-
 Makefile.hw           |    2 +-
 hw/arm_sysctl.c       |   20 +++-
 hw/armv7m.c           |   22 ++++-
 hw/axis_dev88.c       |    2 +-
 hw/eccmemctl.c        |   21 ++++-
 hw/esp.c              |   14 +--
 hw/etraxfs.c          |    2 +-
 hw/etraxfs_pic.c      |   18 +++-
 hw/i2c.c              |   11 ++-
 hw/i2c.h              |    2 +-
 hw/integratorcp.c     |   30 ++++--
 hw/m48t59.c           |   39 ++++++--
 hw/mips_malta.c       |    4 +-
 hw/musicpal.c         |    2 +-
 hw/pc.c               |    4 +-
 hw/pci.c              |   17 +++-
 hw/pcnet.c            |   19 +++-
 hw/qdev-addr.c        |   32 +++++++
 hw/qdev-addr.h        |    2 +
 hw/qdev-properties.c  |  246 +++++++++++++++++++++++++++++++++++++++++++++++++
 hw/qdev.c             |  141 ++++------------------------
 hw/qdev.h             |   73 ++++++++++-----
 hw/slavio_misc.c      |    6 -
 hw/smbus_eeprom.c     |   10 ++-
 hw/smc91c111.c        |    2 +-
 hw/stellaris.c        |    2 +-
 hw/sun4m.c            |    6 +-
 hw/syborg.c           |    4 +-
 hw/syborg_fb.c        |   45 ++++++----
 hw/syborg_interrupt.c |   21 ++++-
 hw/syborg_keyboard.c  |   21 ++++-
 hw/syborg_pointer.c   |   29 +++++-
 hw/syborg_serial.c    |   21 ++++-
 hw/syborg_timer.c     |   11 ++-
 hw/tcx.c              |   65 ++++++++++----
 hw/xilinx.h           |   12 +-
 hw/xilinx_ethlite.c   |   29 +++++-
 hw/xilinx_intc.c      |   18 +++-
 hw/xilinx_timer.c     |   32 +++++--
 40 files changed, 757 insertions(+), 302 deletions(-)
 create mode 100644 hw/qdev-addr.c
 create mode 100644 hw/qdev-addr.h
 create mode 100644 hw/qdev-properties.c

diff --git a/Makefile b/Makefile
index caf8530..a3ae99f 100644
--- a/Makefile
+++ b/Makefile
@@ -108,7 +108,7 @@ obj-y += bt-hci-csr.o
 obj-y += buffered_file.o migration.o migration-tcp.o net.o qemu-sockets.o
 obj-y += qemu-char.o aio.o net-checksum.o savevm.o cache-utils.o
 obj-y += msmouse.o ps2.o
-obj-y += qdev.o ssi.o
+obj-y += qdev.o qdev-properties.o ssi.o
 
 obj-$(CONFIG_BRLAPI) += baum.o
 
diff --git a/Makefile.hw b/Makefile.hw
index f7a9507..571e518 100644
--- a/Makefile.hw
+++ b/Makefile.hw
@@ -26,7 +26,7 @@ obj-y += m48t59.o escc.o
 # SCSI layer
 obj-y += lsi53c895a.o esp.o
 
-obj-y += dma-helpers.o sysbus.o
+obj-y += dma-helpers.o sysbus.o qdev-addr.o
 
 all: $(HWLIB)
 # Dummy command so that make thinks it has done something
diff --git a/hw/arm_sysctl.c b/hw/arm_sysctl.c
index c9d1e3f..bb005c8 100644
--- a/hw/arm_sysctl.c
+++ b/hw/arm_sysctl.c
@@ -194,7 +194,6 @@ static void arm_sysctl_init1(SysBusDevice *dev)
     arm_sysctl_state *s = FROM_SYSBUS(arm_sysctl_state, dev);
     int iomemtype;
 
-    s->sys_id = qdev_get_prop_int(&dev->qdev, "sys_id", 0);
     /* The MPcore bootloader uses these flags to start secondary CPUs.
        We don't use a bootloader, so do this here.  */
     s->flags = 3;
@@ -210,15 +209,28 @@ void arm_sysctl_init(uint32_t base, uint32_t sys_id)
     DeviceState *dev;
 
     dev = qdev_create(NULL, "realview_sysctl");
-    qdev_set_prop_int(dev, "sys_id", sys_id);
+    qdev_prop_set_uint32(dev, "sys_id", sys_id);
     qdev_init(dev);
     sysbus_mmio_map(sysbus_from_qdev(dev), 0, base);
 }
 
+static SysBusDeviceInfo arm_sysctl_info = {
+    .init = arm_sysctl_init1,
+    .qdev.name  = "realview_sysctl",
+    .qdev.size  = sizeof(arm_sysctl_state),
+    .qdev.props = (Property[]) {
+        {
+            .name   = "sys_id",
+            .info   = &qdev_prop_uint32,
+            .offset = offsetof(arm_sysctl_state, sys_id),
+        },
+        {/* end of list */}
+    }
+};
+
 static void arm_sysctl_register_devices(void)
 {
-    sysbus_register_dev("realview_sysctl", sizeof(arm_sysctl_state),
-                        arm_sysctl_init1);
+    sysbus_register_withprop(&arm_sysctl_info);
 }
 
 device_init(arm_sysctl_register_devices)
diff --git a/hw/armv7m.c b/hw/armv7m.c
index 297a3e1..2e66d7e 100644
--- a/hw/armv7m.c
+++ b/hw/armv7m.c
@@ -127,7 +127,6 @@ static void bitband_init(SysBusDevice *dev)
     BitBandState *s = FROM_SYSBUS(BitBandState, dev);
     int iomemtype;
 
-    s->base = qdev_get_prop_int(&dev->qdev, "base", 0);
     iomemtype = cpu_register_io_memory(bitband_readfn, bitband_writefn,
                                        &s->base);
     sysbus_init_mmio(dev, 0x02000000, iomemtype);
@@ -138,12 +137,12 @@ static void armv7m_bitband_init(void)
     DeviceState *dev;
 
     dev = qdev_create(NULL, "ARM,bitband-memory");
-    qdev_set_prop_int(dev, "base", 0x20000000);
+    qdev_prop_set_uint32(dev, "base", 0x20000000);
     qdev_init(dev);
     sysbus_mmio_map(sysbus_from_qdev(dev), 0, 0x22000000);
 
     dev = qdev_create(NULL, "ARM,bitband-memory");
-    qdev_set_prop_int(dev, "base", 0x40000000);
+    qdev_prop_set_uint32(dev, "base", 0x40000000);
     qdev_init(dev);
     sysbus_mmio_map(sysbus_from_qdev(dev), 0, 0x42000000);
 }
@@ -238,10 +237,23 @@ qemu_irq *armv7m_init(int flash_size, int sram_size,
     return pic;
 }
 
+static SysBusDeviceInfo bitband_info = {
+    .init = bitband_init,
+    .qdev.name  = "ARM,bitband-memory",
+    .qdev.size  = sizeof(BitBandState),
+    .qdev.props = (Property[]) {
+        {
+            .name   = "base",
+            .info   = &qdev_prop_hex32,
+            .offset = offsetof(BitBandState, base),
+        },
+        {/* end of list */}
+    }
+};
+
 static void armv7m_register_devices(void)
 {
-    sysbus_register_dev("ARM,bitband-memory", sizeof(BitBandState),
-                        bitband_init);
+    sysbus_register_withprop(&bitband_info);
 }
 
 device_init(armv7m_register_devices)
diff --git a/hw/axis_dev88.c b/hw/axis_dev88.c
index 79a4d71..f93f431 100644
--- a/hw/axis_dev88.c
+++ b/hw/axis_dev88.c
@@ -297,7 +297,7 @@ void axisdev88_init (ram_addr_t ram_size,
     cpu_irq = cris_pic_init_cpu(env);
     dev = qdev_create(NULL, "etraxfs,pic");
     /* FIXME: Is there a proper way to signal vectors to the CPU core?  */
-    qdev_set_prop_ptr(dev, "interrupt_vector", &env->interrupt_vector);
+    qdev_prop_set_ptr(dev, "interrupt_vector", &env->interrupt_vector);
     qdev_init(dev);
     s = sysbus_from_qdev(dev);
     sysbus_mmio_map(s, 0, 0x3001c000);
diff --git a/hw/eccmemctl.c b/hw/eccmemctl.c
index d05962b..c5d6449 100644
--- a/hw/eccmemctl.c
+++ b/hw/eccmemctl.c
@@ -321,7 +321,6 @@ static void ecc_init1(SysBusDevice *dev)
     ECCState *s = FROM_SYSBUS(ECCState, dev);
 
     sysbus_init_irq(dev, &s->irq);
-    s->version = qdev_get_prop_int(&dev->qdev, "version", -1);
     s->regs[0] = s->version;
     ecc_io_memory = cpu_register_io_memory(ecc_mem_read, ecc_mem_write, s);
     sysbus_init_mmio(dev, ECC_SIZE, ecc_io_memory);
@@ -342,7 +341,7 @@ void ecc_init(target_phys_addr_t base, qemu_irq irq, uint32_t version)
     SysBusDevice *s;
 
     dev = qdev_create(NULL, "eccmemctl");
-    qdev_set_prop_int(dev, "version", version);
+    qdev_prop_set_uint32(dev, "version", version);
     qdev_init(dev);
     s = sysbus_from_qdev(dev);
     sysbus_connect_irq(s, 0, irq);
@@ -352,9 +351,25 @@ void ecc_init(target_phys_addr_t base, qemu_irq irq, uint32_t version)
     }
 }
 
+static SysBusDeviceInfo ecc_info = {
+    .init = ecc_init1,
+    .qdev.name  = "eccmemctl",
+    .qdev.size  = sizeof(ECCState),
+    .qdev.props = (Property[]) {
+        {
+            .name   = "version",
+            .info   = &qdev_prop_uint32,
+            .offset = offsetof(ECCState, version),
+            .defval = (uint32_t[]) { -1 },
+        },
+        {/* end of list */}
+    }
+};
+
+
 static void ecc_register_devices(void)
 {
-    sysbus_register_dev("eccmemctl", sizeof(ECCState), ecc_init1);
+    sysbus_register_withprop(&ecc_info);
 }
 
 device_init(ecc_register_devices)
diff --git a/hw/esp.c b/hw/esp.c
index 88d42a1..9eacccb 100644
--- a/hw/esp.c
+++ b/hw/esp.c
@@ -650,12 +650,14 @@ void esp_init(target_phys_addr_t espaddr, int it_shift,
 {
     DeviceState *dev;
     SysBusDevice *s;
+    ESPState *esp;
 
     dev = qdev_create(NULL, "esp");
-    qdev_set_prop_ptr(dev, "dma_memory_read", dma_memory_read);
-    qdev_set_prop_ptr(dev, "dma_memory_write", dma_memory_write);
-    qdev_set_prop_ptr(dev, "dma_opaque", dma_opaque);
-    qdev_set_prop_int(dev, "it_shift", it_shift);
+    esp = DO_UPCAST(ESPState, busdev.qdev, dev);
+    esp->dma_memory_read = dma_memory_read;
+    esp->dma_memory_write = dma_memory_write;
+    esp->dma_opaque = dma_opaque;
+    esp->it_shift = it_shift;
     qdev_init(dev);
     s = sysbus_from_qdev(dev);
     sysbus_connect_irq(s, 0, irq);
@@ -668,11 +670,7 @@ static void esp_init1(SysBusDevice *dev)
     int esp_io_memory;
 
     sysbus_init_irq(dev, &s->irq);
-    s->it_shift = qdev_get_prop_int(&dev->qdev, "it_shift", -1);
     assert(s->it_shift != -1);
-    s->dma_memory_read = qdev_get_prop_ptr(&dev->qdev, "dma_memory_read");
-    s->dma_memory_write = qdev_get_prop_ptr(&dev->qdev, "dma_memory_write");
-    s->dma_opaque = qdev_get_prop_ptr(&dev->qdev, "dma_opaque");
 
     esp_io_memory = cpu_register_io_memory(esp_mem_read, esp_mem_write, s);
     sysbus_init_mmio(dev, ESP_REGS << s->it_shift, esp_io_memory);
diff --git a/hw/etraxfs.c b/hw/etraxfs.c
index 94cd6bc..c2eca52 100644
--- a/hw/etraxfs.c
+++ b/hw/etraxfs.c
@@ -88,7 +88,7 @@ void bareetraxfs_init (ram_addr_t ram_size,
     cpu_irq = cris_pic_init_cpu(env);
     dev = qdev_create(NULL, "etraxfs,pic");
     /* FIXME: Is there a proper way to signal vectors to the CPU core?  */
-    qdev_set_prop_ptr(dev, "interrupt_vector", &env->interrupt_vector);
+    qdev_prop_set_ptr(dev, "interrupt_vector", &env->interrupt_vector);
     qdev_init(dev);
     s = sysbus_from_qdev(dev);
     sysbus_mmio_map(s, 0, 0x3001c000);
diff --git a/hw/etraxfs_pic.c b/hw/etraxfs_pic.c
index 1c67427..e627218 100644
--- a/hw/etraxfs_pic.c
+++ b/hw/etraxfs_pic.c
@@ -140,7 +140,6 @@ static void etraxfs_pic_init(SysBusDevice *dev)
     struct etrax_pic *s = FROM_SYSBUS(typeof (*s), dev);
     int intr_vect_regs;
 
-    s->interrupt_vector = qdev_get_prop_ptr(&dev->qdev, "interrupt_vector");
     qdev_init_gpio_in(&dev->qdev, irq_handler, 32);
     sysbus_init_irq(dev, &s->parent_irq);
     sysbus_init_irq(dev, &s->parent_nmi);
@@ -149,10 +148,23 @@ static void etraxfs_pic_init(SysBusDevice *dev)
     sysbus_init_mmio(dev, R_MAX * 4, intr_vect_regs);
 }
 
+static SysBusDeviceInfo etraxfs_pic_info = {
+    .init = etraxfs_pic_init,
+    .qdev.name  = "etraxfs,pic",
+    .qdev.size  = sizeof(struct etrax_pic),
+    .qdev.props = (Property[]) {
+        {
+            .name   = "interrupt_vector",
+            .info   = &qdev_prop_ptr,
+            .offset = offsetof(struct etrax_pic, interrupt_vector),
+        },
+        {/* end of list */}
+    }
+};
+
 static void etraxfs_pic_register(void)
 {
-    sysbus_register_dev("etraxfs,pic", sizeof (struct etrax_pic),
-                        etraxfs_pic_init);
+    sysbus_register_withprop(&etraxfs_pic_info);
 }
 
 device_init(etraxfs_pic_register)
diff --git a/hw/i2c.c b/hw/i2c.c
index 98aa7fc..42a5d7a 100644
--- a/hw/i2c.c
+++ b/hw/i2c.c
@@ -20,6 +20,14 @@ struct i2c_bus
 static struct BusInfo i2c_bus_info = {
     .name = "I2C",
     .size = sizeof(i2c_bus),
+    .props = (Property[]) {
+        {
+            .name   = "address",
+            .info   = &qdev_prop_uint32,
+            .offset = offsetof(struct i2c_slave, address),
+        },
+        {/* end of list */}
+    }
 };
 
 static void i2c_bus_save(QEMUFile *f, void *opaque)
@@ -151,7 +159,6 @@ static void i2c_slave_qdev_init(DeviceState *dev, DeviceInfo *base)
     i2c_slave *s = I2C_SLAVE_FROM_QDEV(dev);
 
     s->info = info;
-    s->address = qdev_get_prop_int(dev, "address", 0);
 
     info->init(s);
 }
@@ -169,7 +176,7 @@ DeviceState *i2c_create_slave(i2c_bus *bus, const char *name, int addr)
     DeviceState *dev;
 
     dev = qdev_create(&bus->qbus, name);
-    qdev_set_prop_int(dev, "address", addr);
+    qdev_prop_set_uint32(dev, "address", addr);
     qdev_init(dev);
     return dev;
 }
diff --git a/hw/i2c.h b/hw/i2c.h
index c4df399..479ff4b 100644
--- a/hw/i2c.h
+++ b/hw/i2c.h
@@ -40,7 +40,7 @@ struct i2c_slave
     I2CSlaveInfo *info;
 
     /* Remaining fields for internal use by the I2C code.  */
-    int address;
+    uint32_t address;
 };
 
 i2c_bus *i2c_init_bus(DeviceState *parent, const char *name);
diff --git a/hw/integratorcp.c b/hw/integratorcp.c
index 50eae0c..ddc8d85 100644
--- a/hw/integratorcp.c
+++ b/hw/integratorcp.c
@@ -17,6 +17,7 @@
 
 typedef struct {
     SysBusDevice busdev;
+    uint32_t memsz;
     uint32_t flash_offset;
     uint32_t cm_osc;
     uint32_t cm_ctrl;
@@ -230,23 +231,21 @@ static void integratorcm_init(SysBusDevice *dev)
 {
     int iomemtype;
     integratorcm_state *s = FROM_SYSBUS(integratorcm_state, dev);
-    int memsz;
 
-    memsz = qdev_get_prop_int(&dev->qdev, "memsz", 0);
     s->cm_osc = 0x01000048;
     /* ??? What should the high bits of this value be?  */
     s->cm_auxosc = 0x0007feff;
     s->cm_sdram = 0x00011122;
-    if (memsz >= 256) {
+    if (s->memsz >= 256) {
         integrator_spd[31] = 64;
         s->cm_sdram |= 0x10;
-    } else if (memsz >= 128) {
+    } else if (s->memsz >= 128) {
         integrator_spd[31] = 32;
         s->cm_sdram |= 0x0c;
-    } else if (memsz >= 64) {
+    } else if (s->memsz >= 64) {
         integrator_spd[31] = 16;
         s->cm_sdram |= 0x08;
-    } else if (memsz >= 32) {
+    } else if (s->memsz >= 32) {
         integrator_spd[31] = 4;
         s->cm_sdram |= 0x04;
     } else {
@@ -475,7 +474,7 @@ static void integratorcp_init(ram_addr_t ram_size,
     cpu_register_physical_memory(0x80000000, ram_size, ram_offset | IO_MEM_RAM);
 
     dev = qdev_create(NULL, "integrator_core");
-    qdev_set_prop_int(dev, "memsz", ram_size >> 20);
+    qdev_prop_set_uint32(dev, "memsz", ram_size >> 20);
     qdev_init(dev);
     sysbus_mmio_map((SysBusDevice *)dev, 0, 0x10000000);
 
@@ -522,11 +521,24 @@ static void integratorcp_machine_init(void)
 
 machine_init(integratorcp_machine_init);
 
+static SysBusDeviceInfo core_info = {
+    .init = integratorcm_init,
+    .qdev.name  = "integrator_core",
+    .qdev.size  = sizeof(integratorcm_state),
+    .qdev.props = (Property[]) {
+        {
+            .name   = "memsz",
+            .info   = &qdev_prop_uint32,
+            .offset = offsetof(integratorcm_state, memsz),
+        },
+        {/* end of list */}
+    }
+};
+
 static void integratorcp_register_devices(void)
 {
     sysbus_register_dev("integrator_pic", sizeof(icp_pic_state), icp_pic_init);
-    sysbus_register_dev("integrator_core", sizeof(integratorcm_state),
-                        integratorcm_init);
+    sysbus_register_withprop(&core_info);
 }
 
 device_init(integratorcp_register_devices)
diff --git a/hw/m48t59.c b/hw/m48t59.c
index 798d292..7e53dce 100644
--- a/hw/m48t59.c
+++ b/hw/m48t59.c
@@ -43,11 +43,11 @@
 struct m48t59_t {
     SysBusDevice busdev;
     /* Model parameters */
-    int type; // 2 = m48t02, 8 = m48t08, 59 = m48t59
+    uint32_t type; // 2 = m48t02, 8 = m48t08, 59 = m48t59
     /* Hardware parameters */
     qemu_irq IRQ;
     uint32_t io_base;
-    uint16_t size;
+    uint32_t size;
     /* RTC management */
     time_t   time_offset;
     time_t   stop_time;
@@ -623,9 +623,9 @@ m48t59_t *m48t59_init (qemu_irq IRQ, target_phys_addr_t mem_base,
     m48t59_t *d;
 
     dev = qdev_create(NULL, "m48t59");
-    qdev_set_prop_int(dev, "type", type);
-    qdev_set_prop_int(dev, "size", size);
-    qdev_set_prop_int(dev, "io_base", io_base);
+    qdev_prop_set_uint32(dev, "type", type);
+    qdev_prop_set_uint32(dev, "size", size);
+    qdev_prop_set_uint32(dev, "io_base", io_base);
     qdev_init(dev);
     s = sysbus_from_qdev(dev);
     sysbus_connect_irq(s, 0, IRQ);
@@ -647,11 +647,8 @@ static void m48t59_init1(SysBusDevice *dev)
     m48t59_t *s = FROM_SYSBUS(m48t59_t, dev);
     int mem_index;
 
-    s->size = qdev_get_prop_int(&dev->qdev, "size", -1);
     s->buffer = qemu_mallocz(s->size);
     sysbus_init_irq(dev, &s->IRQ);
-    s->io_base = qdev_get_prop_int(&dev->qdev, "io_base", 0);
-    s->type = qdev_get_prop_int(&dev->qdev, "type", -1);
 
     mem_index = cpu_register_io_memory(nvram_read, nvram_write, s);
     sysbus_init_mmio(dev, s->size, mem_index);
@@ -666,9 +663,33 @@ static void m48t59_init1(SysBusDevice *dev)
     register_savevm("m48t59", -1, 1, m48t59_save, m48t59_load, s);
 }
 
+static SysBusDeviceInfo m48t59_info = {
+    .init = m48t59_init1,
+    .qdev.name  = "m48t59",
+    .qdev.size  = sizeof(m48t59_t),
+    .qdev.props = (Property[]) {
+        {
+            .name   = "size",
+            .info   = &qdev_prop_uint32,
+            .offset = offsetof(m48t59_t, size),
+            .defval = (uint32_t[]) { -1 },
+        },{
+            .name   = "type",
+            .info   = &qdev_prop_uint32,
+            .offset = offsetof(m48t59_t, type),
+            .defval = (uint32_t[]) { -1 },
+        },{
+            .name   = "io_base",
+            .info   = &qdev_prop_hex32,
+            .offset = offsetof(m48t59_t, io_base),
+        },
+        {/* end of list */}
+    }
+};
+
 static void m48t59_register_devices(void)
 {
-    sysbus_register_dev("m48t59", sizeof(m48t59_t), m48t59_init1);
+    sysbus_register_withprop(&m48t59_info);
 }
 
 device_init(m48t59_register_devices)
diff --git a/hw/mips_malta.c b/hw/mips_malta.c
index 853ec2b..7728e58 100644
--- a/hw/mips_malta.c
+++ b/hw/mips_malta.c
@@ -914,8 +914,8 @@ void mips_malta_init (ram_addr_t ram_size,
         /* TODO: Populate SPD eeprom data.  */
         DeviceState *eeprom;
         eeprom = qdev_create((BusState *)smbus, "smbus-eeprom");
-        qdev_set_prop_int(eeprom, "address", 0x50 + i);
-        qdev_set_prop_ptr(eeprom, "data", eeprom_buf + (i * 256));
+        qdev_prop_set_uint32(eeprom, "address", 0x50 + i);
+        qdev_prop_set_ptr(eeprom, "data", eeprom_buf + (i * 256));
         qdev_init(eeprom);
     }
     pit = pit_init(0x40, i8259[0]);
diff --git a/hw/musicpal.c b/hw/musicpal.c
index 10be69b..e636791 100644
--- a/hw/musicpal.c
+++ b/hw/musicpal.c
@@ -1578,7 +1578,7 @@ static void musicpal_init(ram_addr_t ram_size,
 
     qemu_check_nic_model(&nd_table[0], "mv88w8618");
     dev = qdev_create(NULL, "mv88w8618_eth");
-    qdev_set_netdev(dev, &nd_table[0]);
+    dev->nd = &nd_table[0];
     qdev_init(dev);
     sysbus_mmio_map(sysbus_from_qdev(dev), 0, MP_ETH_BASE);
     sysbus_connect_irq(sysbus_from_qdev(dev), 0, pic[MP_ETH_IRQ]);
diff --git a/hw/pc.c b/hw/pc.c
index 553ba5c..bdcec52 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -1374,8 +1374,8 @@ static void pc_init1(ram_addr_t ram_size,
         for (i = 0; i < 8; i++) {
             DeviceState *eeprom;
             eeprom = qdev_create((BusState *)smbus, "smbus-eeprom");
-            qdev_set_prop_int(eeprom, "address", 0x50 + i);
-            qdev_set_prop_ptr(eeprom, "data", eeprom_buf + (i * 256));
+            qdev_prop_set_uint32(eeprom, "address", 0x50 + i);
+            qdev_prop_set_ptr(eeprom, "data", eeprom_buf + (i * 256));
             qdev_init(eeprom);
         }
     }
diff --git a/hw/pci.c b/hw/pci.c
index a6fb957..3232dda 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -54,6 +54,15 @@ static struct BusInfo pci_bus_info = {
     .name       = "PCI",
     .size       = sizeof(PCIBus),
     .print_dev  = pcibus_dev_print,
+    .props      = (Property[]) {
+        {
+            .name   = "devfn",
+            .info   = &qdev_prop_uint32,
+            .offset = offsetof(PCIDevice, devfn),
+            .defval = (uint32_t[]) { -1 },
+        },
+        {/* end of list */}
+    }
 };
 
 static void pci_update_mappings(PCIDevice *d);
@@ -769,7 +778,7 @@ PCIDevice *pci_create(const char *name, const char *devaddr)
     }
 
     dev = qdev_create(&bus->qbus, name);
-    qdev_set_prop_int(dev, "devfn", devfn);
+    qdev_prop_set_uint32(dev, "devfn", devfn);
     return (PCIDevice *)dev;
 }
 
@@ -812,7 +821,7 @@ PCIDevice *pci_nic_init(NICInfo *nd, const char *default_model,
         if (strcmp(nd->model, pci_nic_models[i]) == 0) {
             pci_dev = pci_create(pci_nic_names[i], devaddr);
             dev = &pci_dev->qdev;
-            qdev_set_netdev(dev, nd);
+            dev->nd = nd;
             qdev_init(dev);
             nd->private = dev;
             return pci_dev;
@@ -890,7 +899,7 @@ static void pci_qdev_init(DeviceState *qdev, DeviceInfo *base)
     int devfn;
 
     bus = FROM_QBUS(PCIBus, qdev_get_parent_bus(qdev));
-    devfn = qdev_get_prop_int(qdev, "devfn", -1);
+    devfn = pci_dev->devfn;
     pci_dev = do_pci_register_device(pci_dev, bus, base->name, devfn,
                                      info->config_read, info->config_write);
     assert(pci_dev);
@@ -917,7 +926,7 @@ PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name)
     DeviceState *dev;
 
     dev = qdev_create(&bus->qbus, name);
-    qdev_set_prop_int(dev, "devfn", devfn);
+    qdev_prop_set_uint32(dev, "devfn", devfn);
     qdev_init(dev);
 
     return (PCIDevice *)dev;
diff --git a/hw/pcnet.c b/hw/pcnet.c
index 4519780..22ab6be 100644
--- a/hw/pcnet.c
+++ b/hw/pcnet.c
@@ -2128,8 +2128,6 @@ static void lance_init(SysBusDevice *dev)
     s->mmio_index =
         cpu_register_io_memory(lance_mem_read, lance_mem_write, d);
 
-    s->dma_opaque = qdev_get_prop_ptr(&dev->qdev, "dma");
-
     qdev_init_gpio_in(&dev->qdev, parent_lance_reset, 1);
 
     sysbus_init_mmio(dev, 4, s->mmio_index);
@@ -2141,6 +2139,21 @@ static void lance_init(SysBusDevice *dev)
 
     pcnet_common_init(&dev->qdev, s, lance_cleanup);
 }
+
+static SysBusDeviceInfo lance_info = {
+    .init = lance_init,
+    .qdev.name  = "lance",
+    .qdev.size  = sizeof(SysBusPCNetState),
+    .qdev.props = (Property[]) {
+        {
+            .name   = "dma",
+            .info   = &qdev_prop_ptr,
+            .offset = offsetof(SysBusPCNetState, state.dma_opaque),
+        },
+        {/* end of list */}
+    }
+};
+
 #endif /* TARGET_SPARC */
 
 static PCIDeviceInfo pcnet_info = {
@@ -2153,7 +2166,7 @@ static void pcnet_register_devices(void)
 {
     pci_qdev_register(&pcnet_info);
 #if defined (TARGET_SPARC) && !defined(TARGET_SPARC64)
-    sysbus_register_dev("lance", sizeof(SysBusPCNetState), lance_init);
+    sysbus_register_withprop(&lance_info);
 #endif
 }
 
diff --git a/hw/qdev-addr.c b/hw/qdev-addr.c
new file mode 100644
index 0000000..305c2d3
--- /dev/null
+++ b/hw/qdev-addr.c
@@ -0,0 +1,32 @@
+#include "qdev.h"
+#include "qdev-addr.h"
+#include "targphys.h"
+
+/* --- target physical address --- */
+
+static int parse_taddr(DeviceState *dev, Property *prop, const char *str)
+{
+    target_phys_addr_t *ptr = qdev_get_prop_ptr(dev, prop);
+
+    *ptr = strtoull(str, NULL, 16);
+    return 0;
+}
+
+static int print_taddr(DeviceState *dev, Property *prop, char *dest, size_t len)
+{
+    target_phys_addr_t *ptr = qdev_get_prop_ptr(dev, prop);
+    return snprintf(dest, len, "0x" TARGET_FMT_plx, *ptr);
+}
+
+PropertyInfo qdev_prop_taddr = {
+    .name  = "taddr",
+    .type  = PROP_TYPE_TADDR,
+    .size  = sizeof(target_phys_addr_t),
+    .parse = parse_taddr,
+    .print = print_taddr,
+};
+
+void qdev_prop_set_taddr(DeviceState *dev, const char *name, target_phys_addr_t value)
+{
+    qdev_prop_set(dev, name, &value, PROP_TYPE_TADDR);
+}
diff --git a/hw/qdev-addr.h b/hw/qdev-addr.h
new file mode 100644
index 0000000..f02bd7a
--- /dev/null
+++ b/hw/qdev-addr.h
@@ -0,0 +1,2 @@
+extern PropertyInfo qdev_prop_taddr;
+void qdev_prop_set_taddr(DeviceState *dev, const char *name, target_phys_addr_t value);
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 @@
+#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++;
+    }
+}
+
diff --git a/hw/qdev.c b/hw/qdev.c
index 83e98bf..9912bd9 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -31,16 +31,6 @@
 #include "sysemu.h"
 #include "monitor.h"
 
-struct DeviceProperty {
-    const char *name;
-    DevicePropType type;
-    union {
-        uint64_t i;
-        void *ptr;
-    } value;
-    DeviceProperty *next;
-};
-
 /* This is a nasty hack to allow passing a NULL bus to qdev_create.  */
 static BusState *main_system_bus;
 extern struct BusInfo system_bus_info;
@@ -86,6 +76,8 @@ DeviceState *qdev_create(BusState *bus, const char *name)
     dev = qemu_mallocz(info->size);
     dev->info = info;
     dev->parent_bus = bus;
+    qdev_prop_set_defaults(dev, dev->info->props);
+    qdev_prop_set_defaults(dev, dev->parent_bus->info->props);
     LIST_INSERT_HEAD(&bus->children, dev, sibling);
     return dev;
 }
@@ -105,52 +97,6 @@ void qdev_free(DeviceState *dev)
     free(dev);
 }
 
-static DeviceProperty *create_prop(DeviceState *dev, const char *name,
-                                   DevicePropType type)
-{
-    DeviceProperty *prop;
-
-    /* TODO: Check for duplicate properties.  */
-    prop = qemu_mallocz(sizeof(*prop));
-    prop->name = qemu_strdup(name);
-    prop->type = type;
-    prop->next = dev->props;
-    dev->props = prop;
-
-    return prop;
-}
-
-void qdev_set_prop_int(DeviceState *dev, const char *name, uint64_t value)
-{
-    DeviceProperty *prop;
-
-    prop = create_prop(dev, name, PROP_TYPE_INT);
-    prop->value.i = value;
-}
-
-void qdev_set_prop_dev(DeviceState *dev, const char *name, DeviceState *value)
-{
-    DeviceProperty *prop;
-
-    prop = create_prop(dev, name, PROP_TYPE_DEV);
-    prop->value.ptr = value;
-}
-
-void qdev_set_prop_ptr(DeviceState *dev, const char *name, void *value)
-{
-    DeviceProperty *prop;
-
-    prop = create_prop(dev, name, PROP_TYPE_PTR);
-    prop->value.ptr = value;
-}
-
-void qdev_set_netdev(DeviceState *dev, NICInfo *nd)
-{
-    assert(!dev->nd);
-    dev->nd = nd;
-}
-
-
 /* Get a character (serial) device interface.  */
 CharDriverState *qdev_init_chardev(DeviceState *dev)
 {
@@ -169,52 +115,6 @@ BusState *qdev_get_parent_bus(DeviceState *dev)
     return dev->parent_bus;
 }
 
-static DeviceProperty *find_prop(DeviceState *dev, const char *name,
-                                 DevicePropType type)
-{
-    DeviceProperty *prop;
-
-    for (prop = dev->props; prop; prop = prop->next) {
-        if (strcmp(prop->name, name) == 0) {
-            assert (prop->type == type);
-            return prop;
-        }
-    }
-    return NULL;
-}
-
-uint64_t qdev_get_prop_int(DeviceState *dev, const char *name, uint64_t def)
-{
-    DeviceProperty *prop;
-
-    prop = find_prop(dev, name, PROP_TYPE_INT);
-    if (!prop) {
-        return def;
-    }
-
-    return prop->value.i;
-}
-
-void *qdev_get_prop_ptr(DeviceState *dev, const char *name)
-{
-    DeviceProperty *prop;
-
-    prop = find_prop(dev, name, PROP_TYPE_PTR);
-    assert(prop);
-    return prop->value.ptr;
-}
-
-DeviceState *qdev_get_prop_dev(DeviceState *dev, const char *name)
-{
-    DeviceProperty *prop;
-
-    prop = find_prop(dev, name, PROP_TYPE_DEV);
-    if (!prop) {
-        return NULL;
-    }
-    return prop->value.ptr;
-}
-
 void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n)
 {
     assert(dev->num_gpio_in == 0);
@@ -327,9 +227,24 @@ BusState *qbus_create(BusInfo *info, DeviceState *parent, const char *name)
 #define qdev_printf(fmt, ...) monitor_printf(mon, "%*s" fmt, indent, "", ## __VA_ARGS__)
 static void qbus_print(Monitor *mon, BusState *bus, int indent);
 
+static void qdev_print_props(Monitor *mon, DeviceState *dev, Property *props,
+                             const char *prefix, int indent)
+{
+    char buf[64];
+
+    if (!props)
+        return;
+    while (props->name) {
+        if (props->info->print) {
+            props->info->print(dev, props, buf, sizeof(buf));
+            qdev_printf("%s-prop: %s = %s\n", prefix, props->name, buf);
+        }
+        props++;
+    }
+}
+
 static void qdev_print(Monitor *mon, DeviceState *dev, int indent)
 {
-    DeviceProperty *prop;
     BusState *child;
     qdev_printf("dev: %s\n", dev->info->name);
     indent += 2;
@@ -339,24 +254,8 @@ static void qdev_print(Monitor *mon, DeviceState *dev, int indent)
     if (dev->num_gpio_out) {
         qdev_printf("gpio-out %d\n", dev->num_gpio_out);
     }
-    for (prop = dev->props; prop; prop = prop->next) {
-        switch (prop->type) {
-        case PROP_TYPE_INT:
-            qdev_printf("prop-int %s 0x%" PRIx64 "\n", prop->name,
-                        prop->value.i);
-            break;
-        case PROP_TYPE_PTR:
-            qdev_printf("prop-ptr %s\n", prop->name);
-            break;
-        case PROP_TYPE_DEV:
-            qdev_printf("prop-dev %s %s\n", prop->name,
-                        ((DeviceState *)prop->value.ptr)->info->name);
-            break;
-        default:
-            qdev_printf("prop-unknown%d %s\n", prop->type, prop->name);
-            break;
-        }
-    }
+    qdev_print_props(mon, dev, dev->info->props, "dev", indent);
+    qdev_print_props(mon, dev, dev->parent_bus->info->props, "bus", indent);
     if (dev->parent_bus->info->print_dev)
         dev->parent_bus->info->print_dev(mon, dev, indent);
     LIST_FOREACH(child, &dev->child_bus, sibling) {
diff --git a/hw/qdev.h b/hw/qdev.h
index b18dbf9..9ecc9ec 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -4,9 +4,11 @@
 #include "hw.h"
 #include "sys-queue.h"
 
-typedef struct DeviceInfo DeviceInfo;
+typedef struct Property Property;
+
+typedef struct PropertyInfo PropertyInfo;
 
-typedef struct DeviceProperty DeviceProperty;
+typedef struct DeviceInfo DeviceInfo;
 
 typedef struct BusState BusState;
 
@@ -17,7 +19,6 @@ typedef struct BusInfo BusInfo;
 struct DeviceState {
     DeviceInfo *info;
     BusState *parent_bus;
-    DeviceProperty *props;
     int num_gpio_out;
     qemu_irq *gpio_out;
     int num_gpio_in;
@@ -32,6 +33,7 @@ struct BusInfo {
     const char *name;
     size_t size;
     bus_dev_printfn print_dev;
+    Property *props;
 };
 
 struct BusState {
@@ -42,18 +44,36 @@ struct BusState {
     LIST_ENTRY(BusState) sibling;
 };
 
+struct Property {
+    const char   *name;
+    PropertyInfo *info;
+    int          offset;
+    void         *defval;
+};
+
+enum PropertyType {
+    PROP_TYPE_UNSPEC = 0,
+    PROP_TYPE_UINT16,
+    PROP_TYPE_UINT32,
+    PROP_TYPE_TADDR,
+    PROP_TYPE_MACADDR,
+    PROP_TYPE_PTR,
+};
+
+struct PropertyInfo {
+    const char *name;
+    size_t size;
+    enum PropertyType type;
+    int (*parse)(DeviceState *dev, Property *prop, const char *str);
+    int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len);
+};
+
 /*** Board API.  This should go away once we have a machine config file.  ***/
 
 DeviceState *qdev_create(BusState *bus, const char *name);
 void qdev_init(DeviceState *dev);
 void qdev_free(DeviceState *dev);
 
-/* Set properties between creation and init.  */
-void qdev_set_prop_int(DeviceState *dev, const char *name, uint64_t value);
-void qdev_set_prop_dev(DeviceState *dev, const char *name, DeviceState *value);
-void qdev_set_prop_ptr(DeviceState *dev, const char *name, void *value);
-void qdev_set_netdev(DeviceState *dev, NICInfo *nd);
-
 qemu_irq qdev_get_gpio_in(DeviceState *dev, int n);
 void qdev_connect_gpio_out(DeviceState *dev, int n, qemu_irq pin);
 
@@ -61,17 +81,6 @@ BusState *qdev_get_child_bus(DeviceState *dev, const char *name);
 
 /*** Device API.  ***/
 
-typedef enum {
-    PROP_TYPE_INT,
-    PROP_TYPE_PTR,
-    PROP_TYPE_DEV
-} DevicePropType;
-
-typedef struct {
-    const char *name;
-    DevicePropType type;
-} DevicePropList;
-
 typedef void (*qdev_initfn)(DeviceState *dev, DeviceInfo *info);
 typedef void (*SCSIAttachFn)(DeviceState *host, BlockDriverState *bdrv,
               int unit);
@@ -79,7 +88,7 @@ typedef void (*SCSIAttachFn)(DeviceState *host, BlockDriverState *bdrv,
 struct DeviceInfo {
     const char *name;
     size_t size;
-    DevicePropList *props;
+    Property *props;
 
     /* Private to qdev / bus.  */
     qdev_initfn init;
@@ -99,10 +108,6 @@ void scsi_bus_new(DeviceState *host, SCSIAttachFn attach);
 CharDriverState *qdev_init_chardev(DeviceState *dev);
 
 BusState *qdev_get_parent_bus(DeviceState *dev);
-uint64_t qdev_get_prop_int(DeviceState *dev, const char *name, uint64_t def);
-DeviceState *qdev_get_prop_dev(DeviceState *dev, const char *name);
-/* FIXME: Remove opaque pointer properties.  */
-void *qdev_get_prop_ptr(DeviceState *dev, const char *name);
 
 /* Convery from a base type to a parent type, with compile time checking.  */
 #ifdef __GNUC__
@@ -124,4 +129,22 @@ BusState *qbus_create(BusInfo *info, DeviceState *parent, const char *name);
 
 void do_info_qtree(Monitor *mon);
 
+/*** qdev-properties.c ***/
+
+extern PropertyInfo qdev_prop_uint16;
+extern PropertyInfo qdev_prop_uint32;
+extern PropertyInfo qdev_prop_hex32;
+extern PropertyInfo qdev_prop_ptr;
+extern PropertyInfo qdev_prop_macaddr;
+
+/* Set properties between creation and init.  */
+void *qdev_get_prop_ptr(DeviceState *dev, Property *prop);
+int qdev_prop_parse(DeviceState *dev, const char *name, const char *value);
+void qdev_prop_set(DeviceState *dev, const char *name, void *src, enum PropertyType type);
+void qdev_prop_set_uint16(DeviceState *dev, const char *name, uint16_t value);
+void qdev_prop_set_uint32(DeviceState *dev, const char *name, uint32_t value);
+/* FIXME: Remove opaque pointer properties.  */
+void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value);
+void qdev_prop_set_defaults(DeviceState *dev, Property *props);
+
 #endif
diff --git a/hw/slavio_misc.c b/hw/slavio_misc.c
index 3d246ee..23012a3 100644
--- a/hw/slavio_misc.c
+++ b/hw/slavio_misc.c
@@ -564,18 +564,12 @@ static SysBusDeviceInfo slavio_misc_info = {
     .init = slavio_misc_init1,
     .qdev.name  = "slavio_misc",
     .qdev.size  = sizeof(MiscState),
-    .qdev.props = (DevicePropList[]) {
-        {.name = NULL}
-    }
 };
 
 static SysBusDeviceInfo apc_info = {
     .init = apc_init1,
     .qdev.name  = "apc",
     .qdev.size  = sizeof(MiscState),
-    .qdev.props = (DevicePropList[]) {
-        {.name = NULL}
-    }
 };
 
 static void slavio_misc_register_devices(void)
diff --git a/hw/smbus_eeprom.c b/hw/smbus_eeprom.c
index 05a70d9..c071fb1 100644
--- a/hw/smbus_eeprom.c
+++ b/hw/smbus_eeprom.c
@@ -99,14 +99,20 @@ static void smbus_eeprom_init(SMBusDevice *dev)
 {
     SMBusEEPROMDevice *eeprom = (SMBusEEPROMDevice *)dev;
 
-    /* FIXME: Should be a blob rather than a ptr.  */
-    eeprom->data = qdev_get_prop_ptr(&dev->i2c.qdev, "data");
     eeprom->offset = 0;
 }
 
 static SMBusDeviceInfo smbus_eeprom_info = {
     .i2c.qdev.name = "smbus-eeprom",
     .i2c.qdev.size = sizeof(SMBusEEPROMDevice),
+    .i2c.qdev.props = (Property[]) {
+        {
+            .name   = "data",
+            .info   = &qdev_prop_ptr,
+            .offset = offsetof(SMBusEEPROMDevice, data),
+        },
+        {/* end of list */}
+    },
     .init = smbus_eeprom_init,
     .quick_cmd = eeprom_quick_cmd,
     .send_byte = eeprom_send_byte,
diff --git a/hw/smc91c111.c b/hw/smc91c111.c
index cf8d864..5f6956a 100644
--- a/hw/smc91c111.c
+++ b/hw/smc91c111.c
@@ -733,7 +733,7 @@ void smc91c111_init(NICInfo *nd, uint32_t base, qemu_irq irq)
 
     qemu_check_nic_model(nd, "smc91c111");
     dev = qdev_create(NULL, "smc91c111");
-    qdev_set_netdev(dev, nd);
+    dev->nd = nd;
     qdev_init(dev);
     s = sysbus_from_qdev(dev);
     sysbus_mmio_map(s, 0, base);
diff --git a/hw/stellaris.c b/hw/stellaris.c
index 5f44bff..d9434ca 100644
--- a/hw/stellaris.c
+++ b/hw/stellaris.c
@@ -1378,7 +1378,7 @@ static void stellaris_init(const char *kernel_filename, const char *cpu_model,
         qemu_check_nic_model(&nd_table[0], "stellaris");
 
         enet = qdev_create(NULL, "stellaris_enet");
-        qdev_set_netdev(enet, &nd_table[0]);
+        enet->nd = &nd_table[0];
         qdev_init(enet);
         sysbus_mmio_map(sysbus_from_qdev(enet), 0, 0x40048000);
         sysbus_connect_irq(sysbus_from_qdev(enet), 0, pic[42]);
diff --git a/hw/sun4m.c b/hw/sun4m.c
index f3fe11c..b24f7a8 100644
--- a/hw/sun4m.c
+++ b/hw/sun4m.c
@@ -373,8 +373,7 @@ static void lance_init(NICInfo *nd, target_phys_addr_t leaddr,
     qemu_check_nic_model(&nd_table[0], "lance");
 
     dev = qdev_create(NULL, "lance");
-    qdev_set_netdev(dev, nd);
-    qdev_set_prop_ptr(dev, "dma", dma_opaque);
+    dev->nd = nd;
     qdev_init(dev);
     s = sysbus_from_qdev(dev);
     sysbus_mmio_map(s, 0, leaddr);
@@ -410,9 +409,6 @@ static SysBusDeviceInfo idreg_info = {
     .init = idreg_init1,
     .qdev.name  = "macio_idreg",
     .qdev.size  = sizeof(SysBusDevice),
-    .qdev.props = (DevicePropList[]) {
-        {.name = NULL}
-    }
 };
 
 static void idreg_register_devices(void)
diff --git a/hw/syborg.c b/hw/syborg.c
index 5ca9977..d8d38d4 100644
--- a/hw/syborg.c
+++ b/hw/syborg.c
@@ -64,7 +64,7 @@ static void syborg_init(ram_addr_t ram_size,
     sysbus_create_simple("syborg,rtc", 0xC0001000, NULL);
 
     dev = qdev_create(NULL, "syborg,timer");
-    qdev_set_prop_int(dev, "frequency", 1000000);
+    qdev_prop_set_uint32(dev, "frequency", 1000000);
     qdev_init(dev);
     sysbus_mmio_map(sysbus_from_qdev(dev), 0, 0xC0002000);
     sysbus_connect_irq(sysbus_from_qdev(dev), 0, pic[1]);
@@ -83,7 +83,7 @@ static void syborg_init(ram_addr_t ram_size,
 
         qemu_check_nic_model(&nd_table[0], "virtio");
         dev = qdev_create(NULL, "syborg,virtio-net");
-        qdev_set_netdev(dev, &nd_table[0]);
+        dev->nd = &nd_table[0];
         qdev_init(dev);
         s = sysbus_from_qdev(dev);
         sysbus_mmio_map(s, 0, 0xc000c000);
diff --git a/hw/syborg_fb.c b/hw/syborg_fb.c
index 42c6274..2929ffd 100644
--- a/hw/syborg_fb.c
+++ b/hw/syborg_fb.c
@@ -76,8 +76,8 @@ typedef struct {
 
     uint32_t base;
     uint32_t pitch;
-    int rows;
-    int cols;
+    uint32_t rows;
+    uint32_t cols;
     int blank;
     int bpp;
     int rgb; /* 0 = BGR, 1 = RGB */
@@ -507,41 +507,50 @@ static void syborg_fb_init(SysBusDevice *dev)
 {
     SyborgFBState *s = FROM_SYSBUS(SyborgFBState, dev);
     int iomemtype;
-    int width;
-    int height;
 
     sysbus_init_irq(dev, &s->irq);
     iomemtype = cpu_register_io_memory(syborg_fb_readfn,
                                        syborg_fb_writefn, s);
     sysbus_init_mmio(dev, 0x1000, iomemtype);
 
-    width = qdev_get_prop_int(&dev->qdev, "width", 0);
-    height = qdev_get_prop_int(&dev->qdev, "height", 0);
-
     s->ds = graphic_console_init(syborg_fb_update_display,
                                  syborg_fb_invalidate_display,
                                  NULL, NULL, s);
 
-    if (width != 0 && height != 0) {
-        qemu_console_resize(s->ds, width, height);
+    if (s->cols != 0 && s->rows != 0) {
+        qemu_console_resize(s->ds, s->cols, s->rows);
     }
 
-    if (!width)
-        width = ds_get_width(s->ds);
-    if (!height)
-        height = ds_get_height(s->ds);
-
-    s->cols = width;
-    s->rows = height;
+    if (!s->cols)
+        s->cols = ds_get_width(s->ds);
+    if (!s->rows)
+        s->rows = ds_get_height(s->ds);
 
     register_savevm("syborg_framebuffer", -1, 1,
                     syborg_fb_save, syborg_fb_load, s);
 }
 
+static SysBusDeviceInfo syborg_fb_info = {
+    .init = syborg_fb_init,
+    .qdev.name  = "syborg,framebuffer",
+    .qdev.size  = sizeof(SyborgFBState),
+    .qdev.props = (Property[]) {
+        {
+            .name   = "width",
+            .info   = &qdev_prop_uint32,
+            .offset = offsetof(SyborgFBState, cols),
+        },{
+            .name   = "height",
+            .info   = &qdev_prop_uint32,
+            .offset = offsetof(SyborgFBState, rows),
+        },
+        {/* end of list */}
+    }
+};
+
 static void syborg_fb_register_devices(void)
 {
-    sysbus_register_dev("syborg,framebuffer", sizeof(SyborgFBState),
-                        syborg_fb_init);
+    sysbus_register_withprop(&syborg_fb_info);
 }
 
 device_init(syborg_fb_register_devices)
diff --git a/hw/syborg_interrupt.c b/hw/syborg_interrupt.c
index 569c7f6..a372ec1 100644
--- a/hw/syborg_interrupt.c
+++ b/hw/syborg_interrupt.c
@@ -56,7 +56,7 @@ typedef struct {
 typedef struct {
     SysBusDevice busdev;
     int pending_count;
-    int num_irqs;
+    uint32_t num_irqs;
     syborg_int_flags *flags;
     qemu_irq parent_irq;
 } SyborgIntState;
@@ -208,7 +208,6 @@ static void syborg_int_init(SysBusDevice *dev)
     int iomemtype;
 
     sysbus_init_irq(dev, &s->parent_irq);
-    s->num_irqs = qdev_get_prop_int(&dev->qdev, "num-interrupts", 64);
     qdev_init_gpio_in(&dev->qdev, syborg_int_set_irq, s->num_irqs);
     iomemtype = cpu_register_io_memory(syborg_int_readfn,
                                        syborg_int_writefn, s);
@@ -218,10 +217,24 @@ static void syborg_int_init(SysBusDevice *dev)
     register_savevm("syborg_int", -1, 1, syborg_int_save, syborg_int_load, s);
 }
 
+static SysBusDeviceInfo syborg_int_info = {
+    .init = syborg_int_init,
+    .qdev.name  = "syborg,interrupt",
+    .qdev.size  = sizeof(SyborgIntState),
+    .qdev.props = (Property[]) {
+        {
+            .name   = "num-interrupts",
+            .info   = &qdev_prop_uint32,
+            .offset = offsetof(SyborgIntState, num_irqs),
+            .defval = (uint32_t[]) { 64 },
+        },
+        {/* end of list */}
+    }
+};
+
 static void syborg_interrupt_register_devices(void)
 {
-    sysbus_register_dev("syborg,interrupt", sizeof(SyborgIntState),
-                        syborg_int_init);
+    sysbus_register_withprop(&syborg_int_info);
 }
 
 device_init(syborg_interrupt_register_devices)
diff --git a/hw/syborg_keyboard.c b/hw/syborg_keyboard.c
index 84a099e..ffc85a5 100644
--- a/hw/syborg_keyboard.c
+++ b/hw/syborg_keyboard.c
@@ -53,7 +53,7 @@ typedef struct {
     SysBusDevice busdev;
     int int_enabled;
     int extension_bit;
-    int fifo_size;
+    uint32_t fifo_size;
     uint32_t *key_fifo;
     int read_pos, read_count;
     qemu_irq irq;
@@ -212,7 +212,6 @@ static void syborg_keyboard_init(SysBusDevice *dev)
     iomemtype = cpu_register_io_memory(syborg_keyboard_readfn,
                                        syborg_keyboard_writefn, s);
     sysbus_init_mmio(dev, 0x1000, iomemtype);
-    s->fifo_size = qdev_get_prop_int(&dev->qdev, "fifo-size", 16);
     if (s->fifo_size <= 0) {
         fprintf(stderr, "syborg_keyboard: fifo too small\n");
         s->fifo_size = 16;
@@ -225,10 +224,24 @@ static void syborg_keyboard_init(SysBusDevice *dev)
                     syborg_keyboard_save, syborg_keyboard_load, s);
 }
 
+static SysBusDeviceInfo syborg_keyboard_info = {
+    .init = syborg_keyboard_init,
+    .qdev.name  = "syborg,keyboard",
+    .qdev.size  = sizeof(SyborgKeyboardState),
+    .qdev.props = (Property[]) {
+        {
+            .name   = "fifo-size",
+            .info   = &qdev_prop_uint32,
+            .offset = offsetof(SyborgKeyboardState, fifo_size),
+            .defval = (uint32_t[]) { 16 },
+        },
+        {/* end of list */}
+    }
+};
+
 static void syborg_keyboard_register_devices(void)
 {
-    sysbus_register_dev("syborg,keyboard", sizeof(SyborgKeyboardState),
-                        syborg_keyboard_init);
+    sysbus_register_withprop(&syborg_keyboard_info);
 }
 
 device_init(syborg_keyboard_register_devices)
diff --git a/hw/syborg_pointer.c b/hw/syborg_pointer.c
index e0a892d..edd1f22 100644
--- a/hw/syborg_pointer.c
+++ b/hw/syborg_pointer.c
@@ -45,11 +45,11 @@ typedef struct {
 typedef struct {
     SysBusDevice busdev;
     int int_enabled;
-    int fifo_size;
+    uint32_t fifo_size;
     event_data *event_fifo;
     int read_pos, read_count;
     qemu_irq irq;
-    int absolute;
+    uint32_t absolute;
 } SyborgPointerState;
 
 static void syborg_pointer_update(SyborgPointerState *s)
@@ -209,8 +209,6 @@ static void syborg_pointer_init(SysBusDevice *dev)
 				       syborg_pointer_writefn, s);
     sysbus_init_mmio(dev, 0x1000, iomemtype);
 
-    s->absolute = qdev_get_prop_int(&dev->qdev, "absolute", 1);
-    s->fifo_size = qdev_get_prop_int(&dev->qdev, "fifo-size", 16);
     if (s->fifo_size <= 0) {
         fprintf(stderr, "syborg_pointer: fifo too small\n");
         s->fifo_size = 16;
@@ -224,10 +222,29 @@ static void syborg_pointer_init(SysBusDevice *dev)
                     syborg_pointer_save, syborg_pointer_load, s);
 }
 
+static SysBusDeviceInfo syborg_pointer_info = {
+    .init = syborg_pointer_init,
+    .qdev.name  = "syborg,pointer",
+    .qdev.size  = sizeof(SyborgPointerState),
+    .qdev.props = (Property[]) {
+        {
+            .name   = "fifo-size",
+            .info   = &qdev_prop_uint32,
+            .offset = offsetof(SyborgPointerState, fifo_size),
+            .defval = (uint32_t[]) { 16 },
+        },{
+            .name   = "absolute",
+            .info   = &qdev_prop_uint32,
+            .offset = offsetof(SyborgPointerState, absolute),
+            .defval = (uint32_t[]) { 1 },
+        },
+        {/* end of list */}
+    }
+};
+
 static void syborg_pointer_register_devices(void)
 {
-    sysbus_register_dev("syborg,pointer", sizeof(SyborgPointerState),
-                        syborg_pointer_init);
+    sysbus_register_withprop(&syborg_pointer_info);
 }
 
 device_init(syborg_pointer_register_devices)
diff --git a/hw/syborg_serial.c b/hw/syborg_serial.c
index f430508..f693421 100644
--- a/hw/syborg_serial.c
+++ b/hw/syborg_serial.c
@@ -59,7 +59,7 @@ enum {
 typedef struct {
     SysBusDevice busdev;
     uint32_t int_enable;
-    int fifo_size;
+    uint32_t fifo_size;
     uint32_t *read_fifo;
     int read_pos;
     int read_count;
@@ -329,7 +329,6 @@ static void syborg_serial_init(SysBusDevice *dev)
         qemu_chr_add_handlers(s->chr, syborg_serial_can_receive,
                               syborg_serial_receive, syborg_serial_event, s);
     }
-    s->fifo_size = qdev_get_prop_int(&dev->qdev, "fifo-size", 16);
     if (s->fifo_size <= 0) {
         fprintf(stderr, "syborg_serial: fifo too small\n");
         s->fifo_size = 16;
@@ -340,10 +339,24 @@ static void syborg_serial_init(SysBusDevice *dev)
                     syborg_serial_save, syborg_serial_load, s);
 }
 
+static SysBusDeviceInfo syborg_serial_info = {
+    .init = syborg_serial_init,
+    .qdev.name  = "syborg,serial",
+    .qdev.size  = sizeof(SyborgSerialState),
+    .qdev.props = (Property[]) {
+        {
+            .name   = "fifo-size",
+            .info   = &qdev_prop_uint32,
+            .offset = offsetof(SyborgSerialState, fifo_size),
+            .defval = (uint32_t[]) { 16 },
+        },
+        {/* end of list */}
+    }
+};
+
 static void syborg_serial_register_devices(void)
 {
-    sysbus_register_dev("syborg,serial", sizeof(SyborgSerialState),
-                        syborg_serial_init);
+    sysbus_register_withprop(&syborg_serial_info);
 }
 
 device_init(syborg_serial_register_devices)
diff --git a/hw/syborg_timer.c b/hw/syborg_timer.c
index 4f5e3a1..cf96c5f 100644
--- a/hw/syborg_timer.c
+++ b/hw/syborg_timer.c
@@ -209,7 +209,6 @@ static void syborg_timer_init(SysBusDevice *dev)
     QEMUBH *bh;
     int iomemtype;
 
-    s->freq = qdev_get_prop_int(&dev->qdev, "frequency", 0);
     if (s->freq == 0) {
         fprintf(stderr, "syborg_timer: Zero/unset frequency\n");
         exit(1);
@@ -230,9 +229,13 @@ static SysBusDeviceInfo syborg_timer_info = {
     .init = syborg_timer_init,
     .qdev.name  = "syborg,timer",
     .qdev.size  = sizeof(SyborgTimerState),
-    .qdev.props = (DevicePropList[]) {
-        {.name = "frequency", .type = PROP_TYPE_INT},
-        {.name = NULL}
+    .qdev.props = (Property[]) {
+        {
+            .name   = "frequency",
+            .info   = &qdev_prop_uint32,
+            .offset = offsetof(SyborgTimerState, freq),
+        },
+        {/* end of list */}
     }
 };
 
diff --git a/hw/tcx.c b/hw/tcx.c
index d9b07cc..9335b42 100644
--- a/hw/tcx.c
+++ b/hw/tcx.c
@@ -26,6 +26,7 @@
 #include "console.h"
 #include "pixel_ops.h"
 #include "sysbus.h"
+#include "qdev-addr.h"
 
 #define MAXX 1024
 #define MAXY 768
@@ -41,6 +42,7 @@ typedef struct TCXState {
     uint8_t *vram;
     uint32_t *vram24, *cplane;
     ram_addr_t vram_offset, vram24_offset, cplane_offset;
+    uint32_t vram_size;
     uint16_t width, height, depth;
     uint8_t r[256], g[256], b[256];
     uint32_t palette[256];
@@ -506,11 +508,11 @@ void tcx_init(target_phys_addr_t addr, int vram_size, int width, int height,
     SysBusDevice *s;
 
     dev = qdev_create(NULL, "SUNW,tcx");
-    qdev_set_prop_int(dev, "addr", addr);
-    qdev_set_prop_int(dev, "vram_size", vram_size);
-    qdev_set_prop_int(dev, "width", width);
-    qdev_set_prop_int(dev, "height", height);
-    qdev_set_prop_int(dev, "depth", depth);
+    qdev_prop_set_taddr(dev, "addr", addr);
+    qdev_prop_set_uint32(dev, "vram_size", vram_size);
+    qdev_prop_set_uint16(dev, "width", width);
+    qdev_prop_set_uint16(dev, "height", height);
+    qdev_prop_set_uint16(dev, "depth", depth);
     qdev_init(dev);
     s = sysbus_from_qdev(dev);
     /* 8-bit plane */
@@ -537,22 +539,16 @@ static void tcx_init1(SysBusDevice *dev)
     TCXState *s = FROM_SYSBUS(TCXState, dev);
     int io_memory, dummy_memory;
     ram_addr_t vram_offset;
-    int size, vram_size;
+    int size;
     uint8_t *vram_base;
 
-    vram_size = qdev_get_prop_int(&dev->qdev, "vram_size", -1);
-
-    vram_offset = qemu_ram_alloc(vram_size * (1 + 4 + 4));
+    vram_offset = qemu_ram_alloc(s->vram_size * (1 + 4 + 4));
     vram_base = qemu_get_ram_ptr(vram_offset);
-    s->addr = qdev_get_prop_int(&dev->qdev, "addr", -1);
     s->vram_offset = vram_offset;
-    s->width = qdev_get_prop_int(&dev->qdev, "width", -1);
-    s->height = qdev_get_prop_int(&dev->qdev, "height", -1);
-    s->depth = qdev_get_prop_int(&dev->qdev, "depth", -1);
 
     /* 8-bit plane */
     s->vram = vram_base;
-    size = vram_size;
+    size = s->vram_size;
     sysbus_init_mmio(dev, size, s->vram_offset);
     vram_offset += size;
     vram_base += size;
@@ -570,7 +566,7 @@ static void tcx_init1(SysBusDevice *dev)
 
     if (s->depth == 24) {
         /* 24-bit plane */
-        size = vram_size * 4;
+        size = s->vram_size * 4;
         s->vram24 = (uint32_t *)vram_base;
         s->vram24_offset = vram_offset;
         sysbus_init_mmio(dev, size, vram_offset);
@@ -578,7 +574,7 @@ static void tcx_init1(SysBusDevice *dev)
         vram_base += size;
 
         /* Control plane */
-        size = vram_size * 4;
+        size = s->vram_size * 4;
         s->cplane = (uint32_t *)vram_base;
         s->cplane_offset = vram_offset;
         sysbus_init_mmio(dev, size, vram_offset);
@@ -664,9 +660,44 @@ static void tcx24_screen_dump(void *opaque, const char *filename)
     return;
 }
 
+static SysBusDeviceInfo tcx_info = {
+    .init = tcx_init1,
+    .qdev.name  = "SUNW,tcx",
+    .qdev.size  = sizeof(TCXState),
+    .qdev.props = (Property[]) {
+        {
+            .name   = "addr",
+            .info   = &qdev_prop_taddr,
+            .offset = offsetof(TCXState, addr),
+            .defval = (target_phys_addr_t[]) { -1 },
+        },{
+            .name   = "vram_size",
+            .info   = &qdev_prop_hex32,
+            .offset = offsetof(TCXState, vram_size),
+            .defval = (uint32_t[]) { -1 },
+        },{
+            .name   = "width",
+            .info   = &qdev_prop_uint16,
+            .offset = offsetof(TCXState, width),
+            .defval = (uint16_t[]) { -1 },
+        },{
+            .name   = "height",
+            .info   = &qdev_prop_uint16,
+            .offset = offsetof(TCXState, height),
+            .defval = (uint16_t[]) { -1 },
+        },{
+            .name   = "depth",
+            .info   = &qdev_prop_uint16,
+            .offset = offsetof(TCXState, depth),
+            .defval = (uint16_t[]) { -1 },
+        },
+        {/* end of list */}
+    }
+};
+
 static void tcx_register_devices(void)
 {
-    sysbus_register_dev("SUNW,tcx", sizeof(TCXState), tcx_init1);
+    sysbus_register_withprop(&tcx_info);
 }
 
 device_init(tcx_register_devices)
diff --git a/hw/xilinx.h b/hw/xilinx.h
index 9707a0e..070679c 100644
--- a/hw/xilinx.h
+++ b/hw/xilinx.h
@@ -8,7 +8,7 @@ xilinx_intc_create(target_phys_addr_t base, qemu_irq irq, int kind_of_intr)
     DeviceState *dev;
 
     dev = qdev_create(NULL, "xilinx,intc");
-    qdev_set_prop_int(dev, "kind-of-intr", kind_of_intr);
+    qdev_prop_set_uint32(dev, "kind-of-intr", kind_of_intr);
     qdev_init(dev);
     sysbus_mmio_map(sysbus_from_qdev(dev), 0, base);
     sysbus_connect_irq(sysbus_from_qdev(dev), 0, irq);
@@ -22,8 +22,8 @@ xilinx_timer_create(target_phys_addr_t base, qemu_irq irq, int nr, int freq)
     DeviceState *dev;
 
     dev = qdev_create(NULL, "xilinx,timer");
-    qdev_set_prop_int(dev, "nr-timers", nr);
-    qdev_set_prop_int(dev, "frequency", freq);
+    qdev_prop_set_uint32(dev, "nr-timers", nr);
+    qdev_prop_set_uint32(dev, "frequency", freq);
     qdev_init(dev);
     sysbus_mmio_map(sysbus_from_qdev(dev), 0, base);
     sysbus_connect_irq(sysbus_from_qdev(dev), 0, irq);
@@ -40,9 +40,9 @@ xilinx_ethlite_create(NICInfo *nd, target_phys_addr_t base, qemu_irq irq,
     qemu_check_nic_model(nd, "xilinx-ethlite");
 
     dev = qdev_create(NULL, "xilinx,ethlite");
-    qdev_set_netdev(dev, nd);
-    qdev_set_prop_int(dev, "txpingpong", txpingpong);
-    qdev_set_prop_int(dev, "rxpingpong", rxpingpong);
+    dev->nd = nd;
+    qdev_prop_set_uint32(dev, "txpingpong", txpingpong);
+    qdev_prop_set_uint32(dev, "rxpingpong", rxpingpong);
     qdev_init(dev);
     sysbus_mmio_map(sysbus_from_qdev(dev), 0, base);
     sysbus_connect_irq(sysbus_from_qdev(dev), 0, irq);
diff --git a/hw/xilinx_ethlite.c b/hw/xilinx_ethlite.c
index f4b40c7..b3fd25b 100644
--- a/hw/xilinx_ethlite.c
+++ b/hw/xilinx_ethlite.c
@@ -53,8 +53,8 @@ struct xlx_ethlite
     qemu_irq irq;
     VLANClientState *vc;
 
-    unsigned int c_tx_pingpong;
-    unsigned int c_rx_pingpong;
+    uint32_t c_tx_pingpong;
+    uint32_t c_rx_pingpong;
     unsigned int txbuf;
     unsigned int rxbuf;
 
@@ -213,8 +213,6 @@ static void xilinx_ethlite_init(SysBusDevice *dev)
     int regs;
 
     sysbus_init_irq(dev, &s->irq);
-    s->c_tx_pingpong = qdev_get_prop_int(&dev->qdev, "txpingpong", 1);
-    s->c_rx_pingpong = qdev_get_prop_int(&dev->qdev, "rxpingpong", 1);
     s->rxbuf = 0;
 
     regs = cpu_register_io_memory(eth_read, eth_write, s);
@@ -225,10 +223,29 @@ static void xilinx_ethlite_init(SysBusDevice *dev)
                                  eth_can_rx, eth_rx, NULL, eth_cleanup, s);
 }
 
+static SysBusDeviceInfo xilinx_ethlite_info = {
+    .init = xilinx_ethlite_init,
+    .qdev.name  = "xilinx,ethlite",
+    .qdev.size  = sizeof(struct xlx_ethlite),
+    .qdev.props = (Property[]) {
+        {
+            .name   = "txpingpong",
+            .info   = &qdev_prop_uint32,
+            .offset = offsetof(struct xlx_ethlite, c_tx_pingpong),
+            .defval = (uint32_t[]) { 1 },
+        },{
+            .name   = "rxpingpong",
+            .info   = &qdev_prop_uint32,
+            .offset = offsetof(struct xlx_ethlite, c_rx_pingpong),
+            .defval = (uint32_t[]) { 1 },
+        },
+        {/* end of list */}
+    }
+};
+
 static void xilinx_ethlite_register(void)
 {
-    sysbus_register_dev("xilinx,ethlite", sizeof (struct xlx_ethlite),
-                        xilinx_ethlite_init);
+    sysbus_register_withprop(&xilinx_ethlite_info);
 }
 
 device_init(xilinx_ethlite_register)
diff --git a/hw/xilinx_intc.c b/hw/xilinx_intc.c
index 0540f52..3f08bf8 100644
--- a/hw/xilinx_intc.c
+++ b/hw/xilinx_intc.c
@@ -150,7 +150,6 @@ static void xilinx_intc_init(SysBusDevice *dev)
     struct xlx_pic *p = FROM_SYSBUS(typeof (*p), dev);
     int pic_regs;
 
-    p->c_kind_of_intr = qdev_get_prop_int(&dev->qdev, "kind-of-intr", 0);
     qdev_init_gpio_in(&dev->qdev, irq_handler, 32);
     sysbus_init_irq(dev, &p->parent_irq);
 
@@ -158,10 +157,23 @@ static void xilinx_intc_init(SysBusDevice *dev)
     sysbus_init_mmio(dev, R_MAX * 4, pic_regs);
 }
 
+static SysBusDeviceInfo xilinx_intc_info = {
+    .init = xilinx_intc_init,
+    .qdev.name  = "xilinx,intc",
+    .qdev.size  = sizeof(struct xlx_pic),
+    .qdev.props = (Property[]) {
+        {
+            .name   = "kind-of-intr",
+            .info   = &qdev_prop_uint32,
+            .offset = offsetof(struct xlx_pic, c_kind_of_intr),
+        },
+        {/* end of list */}
+    }
+};
+
 static void xilinx_intc_register(void)
 {
-    sysbus_register_dev("xilinx,intc", sizeof (struct xlx_pic),
-                        xilinx_intc_init);
+    sysbus_register_withprop(&xilinx_intc_info);
 }
 
 device_init(xilinx_intc_register)
diff --git a/hw/xilinx_timer.c b/hw/xilinx_timer.c
index a64ad2d..efb6a04 100644
--- a/hw/xilinx_timer.c
+++ b/hw/xilinx_timer.c
@@ -61,7 +61,8 @@ struct timerblock
 {
     SysBusDevice busdev;
     qemu_irq irq;
-    unsigned int nr_timers;
+    uint32_t nr_timers;
+    uint32_t freq_hz;
     struct xlx_timer *timers;
 };
 
@@ -192,14 +193,12 @@ static void xilinx_timer_init(SysBusDevice *dev)
 {
     struct timerblock *t = FROM_SYSBUS(typeof (*t), dev);
     unsigned int i;
-    int timer_regs, freq_hz;
+    int timer_regs;
 
     /* All timers share a single irq line.  */
     sysbus_init_irq(dev, &t->irq);
 
     /* Init all the ptimers.  */
-    freq_hz = qdev_get_prop_int(&dev->qdev, "frequency", 2);
-    t->nr_timers = qdev_get_prop_int(&dev->qdev, "nr-timers", 2);
     t->timers = qemu_mallocz(sizeof t->timers[0] * t->nr_timers);
     for (i = 0; i < t->nr_timers; i++) {
         struct xlx_timer *xt = &t->timers[i];
@@ -208,17 +207,36 @@ static void xilinx_timer_init(SysBusDevice *dev)
         xt->nr = i;
         xt->bh = qemu_bh_new(timer_hit, xt);
         xt->ptimer = ptimer_init(xt->bh);
-        ptimer_set_freq(xt->ptimer, freq_hz);
+        ptimer_set_freq(xt->ptimer, t->freq_hz);
     }
 
     timer_regs = cpu_register_io_memory(timer_read, timer_write, t);
     sysbus_init_mmio(dev, R_MAX * 4 * t->nr_timers, timer_regs);
 }
 
+static SysBusDeviceInfo xilinx_timer_info = {
+    .init = xilinx_timer_init,
+    .qdev.name  = "xilinx,timer",
+    .qdev.size  = sizeof(struct timerblock),
+    .qdev.props = (Property[]) {
+        {
+            .name   = "frequency",
+            .info   = &qdev_prop_uint32,
+            .offset = offsetof(struct timerblock, freq_hz),
+            .defval = (uint32_t[]) { 2 },
+        },{
+            .name   = "nr-timers",
+            .info   = &qdev_prop_uint32,
+            .offset = offsetof(struct timerblock, nr_timers),
+            .defval = (uint32_t[]) { 2 },
+        },
+        {/* end of list */}
+    }
+};
+
 static void xilinx_timer_register(void)
 {
-    sysbus_register_dev("xilinx,timer", sizeof (struct timerblock),
-                        xilinx_timer_init);
+    sysbus_register_withprop(&xilinx_timer_info);
 }
 
 device_init(xilinx_timer_register)
-- 
1.6.2.5

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH 2/6] qdev: factor out driver search to qdev_find_info()
  2009-07-15 11:43 [Qemu-devel] [PATCH 0/6] qdev patches: properties, id=<tag>, more device info Gerd Hoffmann
  2009-07-15 11:43 ` [Qemu-devel] [PATCH 1/6] qdev: rework device properties Gerd Hoffmann
@ 2009-07-15 11:43 ` Gerd Hoffmann
  2009-07-15 11:43 ` [Qemu-devel] [PATCH 3/6] qdev: add no_user, alias and desc Gerd Hoffmann
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 21+ messages in thread
From: Gerd Hoffmann @ 2009-07-15 11:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gerd Hoffmann


Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/qdev.c |   22 +++++++++++++++-------
 1 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/hw/qdev.c b/hw/qdev.c
index 9912bd9..644a5be 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -47,6 +47,20 @@ void qdev_register(DeviceInfo *info)
     device_info_list = info;
 }
 
+static DeviceInfo *qdev_find_info(BusInfo *bus_info, const char *name)
+{
+    DeviceInfo *info;
+
+    for (info = device_info_list; info != NULL; info = info->next) {
+        if (bus_info && info->bus_info != bus_info)
+            continue;
+        if (strcmp(info->name, name) != 0)
+            continue;
+        return info;
+    }
+    return NULL;
+}
+
 /* Create a new device.  This only initializes the device state structure
    and allows properties to be set.  qdev_init should be called to
    initialize the actual device emulation.  */
@@ -62,13 +76,7 @@ DeviceState *qdev_create(BusState *bus, const char *name)
         bus = main_system_bus;
     }
 
-    for (info = device_info_list; info != NULL; info = info->next) {
-        if (info->bus_info != bus->info)
-            continue;
-        if (strcmp(info->name, name) != 0)
-            continue;
-        break;
-    }
+    info = qdev_find_info(bus->info, name);
     if (!info) {
         hw_error("Unknown device '%s' for bus '%s'\n", name, bus->info->name);
     }
-- 
1.6.2.5

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH 3/6] qdev: add no_user, alias and desc
  2009-07-15 11:43 [Qemu-devel] [PATCH 0/6] qdev patches: properties, id=<tag>, more device info Gerd Hoffmann
  2009-07-15 11:43 ` [Qemu-devel] [PATCH 1/6] qdev: rework device properties Gerd Hoffmann
  2009-07-15 11:43 ` [Qemu-devel] [PATCH 2/6] qdev: factor out driver search to qdev_find_info() Gerd Hoffmann
@ 2009-07-15 11:43 ` Gerd Hoffmann
  2009-07-15 11:43 ` [Qemu-devel] [PATCH 4/6] qdev: add user-specified identifier to devices Gerd Hoffmann
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 21+ messages in thread
From: Gerd Hoffmann @ 2009-07-15 11:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gerd Hoffmann

no_user: prevent users from adding certain devices.
desc: description of the device.
alias: to allow user friendly shortcuts on the command line, i.e.
  -device usbmouse  instead of  -device "QEMU USB Mouse"  or
  -device lsi       instead of  -device lsi53c895a

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/qdev.c |   12 ++++++++++++
 hw/qdev.h |    3 +++
 2 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/hw/qdev.c b/hw/qdev.c
index 644a5be..53e9b00 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -51,6 +51,7 @@ static DeviceInfo *qdev_find_info(BusInfo *bus_info, const char *name)
 {
     DeviceInfo *info;
 
+    /* first check device names */
     for (info = device_info_list; info != NULL; info = info->next) {
         if (bus_info && info->bus_info != bus_info)
             continue;
@@ -58,6 +59,17 @@ static DeviceInfo *qdev_find_info(BusInfo *bus_info, const char *name)
             continue;
         return info;
     }
+
+    /* failing that check the aliases */
+    for (info = device_info_list; info != NULL; info = info->next) {
+        if (bus_info && info->bus_info != bus_info)
+            continue;
+        if (!info->alias)
+            continue;
+        if (strcmp(info->alias, name) != 0)
+            continue;
+        return info;
+    }
     return NULL;
 }
 
diff --git a/hw/qdev.h b/hw/qdev.h
index 9ecc9ec..115c2d0 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -87,8 +87,11 @@ typedef void (*SCSIAttachFn)(DeviceState *host, BlockDriverState *bdrv,
 
 struct DeviceInfo {
     const char *name;
+    const char *alias;
+    const char *desc;
     size_t size;
     Property *props;
+    int no_user;
 
     /* Private to qdev / bus.  */
     qdev_initfn init;
-- 
1.6.2.5

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH 4/6] qdev: add user-specified identifier to devices.
  2009-07-15 11:43 [Qemu-devel] [PATCH 0/6] qdev patches: properties, id=<tag>, more device info Gerd Hoffmann
                   ` (2 preceding siblings ...)
  2009-07-15 11:43 ` [Qemu-devel] [PATCH 3/6] qdev: add no_user, alias and desc Gerd Hoffmann
@ 2009-07-15 11:43 ` Gerd Hoffmann
  2009-07-15 11:43 ` [Qemu-devel] [PATCH 5/6] qdev: add id= support for pci nics Gerd Hoffmann
  2009-07-15 11:43 ` [Qemu-devel] [PATCH 6/6] qdev: print device id in "info pci" Gerd Hoffmann
  5 siblings, 0 replies; 21+ messages in thread
From: Gerd Hoffmann @ 2009-07-15 11:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gerd Hoffmann

Add id field to DeviceState.  Make "info qtree" print it.

This helps users and management apps identifying devices in monitor
output, which is especially useful with otherwise identical devices
such as two virtio disks.

This patch doesn't add a way to set the id, followup patches will do.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/qdev.c |    6 ++++--
 hw/qdev.h |    1 +
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/hw/qdev.c b/hw/qdev.c
index 53e9b00..aa555fc 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -114,7 +114,8 @@ void qdev_init(DeviceState *dev)
 void qdev_free(DeviceState *dev)
 {
     LIST_REMOVE(dev, sibling);
-    free(dev);
+    qemu_free(dev->id);
+    qemu_free(dev);
 }
 
 /* Get a character (serial) device interface.  */
@@ -266,7 +267,8 @@ static void qdev_print_props(Monitor *mon, DeviceState *dev, Property *props,
 static void qdev_print(Monitor *mon, DeviceState *dev, int indent)
 {
     BusState *child;
-    qdev_printf("dev: %s\n", dev->info->name);
+    qdev_printf("dev: %s, id \"%s\"\n", dev->info->name,
+                dev->id ? dev->id : "");
     indent += 2;
     if (dev->num_gpio_in) {
         qdev_printf("gpio-in %d\n", dev->num_gpio_in);
diff --git a/hw/qdev.h b/hw/qdev.h
index 115c2d0..4c6e673 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -17,6 +17,7 @@ typedef struct BusInfo BusInfo;
 /* This structure should not be accessed directly.  We declare it here
    so that it can be embedded in individual device state structures.  */
 struct DeviceState {
+    char *id;
     DeviceInfo *info;
     BusState *parent_bus;
     int num_gpio_out;
-- 
1.6.2.5

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH 5/6] qdev: add id= support for pci nics.
  2009-07-15 11:43 [Qemu-devel] [PATCH 0/6] qdev patches: properties, id=<tag>, more device info Gerd Hoffmann
                   ` (3 preceding siblings ...)
  2009-07-15 11:43 ` [Qemu-devel] [PATCH 4/6] qdev: add user-specified identifier to devices Gerd Hoffmann
@ 2009-07-15 11:43 ` Gerd Hoffmann
  2009-07-15 11:43 ` [Qemu-devel] [PATCH 6/6] qdev: print device id in "info pci" Gerd Hoffmann
  5 siblings, 0 replies; 21+ messages in thread
From: Gerd Hoffmann @ 2009-07-15 11:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gerd Hoffmann


Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/pci.c |    2 ++
 net.c    |    5 ++++-
 net.h    |    1 +
 3 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/hw/pci.c b/hw/pci.c
index 3232dda..79eab91 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -821,6 +821,8 @@ PCIDevice *pci_nic_init(NICInfo *nd, const char *default_model,
         if (strcmp(nd->model, pci_nic_models[i]) == 0) {
             pci_dev = pci_create(pci_nic_names[i], devaddr);
             dev = &pci_dev->qdev;
+            if (nd->id)
+                dev->id = qemu_strdup(nd->id);
             dev->nd = nd;
             qdev_init(dev);
             nd->private = dev;
diff --git a/net.c b/net.c
index 1507f37..ca8d232 100644
--- a/net.c
+++ b/net.c
@@ -2428,7 +2428,7 @@ int net_client_init(Monitor *mon, const char *device, const char *p)
     }
     if (!strcmp(device, "nic")) {
         static const char * const nic_params[] = {
-            "vlan", "name", "macaddr", "model", "addr", "vectors", NULL
+            "vlan", "name", "macaddr", "model", "addr", "id", "vectors", NULL
         };
         NICInfo *nd;
         uint8_t *macaddr;
@@ -2466,6 +2466,9 @@ int net_client_init(Monitor *mon, const char *device, const char *p)
         if (get_param_value(buf, sizeof(buf), "addr", p)) {
             nd->devaddr = strdup(buf);
         }
+        if (get_param_value(buf, sizeof(buf), "id", p)) {
+            nd->id = strdup(buf);
+        }
         nd->nvectors = NIC_NVECTORS_UNSPECIFIED;
         if (get_param_value(buf, sizeof(buf), "vectors", p)) {
             char *endptr;
diff --git a/net.h b/net.h
index 6026e10..188fa39 100644
--- a/net.h
+++ b/net.h
@@ -95,6 +95,7 @@ struct NICInfo {
     const char *model;
     const char *name;
     const char *devaddr;
+    const char *id;
     VLANState *vlan;
     VLANClientState *vc;
     void *private;
-- 
1.6.2.5

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH 6/6] qdev: print device id in "info pci".
  2009-07-15 11:43 [Qemu-devel] [PATCH 0/6] qdev patches: properties, id=<tag>, more device info Gerd Hoffmann
                   ` (4 preceding siblings ...)
  2009-07-15 11:43 ` [Qemu-devel] [PATCH 5/6] qdev: add id= support for pci nics Gerd Hoffmann
@ 2009-07-15 11:43 ` Gerd Hoffmann
  5 siblings, 0 replies; 21+ messages in thread
From: Gerd Hoffmann @ 2009-07-15 11:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gerd Hoffmann


Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/pci.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/hw/pci.c b/hw/pci.c
index 79eab91..5e2996b 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -737,6 +737,7 @@ static void pci_info_device(PCIDevice *d)
             }
         }
     }
+    monitor_printf(mon, "      id \"%s\"\n", d->qdev.id ? d->qdev.id : "");
     if (class == 0x0604 && d->config[0x19] != 0) {
         pci_for_each_device(d->config[0x19], pci_info_device);
     }
-- 
1.6.2.5

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties.
  2009-07-15 11:43 ` [Qemu-devel] [PATCH 1/6] qdev: rework device properties Gerd Hoffmann
@ 2012-10-17 20:14   ` Eduardo Habkost
  2012-10-17 21:05     ` Stefan Weil
                       ` (8 more replies)
  0 siblings, 9 replies; 21+ messages in thread
From: Eduardo Habkost @ 2012-10-17 20:14 UTC (permalink / raw)
  To: Gerd Hoffmann
  Cc: Michael S. Tsirkin, Jan Kiszka, qemu-devel, dunrong huang,
	Markus Armbruster, Blue Swirl, Stefan Weil, Zhi Yong Wu,
	Donald Dutile, Juan Quintela, Michael Roth,
	Christian Borntraeger, Anthony PERARD, Kusanagi Kouichi,
	Stefan Hajnoczi, Stefan Weil, Christoph Egger, Jan Kiszka,
	Kevin Wolf, David 'Digit' Turner, Anthony Liguori,
	Isaku Yamahata, Amit Shah, Paolo Bonzini

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.



> +#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

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties.
  2012-10-17 20:14   ` Eduardo Habkost
@ 2012-10-17 21:05     ` Stefan Weil
  2012-10-17 21:50       ` Eduardo Habkost
  2012-10-18  6:19     ` Gerd Hoffmann
                       ` (7 subsequent siblings)
  8 siblings, 1 reply; 21+ messages in thread
From: Stefan Weil @ 2012-10-17 21:05 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: Michael S. Tsirkin, Jan Kiszka, qemu-devel, dunrong huang,
	Markus Armbruster, Blue Swirl, Stefan Weil, Zhi Yong Wu,
	Donald Dutile, Gerd Hoffmann, Juan Quintela, Michael Roth,
	Christian Borntraeger, Anthony PERARD, Kusanagi Kouichi,
	Stefan Hajnoczi, Stefan Weil, Christoph Egger, Jan Kiszka,
	Kevin Wolf, David 'Digit' Turner, Anthony Liguori,
	Isaku Yamahata, Amit Shah, Paolo Bonzini

> 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 prefer and assumed GPL2+ because that is kind of standard for many
files of QEMU, but would not mind any other free licenses like
LGPL2+, BSD or Public Domain for hw/qdev-properties.c

Regards

Stefan Weil

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties.
  2012-10-17 21:05     ` Stefan Weil
@ 2012-10-17 21:50       ` Eduardo Habkost
  2012-10-18  8:07         ` Paolo Bonzini
  0 siblings, 1 reply; 21+ messages in thread
From: Eduardo Habkost @ 2012-10-17 21:50 UTC (permalink / raw)
  To: Stefan Weil
  Cc: Michael S. Tsirkin, Jan Kiszka, qemu-devel, dunrong huang,
	Markus Armbruster, Blue Swirl, Stefan Weil, Zhi Yong Wu,
	Donald Dutile, Gerd Hoffmann, Juan Quintela, Michael Roth,
	Christian Borntraeger, Anthony PERARD, Kusanagi Kouichi,
	Stefan Hajnoczi, Christoph Egger, Jan Kiszka, Kevin Wolf,
	David 'Digit' Turner, Anthony Liguori, Isaku Yamahata,
	Amit Shah, Paolo Bonzini

On Wed, Oct 17, 2012 at 11:05:22PM +0200, Stefan Weil 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 prefer and assumed GPL2+ because that is kind of standard for many
> files of QEMU, but would not mind any other free licenses like
> LGPL2+, BSD or Public Domain for hw/qdev-properties.c

I suppose that's the usual assumption when the file doesn't have an
explicit license, as it's the license specified on the LICENSE file.

The only problem is that the LICENSE file doesn't specify the GPL
version, so it's a bit complicated. Some opinions can be found here:
<http://article.gmane.org/gmane.comp.emulators.qemu/122665>.

Unless every single author replies and accepts the adoption of another
license (which I find very unlikely), I plan to submit a patch adding a
GPLv2+ license header.

-- 
Eduardo

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties.
  2012-10-17 20:14   ` Eduardo Habkost
  2012-10-17 21:05     ` Stefan Weil
@ 2012-10-18  6:19     ` Gerd Hoffmann
  2012-10-18  6:24     ` Christian Borntraeger
                       ` (6 subsequent siblings)
  8 siblings, 0 replies; 21+ messages in thread
From: Gerd Hoffmann @ 2012-10-18  6:19 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: Michael S. Tsirkin, Jan Kiszka, qemu-devel, dunrong huang,
	Markus Armbruster, Blue Swirl, Stefan Weil, Zhi Yong Wu,
	Donald Dutile, Juan Quintela, Michael Roth,
	Christian Borntraeger, Anthony PERARD, Kusanagi Kouichi,
	Stefan Hajnoczi, Stefan Weil, Christoph Egger, Jan Kiszka,
	Kevin Wolf, David 'Digit' Turner, Anthony Liguori,
	Isaku Yamahata, Amit Shah, Paolo Bonzini

On 10/17/12 22:14, 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.

gplv2+

cheers,
  Gerd

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties.
  2012-10-17 20:14   ` Eduardo Habkost
  2012-10-17 21:05     ` Stefan Weil
  2012-10-18  6:19     ` Gerd Hoffmann
@ 2012-10-18  6:24     ` Christian Borntraeger
  2012-10-18  6:32     ` Jan Kiszka
                       ` (5 subsequent siblings)
  8 siblings, 0 replies; 21+ messages in thread
From: Christian Borntraeger @ 2012-10-18  6:24 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: Michael S. Tsirkin, Jan Kiszka, qemu-devel, dunrong huang,
	Markus Armbruster, Blue Swirl, Stefan Weil, Zhi Yong Wu,
	Donald Dutile, Gerd Hoffmann, Juan Quintela, Michael Roth,
	Isaku Yamahata, Anthony PERARD, Kusanagi Kouichi,
	Stefan Hajnoczi, Stefan Weil, Christoph Egger, Jan Kiszka,
	Kevin Wolf, David 'Digit' Turner, Anthony Liguori,
	Amit Shah, Paolo Bonzini

On 17/10/12 22:14, 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 assumed GPLv2+.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties.
  2012-10-17 20:14   ` Eduardo Habkost
                       ` (2 preceding siblings ...)
  2012-10-18  6:24     ` Christian Borntraeger
@ 2012-10-18  6:32     ` Jan Kiszka
  2012-10-19  7:25       ` Markus Armbruster
  2012-10-19  7:23     ` Markus Armbruster
                       ` (4 subsequent siblings)
  8 siblings, 1 reply; 21+ messages in thread
From: Jan Kiszka @ 2012-10-18  6:32 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: Michael S. Tsirkin, qemu-devel, dunrong huang, Markus Armbruster,
	Blue Swirl, Stefan Weil, Zhi Yong Wu, Donald Dutile,
	Gerd Hoffmann, Juan Quintela, Michael Roth,
	Christian Borntraeger, Anthony PERARD, Kusanagi Kouichi,
	Stefan Hajnoczi, Stefan Weil, Christoph Egger, Jan Kiszka,
	Kevin Wolf, David 'Digit' Turner, Anthony Liguori,
	Isaku Yamahata, Amit Shah, Paolo Bonzini

On 2012-10-17 22:14, 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.

Under the license the original author considered for this file. If that
is unclear, GPLv2.

Jan

-- 
Siemens AG, Corporate Technology, CT RTC ITP SDP-DE
Corporate Competence Center Embedded Linux

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties.
  2012-10-17 21:50       ` Eduardo Habkost
@ 2012-10-18  8:07         ` Paolo Bonzini
  0 siblings, 0 replies; 21+ messages in thread
From: Paolo Bonzini @ 2012-10-18  8:07 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: Michael S. Tsirkin, Jan Kiszka, qemu-devel, dunrong huang,
	Markus Armbruster, Blue Swirl, Stefan Weil, Zhi Yong Wu,
	Donald Dutile, Gerd Hoffmann, Juan Quintela, Michael Roth,
	Christian Borntraeger, Anthony PERARD, Kusanagi Kouichi,
	Stefan Hajnoczi, Stefan Weil, Christoph Egger, Jan Kiszka,
	Kevin Wolf, David 'Digit' Turner, Anthony Liguori,
	Isaku Yamahata, Amit Shah

Il 17/10/2012 23:50, Eduardo Habkost ha scritto:
> I suppose that's the usual assumption when the file doesn't have an
> explicit license, as it's the license specified on the LICENSE file.
> 
> The only problem is that the LICENSE file doesn't specify the GPL
> version, so it's a bit complicated. Some opinions can be found here:
> <http://article.gmane.org/gmane.comp.emulators.qemu/122665>.
> 
> Unless every single author replies and accepts the adoption of another
> license (which I find very unlikely), I plan to submit a patch adding a
> GPLv2+ license header.

GPLv2+ should be the default license for files without a heading, except
if the history of the file shows that the code came originally from the
Linux kernel or another GPLv2-only project/file.

Paolo

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties.
  2012-10-17 20:14   ` Eduardo Habkost
                       ` (3 preceding siblings ...)
  2012-10-18  6:32     ` Jan Kiszka
@ 2012-10-19  7:23     ` Markus Armbruster
  2012-10-19  8:30     ` Michael S. Tsirkin
                       ` (3 subsequent siblings)
  8 siblings, 0 replies; 21+ messages in thread
From: Markus Armbruster @ 2012-10-19  7:23 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: Michael S. Tsirkin, Jan Kiszka, qemu-devel, dunrong huang,
	Blue Swirl, Stefan Weil, Zhi Yong Wu, Donald Dutile,
	Gerd Hoffmann, Juan Quintela, Michael Roth,
	Christian Borntraeger, Anthony PERARD, Kusanagi Kouichi,
	Stefan Hajnoczi, Stefan Weil, Anthony Liguori, Jan Kiszka,
	Kevin Wolf, David 'Digit' Turner, Christoph Egger,
	Isaku Yamahata, Amit Shah, Paolo Bonzini

Eduardo Habkost <ehabkost@redhat.com> writes:

> 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.

GPLv2+

In fact, I like to protect my work with

 * Contributions after <today> are licensed under the terms of the
 * GNU GPL, version 2 or (at your option) any later version.

whenever I make major changes to files with weaker licenses, unless
there are specific reasons to stick to the weak license.

Too bad I didn't pay attention when I worked actively on this one.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties.
  2012-10-18  6:32     ` Jan Kiszka
@ 2012-10-19  7:25       ` Markus Armbruster
  0 siblings, 0 replies; 21+ messages in thread
From: Markus Armbruster @ 2012-10-19  7:25 UTC (permalink / raw)
  To: Jan Kiszka
  Cc: Michael S. Tsirkin, qemu-devel, dunrong huang, Blue Swirl,
	Stefan Weil, Zhi Yong Wu, Donald Dutile, Gerd Hoffmann,
	Stefan Hajnoczi, Juan Quintela, Michael Roth, 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

Jan Kiszka <jan.kiszka@siemens.com> writes:

> On 2012-10-17 22:14, 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.
>
> Under the license the original author considered for this file. If that
> is unclear, GPLv2.

For what it's worth, the original author is kraxel, and he just said he
intended GPLv2+.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties.
  2012-10-17 20:14   ` Eduardo Habkost
                       ` (4 preceding siblings ...)
  2012-10-19  7:23     ` Markus Armbruster
@ 2012-10-19  8:30     ` Michael S. Tsirkin
  2012-10-19 17:18     ` Blue Swirl
                       ` (2 subsequent siblings)
  8 siblings, 0 replies; 21+ messages in thread
From: Michael S. Tsirkin @ 2012-10-19  8:30 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: Jan Kiszka, qemu-devel, dunrong huang, Markus Armbruster,
	Blue Swirl, Stefan Weil, Zhi Yong Wu, Donald Dutile,
	Gerd Hoffmann, Juan Quintela, Michael Roth,
	Christian Borntraeger, Anthony PERARD, Kusanagi Kouichi,
	Stefan Hajnoczi, Stefan Weil, Christoph Egger, Jan Kiszka,
	Kevin Wolf, David 'Digit' Turner, Anthony Liguori,
	Isaku Yamahata, Amit Shah, Paolo Bonzini

On Wed, Oct 17, 2012 at 05:14:14PM -0300, 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.

GPLv2+

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties.
  2012-10-17 20:14   ` Eduardo Habkost
                       ` (5 preceding siblings ...)
  2012-10-19  8:30     ` Michael S. Tsirkin
@ 2012-10-19 17:18     ` Blue Swirl
  2012-10-19 18:57       ` Michael Roth
  2012-10-22 10:45     ` Amit Shah
  2012-10-23  3:14     ` Isaku Yamahata
  8 siblings, 1 reply; 21+ messages in thread
From: Blue Swirl @ 2012-10-19 17:18 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: Michael S. Tsirkin, Jan Kiszka, qemu-devel, dunrong huang,
	Markus Armbruster, Stefan Weil, Zhi Yong Wu, Donald Dutile,
	Gerd Hoffmann, Juan Quintela, Michael Roth,
	Christian Borntraeger, Anthony PERARD, Kusanagi Kouichi,
	Stefan Hajnoczi, Stefan Weil, Christoph Egger, Jan Kiszka,
	Kevin Wolf, David 'Digit' Turner, Anthony Liguori,
	Isaku Yamahata, Amit Shah, Paolo Bonzini

On Wed, Oct 17, 2012 at 8:14 PM, Eduardo Habkost <ehabkost@redhat.com> 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

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties.
  2012-10-19 17:18     ` Blue Swirl
@ 2012-10-19 18:57       ` Michael Roth
  0 siblings, 0 replies; 21+ messages in thread
From: Michael Roth @ 2012-10-19 18:57 UTC (permalink / raw)
  To: Blue Swirl
  Cc: Michael S. Tsirkin, Jan Kiszka, qemu-devel, 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 <ehabkost@redhat.com> 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
> 

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties.
  2012-10-17 20:14   ` Eduardo Habkost
                       ` (6 preceding siblings ...)
  2012-10-19 17:18     ` Blue Swirl
@ 2012-10-22 10:45     ` Amit Shah
  2012-10-23  3:14     ` Isaku Yamahata
  8 siblings, 0 replies; 21+ messages in thread
From: Amit Shah @ 2012-10-22 10:45 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: Michael S. Tsirkin, Jan Kiszka, qemu-devel, dunrong huang,
	Markus Armbruster, Blue Swirl, Stefan Weil, Zhi Yong Wu,
	Donald Dutile, Gerd Hoffmann, Juan Quintela, Michael Roth,
	Isaku Yamahata, Anthony PERARD, Kusanagi Kouichi,
	Stefan Hajnoczi, Stefan Weil, Christoph Egger, Jan Kiszka,
	Christian Borntraeger, Kevin Wolf, David 'Digit' Turner,
	Anthony Liguori, Paolo Bonzini

On (Wed) 17 Oct 2012 [17:14:14], 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.

GPLv2+

		Amit

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH 1/6] qdev: rework device properties.
  2012-10-17 20:14   ` Eduardo Habkost
                       ` (7 preceding siblings ...)
  2012-10-22 10:45     ` Amit Shah
@ 2012-10-23  3:14     ` Isaku Yamahata
  8 siblings, 0 replies; 21+ messages in thread
From: Isaku Yamahata @ 2012-10-23  3:14 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: Michael S. Tsirkin, Jan Kiszka, qemu-devel, dunrong huang,
	Markus Armbruster, Blue Swirl, Stefan Weil, Zhi Yong Wu,
	Donald Dutile, Gerd Hoffmann, Juan Quintela, Michael Roth,
	Christian Borntraeger, Anthony PERARD, Kusanagi Kouichi,
	Stefan Hajnoczi, Stefan Weil, Christoph Egger, Jan Kiszka,
	Kevin Wolf, David 'Digit' Turner, Anthony Liguori,
	Amit Shah, Paolo Bonzini

On Wed, Oct 17, 2012 at 05:14:14PM -0300, 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'm fine with GPLv2+.
-- 
yamahata

^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2012-10-23  3:14 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-07-15 11:43 [Qemu-devel] [PATCH 0/6] qdev patches: properties, id=<tag>, more device info Gerd Hoffmann
2009-07-15 11:43 ` [Qemu-devel] [PATCH 1/6] qdev: rework device properties Gerd Hoffmann
2012-10-17 20:14   ` Eduardo Habkost
2012-10-17 21:05     ` Stefan Weil
2012-10-17 21:50       ` Eduardo Habkost
2012-10-18  8:07         ` Paolo Bonzini
2012-10-18  6:19     ` Gerd Hoffmann
2012-10-18  6:24     ` Christian Borntraeger
2012-10-18  6:32     ` Jan Kiszka
2012-10-19  7:25       ` Markus Armbruster
2012-10-19  7:23     ` Markus Armbruster
2012-10-19  8:30     ` Michael S. Tsirkin
2012-10-19 17:18     ` Blue Swirl
2012-10-19 18:57       ` Michael Roth
2012-10-22 10:45     ` Amit Shah
2012-10-23  3:14     ` Isaku Yamahata
2009-07-15 11:43 ` [Qemu-devel] [PATCH 2/6] qdev: factor out driver search to qdev_find_info() Gerd Hoffmann
2009-07-15 11:43 ` [Qemu-devel] [PATCH 3/6] qdev: add no_user, alias and desc Gerd Hoffmann
2009-07-15 11:43 ` [Qemu-devel] [PATCH 4/6] qdev: add user-specified identifier to devices Gerd Hoffmann
2009-07-15 11:43 ` [Qemu-devel] [PATCH 5/6] qdev: add id= support for pci nics Gerd Hoffmann
2009-07-15 11:43 ` [Qemu-devel] [PATCH 6/6] qdev: print device id in "info pci" Gerd Hoffmann

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.