qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/5] Add '-device help' output for device params and help text
@ 2010-05-31 12:41 Amit Shah
  2010-05-31 12:41 ` [Qemu-devel] [PATCH 1/5] qdev: Add a description field for qdev properties for documentation Amit Shah
                   ` (5 more replies)
  0 siblings, 6 replies; 12+ messages in thread
From: Amit Shah @ 2010-05-31 12:41 UTC (permalink / raw)
  To: qemu list; +Cc: Amit Shah, Juan Quintela, Markus Armbruster, Gerd Hoffmann

Hello,

This patch series adds support to specify some descriptive help text
to qdev device parameters. This series adds some help text to the
virtserialport and net family of devices as an example, and the new
output is shown in the respective commits.

This series also adds a new '-device help' option that lists all the
available qdev devices (which is avl. via -device ? now), and adds
each device's parameters to the output listing. This output also shows
the descriptive text.

The idea is to auto-generate documentation from code and to populate
some wiki / qemu-doc.texi using this new target.

Changes from previous send:
- Removed the 'RFC' tag
- Not using macros in net.h (Markus)

It'll be helpful to have people submit some short descriptive text for
the subsystems they care about.

Amit Shah (5):
  qdev: Add a description field for qdev properties for documentation
  virtio-serial: Add description fields for qdev properties
  net.h: Add description fields for qdev properites
  qdev: Re-arrange code to have device properties shown from own
    function
  qdev: Add new '-device help' option, shows all devices and properties

 block_int.h           |   10 +++---
 hw/a9mpcore.c         |    2 +-
 hw/acpi_piix4.c       |    2 +-
 hw/arm11mpcore.c      |    4 +-
 hw/arm_sysctl.c       |    4 +-
 hw/armv7m.c           |    2 +-
 hw/cs4231a.c          |    6 ++--
 hw/debugcon.c         |    6 ++--
 hw/eccmemctl.c        |    2 +-
 hw/escc.c             |   16 +++++-----
 hw/etraxfs_pic.c      |    3 +-
 hw/fdc.c              |   10 +++---
 hw/gus.c              |    8 ++--
 hw/i2c.c              |    2 +-
 hw/ide/cmd646.c       |    2 +-
 hw/ide/isa.c          |    6 ++--
 hw/ide/qdev.c         |    4 +-
 hw/integratorcp.c     |    2 +-
 hw/lance.c            |    2 +-
 hw/m48t59.c           |   12 ++++----
 hw/mc146818rtc.c      |    2 +-
 hw/ne2000-isa.c       |    4 +-
 hw/parallel.c         |    8 ++--
 hw/pci.c              |   10 +++---
 hw/qdev-addr.h        |    4 +-
 hw/qdev.c             |   51 +++++++++++++++++++++------------
 hw/qdev.h             |   75 ++++++++++++++++++++++++++-----------------------
 hw/s390-virtio-bus.c  |    2 +-
 hw/sb16.c             |   10 +++---
 hw/scsi-bus.c         |    2 +-
 hw/scsi-disk.c        |    2 +-
 hw/serial.c           |    8 ++--
 hw/slavio_timer.c     |    2 +-
 hw/smbus_eeprom.c     |    2 +-
 hw/sparc32_dma.c      |    2 +-
 hw/sun4m.c            |    2 +-
 hw/sun4m_iommu.c      |    2 +-
 hw/sun4u.c            |    2 +-
 hw/syborg_fb.c        |    4 +-
 hw/syborg_interrupt.c |    2 +-
 hw/syborg_keyboard.c  |    2 +-
 hw/syborg_pointer.c   |    4 +-
 hw/syborg_serial.c    |    2 +-
 hw/syborg_timer.c     |    2 +-
 hw/tcx.c              |   10 +++---
 hw/usb-ohci.c         |    4 +-
 hw/usb-serial.c       |   12 ++++----
 hw/vga-pci.c          |    4 +-
 hw/virtio-blk.h       |    4 +-
 hw/virtio-console.c   |   19 ++++++++----
 hw/virtio-net.h       |   51 +++++++++++++++++++++------------
 hw/virtio-pci.c       |   16 +++++-----
 hw/virtio-serial.h    |   13 ++++++++
 hw/virtio.h           |    2 +-
 hw/xilinx_ethlite.c   |    6 ++-
 hw/xilinx_intc.c      |    3 +-
 hw/xilinx_timer.c     |    4 +-
 net.h                 |    9 ++++--
 usb-linux.c           |    8 ++--
 59 files changed, 268 insertions(+), 208 deletions(-)

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

* [Qemu-devel] [PATCH 1/5] qdev: Add a description field for qdev properties for documentation
  2010-05-31 12:41 [Qemu-devel] [PATCH 0/5] Add '-device help' output for device params and help text Amit Shah
@ 2010-05-31 12:41 ` Amit Shah
  2010-05-31 12:41 ` [Qemu-devel] [PATCH 2/5] virtio-serial: Add description fields for qdev properties Amit Shah
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 12+ messages in thread
From: Amit Shah @ 2010-05-31 12:41 UTC (permalink / raw)
  To: qemu list; +Cc: Amit Shah, Juan Quintela, Markus Armbruster, Gerd Hoffmann

Add a 'description' along with each qdev property to document the input
each qdev property takes.

Signed-off-by: Amit Shah <amit.shah@redhat.com>
---
 block_int.h           |   10 +++---
 hw/a9mpcore.c         |    2 +-
 hw/acpi_piix4.c       |    2 +-
 hw/arm11mpcore.c      |    4 +-
 hw/arm_sysctl.c       |    4 +-
 hw/armv7m.c           |    2 +-
 hw/cs4231a.c          |    6 ++--
 hw/debugcon.c         |    6 ++--
 hw/eccmemctl.c        |    2 +-
 hw/escc.c             |   16 +++++-----
 hw/etraxfs_pic.c      |    3 +-
 hw/fdc.c              |   10 +++---
 hw/gus.c              |    8 ++--
 hw/i2c.c              |    2 +-
 hw/ide/cmd646.c       |    2 +-
 hw/ide/isa.c          |    6 ++--
 hw/ide/qdev.c         |    4 +-
 hw/integratorcp.c     |    2 +-
 hw/lance.c            |    2 +-
 hw/m48t59.c           |   12 ++++----
 hw/mc146818rtc.c      |    2 +-
 hw/ne2000-isa.c       |    4 +-
 hw/parallel.c         |    8 ++--
 hw/pci.c              |   10 +++---
 hw/qdev-addr.h        |    4 +-
 hw/qdev.c             |    3 +-
 hw/qdev.h             |   75 ++++++++++++++++++++++++++-----------------------
 hw/s390-virtio-bus.c  |    2 +-
 hw/sb16.c             |   10 +++---
 hw/scsi-bus.c         |    2 +-
 hw/scsi-disk.c        |    2 +-
 hw/serial.c           |    8 ++--
 hw/slavio_timer.c     |    2 +-
 hw/smbus_eeprom.c     |    2 +-
 hw/sparc32_dma.c      |    2 +-
 hw/sun4m.c            |    2 +-
 hw/sun4m_iommu.c      |    2 +-
 hw/sun4u.c            |    2 +-
 hw/syborg_fb.c        |    4 +-
 hw/syborg_interrupt.c |    2 +-
 hw/syborg_keyboard.c  |    2 +-
 hw/syborg_pointer.c   |    4 +-
 hw/syborg_serial.c    |    2 +-
 hw/syborg_timer.c     |    2 +-
 hw/tcx.c              |   10 +++---
 hw/usb-ohci.c         |    4 +-
 hw/usb-serial.c       |   12 ++++----
 hw/vga-pci.c          |    4 +-
 hw/virtio-blk.h       |    4 +-
 hw/virtio-console.c   |   16 ++++++----
 hw/virtio-net.h       |   51 +++++++++++++++++++++------------
 hw/virtio-pci.c       |   16 +++++-----
 hw/virtio.h           |    2 +-
 hw/xilinx_ethlite.c   |    6 ++-
 hw/xilinx_intc.c      |    3 +-
 hw/xilinx_timer.c     |    4 +-
 net.h                 |    6 ++--
 usb-linux.c           |    8 ++--
 58 files changed, 218 insertions(+), 191 deletions(-)

diff --git a/block_int.h b/block_int.h
index 1a7240c..767cd29 100644
--- a/block_int.h
+++ b/block_int.h
@@ -231,12 +231,12 @@ static inline unsigned int get_physical_block_exp(BlockConf *conf)
 }
 
 #define DEFINE_BLOCK_PROPERTIES(_state, _conf)                          \
-    DEFINE_PROP_DRIVE("drive", _state, _conf.dinfo),                    \
+    DEFINE_PROP_DRIVE("drive", _state, _conf.dinfo, ""),                \
     DEFINE_PROP_UINT16("logical_block_size", _state,                    \
-                       _conf.logical_block_size, 512),                  \
+                       _conf.logical_block_size, 512, ""),              \
     DEFINE_PROP_UINT16("physical_block_size", _state,                   \
-                       _conf.physical_block_size, 512),                 \
-    DEFINE_PROP_UINT16("min_io_size", _state, _conf.min_io_size, 512),  \
-    DEFINE_PROP_UINT32("opt_io_size", _state, _conf.opt_io_size, 512)
+                       _conf.physical_block_size, 512, ""),             \
+    DEFINE_PROP_UINT16("min_io_size", _state, _conf.min_io_size, 512, ""), \
+    DEFINE_PROP_UINT32("opt_io_size", _state, _conf.opt_io_size, 512, "")
 
 #endif /* BLOCK_INT_H */
diff --git a/hw/a9mpcore.c b/hw/a9mpcore.c
index b5e5328..174f5d5 100644
--- a/hw/a9mpcore.c
+++ b/hw/a9mpcore.c
@@ -16,7 +16,7 @@ static SysBusDeviceInfo mpcore_priv_info = {
     .qdev.name  = "a9mpcore_priv",
     .qdev.size  = sizeof(mpcore_priv_state),
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("num-cpu", mpcore_priv_state, num_cpu, 1),
+        DEFINE_PROP_UINT32("num-cpu", mpcore_priv_state, num_cpu, 1, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c
index 0fce958..fa65cc2 100644
--- a/hw/acpi_piix4.c
+++ b/hw/acpi_piix4.c
@@ -410,7 +410,7 @@ static PCIDeviceInfo piix4_pm_info = {
     .init               = piix4_pm_initfn,
     .config_write       = pm_write_config,
     .qdev.props         = (Property[]) {
-        DEFINE_PROP_UINT32("smb_io_base", PIIX4PMState, smb_io_base, 0),
+        DEFINE_PROP_UINT32("smb_io_base", PIIX4PMState, smb_io_base, 0, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/arm11mpcore.c b/hw/arm11mpcore.c
index 3bbd885..a3a7a9d 100644
--- a/hw/arm11mpcore.c
+++ b/hw/arm11mpcore.c
@@ -88,7 +88,7 @@ static SysBusDeviceInfo mpcore_rirq_info = {
     .qdev.name  = "realview_mpcore",
     .qdev.size  = sizeof(mpcore_rirq_state),
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("num-cpu", mpcore_rirq_state, num_cpu, 1),
+        DEFINE_PROP_UINT32("num-cpu", mpcore_rirq_state, num_cpu, 1, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
@@ -98,7 +98,7 @@ static SysBusDeviceInfo mpcore_priv_info = {
     .qdev.name  = "arm11mpcore_priv",
     .qdev.size  = sizeof(mpcore_priv_state),
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("num-cpu", mpcore_priv_state, num_cpu, 1),
+        DEFINE_PROP_UINT32("num-cpu", mpcore_priv_state, num_cpu, 1, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/arm_sysctl.c b/hw/arm_sysctl.c
index 0cb2ffc..b35d269 100644
--- a/hw/arm_sysctl.c
+++ b/hw/arm_sysctl.c
@@ -232,8 +232,8 @@ static SysBusDeviceInfo arm_sysctl_info = {
     .qdev.size  = sizeof(arm_sysctl_state),
     .qdev.reset = arm_sysctl_reset,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("sys_id", arm_sysctl_state, sys_id, 0),
-        DEFINE_PROP_UINT32("proc_id", arm_sysctl_state, proc_id, 0),
+        DEFINE_PROP_UINT32("sys_id", arm_sysctl_state, sys_id, 0, ""),
+        DEFINE_PROP_UINT32("proc_id", arm_sysctl_state, proc_id, 0, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/armv7m.c b/hw/armv7m.c
index 854261d..9f8f2a0 100644
--- a/hw/armv7m.c
+++ b/hw/armv7m.c
@@ -247,7 +247,7 @@ static SysBusDeviceInfo bitband_info = {
     .qdev.name  = "ARM,bitband-memory",
     .qdev.size  = sizeof(BitBandState),
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("base", BitBandState, base, 0),
+        DEFINE_PROP_UINT32("base", BitBandState, base, 0, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/cs4231a.c b/hw/cs4231a.c
index 4d5ce5c..330dd4a 100644
--- a/hw/cs4231a.c
+++ b/hw/cs4231a.c
@@ -671,9 +671,9 @@ static ISADeviceInfo cs4231a_info = {
     .qdev.vmsd     = &vmstate_cs4231a,
     .init          = cs4231a_initfn,
     .qdev.props    = (Property[]) {
-        DEFINE_PROP_HEX32  ("iobase",  CSState, port, 0x534),
-        DEFINE_PROP_UINT32 ("irq",     CSState, irq,  9),
-        DEFINE_PROP_UINT32 ("dma",     CSState, dma,  3),
+        DEFINE_PROP_HEX32  ("iobase",  CSState, port, 0x534, ""),
+        DEFINE_PROP_UINT32 ("irq",     CSState, irq,  9,     ""),
+        DEFINE_PROP_UINT32 ("dma",     CSState, dma,  3,     ""),
         DEFINE_PROP_END_OF_LIST (),
     },
 };
diff --git a/hw/debugcon.c b/hw/debugcon.c
index 5ee6821..a1e06ee 100644
--- a/hw/debugcon.c
+++ b/hw/debugcon.c
@@ -92,9 +92,9 @@ static ISADeviceInfo debugcon_isa_info = {
     .qdev.size  = sizeof(ISADebugconState),
     .init       = debugcon_isa_initfn,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_HEX32("iobase", ISADebugconState, iobase, 0xe9),
-        DEFINE_PROP_CHR("chardev",  ISADebugconState, state.chr),
-        DEFINE_PROP_HEX32("readback", ISADebugconState, state.readback, 0xe9),
+        DEFINE_PROP_HEX32("iobase", ISADebugconState, iobase, 0xe9, ""),
+        DEFINE_PROP_CHR("chardev",  ISADebugconState, state.chr, ""),
+        DEFINE_PROP_HEX32("readback", ISADebugconState, state.readback, 0xe9, ""),
         DEFINE_PROP_END_OF_LIST(),
     },
 };
diff --git a/hw/eccmemctl.c b/hw/eccmemctl.c
index 498c61a..442a695 100644
--- a/hw/eccmemctl.c
+++ b/hw/eccmemctl.c
@@ -324,7 +324,7 @@ static SysBusDeviceInfo ecc_info = {
     .qdev.vmsd  = &vmstate_ecc,
     .qdev.reset = ecc_reset,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_HEX32("version", ECCState, version, -1),
+        DEFINE_PROP_HEX32("version", ECCState, version, -1, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/escc.c b/hw/escc.c
index 6d2fd36..adda135 100644
--- a/hw/escc.c
+++ b/hw/escc.c
@@ -932,14 +932,14 @@ static SysBusDeviceInfo escc_info = {
     .qdev.vmsd  = &vmstate_escc,
     .qdev.reset = escc_reset,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("frequency", SerialState, frequency,   0),
-        DEFINE_PROP_UINT32("it_shift",  SerialState, it_shift,    0),
-        DEFINE_PROP_UINT32("disabled",  SerialState, disabled,    0),
-        DEFINE_PROP_UINT32("disabled",  SerialState, disabled,    0),
-        DEFINE_PROP_UINT32("chnBtype",  SerialState, chn[0].type, 0),
-        DEFINE_PROP_UINT32("chnAtype",  SerialState, chn[1].type, 0),
-        DEFINE_PROP_CHR("chrB", SerialState, chn[0].chr),
-        DEFINE_PROP_CHR("chrA", SerialState, chn[1].chr),
+        DEFINE_PROP_UINT32("frequency", SerialState, frequency,   0, ""),
+        DEFINE_PROP_UINT32("it_shift",  SerialState, it_shift,    0, ""),
+        DEFINE_PROP_UINT32("disabled",  SerialState, disabled,    0, ""),
+        DEFINE_PROP_UINT32("disabled",  SerialState, disabled,    0, ""),
+        DEFINE_PROP_UINT32("chnBtype",  SerialState, chn[0].type, 0, ""),
+        DEFINE_PROP_UINT32("chnAtype",  SerialState, chn[1].type, 0, ""),
+        DEFINE_PROP_CHR("chrB", SerialState, chn[0].chr, ""),
+        DEFINE_PROP_CHR("chrA", SerialState, chn[1].chr, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/etraxfs_pic.c b/hw/etraxfs_pic.c
index b2c4859..3cb6638 100644
--- a/hw/etraxfs_pic.c
+++ b/hw/etraxfs_pic.c
@@ -155,7 +155,8 @@ static SysBusDeviceInfo etraxfs_pic_info = {
     .qdev.name  = "etraxfs,pic",
     .qdev.size  = sizeof(struct etrax_pic),
     .qdev.props = (Property[]) {
-        DEFINE_PROP_PTR("interrupt_vector", struct etrax_pic, interrupt_vector),
+        DEFINE_PROP_PTR("interrupt_vector", struct etrax_pic, interrupt_vector,
+                        ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/fdc.c b/hw/fdc.c
index 6306496..2ecfc47 100644
--- a/hw/fdc.c
+++ b/hw/fdc.c
@@ -2031,8 +2031,8 @@ static ISADeviceInfo isa_fdc_info = {
     .qdev.vmsd  = &vmstate_isa_fdc,
     .qdev.reset = fdctrl_external_reset_isa,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_DRIVE("driveA", FDCtrlISABus, state.drives[0].dinfo),
-        DEFINE_PROP_DRIVE("driveB", FDCtrlISABus, state.drives[1].dinfo),
+        DEFINE_PROP_DRIVE("driveA", FDCtrlISABus, state.drives[0].dinfo, ""),
+        DEFINE_PROP_DRIVE("driveB", FDCtrlISABus, state.drives[1].dinfo, ""),
         DEFINE_PROP_END_OF_LIST(),
     },
 };
@@ -2054,8 +2054,8 @@ static SysBusDeviceInfo sysbus_fdc_info = {
     .qdev.vmsd  = &vmstate_sysbus_fdc,
     .qdev.reset = fdctrl_external_reset_sysbus,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_DRIVE("driveA", FDCtrlSysBus, state.drives[0].dinfo),
-        DEFINE_PROP_DRIVE("driveB", FDCtrlSysBus, state.drives[1].dinfo),
+        DEFINE_PROP_DRIVE("driveA", FDCtrlSysBus, state.drives[0].dinfo, ""),
+        DEFINE_PROP_DRIVE("driveB", FDCtrlSysBus, state.drives[1].dinfo, ""),
         DEFINE_PROP_END_OF_LIST(),
     },
 };
@@ -2067,7 +2067,7 @@ static SysBusDeviceInfo sun4m_fdc_info = {
     .qdev.vmsd  = &vmstate_sysbus_fdc,
     .qdev.reset = fdctrl_external_reset_sysbus,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_DRIVE("drive", FDCtrlSysBus, state.drives[0].dinfo),
+        DEFINE_PROP_DRIVE("drive", FDCtrlSysBus, state.drives[0].dinfo, ""),
         DEFINE_PROP_END_OF_LIST(),
     },
 };
diff --git a/hw/gus.c b/hw/gus.c
index e9016d8..2c37ff9 100644
--- a/hw/gus.c
+++ b/hw/gus.c
@@ -303,10 +303,10 @@ static ISADeviceInfo gus_info = {
     .qdev.vmsd     = &vmstate_gus,
     .init          = gus_initfn,
     .qdev.props    = (Property[]) {
-        DEFINE_PROP_UINT32 ("freq",    GUSState, freq,        44100),
-        DEFINE_PROP_HEX32  ("iobase",  GUSState, port,        0x240),
-        DEFINE_PROP_UINT32 ("irq",     GUSState, emu.gusirq,  7),
-        DEFINE_PROP_UINT32 ("dma",     GUSState, emu.gusdma,  3),
+        DEFINE_PROP_UINT32 ("freq",    GUSState, freq,        44100, ""),
+        DEFINE_PROP_HEX32  ("iobase",  GUSState, port,        0x240, ""),
+        DEFINE_PROP_UINT32 ("irq",     GUSState, emu.gusirq,  7,     ""),
+        DEFINE_PROP_UINT32 ("dma",     GUSState, emu.gusdma,  3,     ""),
         DEFINE_PROP_END_OF_LIST (),
     },
 };
diff --git a/hw/i2c.c b/hw/i2c.c
index bee8e88..8e54c25 100644
--- a/hw/i2c.c
+++ b/hw/i2c.c
@@ -21,7 +21,7 @@ static struct BusInfo i2c_bus_info = {
     .name = "I2C",
     .size = sizeof(i2c_bus),
     .props = (Property[]) {
-        DEFINE_PROP_UINT8("address", struct i2c_slave, address, 0),
+        DEFINE_PROP_UINT8("address", struct i2c_slave, address, 0, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/ide/cmd646.c b/hw/ide/cmd646.c
index cdcc9bf..885a460 100644
--- a/hw/ide/cmd646.c
+++ b/hw/ide/cmd646.c
@@ -286,7 +286,7 @@ static PCIDeviceInfo cmd646_ide_info[] = {
         .qdev.size    = sizeof(PCIIDEState),
         .init         = pci_cmd646_ide_initfn,
         .qdev.props   = (Property[]) {
-            DEFINE_PROP_UINT32("secondary", PCIIDEState, secondary, 0),
+            DEFINE_PROP_UINT32("secondary", PCIIDEState, secondary, 0, ""),
             DEFINE_PROP_END_OF_LIST(),
         },
     },{
diff --git a/hw/ide/isa.c b/hw/ide/isa.c
index dff7c79..b2de3db 100644
--- a/hw/ide/isa.c
+++ b/hw/ide/isa.c
@@ -102,9 +102,9 @@ static ISADeviceInfo isa_ide_info = {
     .init       = isa_ide_initfn,
     .qdev.reset = isa_ide_reset,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_HEX32("iobase",  ISAIDEState, iobase,  0x1f0),
-        DEFINE_PROP_HEX32("iobase2", ISAIDEState, iobase2, 0x3f6),
-        DEFINE_PROP_UINT32("irq",    ISAIDEState, isairq,  14),
+        DEFINE_PROP_HEX32("iobase",  ISAIDEState, iobase,  0x1f0, ""),
+        DEFINE_PROP_HEX32("iobase2", ISAIDEState, iobase2, 0x3f6, ""),
+        DEFINE_PROP_UINT32("irq",    ISAIDEState, isairq,  14, ""),
         DEFINE_PROP_END_OF_LIST(),
     },
 };
diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c
index b18693d..d71c2a1 100644
--- a/hw/ide/qdev.c
+++ b/hw/ide/qdev.c
@@ -109,9 +109,9 @@ static IDEDeviceInfo ide_drive_info = {
     .qdev.size  = sizeof(IDEDrive),
     .init       = ide_drive_initfn,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("unit", IDEDrive, dev.unit, -1),
+        DEFINE_PROP_UINT32("unit", IDEDrive, dev.unit, -1, ""),
         DEFINE_BLOCK_PROPERTIES(IDEDrive, dev.conf),
-        DEFINE_PROP_STRING("ver",  IDEDrive, dev.version),
+        DEFINE_PROP_STRING("ver",  IDEDrive, dev.version, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/integratorcp.c b/hw/integratorcp.c
index bee8298..3492f03 100644
--- a/hw/integratorcp.c
+++ b/hw/integratorcp.c
@@ -528,7 +528,7 @@ static SysBusDeviceInfo core_info = {
     .qdev.name  = "integrator_core",
     .qdev.size  = sizeof(integratorcm_state),
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("memsz", integratorcm_state, memsz, 0),
+        DEFINE_PROP_UINT32("memsz", integratorcm_state, memsz, 0, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/lance.c b/hw/lance.c
index b6b04dd..c64bf36 100644
--- a/hw/lance.c
+++ b/hw/lance.c
@@ -151,7 +151,7 @@ static SysBusDeviceInfo lance_info = {
     .qdev.reset = lance_reset,
     .qdev.vmsd  = &vmstate_lance,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_PTR("dma", SysBusPCNetState, state.dma_opaque),
+        DEFINE_PROP_PTR("dma", SysBusPCNetState, state.dma_opaque, ""),
         DEFINE_NIC_PROPERTIES(SysBusPCNetState, state.conf),
         DEFINE_PROP_END_OF_LIST(),
     }
diff --git a/hw/m48t59.c b/hw/m48t59.c
index c3d7b3a..5402932 100644
--- a/hw/m48t59.c
+++ b/hw/m48t59.c
@@ -730,9 +730,9 @@ static ISADeviceInfo m48t59_isa_info = {
     .qdev.reset = m48t59_reset_isa,
     .qdev.no_user = 1,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("size",    M48t59ISAState, state.size,    -1),
-        DEFINE_PROP_UINT32("type",    M48t59ISAState, state.type,    -1),
-        DEFINE_PROP_HEX32( "io_base", M48t59ISAState, state.io_base,  0),
+        DEFINE_PROP_UINT32("size",    M48t59ISAState, state.size,    -1, ""),
+        DEFINE_PROP_UINT32("type",    M48t59ISAState, state.type,    -1, ""),
+        DEFINE_PROP_HEX32( "io_base", M48t59ISAState, state.io_base,  0, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
@@ -743,9 +743,9 @@ static SysBusDeviceInfo m48t59_info = {
     .qdev.size = sizeof(M48t59SysBusState),
     .qdev.reset = m48t59_reset_sysbus,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("size",    M48t59SysBusState, state.size,    -1),
-        DEFINE_PROP_UINT32("type",    M48t59SysBusState, state.type,    -1),
-        DEFINE_PROP_HEX32( "io_base", M48t59SysBusState, state.io_base,  0),
+        DEFINE_PROP_UINT32("size",    M48t59SysBusState, state.size,    -1, ""),
+        DEFINE_PROP_UINT32("type",    M48t59SysBusState, state.type,    -1, ""),
+        DEFINE_PROP_HEX32( "io_base", M48t59SysBusState, state.io_base,  0, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c
index c3e6a70..c061af2 100644
--- a/hw/mc146818rtc.c
+++ b/hw/mc146818rtc.c
@@ -655,7 +655,7 @@ static ISADeviceInfo mc146818rtc_info = {
     .qdev.vmsd     = &vmstate_rtc,
     .init          = rtc_initfn,
     .qdev.props    = (Property[]) {
-        DEFINE_PROP_INT32("base_year", RTCState, base_year, 1980),
+        DEFINE_PROP_INT32("base_year", RTCState, base_year, 1980, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/ne2000-isa.c b/hw/ne2000-isa.c
index 03a5a1f..ec7daa3 100644
--- a/hw/ne2000-isa.c
+++ b/hw/ne2000-isa.c
@@ -107,8 +107,8 @@ static ISADeviceInfo ne2000_isa_info = {
     .qdev.size  = sizeof(ISANE2000State),
     .init       = isa_ne2000_initfn,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_HEX32("iobase", ISANE2000State, iobase, 0x300),
-        DEFINE_PROP_UINT32("irq",   ISANE2000State, isairq, 9),
+        DEFINE_PROP_HEX32("iobase", ISANE2000State, iobase, 0x300, ""),
+        DEFINE_PROP_UINT32("irq",   ISANE2000State, isairq, 9, ""),
         DEFINE_NIC_PROPERTIES(ISANE2000State, ne2000.c),
         DEFINE_PROP_END_OF_LIST(),
     },
diff --git a/hw/parallel.c b/hw/parallel.c
index be8e2d5..9298d26 100644
--- a/hw/parallel.c
+++ b/hw/parallel.c
@@ -586,10 +586,10 @@ static ISADeviceInfo parallel_isa_info = {
     .qdev.size  = sizeof(ISAParallelState),
     .init       = parallel_isa_initfn,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("index", ISAParallelState, index,   -1),
-        DEFINE_PROP_HEX32("iobase", ISAParallelState, iobase,  -1),
-        DEFINE_PROP_UINT32("irq",   ISAParallelState, isairq,  7),
-        DEFINE_PROP_CHR("chardev",  ISAParallelState, state.chr),
+        DEFINE_PROP_UINT32("index", ISAParallelState, index,   -1, ""),
+        DEFINE_PROP_HEX32("iobase", ISAParallelState, iobase,  -1, ""),
+        DEFINE_PROP_UINT32("irq",   ISAParallelState, isairq,  7, ""),
+        DEFINE_PROP_CHR("chardev",  ISAParallelState, state.chr, ""),
         DEFINE_PROP_END_OF_LIST(),
     },
 };
diff --git a/hw/pci.c b/hw/pci.c
index 8d84651..a3c6c9f 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -64,9 +64,9 @@ static struct BusInfo pci_bus_info = {
     .size       = sizeof(PCIBus),
     .print_dev  = pcibus_dev_print,
     .props      = (Property[]) {
-        DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1),
-        DEFINE_PROP_STRING("romfile", PCIDevice, romfile),
-        DEFINE_PROP_UINT32("rombar",  PCIDevice, rom_bar, 1),
+        DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1, ""),
+        DEFINE_PROP_STRING("romfile", PCIDevice, romfile, ""),
+        DEFINE_PROP_UINT32("rombar",  PCIDevice, rom_bar, 1, ""),
         DEFINE_PROP_END_OF_LIST()
     }
 };
@@ -1906,8 +1906,8 @@ static PCIDeviceInfo bridge_info = {
     .config_write = pci_bridge_write_config,
     .header_type  = PCI_HEADER_TYPE_BRIDGE,
     .qdev.props   = (Property[]) {
-        DEFINE_PROP_HEX32("vendorid", PCIBridge, vid, 0),
-        DEFINE_PROP_HEX32("deviceid", PCIBridge, did, 0),
+        DEFINE_PROP_HEX32("vendorid", PCIBridge, vid, 0, ""),
+        DEFINE_PROP_HEX32("deviceid", PCIBridge, did, 0, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/qdev-addr.h b/hw/qdev-addr.h
index a0ddf38..515a887 100644
--- a/hw/qdev-addr.h
+++ b/hw/qdev-addr.h
@@ -1,5 +1,5 @@
-#define DEFINE_PROP_TADDR(_n, _s, _f, _d)                               \
-    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_taddr, target_phys_addr_t)
+#define DEFINE_PROP_TADDR(_n, _s, _f, _d, _c)				\
+    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_taddr, target_phys_addr_t, _c)
 
 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.c b/hw/qdev.c
index af17486..2cd205b 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -187,7 +187,8 @@ int qdev_device_help(QemuOpts *opts)
         if (!prop->info->parse) {
             continue;           /* no way to set it, don't show */
         }
-        error_printf("%s.%s=%s\n", info->name, prop->name, prop->info->name);
+        error_printf("%s.%s=%s, %s\n", info->name, prop->name,
+                     prop->info->name, prop->desc ?: "");
     }
     return 1;
 }
diff --git a/hw/qdev.h b/hw/qdev.h
index a44060e..012e303 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -69,6 +69,7 @@ struct BusState {
 struct Property {
     const char   *name;
     PropertyInfo *info;
+    const char   *desc;
     int          offset;
     int          bitnr;
     void         *defval;
@@ -201,59 +202,63 @@ extern PropertyInfo qdev_prop_netdev;
 extern PropertyInfo qdev_prop_vlan;
 extern PropertyInfo qdev_prop_pci_devfn;
 
-#define DEFINE_PROP(_name, _state, _field, _prop, _type) { \
+#define DEFINE_PROP(_name, _state, _field, _prop, _type, _desc) {       \
         .name      = (_name),                                    \
         .info      = &(_prop),                                   \
+        .desc      = (_desc),                                    \
         .offset    = offsetof(_state, _field)                    \
             + type_check(_type,typeof_field(_state, _field)),    \
         }
-#define DEFINE_PROP_DEFAULT(_name, _state, _field, _defval, _prop, _type) { \
+#define DEFINE_PROP_DEFAULT(_name, _state, _field, _defval, _prop, _type, \
+                            _desc) {                                    \
         .name      = (_name),                                           \
         .info      = &(_prop),                                          \
+        .desc      = (_desc),                                           \
         .offset    = offsetof(_state, _field)                           \
             + type_check(_type,typeof_field(_state, _field)),           \
         .defval    = (_type[]) { _defval },                             \
         }
-#define DEFINE_PROP_BIT(_name, _state, _field, _bit, _defval) {  \
+#define DEFINE_PROP_BIT(_name, _state, _field, _bit, _defval, _desc) {  \
         .name      = (_name),                                    \
         .info      = &(qdev_prop_bit),                           \
-        .bitnr    = (_bit),                                      \
+        .desc      = (_desc),                                    \
+        .bitnr     = (_bit),                                     \
         .offset    = offsetof(_state, _field)                    \
             + type_check(uint32_t,typeof_field(_state, _field)), \
         .defval    = (bool[]) { (_defval) },                     \
         }
 
-#define DEFINE_PROP_UINT8(_n, _s, _f, _d)                       \
-    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint8, uint8_t)
-#define DEFINE_PROP_UINT16(_n, _s, _f, _d)                      \
-    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint16, uint16_t)
-#define DEFINE_PROP_UINT32(_n, _s, _f, _d)                      \
-    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint32, uint32_t)
-#define DEFINE_PROP_INT32(_n, _s, _f, _d)                      \
-    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_int32, int32_t)
-#define DEFINE_PROP_UINT64(_n, _s, _f, _d)                      \
-    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint64, uint64_t)
-#define DEFINE_PROP_HEX32(_n, _s, _f, _d)                       \
-    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex32, uint32_t)
-#define DEFINE_PROP_HEX64(_n, _s, _f, _d)                       \
-    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex64, uint64_t)
-#define DEFINE_PROP_PCI_DEVFN(_n, _s, _f, _d)                   \
-    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_pci_devfn, uint32_t)
-
-#define DEFINE_PROP_PTR(_n, _s, _f)             \
-    DEFINE_PROP(_n, _s, _f, qdev_prop_ptr, void*)
-#define DEFINE_PROP_CHR(_n, _s, _f)             \
-    DEFINE_PROP(_n, _s, _f, qdev_prop_chr, CharDriverState*)
-#define DEFINE_PROP_STRING(_n, _s, _f)             \
-    DEFINE_PROP(_n, _s, _f, qdev_prop_string, char*)
-#define DEFINE_PROP_NETDEV(_n, _s, _f)             \
-    DEFINE_PROP(_n, _s, _f, qdev_prop_netdev, VLANClientState*)
-#define DEFINE_PROP_VLAN(_n, _s, _f)             \
-    DEFINE_PROP(_n, _s, _f, qdev_prop_vlan, VLANState*)
-#define DEFINE_PROP_DRIVE(_n, _s, _f)             \
-    DEFINE_PROP(_n, _s, _f, qdev_prop_drive, DriveInfo*)
-#define DEFINE_PROP_MACADDR(_n, _s, _f)         \
-    DEFINE_PROP(_n, _s, _f, qdev_prop_macaddr, MACAddr)
+#define DEFINE_PROP_UINT8(_n, _s, _f, _d, _c)                           \
+    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint8, uint8_t, _c)
+#define DEFINE_PROP_UINT16(_n, _s, _f, _d, _c)                          \
+    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint16, uint16_t, _c)
+#define DEFINE_PROP_UINT32(_n, _s, _f, _d, _c)                          \
+    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint32, uint32_t, _c)
+#define DEFINE_PROP_INT32(_n, _s, _f, _d, _c)                           \
+    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_int32, int32_t, _c)
+#define DEFINE_PROP_UINT64(_n, _s, _f, _d, _c)                          \
+    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint64, uint64_t, _c)
+#define DEFINE_PROP_HEX32(_n, _s, _f, _d, _c)                           \
+    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex32, uint32_t, _c)
+#define DEFINE_PROP_HEX64(_n, _s, _f, _d, _c)                           \
+    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_hex64, uint64_t, _c)
+#define DEFINE_PROP_PCI_DEVFN(_n, _s, _f, _d, _c)                       \
+    DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_pci_devfn, uint32_t, _c)
+
+#define DEFINE_PROP_PTR(_n, _s, _f, _c)                 \
+    DEFINE_PROP(_n, _s, _f, qdev_prop_ptr, void*, _c)
+#define DEFINE_PROP_CHR(_n, _s, _f, _c)                         \
+    DEFINE_PROP(_n, _s, _f, qdev_prop_chr, CharDriverState*, _c)
+#define DEFINE_PROP_STRING(_n, _s, _f, _c)              \
+    DEFINE_PROP(_n, _s, _f, qdev_prop_string, char*, _c)
+#define DEFINE_PROP_NETDEV(_n, _s, _f, _c)                      \
+    DEFINE_PROP(_n, _s, _f, qdev_prop_netdev, VLANClientState*, _c)
+#define DEFINE_PROP_VLAN(_n, _s, _f, _c)                \
+    DEFINE_PROP(_n, _s, _f, qdev_prop_vlan, VLANState*, _c)
+#define DEFINE_PROP_DRIVE(_n, _s, _f, _c)                       \
+    DEFINE_PROP(_n, _s, _f, qdev_prop_drive, DriveInfo*, _c)
+#define DEFINE_PROP_MACADDR(_n, _s, _f, _c)             \
+    DEFINE_PROP(_n, _s, _f, qdev_prop_macaddr, MACAddr, _c)
 
 #define DEFINE_PROP_END_OF_LIST()               \
     {}
diff --git a/hw/s390-virtio-bus.c b/hw/s390-virtio-bus.c
index fe6884d..7d37b51 100644
--- a/hw/s390-virtio-bus.c
+++ b/hw/s390-virtio-bus.c
@@ -348,7 +348,7 @@ static VirtIOS390DeviceInfo s390_virtio_serial = {
     .qdev.size = sizeof(VirtIOS390Device),
     .qdev.props = (Property[]) {
         DEFINE_PROP_UINT32("max_ports", VirtIOS390Device, max_virtserial_ports,
-                           31),
+                           31, ""),
         DEFINE_PROP_END_OF_LIST(),
     },
 };
diff --git a/hw/sb16.c b/hw/sb16.c
index 78590a7..f2181a2 100644
--- a/hw/sb16.c
+++ b/hw/sb16.c
@@ -1400,11 +1400,11 @@ static ISADeviceInfo sb16_info = {
     .qdev.vmsd     = &vmstate_sb16,
     .init          = sb16_initfn,
     .qdev.props    = (Property[]) {
-        DEFINE_PROP_HEX32  ("version", SB16State, ver,  0x0405), /* 4.5 */
-        DEFINE_PROP_HEX32  ("iobase",  SB16State, port, 0x220),
-        DEFINE_PROP_UINT32 ("irq",     SB16State, irq,  5),
-        DEFINE_PROP_UINT32 ("dma",     SB16State, dma,  1),
-        DEFINE_PROP_UINT32 ("dma16",   SB16State, hdma, 5),
+        DEFINE_PROP_HEX32  ("version", SB16State, ver,  0x0405, ""), /* 4.5 */
+        DEFINE_PROP_HEX32  ("iobase",  SB16State, port, 0x220, ""),
+        DEFINE_PROP_UINT32 ("irq",     SB16State, irq,  5, ""),
+        DEFINE_PROP_UINT32 ("dma",     SB16State, dma,  1, ""),
+        DEFINE_PROP_UINT32 ("dma16",   SB16State, hdma, 5, ""),
         DEFINE_PROP_END_OF_LIST (),
     },
 };
diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c
index 383240b..356a97d 100644
--- a/hw/scsi-bus.c
+++ b/hw/scsi-bus.c
@@ -9,7 +9,7 @@ static struct BusInfo scsi_bus_info = {
     .name  = "SCSI",
     .size  = sizeof(SCSIBus),
     .props = (Property[]) {
-        DEFINE_PROP_UINT32("scsi-id", SCSIDevice, id, -1),
+        DEFINE_PROP_UINT32("scsi-id", SCSIDevice, id, -1, ""),
         DEFINE_PROP_END_OF_LIST(),
     },
 };
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index 4d20919..594a9ad 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -1089,7 +1089,7 @@ static SCSIDeviceInfo scsi_disk_info = {
     .get_buf      = scsi_get_buf,
     .qdev.props   = (Property[]) {
         DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf),
-        DEFINE_PROP_STRING("ver",  SCSIDiskState, version),
+        DEFINE_PROP_STRING("ver",  SCSIDiskState, version, ""),
         DEFINE_PROP_END_OF_LIST(),
     },
 };
diff --git a/hw/serial.c b/hw/serial.c
index 9102edb..561cc07 100644
--- a/hw/serial.c
+++ b/hw/serial.c
@@ -969,10 +969,10 @@ static ISADeviceInfo serial_isa_info = {
     .qdev.vmsd  = &vmstate_isa_serial,
     .init       = serial_isa_initfn,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("index", ISASerialState, index,   -1),
-        DEFINE_PROP_HEX32("iobase", ISASerialState, iobase,  -1),
-        DEFINE_PROP_UINT32("irq",   ISASerialState, isairq,  -1),
-        DEFINE_PROP_CHR("chardev",  ISASerialState, state.chr),
+        DEFINE_PROP_UINT32("index", ISASerialState, index,   -1, ""),
+        DEFINE_PROP_HEX32("iobase", ISASerialState, iobase,  -1, ""),
+        DEFINE_PROP_UINT32("irq",   ISASerialState, isairq,  -1, ""),
+        DEFINE_PROP_CHR("chardev",  ISASerialState, state.chr, ""),
         DEFINE_PROP_END_OF_LIST(),
     },
 };
diff --git a/hw/slavio_timer.c b/hw/slavio_timer.c
index d787553..a1d7ec8 100644
--- a/hw/slavio_timer.c
+++ b/hw/slavio_timer.c
@@ -425,7 +425,7 @@ static SysBusDeviceInfo slavio_timer_info = {
     .qdev.vmsd  = &vmstate_slavio_timer,
     .qdev.reset = slavio_timer_reset,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("num_cpus",  SLAVIO_TIMERState, num_cpus,  0),
+        DEFINE_PROP_UINT32("num_cpus",  SLAVIO_TIMERState, num_cpus,  0, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/smbus_eeprom.c b/hw/smbus_eeprom.c
index 52463e0..9ee8f54 100644
--- a/hw/smbus_eeprom.c
+++ b/hw/smbus_eeprom.c
@@ -108,7 +108,7 @@ static SMBusDeviceInfo smbus_eeprom_info = {
     .i2c.qdev.name = "smbus-eeprom",
     .i2c.qdev.size = sizeof(SMBusEEPROMDevice),
     .i2c.qdev.props = (Property[]) {
-        DEFINE_PROP_PTR("data", SMBusEEPROMDevice, data),
+        DEFINE_PROP_PTR("data", SMBusEEPROMDevice, data, ""),
         DEFINE_PROP_END_OF_LIST(),
     },
     .init = smbus_eeprom_init,
diff --git a/hw/sparc32_dma.c b/hw/sparc32_dma.c
index b521707..5e58605 100644
--- a/hw/sparc32_dma.c
+++ b/hw/sparc32_dma.c
@@ -274,7 +274,7 @@ static SysBusDeviceInfo sparc32_dma_info = {
     .qdev.vmsd  = &vmstate_dma,
     .qdev.reset = dma_reset,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_PTR("iommu_opaque", DMAState, iommu),
+        DEFINE_PROP_PTR("iommu_opaque", DMAState, iommu, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/sun4m.c b/hw/sun4m.c
index e4ca8f3..d25efa2 100644
--- a/hw/sun4m.c
+++ b/hw/sun4m.c
@@ -760,7 +760,7 @@ static SysBusDeviceInfo ram_info = {
     .qdev.name  = "memory",
     .qdev.size  = sizeof(RamDevice),
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT64("size", RamDevice, size, 0),
+        DEFINE_PROP_UINT64("size", RamDevice, size, 0, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/sun4m_iommu.c b/hw/sun4m_iommu.c
index 1dbe077..fa146b8 100644
--- a/hw/sun4m_iommu.c
+++ b/hw/sun4m_iommu.c
@@ -379,7 +379,7 @@ static SysBusDeviceInfo iommu_info = {
     .qdev.vmsd  = &vmstate_iommu,
     .qdev.reset = iommu_reset,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_HEX32("version", IOMMUState, version, 0),
+        DEFINE_PROP_HEX32("version", IOMMUState, version, 0, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/sun4u.c b/hw/sun4u.c
index 40b5f1f..e70609f 100644
--- a/hw/sun4u.c
+++ b/hw/sun4u.c
@@ -692,7 +692,7 @@ static SysBusDeviceInfo ram_info = {
     .qdev.name  = "memory",
     .qdev.size  = sizeof(RamDevice),
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT64("size", RamDevice, size, 0),
+        DEFINE_PROP_UINT64("size", RamDevice, size, 0, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/syborg_fb.c b/hw/syborg_fb.c
index 7be04a3..c707cab 100644
--- a/hw/syborg_fb.c
+++ b/hw/syborg_fb.c
@@ -536,8 +536,8 @@ static SysBusDeviceInfo syborg_fb_info = {
     .qdev.name  = "syborg,framebuffer",
     .qdev.size  = sizeof(SyborgFBState),
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("width",  SyborgFBState, cols, 0),
-        DEFINE_PROP_UINT32("height", SyborgFBState, rows, 0),
+        DEFINE_PROP_UINT32("width",  SyborgFBState, cols, 0, ""),
+        DEFINE_PROP_UINT32("height", SyborgFBState, rows, 0, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/syborg_interrupt.c b/hw/syborg_interrupt.c
index f3a1767..c9c787d 100644
--- a/hw/syborg_interrupt.c
+++ b/hw/syborg_interrupt.c
@@ -223,7 +223,7 @@ static SysBusDeviceInfo syborg_int_info = {
     .qdev.name  = "syborg,interrupt",
     .qdev.size  = sizeof(SyborgIntState),
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("num-interrupts", SyborgIntState, num_irqs, 64),
+        DEFINE_PROP_UINT32("num-interrupts", SyborgIntState, num_irqs, 64, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/syborg_keyboard.c b/hw/syborg_keyboard.c
index 4a562f8..89a0ce9 100644
--- a/hw/syborg_keyboard.c
+++ b/hw/syborg_keyboard.c
@@ -230,7 +230,7 @@ static SysBusDeviceInfo syborg_keyboard_info = {
     .qdev.name  = "syborg,keyboard",
     .qdev.size  = sizeof(SyborgKeyboardState),
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("fifo-size", SyborgKeyboardState, fifo_size, 16),
+        DEFINE_PROP_UINT32("fifo-size", SyborgKeyboardState, fifo_size, 16, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/syborg_pointer.c b/hw/syborg_pointer.c
index 563d730..c5f28d4 100644
--- a/hw/syborg_pointer.c
+++ b/hw/syborg_pointer.c
@@ -228,8 +228,8 @@ static SysBusDeviceInfo syborg_pointer_info = {
     .qdev.name  = "syborg,pointer",
     .qdev.size  = sizeof(SyborgPointerState),
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("fifo-size", SyborgPointerState, fifo_size, 16),
-        DEFINE_PROP_UINT32("absolute",  SyborgPointerState, absolute,   1),
+        DEFINE_PROP_UINT32("fifo-size", SyborgPointerState, fifo_size, 16, ""),
+        DEFINE_PROP_UINT32("absolute",  SyborgPointerState, absolute,   1, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/syborg_serial.c b/hw/syborg_serial.c
index cac00ea..6a2203f 100644
--- a/hw/syborg_serial.c
+++ b/hw/syborg_serial.c
@@ -345,7 +345,7 @@ static SysBusDeviceInfo syborg_serial_info = {
     .qdev.name  = "syborg,serial",
     .qdev.size  = sizeof(SyborgSerialState),
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("fifo-size", SyborgSerialState, fifo_size, 16),
+        DEFINE_PROP_UINT32("fifo-size", SyborgSerialState, fifo_size, 16, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/syborg_timer.c b/hw/syborg_timer.c
index 3e4a447..7edbeed 100644
--- a/hw/syborg_timer.c
+++ b/hw/syborg_timer.c
@@ -231,7 +231,7 @@ static SysBusDeviceInfo syborg_timer_info = {
     .qdev.name  = "syborg,timer",
     .qdev.size  = sizeof(SyborgTimerState),
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("frequency",SyborgTimerState, freq, 0),
+        DEFINE_PROP_UINT32("frequency",SyborgTimerState, freq, 0, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/tcx.c b/hw/tcx.c
index beb30ac..52eb656 100644
--- a/hw/tcx.c
+++ b/hw/tcx.c
@@ -633,11 +633,11 @@ static SysBusDeviceInfo tcx_info = {
     .qdev.reset = tcx_reset,
     .qdev.vmsd  = &vmstate_tcx,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_TADDR("addr",      TCXState, addr,      -1),
-        DEFINE_PROP_HEX32("vram_size", TCXState, vram_size, -1),
-        DEFINE_PROP_UINT16("width",    TCXState, width,     -1),
-        DEFINE_PROP_UINT16("height",   TCXState, height,    -1),
-        DEFINE_PROP_UINT16("depth",    TCXState, depth,     -1),
+        DEFINE_PROP_TADDR("addr",      TCXState, addr,      -1, ""),
+        DEFINE_PROP_HEX32("vram_size", TCXState, vram_size, -1, ""),
+        DEFINE_PROP_UINT16("width",    TCXState, width,     -1, ""),
+        DEFINE_PROP_UINT16("height",   TCXState, height,    -1, ""),
+        DEFINE_PROP_UINT16("depth",    TCXState, depth,     -1, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/usb-ohci.c b/hw/usb-ohci.c
index 9f80e15..30a2e7f 100644
--- a/hw/usb-ohci.c
+++ b/hw/usb-ohci.c
@@ -1778,8 +1778,8 @@ static SysBusDeviceInfo ohci_sysbus_info = {
     .qdev.desc    = "OHCI USB Controller",
     .qdev.size    = sizeof(OHCISysBusState),
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("num-ports", OHCISysBusState, num_ports, 3),
-        DEFINE_PROP_TADDR("dma-offset", OHCISysBusState, dma_offset, 3),
+        DEFINE_PROP_UINT32("num-ports", OHCISysBusState, num_ports, 3, ""),
+        DEFINE_PROP_TADDR("dma-offset", OHCISysBusState, dma_offset, 3, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/usb-serial.c b/hw/usb-serial.c
index 5b2483a..a07404c 100644
--- a/hw/usb-serial.c
+++ b/hw/usb-serial.c
@@ -637,9 +637,9 @@ static struct USBDeviceInfo serial_info = {
     .usbdevice_name = "serial",
     .usbdevice_init = usb_serial_init,
     .qdev.props     = (Property[]) {
-        DEFINE_PROP_CHR("chardev",     USBSerialState, cs),
-        DEFINE_PROP_HEX32("vendorid",  USBSerialState, vendorid,  0x0403),
-        DEFINE_PROP_HEX32("productid", USBSerialState, productid, 0x6001),
+        DEFINE_PROP_CHR("chardev",     USBSerialState, cs, ""),
+        DEFINE_PROP_HEX32("vendorid",  USBSerialState, vendorid,  0x0403, ""),
+        DEFINE_PROP_HEX32("productid", USBSerialState, productid, 0x6001, ""),
         DEFINE_PROP_END_OF_LIST(),
     },
 };
@@ -657,9 +657,9 @@ static struct USBDeviceInfo braille_info = {
     .usbdevice_name = "braille",
     .usbdevice_init = usb_braille_init,
     .qdev.props     = (Property[]) {
-        DEFINE_PROP_CHR("chardev",     USBSerialState, cs),
-        DEFINE_PROP_HEX32("vendorid",  USBSerialState, vendorid,  0x0403),
-        DEFINE_PROP_HEX32("productid", USBSerialState, productid, 0xfe72),
+        DEFINE_PROP_CHR("chardev",     USBSerialState, cs, ""),
+        DEFINE_PROP_HEX32("vendorid",  USBSerialState, vendorid,  0x0403, ""),
+        DEFINE_PROP_HEX32("productid", USBSerialState, productid, 0xfe72, ""),
         DEFINE_PROP_END_OF_LIST(),
     },
 };
diff --git a/hw/vga-pci.c b/hw/vga-pci.c
index eef78ed..a4688ea 100644
--- a/hw/vga-pci.c
+++ b/hw/vga-pci.c
@@ -132,8 +132,8 @@ static PCIDeviceInfo vga_info = {
     .init         = pci_vga_initfn,
     .config_write = pci_vga_write_config,
     .qdev.props   = (Property[]) {
-        DEFINE_PROP_HEX32("bios-offset", PCIVGAState, vga.bios_offset, 0),
-        DEFINE_PROP_HEX32("bios-size",   PCIVGAState, vga.bios_size,   0),
+        DEFINE_PROP_HEX32("bios-offset", PCIVGAState, vga.bios_offset, 0, ""),
+        DEFINE_PROP_HEX32("bios-size",   PCIVGAState, vga.bios_size,   0, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/virtio-blk.h b/hw/virtio-blk.h
index 7a7ece3..00af0e8 100644
--- a/hw/virtio-blk.h
+++ b/hw/virtio-blk.h
@@ -94,8 +94,8 @@ struct virtio_scsi_inhdr
 
 #ifdef __linux__
 #define DEFINE_VIRTIO_BLK_FEATURES(_state, _field) \
-        DEFINE_VIRTIO_COMMON_FEATURES(_state, _field), \
-        DEFINE_PROP_BIT("scsi", _state, _field, VIRTIO_BLK_F_SCSI, true)
+        DEFINE_VIRTIO_COMMON_FEATURES(_state, _field),                      \
+        DEFINE_PROP_BIT("scsi", _state, _field, VIRTIO_BLK_F_SCSI, true, "")
 #else
 #define DEFINE_VIRTIO_BLK_FEATURES(_state, _field) \
         DEFINE_VIRTIO_COMMON_FEATURES(_state, _field)
diff --git a/hw/virtio-console.c b/hw/virtio-console.c
index caea11f..ccd277a 100644
--- a/hw/virtio-console.c
+++ b/hw/virtio-console.c
@@ -95,10 +95,11 @@ static VirtIOSerialPortInfo virtconsole_info = {
     .init          = virtconsole_initfn,
     .exit          = virtconsole_exitfn,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT8("is_console", VirtConsole, port.is_console, 1),
-        DEFINE_PROP_UINT32("nr", VirtConsole, port.id, VIRTIO_CONSOLE_BAD_ID),
-        DEFINE_PROP_CHR("chardev", VirtConsole, chr),
-        DEFINE_PROP_STRING("name", VirtConsole, port.name),
+        DEFINE_PROP_UINT8("is_console", VirtConsole, port.is_console, 1, ""),
+        DEFINE_PROP_UINT32("nr", VirtConsole, port.id, VIRTIO_CONSOLE_BAD_ID,
+                           ""),
+        DEFINE_PROP_CHR("chardev", VirtConsole, chr, ""),
+        DEFINE_PROP_STRING("name", VirtConsole, port.name, ""),
         DEFINE_PROP_END_OF_LIST(),
     },
 };
@@ -131,9 +132,10 @@ static VirtIOSerialPortInfo virtserialport_info = {
     .init          = virtserialport_initfn,
     .exit          = virtconsole_exitfn,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("nr", VirtConsole, port.id, VIRTIO_CONSOLE_BAD_ID),
-        DEFINE_PROP_CHR("chardev", VirtConsole, chr),
-        DEFINE_PROP_STRING("name", VirtConsole, port.name),
+        DEFINE_PROP_UINT32("nr", VirtConsole, port.id, VIRTIO_CONSOLE_BAD_ID,
+                           ""),
+        DEFINE_PROP_CHR("chardev", VirtConsole, chr, ""),
+        DEFINE_PROP_STRING("name", VirtConsole, port.name, ""),
         DEFINE_PROP_END_OF_LIST(),
     },
 };
diff --git a/hw/virtio-net.h b/hw/virtio-net.h
index 235f1a9..b322ee4 100644
--- a/hw/virtio-net.h
+++ b/hw/virtio-net.h
@@ -154,22 +154,37 @@ struct virtio_net_ctrl_mac {
  #define VIRTIO_NET_CTRL_VLAN_DEL             1
 
 #define DEFINE_VIRTIO_NET_FEATURES(_state, _field) \
-        DEFINE_VIRTIO_COMMON_FEATURES(_state, _field), \
-        DEFINE_PROP_BIT("csum", _state, _field, VIRTIO_NET_F_CSUM, true), \
-        DEFINE_PROP_BIT("guest_csum", _state, _field, VIRTIO_NET_F_GUEST_CSUM, true), \
-        DEFINE_PROP_BIT("gso", _state, _field, VIRTIO_NET_F_GSO, true), \
-        DEFINE_PROP_BIT("guest_tso4", _state, _field, VIRTIO_NET_F_GUEST_TSO4, true), \
-        DEFINE_PROP_BIT("guest_tso6", _state, _field, VIRTIO_NET_F_GUEST_TSO6, true), \
-        DEFINE_PROP_BIT("guest_ecn", _state, _field, VIRTIO_NET_F_GUEST_ECN, true), \
-        DEFINE_PROP_BIT("guest_ufo", _state, _field, VIRTIO_NET_F_GUEST_UFO, true), \
-        DEFINE_PROP_BIT("host_tso4", _state, _field, VIRTIO_NET_F_HOST_TSO4, true), \
-        DEFINE_PROP_BIT("host_tso6", _state, _field, VIRTIO_NET_F_HOST_TSO6, true), \
-        DEFINE_PROP_BIT("host_ecn", _state, _field, VIRTIO_NET_F_HOST_ECN, true), \
-        DEFINE_PROP_BIT("host_ufo", _state, _field, VIRTIO_NET_F_HOST_UFO, true), \
-        DEFINE_PROP_BIT("mrg_rxbuf", _state, _field, VIRTIO_NET_F_MRG_RXBUF, true), \
-        DEFINE_PROP_BIT("status", _state, _field, VIRTIO_NET_F_STATUS, true), \
-        DEFINE_PROP_BIT("ctrl_vq", _state, _field, VIRTIO_NET_F_CTRL_VQ, true), \
-        DEFINE_PROP_BIT("ctrl_rx", _state, _field, VIRTIO_NET_F_CTRL_RX, true), \
-        DEFINE_PROP_BIT("ctrl_vlan", _state, _field, VIRTIO_NET_F_CTRL_VLAN, true), \
-        DEFINE_PROP_BIT("ctrl_rx_extra", _state, _field, VIRTIO_NET_F_CTRL_RX_EXTRA, true)
+        DEFINE_VIRTIO_COMMON_FEATURES(_state, _field),                        \
+        DEFINE_PROP_BIT("csum", _state, _field, VIRTIO_NET_F_CSUM, true, ""), \
+        DEFINE_PROP_BIT("guest_csum", _state, _field, VIRTIO_NET_F_GUEST_CSUM, \
+                        true, ""),                                      \
+        DEFINE_PROP_BIT("gso", _state, _field, VIRTIO_NET_F_GSO, true, ""), \
+        DEFINE_PROP_BIT("guest_tso4", _state, _field, VIRTIO_NET_F_GUEST_TSO4, \
+                        true, ""),                                      \
+        DEFINE_PROP_BIT("guest_tso6", _state, _field, VIRTIO_NET_F_GUEST_TSO6, \
+                        true, ""),                                      \
+        DEFINE_PROP_BIT("guest_ecn", _state, _field, VIRTIO_NET_F_GUEST_ECN, \
+                        true, ""),                                      \
+        DEFINE_PROP_BIT("guest_ufo", _state, _field, VIRTIO_NET_F_GUEST_UFO, \
+                        true, ""),                                      \
+        DEFINE_PROP_BIT("host_tso4", _state, _field, VIRTIO_NET_F_HOST_TSO4, \
+                        true, ""),                                      \
+        DEFINE_PROP_BIT("host_tso6", _state, _field, VIRTIO_NET_F_HOST_TSO6, \
+                        true, ""),                                      \
+        DEFINE_PROP_BIT("host_ecn", _state, _field, VIRTIO_NET_F_HOST_ECN, \
+                        true, ""),                                      \
+        DEFINE_PROP_BIT("host_ufo", _state, _field, VIRTIO_NET_F_HOST_UFO, \
+                        true, ""),                                      \
+        DEFINE_PROP_BIT("mrg_rxbuf", _state, _field, VIRTIO_NET_F_MRG_RXBUF, \
+                        true, ""),                                      \
+        DEFINE_PROP_BIT("status", _state, _field, VIRTIO_NET_F_STATUS, true, \
+                        ""),                                            \
+        DEFINE_PROP_BIT("ctrl_vq", _state, _field, VIRTIO_NET_F_CTRL_VQ, true, \
+                        ""),                                            \
+        DEFINE_PROP_BIT("ctrl_rx", _state, _field, VIRTIO_NET_F_CTRL_RX, true, \
+                        ""),                                            \
+        DEFINE_PROP_BIT("ctrl_vlan", _state, _field, VIRTIO_NET_F_CTRL_VLAN, \
+                        true, ""),                                      \
+        DEFINE_PROP_BIT("ctrl_rx_extra", _state, _field,                \
+                        VIRTIO_NET_F_CTRL_RX_EXTRA, true, "")
 #endif
diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c
index 7ddf612..5dd910c 100644
--- a/hw/virtio-pci.c
+++ b/hw/virtio-pci.c
@@ -666,9 +666,9 @@ static PCIDeviceInfo virtio_info[] = {
         .init      = virtio_blk_init_pci,
         .exit      = virtio_blk_exit_pci,
         .qdev.props = (Property[]) {
-            DEFINE_PROP_HEX32("class", VirtIOPCIProxy, class_code, 0),
+            DEFINE_PROP_HEX32("class", VirtIOPCIProxy, class_code, 0, ""),
             DEFINE_BLOCK_PROPERTIES(VirtIOPCIProxy, block),
-            DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 2),
+            DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 2, ""),
             DEFINE_VIRTIO_BLK_FEATURES(VirtIOPCIProxy, host_features),
             DEFINE_PROP_END_OF_LIST(),
         },
@@ -680,7 +680,7 @@ static PCIDeviceInfo virtio_info[] = {
         .exit       = virtio_net_exit_pci,
         .romfile    = "pxe-virtio.bin",
         .qdev.props = (Property[]) {
-            DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 3),
+            DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 3, ""),
             DEFINE_VIRTIO_NET_FEATURES(VirtIOPCIProxy, host_features),
             DEFINE_NIC_PROPERTIES(VirtIOPCIProxy, nic),
             DEFINE_PROP_END_OF_LIST(),
@@ -694,11 +694,11 @@ static PCIDeviceInfo virtio_info[] = {
         .exit      = virtio_exit_pci,
         .qdev.props = (Property[]) {
             DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors,
-                               DEV_NVECTORS_UNSPECIFIED),
-            DEFINE_PROP_HEX32("class", VirtIOPCIProxy, class_code, 0),
+                               DEV_NVECTORS_UNSPECIFIED, ""),
+            DEFINE_PROP_HEX32("class", VirtIOPCIProxy, class_code, 0, ""),
             DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features),
             DEFINE_PROP_UINT32("max_ports", VirtIOPCIProxy, max_virtserial_ports,
-                               31),
+                               31, ""),
             DEFINE_PROP_END_OF_LIST(),
         },
         .qdev.reset = virtio_pci_reset,
@@ -719,8 +719,8 @@ static PCIDeviceInfo virtio_info[] = {
         .init      = virtio_9p_init_pci,
         .qdev.props = (Property[]) {
             DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features),
-            DEFINE_PROP_STRING("mount_tag", VirtIOPCIProxy, fsconf.tag),
-            DEFINE_PROP_STRING("fsdev", VirtIOPCIProxy, fsconf.fsdev_id),
+            DEFINE_PROP_STRING("mount_tag", VirtIOPCIProxy, fsconf.tag, ""),
+            DEFINE_PROP_STRING("fsdev", VirtIOPCIProxy, fsconf.fsdev_id, ""),
             DEFINE_PROP_END_OF_LIST(),
         },
     }, {
diff --git a/hw/virtio.h b/hw/virtio.h
index e4306cd..21f0c4c 100644
--- a/hw/virtio.h
+++ b/hw/virtio.h
@@ -197,7 +197,7 @@ void virtio_net_exit(VirtIODevice *vdev);
 
 #define DEFINE_VIRTIO_COMMON_FEATURES(_state, _field) \
 	DEFINE_PROP_BIT("indirect_desc", _state, _field, \
-			VIRTIO_RING_F_INDIRECT_DESC, true)
+			VIRTIO_RING_F_INDIRECT_DESC, true, "")
 
 target_phys_addr_t virtio_queue_get_desc_addr(VirtIODevice *vdev, int n);
 target_phys_addr_t virtio_queue_get_avail_addr(VirtIODevice *vdev, int n);
diff --git a/hw/xilinx_ethlite.c b/hw/xilinx_ethlite.c
index 37e33ec..80fa5b6 100644
--- a/hw/xilinx_ethlite.c
+++ b/hw/xilinx_ethlite.c
@@ -239,8 +239,10 @@ static SysBusDeviceInfo xilinx_ethlite_info = {
     .qdev.name  = "xilinx,ethlite",
     .qdev.size  = sizeof(struct xlx_ethlite),
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("txpingpong", struct xlx_ethlite, c_tx_pingpong, 1),
-        DEFINE_PROP_UINT32("rxpingpong", struct xlx_ethlite, c_rx_pingpong, 1),
+        DEFINE_PROP_UINT32("txpingpong", struct xlx_ethlite, c_tx_pingpong, 1,
+                           ""),
+        DEFINE_PROP_UINT32("rxpingpong", struct xlx_ethlite, c_rx_pingpong, 1,
+                           ""),
         DEFINE_NIC_PROPERTIES(struct xlx_ethlite, conf),
         DEFINE_PROP_END_OF_LIST(),
     }
diff --git a/hw/xilinx_intc.c b/hw/xilinx_intc.c
index 8ef6474..c33e878 100644
--- a/hw/xilinx_intc.c
+++ b/hw/xilinx_intc.c
@@ -163,7 +163,8 @@ static SysBusDeviceInfo xilinx_intc_info = {
     .qdev.name  = "xilinx,intc",
     .qdev.size  = sizeof(struct xlx_pic),
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("kind-of-intr", struct xlx_pic, c_kind_of_intr, 0),
+        DEFINE_PROP_UINT32("kind-of-intr", struct xlx_pic, c_kind_of_intr, 0,
+                           ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/hw/xilinx_timer.c b/hw/xilinx_timer.c
index e2d9541..65155e7 100644
--- a/hw/xilinx_timer.c
+++ b/hw/xilinx_timer.c
@@ -220,8 +220,8 @@ static SysBusDeviceInfo xilinx_timer_info = {
     .qdev.name  = "xilinx,timer",
     .qdev.size  = sizeof(struct timerblock),
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT32("frequency", struct timerblock, freq_hz,   0),
-        DEFINE_PROP_UINT32("nr-timers", struct timerblock, nr_timers, 0),
+        DEFINE_PROP_UINT32("frequency", struct timerblock, freq_hz,   0, ""),
+        DEFINE_PROP_UINT32("nr-timers", struct timerblock, nr_timers, 0, ""),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
diff --git a/net.h b/net.h
index b83f615..0e9cc5d 100644
--- a/net.h
+++ b/net.h
@@ -21,9 +21,9 @@ typedef struct NICConf {
 } NICConf;
 
 #define DEFINE_NIC_PROPERTIES(_state, _conf)                            \
-    DEFINE_PROP_MACADDR("mac",   _state, _conf.macaddr),                \
-    DEFINE_PROP_VLAN("vlan",     _state, _conf.vlan),                   \
-    DEFINE_PROP_NETDEV("netdev", _state, _conf.peer)
+    DEFINE_PROP_MACADDR("mac",   _state, _conf.macaddr, ""),            \
+    DEFINE_PROP_VLAN("vlan",     _state, _conf.vlan, ""),               \
+    DEFINE_PROP_NETDEV("netdev", _state, _conf.peer, "")
 
 /* VLANs support */
 
diff --git a/usb-linux.c b/usb-linux.c
index 88273ff..fd62a94 100644
--- a/usb-linux.c
+++ b/usb-linux.c
@@ -1018,10 +1018,10 @@ static struct USBDeviceInfo usb_host_dev_info = {
     .usbdevice_name = "host",
     .usbdevice_init = usb_host_device_open,
     .qdev.props     = (Property[]) {
-        DEFINE_PROP_UINT32("hostbus",  USBHostDevice, match.bus_num,    0),
-        DEFINE_PROP_UINT32("hostaddr", USBHostDevice, match.addr,       0),
-        DEFINE_PROP_HEX32("vendorid",  USBHostDevice, match.vendor_id,  0),
-        DEFINE_PROP_HEX32("productid", USBHostDevice, match.product_id, 0),
+        DEFINE_PROP_UINT32("hostbus",  USBHostDevice, match.bus_num,    0, ""),
+        DEFINE_PROP_UINT32("hostaddr", USBHostDevice, match.addr,       0, ""),
+        DEFINE_PROP_HEX32("vendorid",  USBHostDevice, match.vendor_id,  0, ""),
+        DEFINE_PROP_HEX32("productid", USBHostDevice, match.product_id, 0, ""),
         DEFINE_PROP_END_OF_LIST(),
     },
 };
-- 
1.7.0.1

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

* [Qemu-devel] [PATCH 2/5] virtio-serial: Add description fields for qdev properties
  2010-05-31 12:41 [Qemu-devel] [PATCH 0/5] Add '-device help' output for device params and help text Amit Shah
  2010-05-31 12:41 ` [Qemu-devel] [PATCH 1/5] qdev: Add a description field for qdev properties for documentation Amit Shah
@ 2010-05-31 12:41 ` Amit Shah
  2010-05-31 12:41 ` [Qemu-devel] [PATCH 3/5] net.h: Add description fields for qdev properites Amit Shah
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 12+ messages in thread
From: Amit Shah @ 2010-05-31 12:41 UTC (permalink / raw)
  To: qemu list; +Cc: Amit Shah, Juan Quintela, Markus Armbruster, Gerd Hoffmann

Document the parameters for the virtserialport and virtioconsole
devices.

Example:

$ ./x86_64-softmmu/qemu-system-x86_64 -device virtserialport,?
virtserialport.nr=uint32, The 'number' for the port for \
predictable port numbers. Use this to spawn ports if you \
plan to migrate the guest.

virtserialport.chardev=chr, The chardev to associate this port with.

virtserialport.name=string, Name for the port that's exposed to \
the guest for port discovery.

Signed-off-by: Amit Shah <amit.shah@redhat.com>
---
 hw/virtio-console.c |   17 ++++++++++-------
 hw/virtio-serial.h  |   13 +++++++++++++
 2 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/hw/virtio-console.c b/hw/virtio-console.c
index ccd277a..8a99a99 100644
--- a/hw/virtio-console.c
+++ b/hw/virtio-console.c
@@ -95,11 +95,13 @@ static VirtIOSerialPortInfo virtconsole_info = {
     .init          = virtconsole_initfn,
     .exit          = virtconsole_exitfn,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_UINT8("is_console", VirtConsole, port.is_console, 1, ""),
+        DEFINE_PROP_UINT8("is_console", VirtConsole, port.is_console, 1,
+                          PROP_VIRTSERIAL_IS_CONSOLE_DESC),
         DEFINE_PROP_UINT32("nr", VirtConsole, port.id, VIRTIO_CONSOLE_BAD_ID,
-                           ""),
-        DEFINE_PROP_CHR("chardev", VirtConsole, chr, ""),
-        DEFINE_PROP_STRING("name", VirtConsole, port.name, ""),
+                           PROP_VIRTSERIAL_NR_DESC),
+        DEFINE_PROP_CHR("chardev", VirtConsole, chr, PROP_VIRTSERIAL_CHR_DESC),
+        DEFINE_PROP_STRING("name", VirtConsole, port.name,
+                           PROP_VIRTSERIAL_NAME_DESC),
         DEFINE_PROP_END_OF_LIST(),
     },
 };
@@ -133,9 +135,10 @@ static VirtIOSerialPortInfo virtserialport_info = {
     .exit          = virtconsole_exitfn,
     .qdev.props = (Property[]) {
         DEFINE_PROP_UINT32("nr", VirtConsole, port.id, VIRTIO_CONSOLE_BAD_ID,
-                           ""),
-        DEFINE_PROP_CHR("chardev", VirtConsole, chr, ""),
-        DEFINE_PROP_STRING("name", VirtConsole, port.name, ""),
+                           PROP_VIRTSERIAL_NR_DESC),
+        DEFINE_PROP_CHR("chardev", VirtConsole, chr, PROP_VIRTSERIAL_CHR_DESC),
+        DEFINE_PROP_STRING("name", VirtConsole, port.name,
+                           PROP_VIRTSERIAL_NAME_DESC),
         DEFINE_PROP_END_OF_LIST(),
     },
 };
diff --git a/hw/virtio-serial.h b/hw/virtio-serial.h
index a93b545..91f3da3 100644
--- a/hw/virtio-serial.h
+++ b/hw/virtio-serial.h
@@ -58,6 +58,19 @@ struct virtio_console_control {
 
 /* == In-qemu interface == */
 
+#define PROP_VIRTSERIAL_IS_CONSOLE_DESC                                 \
+    "An hvc console will be spawned in the guest if this is set."
+
+#define PROP_VIRTSERIAL_NR_DESC                                         \
+    "The 'number' for the port for predictable port numbers. Use this to " \
+    "spawn ports if you plan to migrate the guest."
+
+#define PROP_VIRTSERIAL_CHR_DESC                \
+    "The chardev to associate this port with."
+
+#define PROP_VIRTSERIAL_NAME_DESC                \
+    "Name for the port that's exposed to the guest for port discovery."
+
 typedef struct VirtIOSerial VirtIOSerial;
 typedef struct VirtIOSerialBus VirtIOSerialBus;
 typedef struct VirtIOSerialPort VirtIOSerialPort;
-- 
1.7.0.1

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

* [Qemu-devel] [PATCH 3/5] net.h: Add description fields for qdev properites
  2010-05-31 12:41 [Qemu-devel] [PATCH 0/5] Add '-device help' output for device params and help text Amit Shah
  2010-05-31 12:41 ` [Qemu-devel] [PATCH 1/5] qdev: Add a description field for qdev properties for documentation Amit Shah
  2010-05-31 12:41 ` [Qemu-devel] [PATCH 2/5] virtio-serial: Add description fields for qdev properties Amit Shah
@ 2010-05-31 12:41 ` Amit Shah
  2010-05-31 12:41 ` [Qemu-devel] [PATCH 4/5] qdev: Re-arrange code to have device properties shown from own function Amit Shah
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 12+ messages in thread
From: Amit Shah @ 2010-05-31 12:41 UTC (permalink / raw)
  To: qemu list; +Cc: Amit Shah, Juan Quintela, Markus Armbruster, Gerd Hoffmann

This results in an output like:

$ ./x86_64-softmmu/qemu-system-x86_64 -device virtio-net-pci,?

...

virtio-net-pci.mac=macaddr, The MAC address for the NIC.
virtio-net-pci.vlan=vlan, The VLAN to associate the NIC with.
virtio-net-pci.netdev=netdev, The peer net device to associate with this virtual NIC.

Signed-off-by: Amit Shah <amit.shah@redhat.com>
---
 net.h |    9 ++++++---
 1 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/net.h b/net.h
index 0e9cc5d..9ffd4d0 100644
--- a/net.h
+++ b/net.h
@@ -21,9 +21,12 @@ typedef struct NICConf {
 } NICConf;
 
 #define DEFINE_NIC_PROPERTIES(_state, _conf)                            \
-    DEFINE_PROP_MACADDR("mac",   _state, _conf.macaddr, ""),            \
-    DEFINE_PROP_VLAN("vlan",     _state, _conf.vlan, ""),               \
-    DEFINE_PROP_NETDEV("netdev", _state, _conf.peer, "")
+    DEFINE_PROP_MACADDR("mac",   _state, _conf.macaddr,                 \
+                        "The MAC address for the NIC."),                \
+    DEFINE_PROP_VLAN("vlan",     _state, _conf.vlan,                    \
+                     "The VLAN to associate the NIC with."),            \
+    DEFINE_PROP_NETDEV("netdev", _state, _conf.peer,                    \
+                       "The peer net device to associate with this virtual NIC.")
 
 /* VLANs support */
 
-- 
1.7.0.1

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

* [Qemu-devel] [PATCH 4/5] qdev: Re-arrange code to have device properties shown from own function
  2010-05-31 12:41 [Qemu-devel] [PATCH 0/5] Add '-device help' output for device params and help text Amit Shah
                   ` (2 preceding siblings ...)
  2010-05-31 12:41 ` [Qemu-devel] [PATCH 3/5] net.h: Add description fields for qdev properites Amit Shah
@ 2010-05-31 12:41 ` Amit Shah
  2010-05-31 12:41 ` [Qemu-devel] [PATCH 5/5] qdev: Add new '-device help' option, shows all devices and properties Amit Shah
  2010-06-07 16:09 ` [Qemu-devel] [PATCH 0/5] Add '-device help' output for device params and help text Anthony Liguori
  5 siblings, 0 replies; 12+ messages in thread
From: Amit Shah @ 2010-05-31 12:41 UTC (permalink / raw)
  To: qemu list; +Cc: Amit Shah, Juan Quintela, Markus Armbruster, Gerd Hoffmann

Instead of printing out the device properties help messages from
qdev_device_help(), split it off into a new function. This way, we have
two separate function calls for device help and device properties help.

This will be later used to show all the devices and all the properties
associated with the device as part of a complete coverage for all
devices and options associated with each of them.

Signed-off-by: Amit Shah <amit.shah@redhat.com>
---
 hw/qdev.c |   41 ++++++++++++++++++++++++-----------------
 1 files changed, 24 insertions(+), 17 deletions(-)

diff --git a/hw/qdev.c b/hw/qdev.c
index 2cd205b..89ba986 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -151,27 +151,11 @@ static int set_property(const char *name, const char *value, void *opaque)
     return 0;
 }
 
-int qdev_device_help(QemuOpts *opts)
+static int show_device_props(const char *driver)
 {
-    const char *driver;
     DeviceInfo *info;
     Property *prop;
 
-    driver = qemu_opt_get(opts, "driver");
-    if (driver && !strcmp(driver, "?")) {
-        for (info = device_info_list; info != NULL; info = info->next) {
-            if (info->no_user) {
-                continue;       /* not available, don't show */
-            }
-            qdev_print_devinfo(info);
-        }
-        return 1;
-    }
-
-    if (!qemu_opt_get(opts, "?")) {
-        return 0;
-    }
-
     info = qdev_find_info(NULL, driver);
     if (!info) {
         return 0;
@@ -193,6 +177,29 @@ int qdev_device_help(QemuOpts *opts)
     return 1;
 }
 
+int qdev_device_help(QemuOpts *opts)
+{
+    const char *driver;
+    DeviceInfo *info;
+
+    driver = qemu_opt_get(opts, "driver");
+    if (driver && !strcmp(driver, "?")) {
+        for (info = device_info_list; info != NULL; info = info->next) {
+            if (info->no_user) {
+                continue;       /* not available, don't show */
+            }
+            qdev_print_devinfo(info);
+        }
+        return 1;
+    }
+
+    if (!qemu_opt_get(opts, "?")) {
+        return 0;
+    }
+
+    return show_device_props(driver);
+}
+
 DeviceState *qdev_device_add(QemuOpts *opts)
 {
     const char *driver, *path, *id;
-- 
1.7.0.1

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

* [Qemu-devel] [PATCH 5/5] qdev: Add new '-device help' option, shows all devices and properties
  2010-05-31 12:41 [Qemu-devel] [PATCH 0/5] Add '-device help' output for device params and help text Amit Shah
                   ` (3 preceding siblings ...)
  2010-05-31 12:41 ` [Qemu-devel] [PATCH 4/5] qdev: Re-arrange code to have device properties shown from own function Amit Shah
@ 2010-05-31 12:41 ` Amit Shah
  2010-06-07 14:43   ` Markus Armbruster
  2010-06-07 16:09 ` [Qemu-devel] [PATCH 0/5] Add '-device help' output for device params and help text Anthony Liguori
  5 siblings, 1 reply; 12+ messages in thread
From: Amit Shah @ 2010-05-31 12:41 UTC (permalink / raw)
  To: qemu list; +Cc: Amit Shah, Juan Quintela, Markus Armbruster, Gerd Hoffmann

The new '-device help' option shows all the devices that are registered
with qdev and prints out all the properties each device has, along with
the description for each property.

This is useful in creating automatic documentation for all the options
that we have and support.

Signed-off-by: Amit Shah <amit.shah@redhat.com>
---
 hw/qdev.c |   15 +++++++++++----
 1 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/hw/qdev.c b/hw/qdev.c
index 89ba986..4be2f66 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -151,7 +151,7 @@ static int set_property(const char *name, const char *value, void *opaque)
     return 0;
 }
 
-static int show_device_props(const char *driver)
+static int show_device_props(const char *driver, const char *prefix)
 {
     DeviceInfo *info;
     Property *prop;
@@ -161,6 +161,10 @@ static int show_device_props(const char *driver)
         return 0;
     }
 
+    if (!prefix) {
+        prefix = "";
+    }
+
     for (prop = info->props; prop && prop->name; prop++) {
         /*
          * TODO Properties without a parser are just for dirty hacks.
@@ -171,7 +175,7 @@ static int show_device_props(const char *driver)
         if (!prop->info->parse) {
             continue;           /* no way to set it, don't show */
         }
-        error_printf("%s.%s=%s, %s\n", info->name, prop->name,
+        error_printf("%s%s.%s=%s, %s\n", prefix, info->name, prop->name,
                      prop->info->name, prop->desc ?: "");
     }
     return 1;
@@ -183,12 +187,15 @@ int qdev_device_help(QemuOpts *opts)
     DeviceInfo *info;
 
     driver = qemu_opt_get(opts, "driver");
-    if (driver && !strcmp(driver, "?")) {
+    if (driver && (!strcmp(driver, "?") || !strcmp(driver, "help"))) {
         for (info = device_info_list; info != NULL; info = info->next) {
             if (info->no_user) {
                 continue;       /* not available, don't show */
             }
             qdev_print_devinfo(info);
+            if (!strcmp(driver, "help")) {
+                show_device_props(info->name, "\t");
+            }
         }
         return 1;
     }
@@ -197,7 +204,7 @@ int qdev_device_help(QemuOpts *opts)
         return 0;
     }
 
-    return show_device_props(driver);
+    return show_device_props(driver, NULL);
 }
 
 DeviceState *qdev_device_add(QemuOpts *opts)
-- 
1.7.0.1

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

* Re: [Qemu-devel] [PATCH 5/5] qdev: Add new '-device help' option, shows all devices and properties
  2010-05-31 12:41 ` [Qemu-devel] [PATCH 5/5] qdev: Add new '-device help' option, shows all devices and properties Amit Shah
@ 2010-06-07 14:43   ` Markus Armbruster
  2010-06-08  5:13     ` Amit Shah
  0 siblings, 1 reply; 12+ messages in thread
From: Markus Armbruster @ 2010-06-07 14:43 UTC (permalink / raw)
  To: Amit Shah; +Cc: Gerd Hoffmann, qemu list, Juan Quintela

I like PATCH 1-3/5, but this one needs discussion.

Amit Shah <amit.shah@redhat.com> writes:

> The new '-device help' option shows all the devices that are registered
> with qdev and prints out all the properties each device has, along with
> the description for each property.
>
> This is useful in creating automatic documentation for all the options
> that we have and support.
>
> Signed-off-by: Amit Shah <amit.shah@redhat.com>
> ---
>  hw/qdev.c |   15 +++++++++++----
>  1 files changed, 11 insertions(+), 4 deletions(-)

Documentation update missing: qemu-options.hx

> diff --git a/hw/qdev.c b/hw/qdev.c
> index 89ba986..4be2f66 100644
> --- a/hw/qdev.c
> +++ b/hw/qdev.c
> @@ -151,7 +151,7 @@ static int set_property(const char *name, const char *value, void *opaque)
>      return 0;
>  }
>  
> -static int show_device_props(const char *driver)
> +static int show_device_props(const char *driver, const char *prefix)
>  {
>      DeviceInfo *info;
>      Property *prop;
> @@ -161,6 +161,10 @@ static int show_device_props(const char *driver)
>          return 0;
>      }
>  
> +    if (!prefix) {
> +        prefix = "";
> +    }
> +

Just make the caller pass "" instead of NULL.

>      for (prop = info->props; prop && prop->name; prop++) {
>          /*
>           * TODO Properties without a parser are just for dirty hacks.
> @@ -171,7 +175,7 @@ static int show_device_props(const char *driver)
>          if (!prop->info->parse) {
>              continue;           /* no way to set it, don't show */
>          }
> -        error_printf("%s.%s=%s, %s\n", info->name, prop->name,
> +        error_printf("%s%s.%s=%s, %s\n", prefix, info->name, prop->name,
>                       prop->info->name, prop->desc ?: "");
>      }
>      return 1;
> @@ -183,12 +187,15 @@ int qdev_device_help(QemuOpts *opts)
>      DeviceInfo *info;
>  
>      driver = qemu_opt_get(opts, "driver");
> -    if (driver && !strcmp(driver, "?")) {
> +    if (driver && (!strcmp(driver, "?") || !strcmp(driver, "help"))) {
>          for (info = device_info_list; info != NULL; info = info->next) {
>              if (info->no_user) {
>                  continue;       /* not available, don't show */
>              }
>              qdev_print_devinfo(info);
> +            if (!strcmp(driver, "help")) {
> +                show_device_props(info->name, "\t");
> +            }
>          }
>          return 1;
>      }

There is "-device \?" and "-device help", but the user interface
provides no clue about the difference between them.

"-device help" loses when we ever pick up a device model with name
"help".  Not that "?" was a particularly smart choice...

Do we really need two kinds of help output?  Where the second is
basically the same as "-device FOO,\?" for all FOO?  Is that convenience
worth the extra UI complexity?

Doing it in the shell isn't exactly hard:

$ for i in `qemu -device \? 2>&1 | awk -F \" '{ print $2 }'`; do qemu -device $i,\?; done

> @@ -197,7 +204,7 @@ int qdev_device_help(QemuOpts *opts)
>          return 0;
>      }
>  
> -    return show_device_props(driver);
> +    return show_device_props(driver, NULL);
>  }
>  
>  DeviceState *qdev_device_add(QemuOpts *opts)

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

* Re: [Qemu-devel] [PATCH 0/5] Add '-device help' output for device params and help text
  2010-05-31 12:41 [Qemu-devel] [PATCH 0/5] Add '-device help' output for device params and help text Amit Shah
                   ` (4 preceding siblings ...)
  2010-05-31 12:41 ` [Qemu-devel] [PATCH 5/5] qdev: Add new '-device help' option, shows all devices and properties Amit Shah
@ 2010-06-07 16:09 ` Anthony Liguori
  2010-06-08  5:21   ` Amit Shah
  5 siblings, 1 reply; 12+ messages in thread
From: Anthony Liguori @ 2010-06-07 16:09 UTC (permalink / raw)
  To: Amit Shah; +Cc: Markus Armbruster, Gerd Hoffmann, qemu list, Juan Quintela

On 05/31/2010 07:41 AM, Amit Shah wrote:
> Hello,
>
> This patch series adds support to specify some descriptive help text
> to qdev device parameters. This series adds some help text to the
> virtserialport and net family of devices as an example, and the new
> output is shown in the respective commits.
>
> This series also adds a new '-device help' option that lists all the
> available qdev devices (which is avl. via -device ? now), and adds
> each device's parameters to the output listing. This output also shows
> the descriptive text.
>
> The idea is to auto-generate documentation from code and to populate
> some wiki / qemu-doc.texi using this new target.
>    

I really dislike having options print their own help.

Maybe we can introduce a proper -help option that takes an argument that 
can display subsystem specific help?

For instance:

qemu -help device

Would display the help output in this series.

My other concern is that we now have a big mess of properties that don't 
have help text.  What are the chances that anyone is going to go through 
and do this?

I'd rather we bite the bullet and add help everywhere before merging any 
of this because experience has shown that existing code usually never 
gets converted if not converted all at once.

Regards,

Anthony Liguori

> Changes from previous send:
> - Removed the 'RFC' tag
> - Not using macros in net.h (Markus)
>
> It'll be helpful to have people submit some short descriptive text for
> the subsystems they care about.
>
> Amit Shah (5):
>    qdev: Add a description field for qdev properties for documentation
>    virtio-serial: Add description fields for qdev properties
>    net.h: Add description fields for qdev properites
>    qdev: Re-arrange code to have device properties shown from own
>      function
>    qdev: Add new '-device help' option, shows all devices and properties
>
>   block_int.h           |   10 +++---
>   hw/a9mpcore.c         |    2 +-
>   hw/acpi_piix4.c       |    2 +-
>   hw/arm11mpcore.c      |    4 +-
>   hw/arm_sysctl.c       |    4 +-
>   hw/armv7m.c           |    2 +-
>   hw/cs4231a.c          |    6 ++--
>   hw/debugcon.c         |    6 ++--
>   hw/eccmemctl.c        |    2 +-
>   hw/escc.c             |   16 +++++-----
>   hw/etraxfs_pic.c      |    3 +-
>   hw/fdc.c              |   10 +++---
>   hw/gus.c              |    8 ++--
>   hw/i2c.c              |    2 +-
>   hw/ide/cmd646.c       |    2 +-
>   hw/ide/isa.c          |    6 ++--
>   hw/ide/qdev.c         |    4 +-
>   hw/integratorcp.c     |    2 +-
>   hw/lance.c            |    2 +-
>   hw/m48t59.c           |   12 ++++----
>   hw/mc146818rtc.c      |    2 +-
>   hw/ne2000-isa.c       |    4 +-
>   hw/parallel.c         |    8 ++--
>   hw/pci.c              |   10 +++---
>   hw/qdev-addr.h        |    4 +-
>   hw/qdev.c             |   51 +++++++++++++++++++++------------
>   hw/qdev.h             |   75 ++++++++++++++++++++++++++-----------------------
>   hw/s390-virtio-bus.c  |    2 +-
>   hw/sb16.c             |   10 +++---
>   hw/scsi-bus.c         |    2 +-
>   hw/scsi-disk.c        |    2 +-
>   hw/serial.c           |    8 ++--
>   hw/slavio_timer.c     |    2 +-
>   hw/smbus_eeprom.c     |    2 +-
>   hw/sparc32_dma.c      |    2 +-
>   hw/sun4m.c            |    2 +-
>   hw/sun4m_iommu.c      |    2 +-
>   hw/sun4u.c            |    2 +-
>   hw/syborg_fb.c        |    4 +-
>   hw/syborg_interrupt.c |    2 +-
>   hw/syborg_keyboard.c  |    2 +-
>   hw/syborg_pointer.c   |    4 +-
>   hw/syborg_serial.c    |    2 +-
>   hw/syborg_timer.c     |    2 +-
>   hw/tcx.c              |   10 +++---
>   hw/usb-ohci.c         |    4 +-
>   hw/usb-serial.c       |   12 ++++----
>   hw/vga-pci.c          |    4 +-
>   hw/virtio-blk.h       |    4 +-
>   hw/virtio-console.c   |   19 ++++++++----
>   hw/virtio-net.h       |   51 +++++++++++++++++++++------------
>   hw/virtio-pci.c       |   16 +++++-----
>   hw/virtio-serial.h    |   13 ++++++++
>   hw/virtio.h           |    2 +-
>   hw/xilinx_ethlite.c   |    6 ++-
>   hw/xilinx_intc.c      |    3 +-
>   hw/xilinx_timer.c     |    4 +-
>   net.h                 |    9 ++++--
>   usb-linux.c           |    8 ++--
>   59 files changed, 268 insertions(+), 208 deletions(-)
>
>
>    

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

* Re: [Qemu-devel] [PATCH 5/5] qdev: Add new '-device help' option, shows all devices and properties
  2010-06-07 14:43   ` Markus Armbruster
@ 2010-06-08  5:13     ` Amit Shah
  0 siblings, 0 replies; 12+ messages in thread
From: Amit Shah @ 2010-06-08  5:13 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: Gerd Hoffmann, qemu list, Juan Quintela

On (Mon) Jun 07 2010 [16:43:05], Markus Armbruster wrote:
> 
> There is "-device \?" and "-device help", but the user interface
> provides no clue about the difference between them.
> 
> "-device help" loses when we ever pick up a device model with name
> "help".  Not that "?" was a particularly smart choice...
> 
> Do we really need two kinds of help output?  Where the second is
> basically the same as "-device FOO,\?" for all FOO?  Is that convenience
> worth the extra UI complexity?

OK, so my big plan is to have something like this:

---

./qemu -device help

...
name "virtserialport", bus virtio-serial-bus
	nr=uint32, The 'number' for the port for predictable port numbers.
	chardev=chr, The chardev to associate this port with.
	name=string, Name for the port that's exposed to the guest for port discovery.
...

---

./qemu -device virtserialport,?

virtserialport.nr=uint32, The 'number' for the port for predictable port numbers.

   Use this to spawn ports if you plan to migrate the guest and perform
   hot-plug and unplug operations.

virtserialport.chardev=chr, The chardev to associate this port with.

   External programs can communicate with the guest side of the channel
   using chardev

virtserialport.name=string, Name for the port that's exposed to the guest for port discovery.

   The name is exposed in Linux guests via sysfs and udev rules can be
   written to create symlinks to the ports. Apps in the guest can then
   easily find these ports and start communication.

---

So basically -device help gives a short, one-liner help message and the
-device ? option gives a slightly detailed message, if one is available.

How to do that: I'm thinking of two ways:

1)

    DEFINE_PROP_UINT32("nr", VirtConsole, port.id, VIRTIO_CONSOLE_BAD_ID,
                       "The 'number' for the port for predictable port numbers.",
                       "Use this to spawn ports if you plan to migrate the guest and perform \n"
                       "hot-plug and unplug operations." ),

ie, two different strings for the short and long descriptions

2)

    DEFINE_PROP_UINT32("nr", VirtConsole, port.id, VIRTIO_CONSOLE_BAD_ID,
                       "The 'number' for the port for predictable port numbers.\n"
                       "Use this to spawn ports if you plan to migrate the guest and perform \n"
                       "hot-plug and unplug operations." ),

ie, the same string, but the short and long descriptions are separated
by a '\n'.

Doing it the adds parsing to the printing routine for no extra benefit,
so I'm inclined to go with 1. Thoughts?

		Amit

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

* Re: [Qemu-devel] [PATCH 0/5] Add '-device help' output for device params and help text
  2010-06-07 16:09 ` [Qemu-devel] [PATCH 0/5] Add '-device help' output for device params and help text Anthony Liguori
@ 2010-06-08  5:21   ` Amit Shah
  2010-06-14 16:55     ` Anthony Liguori
  0 siblings, 1 reply; 12+ messages in thread
From: Amit Shah @ 2010-06-08  5:21 UTC (permalink / raw)
  To: Anthony Liguori
  Cc: Markus Armbruster, Gerd Hoffmann, qemu list, Juan Quintela

On (Mon) Jun 07 2010 [11:09:32], Anthony Liguori wrote:
> On 05/31/2010 07:41 AM, Amit Shah wrote:
> >Hello,
> >
> >This patch series adds support to specify some descriptive help text
> >to qdev device parameters. This series adds some help text to the
> >virtserialport and net family of devices as an example, and the new
> >output is shown in the respective commits.
> >
> >This series also adds a new '-device help' option that lists all the
> >available qdev devices (which is avl. via -device ? now), and adds
> >each device's parameters to the output listing. This output also shows
> >the descriptive text.
> >
> >The idea is to auto-generate documentation from code and to populate
> >some wiki / qemu-doc.texi using this new target.
> 
> I really dislike having options print their own help.

Why? I really like it, coders can embed help exactly in the same place
they're adding / changing options and there's much less chance of
someone missing updating help strings when updating / adding options.

> Maybe we can introduce a proper -help option that takes an argument
> that can display subsystem specific help?
> 
> For instance:
> 
> qemu -help device
> 
> Would display the help output in this series.

What I'm adding here is similar; instead of -help device, I'm adding
-device help, and I think it's nicer because it fits directly in the
qdev code.

> My other concern is that we now have a big mess of properties that
> don't have help text.  What are the chances that anyone is going to
> go through and do this?
> 
> I'd rather we bite the bullet and add help everywhere before merging
> any of this because experience has shown that existing code usually
> never gets converted if not converted all at once.

Let me put my community contributor hat on: we're not really giving away
vibes that qemu has to be 100% enterprise-ready at each commit, are we?
qemu is a *development* project, and development happens one small
commit at a time, commit early and often. If I'm going to have to
maintiain hundreds of small help-related patches, it's soon going to
grow stale as people change related code and in the end I'll grow
frustrated and drop then entire exercise. Not the first time that
would've happened.

On the other hand, we commit this right away, and interested developers
in their own domains start contributing the small one-liners which
brings their subsystem up to the mark for documentation.

I think this is the best way to contribute such patches.

If you think some devices are going to go documentation-less, instead of
empty strings, I can do "description needed" strings, which can even
invite first-time contributors grep through this and contribute the
one-liners.

If the enterprise people want this fixed before any enterprise release,
they better commit resources to ensure they don't release anything that
has a 'documentation needed!' line. :-)

		Amit

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

* Re: [Qemu-devel] [PATCH 0/5] Add '-device help' output for device params and help text
  2010-06-08  5:21   ` Amit Shah
@ 2010-06-14 16:55     ` Anthony Liguori
  2010-06-15  9:17       ` Markus Armbruster
  0 siblings, 1 reply; 12+ messages in thread
From: Anthony Liguori @ 2010-06-14 16:55 UTC (permalink / raw)
  To: Amit Shah; +Cc: qemu list, Juan Quintela, Markus Armbruster, Gerd Hoffmann

On 06/08/2010 12:21 AM, Amit Shah wrote:
> On (Mon) Jun 07 2010 [11:09:32], Anthony Liguori wrote:
>    
>> On 05/31/2010 07:41 AM, Amit Shah wrote:
>>      
>>> Hello,
>>>
>>> This patch series adds support to specify some descriptive help text
>>> to qdev device parameters. This series adds some help text to the
>>> virtserialport and net family of devices as an example, and the new
>>> output is shown in the respective commits.
>>>
>>> This series also adds a new '-device help' option that lists all the
>>> available qdev devices (which is avl. via -device ? now), and adds
>>> each device's parameters to the output listing. This output also shows
>>> the descriptive text.
>>>
>>> The idea is to auto-generate documentation from code and to populate
>>> some wiki / qemu-doc.texi using this new target.
>>>        
>> I really dislike having options print their own help.
>>      
> Why? I really like it, coders can embed help exactly in the same place
> they're adding / changing options and there's much less chance of
> someone missing updating help strings when updating / adding options.
>    

Because it's inconsistent from a UI perspective.  -device help, -M ?, etc.

How's a user supposed to know which options can display help and what 
the magic invocation is that is used to display it?

-help device/-help machine

Provides a consistent, self discoverable interface for users to get 
detailed inline help.

>> Maybe we can introduce a proper -help option that takes an argument
>> that can display subsystem specific help?
>>
>> For instance:
>>
>> qemu -help device
>>
>> Would display the help output in this series.
>>      
> What I'm adding here is similar; instead of -help device, I'm adding
> -device help, and I think it's nicer because it fits directly in the
> qdev code.
>    

The UI should not be a consequence of the implementation.

>> My other concern is that we now have a big mess of properties that
>> don't have help text.  What are the chances that anyone is going to
>> go through and do this?
>>
>> I'd rather we bite the bullet and add help everywhere before merging
>> any of this because experience has shown that existing code usually
>> never gets converted if not converted all at once.
>>      
> Let me put my community contributor hat on: we're not really giving away
> vibes that qemu has to be 100% enterprise-ready at each commit, are we?
> qemu is a *development* project, and development happens one small
> commit at a time, commit early and often. If I'm going to have to
> maintiain hundreds of small help-related patches, it's soon going to
> grow stale as people change related code and in the end I'll grow
> frustrated and drop then entire exercise. Not the first time that
> would've happened.
>    

The problem with this argument is that people introduce things like this 
with this exact argument and then nothing every ends up getting help 
options.

> On the other hand, we commit this right away, and interested developers
> in their own domains start contributing the small one-liners which
> brings their subsystem up to the mark for documentation.
>    

It simply doesn't happen or else it already would have.  The best way to 
make this is a one time painful conversion followed by strong 
enforcement that all new options take help strings.

Regards,

Anthony Liguori

> I think this is the best way to contribute such patches.
>
> If you think some devices are going to go documentation-less, instead of
> empty strings, I can do "description needed" strings, which can even
> invite first-time contributors grep through this and contribute the
> one-liners.
>
> If the enterprise people want this fixed before any enterprise release,
> they better commit resources to ensure they don't release anything that
> has a 'documentation needed!' line. :-)
>
> 		Amit
>
>
>    

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

* Re: [Qemu-devel] [PATCH 0/5] Add '-device help' output for device params and help text
  2010-06-14 16:55     ` Anthony Liguori
@ 2010-06-15  9:17       ` Markus Armbruster
  0 siblings, 0 replies; 12+ messages in thread
From: Markus Armbruster @ 2010-06-15  9:17 UTC (permalink / raw)
  To: Anthony Liguori; +Cc: Amit Shah, Gerd Hoffmann, qemu list, Juan Quintela

Anthony Liguori <anthony@codemonkey.ws> writes:

> On 06/08/2010 12:21 AM, Amit Shah wrote:
>> On (Mon) Jun 07 2010 [11:09:32], Anthony Liguori wrote:
>>    
>>> On 05/31/2010 07:41 AM, Amit Shah wrote:
>>>      
>>>> Hello,
>>>>
>>>> This patch series adds support to specify some descriptive help text
>>>> to qdev device parameters. This series adds some help text to the
>>>> virtserialport and net family of devices as an example, and the new
>>>> output is shown in the respective commits.
>>>>
>>>> This series also adds a new '-device help' option that lists all the
>>>> available qdev devices (which is avl. via -device ? now), and adds
>>>> each device's parameters to the output listing. This output also shows
>>>> the descriptive text.
>>>>
>>>> The idea is to auto-generate documentation from code and to populate
>>>> some wiki / qemu-doc.texi using this new target.
>>>>        
>>> I really dislike having options print their own help.
>>>      
>> Why? I really like it, coders can embed help exactly in the same place
>> they're adding / changing options and there's much less chance of
>> someone missing updating help strings when updating / adding options.
>>    
>
> Because it's inconsistent from a UI perspective.  -device help, -M ?, etc.
>
> How's a user supposed to know which options can display help and what
> the magic invocation is that is used to display it?
>
> -help device/-help machine
>
> Provides a consistent, self discoverable interface for users to get
> detailed inline help.

Additional advantages:

* No special case for '?' in option processing.  No risk '?' for help
  collides with a legitimate non-help option argument starting with '?'.

* No more "-device x: Parameter 'driver' expects a driver name" just
  because you happen to have a file named "x" around, and you forgot to
  quote.

>>> Maybe we can introduce a proper -help option that takes an argument
>>> that can display subsystem specific help?
>>>
>>> For instance:
>>>
>>> qemu -help device
>>>
>>> Would display the help output in this series.
>>>      
>> What I'm adding here is similar; instead of -help device, I'm adding
>> -device help, and I think it's nicer because it fits directly in the
>> qdev code.
>>    
>
> The UI should not be a consequence of the implementation.

Yes.  And "-help FOO" can certainly be engineered so that FOO's
documentation is still next to FOO's implementation.

[...]

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

end of thread, other threads:[~2010-06-15  9:22 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-05-31 12:41 [Qemu-devel] [PATCH 0/5] Add '-device help' output for device params and help text Amit Shah
2010-05-31 12:41 ` [Qemu-devel] [PATCH 1/5] qdev: Add a description field for qdev properties for documentation Amit Shah
2010-05-31 12:41 ` [Qemu-devel] [PATCH 2/5] virtio-serial: Add description fields for qdev properties Amit Shah
2010-05-31 12:41 ` [Qemu-devel] [PATCH 3/5] net.h: Add description fields for qdev properites Amit Shah
2010-05-31 12:41 ` [Qemu-devel] [PATCH 4/5] qdev: Re-arrange code to have device properties shown from own function Amit Shah
2010-05-31 12:41 ` [Qemu-devel] [PATCH 5/5] qdev: Add new '-device help' option, shows all devices and properties Amit Shah
2010-06-07 14:43   ` Markus Armbruster
2010-06-08  5:13     ` Amit Shah
2010-06-07 16:09 ` [Qemu-devel] [PATCH 0/5] Add '-device help' output for device params and help text Anthony Liguori
2010-06-08  5:21   ` Amit Shah
2010-06-14 16:55     ` Anthony Liguori
2010-06-15  9:17       ` Markus Armbruster

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).