Patchwork [02/11] vmstate: register all VMStateDescriptions

login
register
mail settings
Submitter Anthony Liguori
Date March 23, 2011, 12:16 a.m.
Message ID <1300839376-22520-3-git-send-email-aliguori@us.ibm.com>
Download mbox | patch
Permalink /patch/87984/
State New
Headers show

Comments

Anthony Liguori - March 23, 2011, 12:16 a.m.
This is a purely mechanical change.  It was generated with a simple python
script and a little bit of hand tuning.  Without this, we can only see
VMStateDescriptions that are part of an active device which means that we have
to test migration with a VM configured with every possible device.

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
---
 hw/ac97.c                  |    8 ++++++
 hw/acpi_piix4.c            |    8 ++++++
 hw/apb_pci.c               |    8 ++++++
 hw/apic.c                  |    8 ++++++
 hw/arm_sysctl.c            |    8 ++++++
 hw/bonito.c                |    8 ++++++
 hw/cirrus_vga.c            |    8 ++++++
 hw/cs4231.c                |    8 ++++++
 hw/cs4231a.c               |    8 ++++++
 hw/dec_pci.c               |    8 ++++++
 hw/e1000.c                 |    8 ++++++
 hw/eccmemctl.c             |    8 ++++++
 hw/eeprom93xx.c            |    8 ++++++
 hw/es1370.c                |    8 ++++++
 hw/escc.c                  |    8 ++++++
 hw/esp.c                   |    8 ++++++
 hw/fdc.c                   |   16 ++++++++++++
 hw/fw_cfg.c                |    8 ++++++
 hw/gus.c                   |    8 ++++++
 hw/hda-audio.c             |    8 ++++++
 hw/hpet.c                  |    8 ++++++
 hw/hw.h                    |    3 ++
 hw/i2c.c                   |    8 ++++++
 hw/i8254.c                 |    8 ++++++
 hw/i8259.c                 |    8 ++++++
 hw/intel-hda.c             |    8 ++++++
 hw/ioapic.c                |    8 ++++++
 hw/ioh3420.c               |    8 ++++++
 hw/kvmclock.c              |    8 ++++++
 hw/lance.c                 |    8 ++++++
 hw/lm32_juart.c            |    8 ++++++
 hw/lm32_pic.c              |    8 ++++++
 hw/lm32_sys.c              |    8 ++++++
 hw/lm32_timer.c            |    8 ++++++
 hw/lm32_uart.c             |    8 ++++++
 hw/lm832x.c                |    8 ++++++
 hw/lsi53c895a.c            |    8 ++++++
 hw/marvell_88w8618_audio.c |    8 ++++++
 hw/max7310.c               |    8 ++++++
 hw/mc146818rtc.c           |    8 ++++++
 hw/mst_fpga.c              |    8 ++++++
 hw/musicpal.c              |   56 ++++++++++++++++++++++++++++++++++++++++++++
 hw/ne2000.c                |    8 ++++++
 hw/pc.c                    |    8 ++++++
 hw/pci.c                   |    8 ++++++
 hw/pckbd.c                 |   16 ++++++++++++
 hw/pcnet-pci.c             |    8 ++++++
 hw/piix_pci.c              |    8 ++++++
 hw/pl031.c                 |    8 ++++++
 hw/pl050.c                 |   16 ++++++++++++
 hw/pl080.c                 |   16 ++++++++++++
 hw/pl110.c                 |   16 ++++++++++++
 hw/pl190.c                 |    8 ++++++
 hw/ps2.c                   |   16 ++++++++++++
 hw/pxa2xx.c                |   16 ++++++++++++
 hw/pxa2xx_dma.c            |    8 ++++++
 hw/pxa2xx_pic.c            |    8 ++++++
 hw/pxa2xx_timer.c          |   16 ++++++++++++
 hw/qxl.c                   |   16 ++++++++++++
 hw/rtl8139.c               |   16 ++++++++++++
 hw/sb16.c                  |    8 ++++++
 hw/sbi.c                   |    8 ++++++
 hw/serial.c                |   10 ++++++-
 hw/slavio_intctl.c         |    8 ++++++
 hw/slavio_misc.c           |    8 ++++++
 hw/slavio_timer.c          |    8 ++++++
 hw/smc91c111.c             |    8 ++++++
 hw/sparc32_dma.c           |    8 ++++++
 hw/spitz.c                 |   32 +++++++++++++++++++++++++
 hw/ssd0303.c               |    8 ++++++
 hw/sun4c_intctl.c          |    8 ++++++
 hw/sun4m_iommu.c           |    8 ++++++
 hw/tcx.c                   |    8 ++++++
 hw/tmp105.c                |    8 ++++++
 hw/twl92230.c              |    8 ++++++
 hw/usb-hid.c               |    8 ++++++
 hw/usb-hub.c               |    8 ++++++
 hw/usb-uhci.c              |    8 ++++++
 hw/versatilepb.c           |    8 ++++++
 hw/vga-isa.c               |    8 ++++++
 hw/vga-pci.c               |    8 ++++++
 hw/vmmouse.c               |    8 ++++++
 hw/vmware_vga.c            |    8 ++++++
 hw/vt82c686.c              |   16 ++++++++++++
 hw/wdt_i6300esb.c          |    8 ++++++
 hw/wdt_ib700.c             |    8 ++++++
 hw/wm8750.c                |    8 ++++++
 hw/xio3130_downstream.c    |    8 ++++++
 hw/xio3130_upstream.c      |    8 ++++++
 hw/zaurus.c                |    8 ++++++
 module.h                   |    2 +
 savevm.c                   |    4 +++
 target-i386/machine.c      |    8 ++++++
 93 files changed, 889 insertions(+), 2 deletions(-)
Alon Levy - March 23, 2011, 9 a.m.
On Tue, Mar 22, 2011 at 07:16:07PM -0500, Anthony Liguori wrote:
> This is a purely mechanical change.  It was generated with a simple python
> script and a little bit of hand tuning.  Without this, we can only see
> VMStateDescriptions that are part of an active device which means that we have
> to test migration with a VM configured with every possible device.
> 

Is it possible to make the names meaningful instead of numeric?
you get a simpler script if you do that because you don't have to
track the number, and it's guranteed unique because you start from unique
function names. i.e. instead of

 +static void init_vmstate_description_0(void)
 +{
 +    register_vmstate_description(&vmstate_ac97);
 +}
 +
 +vmstate_init(init_vmstate_description_0);
 +


Have

 +static void init_vmstate_description_ac97(void)
 +{
 +    register_vmstate_description(&vmstate_ac97);
 +}
 +
 +vmstate_init(init_vmstate_description_ac97);
 +

Alon

> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
> ---
>  hw/ac97.c                  |    8 ++++++
>  hw/acpi_piix4.c            |    8 ++++++
>  hw/apb_pci.c               |    8 ++++++
>  hw/apic.c                  |    8 ++++++
>  hw/arm_sysctl.c            |    8 ++++++
>  hw/bonito.c                |    8 ++++++
>  hw/cirrus_vga.c            |    8 ++++++
>  hw/cs4231.c                |    8 ++++++
>  hw/cs4231a.c               |    8 ++++++
>  hw/dec_pci.c               |    8 ++++++
>  hw/e1000.c                 |    8 ++++++
>  hw/eccmemctl.c             |    8 ++++++
>  hw/eeprom93xx.c            |    8 ++++++
>  hw/es1370.c                |    8 ++++++
>  hw/escc.c                  |    8 ++++++
>  hw/esp.c                   |    8 ++++++
>  hw/fdc.c                   |   16 ++++++++++++
>  hw/fw_cfg.c                |    8 ++++++
>  hw/gus.c                   |    8 ++++++
>  hw/hda-audio.c             |    8 ++++++
>  hw/hpet.c                  |    8 ++++++
>  hw/hw.h                    |    3 ++
>  hw/i2c.c                   |    8 ++++++
>  hw/i8254.c                 |    8 ++++++
>  hw/i8259.c                 |    8 ++++++
>  hw/intel-hda.c             |    8 ++++++
>  hw/ioapic.c                |    8 ++++++
>  hw/ioh3420.c               |    8 ++++++
>  hw/kvmclock.c              |    8 ++++++
>  hw/lance.c                 |    8 ++++++
>  hw/lm32_juart.c            |    8 ++++++
>  hw/lm32_pic.c              |    8 ++++++
>  hw/lm32_sys.c              |    8 ++++++
>  hw/lm32_timer.c            |    8 ++++++
>  hw/lm32_uart.c             |    8 ++++++
>  hw/lm832x.c                |    8 ++++++
>  hw/lsi53c895a.c            |    8 ++++++
>  hw/marvell_88w8618_audio.c |    8 ++++++
>  hw/max7310.c               |    8 ++++++
>  hw/mc146818rtc.c           |    8 ++++++
>  hw/mst_fpga.c              |    8 ++++++
>  hw/musicpal.c              |   56 ++++++++++++++++++++++++++++++++++++++++++++
>  hw/ne2000.c                |    8 ++++++
>  hw/pc.c                    |    8 ++++++
>  hw/pci.c                   |    8 ++++++
>  hw/pckbd.c                 |   16 ++++++++++++
>  hw/pcnet-pci.c             |    8 ++++++
>  hw/piix_pci.c              |    8 ++++++
>  hw/pl031.c                 |    8 ++++++
>  hw/pl050.c                 |   16 ++++++++++++
>  hw/pl080.c                 |   16 ++++++++++++
>  hw/pl110.c                 |   16 ++++++++++++
>  hw/pl190.c                 |    8 ++++++
>  hw/ps2.c                   |   16 ++++++++++++
>  hw/pxa2xx.c                |   16 ++++++++++++
>  hw/pxa2xx_dma.c            |    8 ++++++
>  hw/pxa2xx_pic.c            |    8 ++++++
>  hw/pxa2xx_timer.c          |   16 ++++++++++++
>  hw/qxl.c                   |   16 ++++++++++++
>  hw/rtl8139.c               |   16 ++++++++++++
>  hw/sb16.c                  |    8 ++++++
>  hw/sbi.c                   |    8 ++++++
>  hw/serial.c                |   10 ++++++-
>  hw/slavio_intctl.c         |    8 ++++++
>  hw/slavio_misc.c           |    8 ++++++
>  hw/slavio_timer.c          |    8 ++++++
>  hw/smc91c111.c             |    8 ++++++
>  hw/sparc32_dma.c           |    8 ++++++
>  hw/spitz.c                 |   32 +++++++++++++++++++++++++
>  hw/ssd0303.c               |    8 ++++++
>  hw/sun4c_intctl.c          |    8 ++++++
>  hw/sun4m_iommu.c           |    8 ++++++
>  hw/tcx.c                   |    8 ++++++
>  hw/tmp105.c                |    8 ++++++
>  hw/twl92230.c              |    8 ++++++
>  hw/usb-hid.c               |    8 ++++++
>  hw/usb-hub.c               |    8 ++++++
>  hw/usb-uhci.c              |    8 ++++++
>  hw/versatilepb.c           |    8 ++++++
>  hw/vga-isa.c               |    8 ++++++
>  hw/vga-pci.c               |    8 ++++++
>  hw/vmmouse.c               |    8 ++++++
>  hw/vmware_vga.c            |    8 ++++++
>  hw/vt82c686.c              |   16 ++++++++++++
>  hw/wdt_i6300esb.c          |    8 ++++++
>  hw/wdt_ib700.c             |    8 ++++++
>  hw/wm8750.c                |    8 ++++++
>  hw/xio3130_downstream.c    |    8 ++++++
>  hw/xio3130_upstream.c      |    8 ++++++
>  hw/zaurus.c                |    8 ++++++
>  module.h                   |    2 +
>  savevm.c                   |    4 +++
>  target-i386/machine.c      |    8 ++++++
>  93 files changed, 889 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/ac97.c b/hw/ac97.c
> index d71072d..bf818b8 100644
> --- a/hw/ac97.c
> +++ b/hw/ac97.c
> @@ -1343,6 +1343,14 @@ static PCIDeviceInfo ac97_info = {
>      .init         = ac97_initfn,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_ac97);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void ac97_register (void)
>  {
>      pci_qdev_register (&ac97_info);
> diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c
> index 0b2bc97..aaa009b 100644
> --- a/hw/acpi_piix4.c
> +++ b/hw/acpi_piix4.c
> @@ -460,6 +460,14 @@ static PCIDeviceInfo piix4_pm_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_acpi);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void piix4_pm_register(void)
>  {
>      pci_qdev_register(&piix4_pm_info);
> diff --git a/hw/apb_pci.c b/hw/apb_pci.c
> index 84e9af7..e5d7954 100644
> --- a/hw/apb_pci.c
> +++ b/hw/apb_pci.c
> @@ -472,6 +472,14 @@ static PCIDeviceInfo pbm_pci_bridge_info = {
>      .is_bridge = 1,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_pci_device);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void pbm_register_devices(void)
>  {
>      sysbus_register_withprop(&pbm_host_info);
> diff --git a/hw/apic.c b/hw/apic.c
> index 9febf40..cdf64dc 100644
> --- a/hw/apic.c
> +++ b/hw/apic.c
> @@ -1025,6 +1025,14 @@ static SysBusDeviceInfo apic_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_apic);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void apic_register_devices(void)
>  {
>      sysbus_register_withprop(&apic_info);
> diff --git a/hw/arm_sysctl.c b/hw/arm_sysctl.c
> index 9225b58..e11b1ee 100644
> --- a/hw/arm_sysctl.c
> +++ b/hw/arm_sysctl.c
> @@ -363,6 +363,14 @@ static SysBusDeviceInfo arm_sysctl_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_arm_sysctl);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void arm_sysctl_register_devices(void)
>  {
>      sysbus_register_withprop(&arm_sysctl_info);
> diff --git a/hw/bonito.c b/hw/bonito.c
> index 65a4a63..6ec0777 100644
> --- a/hw/bonito.c
> +++ b/hw/bonito.c
> @@ -798,6 +798,14 @@ static PCIDeviceInfo bonito_info = {
>      .init         = bonito_initfn,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_bonito);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static SysBusDeviceInfo bonito_pcihost_info = {
>      .init         = bonito_pcihost_initfn,
>      .qdev.name    = "Bonito-pcihost",
> diff --git a/hw/cirrus_vga.c b/hw/cirrus_vga.c
> index 2724f7b..97a1c4c 100644
> --- a/hw/cirrus_vga.c
> +++ b/hw/cirrus_vga.c
> @@ -3145,6 +3145,14 @@ static PCIDeviceInfo cirrus_vga_info = {
>      .config_write = pci_cirrus_write_config,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_pci_cirrus_vga);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void cirrus_vga_register(void)
>  {
>      pci_qdev_register(&cirrus_vga_info);
> diff --git a/hw/cs4231.c b/hw/cs4231.c
> index a65b697..d9601d0 100644
> --- a/hw/cs4231.c
> +++ b/hw/cs4231.c
> @@ -167,6 +167,14 @@ static SysBusDeviceInfo cs4231_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_cs4231);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void cs4231_register_devices(void)
>  {
>      sysbus_register_withprop(&cs4231_info);
> diff --git a/hw/cs4231a.c b/hw/cs4231a.c
> index 598f032..e036faf 100644
> --- a/hw/cs4231a.c
> +++ b/hw/cs4231a.c
> @@ -679,6 +679,14 @@ static ISADeviceInfo cs4231a_info = {
>      },
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_cs4231a);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void cs4231a_register (void)
>  {
>      isa_qdev_register (&cs4231a_info);
> diff --git a/hw/dec_pci.c b/hw/dec_pci.c
> index bf88f2a..4924a43 100644
> --- a/hw/dec_pci.c
> +++ b/hw/dec_pci.c
> @@ -76,6 +76,14 @@ static PCIDeviceInfo dec_21154_pci_bridge_info = {
>      .is_bridge = 1,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_pci_device);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  PCIBus *pci_dec_21154_init(PCIBus *parent_bus, int devfn)
>  {
>      PCIDevice *dev;
> diff --git a/hw/e1000.c b/hw/e1000.c
> index 2a4d5c7..e906c65 100644
> --- a/hw/e1000.c
> +++ b/hw/e1000.c
> @@ -1212,6 +1212,14 @@ static PCIDeviceInfo e1000_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_e1000);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void e1000_register_devices(void)
>  {
>      pci_qdev_register(&e1000_info);
> diff --git a/hw/eccmemctl.c b/hw/eccmemctl.c
> index 2bda87b..770b6aa 100644
> --- a/hw/eccmemctl.c
> +++ b/hw/eccmemctl.c
> @@ -323,6 +323,14 @@ static SysBusDeviceInfo ecc_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_ecc);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  
>  static void ecc_register_devices(void)
>  {
> diff --git a/hw/eeprom93xx.c b/hw/eeprom93xx.c
> index 660b28f..cfa695d 100644
> --- a/hw/eeprom93xx.c
> +++ b/hw/eeprom93xx.c
> @@ -320,6 +320,14 @@ eeprom_t *eeprom93xx_new(DeviceState *dev, uint16_t nwords)
>      return eeprom;
>  }
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description(void)
> +{
> +    register_vmstate_description(&vmstate_eeprom);
> +}
> +
> +vmstate_init(init_vmstate_description);
> +
>  void eeprom93xx_free(DeviceState *dev, eeprom_t *eeprom)
>  {
>      /* Destroy EEPROM. */
> diff --git a/hw/es1370.c b/hw/es1370.c
> index 40cb48c..d2f3671 100644
> --- a/hw/es1370.c
> +++ b/hw/es1370.c
> @@ -1045,6 +1045,14 @@ static PCIDeviceInfo es1370_info = {
>      .init         = es1370_initfn,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_es1370);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void es1370_register (void)
>  {
>      pci_qdev_register (&es1370_info);
> diff --git a/hw/escc.c b/hw/escc.c
> index f6fd919..08062e7 100644
> --- a/hw/escc.c
> +++ b/hw/escc.c
> @@ -953,6 +953,14 @@ static SysBusDeviceInfo escc_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_escc);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void escc_register_devices(void)
>  {
>      sysbus_register_withprop(&escc_info);
> diff --git a/hw/esp.c b/hw/esp.c
> index fa9d2a2..977890e 100644
> --- a/hw/esp.c
> +++ b/hw/esp.c
> @@ -743,6 +743,14 @@ static SysBusDeviceInfo esp_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_esp);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void esp_register_devices(void)
>  {
>      sysbus_register_withprop(&esp_info);
> diff --git a/hw/fdc.c b/hw/fdc.c
> index 9fdbc75..4b02dce 100644
> --- a/hw/fdc.c
> +++ b/hw/fdc.c
> @@ -1938,6 +1938,14 @@ static ISADeviceInfo isa_fdc_info = {
>      },
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_isa_fdc);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static const VMStateDescription vmstate_sysbus_fdc ={
>      .name = "fdc",
>      .version_id = 2,
> @@ -1961,6 +1969,14 @@ static SysBusDeviceInfo sysbus_fdc_info = {
>      },
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_1(void)
> +{
> +    register_vmstate_description(&vmstate_sysbus_fdc);
> +}
> +
> +vmstate_init(init_vmstate_description_1);
> +
>  static SysBusDeviceInfo sun4m_fdc_info = {
>      .init = sun4m_fdc_init1,
>      .qdev.name  = "SUNW,fdtwo",
> diff --git a/hw/fw_cfg.c b/hw/fw_cfg.c
> index 85c8c3c..67603a9 100644
> --- a/hw/fw_cfg.c
> +++ b/hw/fw_cfg.c
> @@ -399,6 +399,14 @@ static SysBusDeviceInfo fw_cfg_info = {
>      },
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_fw_cfg);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void fw_cfg_register_devices(void)
>  {
>      sysbus_register_withprop(&fw_cfg_info);
> diff --git a/hw/gus.c b/hw/gus.c
> index ff9e7c7..8e35ffb 100644
> --- a/hw/gus.c
> +++ b/hw/gus.c
> @@ -315,6 +315,14 @@ static ISADeviceInfo gus_info = {
>      },
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_gus);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void gus_register (void)
>  {
>      isa_qdev_register (&gus_info);
> diff --git a/hw/hda-audio.c b/hw/hda-audio.c
> index c699d6f..f384de6 100644
> --- a/hw/hda-audio.c
> +++ b/hw/hda-audio.c
> @@ -906,6 +906,14 @@ static HDACodecDeviceInfo hda_audio_info_output = {
>      .stream       = hda_audio_stream,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_hda_audio);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static HDACodecDeviceInfo hda_audio_info_duplex = {
>      .qdev.name    = "hda-duplex",
>      .qdev.desc    = "HDA Audio Codec, duplex",
> diff --git a/hw/hpet.c b/hw/hpet.c
> index ef9a2a0..9010f45 100644
> --- a/hw/hpet.c
> +++ b/hw/hpet.c
> @@ -737,6 +737,14 @@ static SysBusDeviceInfo hpet_device_info = {
>      },
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_hpet);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void hpet_register_device(void)
>  {
>      sysbus_register_withprop(&hpet_device_info);
> diff --git a/hw/hw.h b/hw/hw.h
> index 1b09039..81bbd7a 100644
> --- a/hw/hw.h
> +++ b/hw/hw.h
> @@ -914,4 +914,7 @@ int vmstate_register_with_alias_id(DeviceState *dev, int instance_id,
>                                     int required_for_version);
>  void vmstate_unregister(DeviceState *dev, const VMStateDescription *vmsd,
>                          void *opaque);
> +
> +void register_vmstate_description(const VMStateDescription *desc);
> +
>  #endif
> diff --git a/hw/i2c.c b/hw/i2c.c
> index f80d12d..85ae1f9 100644
> --- a/hw/i2c.c
> +++ b/hw/i2c.c
> @@ -66,6 +66,14 @@ i2c_bus *i2c_init_bus(DeviceState *parent, const char *name)
>      return bus;
>  }
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description(void)
> +{
> +    register_vmstate_description(&vmstate_i2c_bus);
> +}
> +
> +vmstate_init(init_vmstate_description);
> +
>  void i2c_set_slave_address(i2c_slave *dev, uint8_t address)
>  {
>      dev->address = address;
> diff --git a/hw/i8254.c b/hw/i8254.c
> index a9ca9f6..261f860 100644
> --- a/hw/i8254.c
> +++ b/hw/i8254.c
> @@ -539,6 +539,14 @@ static ISADeviceInfo pit_info = {
>      },
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_pit);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void pit_register(void)
>  {
>      isa_qdev_register(&pit_info);
> diff --git a/hw/i8259.c b/hw/i8259.c
> index 84d330d..388e145 100644
> --- a/hw/i8259.c
> +++ b/hw/i8259.c
> @@ -487,6 +487,14 @@ static void pic_init1(int io_addr, int elcr_addr, PicState *s)
>      qemu_register_reset(pic_reset, s);
>  }
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description(void)
> +{
> +    register_vmstate_description(&vmstate_pic);
> +}
> +
> +vmstate_init(init_vmstate_description);
> +
>  void pic_info(Monitor *mon)
>  {
>      int i;
> diff --git a/hw/intel-hda.c b/hw/intel-hda.c
> index b0b1d12..a32d28d 100644
> --- a/hw/intel-hda.c
> +++ b/hw/intel-hda.c
> @@ -1283,6 +1283,14 @@ static PCIDeviceInfo intel_hda_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_intel_hda);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void intel_hda_register(void)
>  {
>      pci_qdev_register(&intel_hda_info);
> diff --git a/hw/ioapic.c b/hw/ioapic.c
> index 569327d..8ac6d34 100644
> --- a/hw/ioapic.c
> +++ b/hw/ioapic.c
> @@ -350,6 +350,14 @@ static SysBusDeviceInfo ioapic_info = {
>      .qdev.no_user = 1,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_ioapic);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void ioapic_register_devices(void)
>  {
>      sysbus_register_withprop(&ioapic_info);
> diff --git a/hw/ioh3420.c b/hw/ioh3420.c
> index 95adf09..7b0b801 100644
> --- a/hw/ioh3420.c
> +++ b/hw/ioh3420.c
> @@ -229,6 +229,14 @@ static PCIDeviceInfo ioh3420_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_ioh3420);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void ioh3420_register(void)
>  {
>      pci_qdev_register(&ioh3420_info);
> diff --git a/hw/kvmclock.c b/hw/kvmclock.c
> index b6ceddf..f9c05cd 100644
> --- a/hw/kvmclock.c
> +++ b/hw/kvmclock.c
> @@ -99,6 +99,14 @@ static SysBusDeviceInfo kvmclock_info = {
>      .init = kvmclock_init,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&kvmclock_vmsd);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  /* Note: Must be called after VCPU initialization. */
>  void kvmclock_create(void)
>  {
> diff --git a/hw/lance.c b/hw/lance.c
> index ddb1cbb..32d81ca 100644
> --- a/hw/lance.c
> +++ b/hw/lance.c
> @@ -153,6 +153,14 @@ static SysBusDeviceInfo lance_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_lance);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void lance_register_devices(void)
>  {
>      sysbus_register_withprop(&lance_info);
> diff --git a/hw/lm32_juart.c b/hw/lm32_juart.c
> index fddcf7e..a49308c 100644
> --- a/hw/lm32_juart.c
> +++ b/hw/lm32_juart.c
> @@ -142,6 +142,14 @@ static SysBusDeviceInfo lm32_juart_info = {
>      .qdev.reset = juart_reset,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_lm32_juart);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void lm32_juart_register(void)
>  {
>      sysbus_register_withprop(&lm32_juart_info);
> diff --git a/hw/lm32_pic.c b/hw/lm32_pic.c
> index 02941a7..de4f310 100644
> --- a/hw/lm32_pic.c
> +++ b/hw/lm32_pic.c
> @@ -182,6 +182,14 @@ static SysBusDeviceInfo lm32_pic_info = {
>      .qdev.reset = pic_reset,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_lm32_pic);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void lm32_pic_register(void)
>  {
>      sysbus_register_withprop(&lm32_pic_info);
> diff --git a/hw/lm32_sys.c b/hw/lm32_sys.c
> index 427b05f..4c718b7 100644
> --- a/hw/lm32_sys.c
> +++ b/hw/lm32_sys.c
> @@ -153,6 +153,14 @@ static SysBusDeviceInfo lm32_sys_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_lm32_sys);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void lm32_sys_register(void)
>  {
>      sysbus_register_withprop(&lm32_sys_info);
> diff --git a/hw/lm32_timer.c b/hw/lm32_timer.c
> index ed28984..445cfde 100644
> --- a/hw/lm32_timer.c
> +++ b/hw/lm32_timer.c
> @@ -214,6 +214,14 @@ static SysBusDeviceInfo lm32_timer_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_lm32_timer);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void lm32_timer_register(void)
>  {
>      sysbus_register_withprop(&lm32_timer_info);
> diff --git a/hw/lm32_uart.c b/hw/lm32_uart.c
> index e225087..32c6ffd 100644
> --- a/hw/lm32_uart.c
> +++ b/hw/lm32_uart.c
> @@ -280,6 +280,14 @@ static SysBusDeviceInfo lm32_uart_info = {
>      .qdev.reset = uart_reset,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_lm32_uart);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void lm32_uart_register(void)
>  {
>      sysbus_register_withprop(&lm32_uart_info);
> diff --git a/hw/lm832x.c b/hw/lm832x.c
> index 590a4cc..ac097bd 100644
> --- a/hw/lm832x.c
> +++ b/hw/lm832x.c
> @@ -504,6 +504,14 @@ static I2CSlaveInfo lm8323_info = {
>      .send = lm_i2c_tx
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_lm_kbd);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void lm832x_register_devices(void)
>  {
>      i2c_register_slave(&lm8323_info);
> diff --git a/hw/lsi53c895a.c b/hw/lsi53c895a.c
> index 84a4992..699261b 100644
> --- a/hw/lsi53c895a.c
> +++ b/hw/lsi53c895a.c
> @@ -2211,6 +2211,14 @@ static PCIDeviceInfo lsi_info = {
>      .exit       = lsi_scsi_uninit,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_lsi_scsi);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void lsi53c895a_register_devices(void)
>  {
>      pci_qdev_register(&lsi_info);
> diff --git a/hw/marvell_88w8618_audio.c b/hw/marvell_88w8618_audio.c
> index 3eff925..25437ea 100644
> --- a/hw/marvell_88w8618_audio.c
> +++ b/hw/marvell_88w8618_audio.c
> @@ -291,6 +291,14 @@ static SysBusDeviceInfo mv88w8618_audio_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&mv88w8618_audio_vmsd);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void mv88w8618_register_devices(void)
>  {
>      sysbus_register_withprop(&mv88w8618_audio_info);
> diff --git a/hw/max7310.c b/hw/max7310.c
> index c1bdb2e..12b8769 100644
> --- a/hw/max7310.c
> +++ b/hw/max7310.c
> @@ -196,6 +196,14 @@ static I2CSlaveInfo max7310_info = {
>      .send = max7310_tx
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_max7310);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void max7310_register_devices(void)
>  {
>      i2c_register_slave(&max7310_info);
> diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c
> index 1c9a706..7b80c18 100644
> --- a/hw/mc146818rtc.c
> +++ b/hw/mc146818rtc.c
> @@ -650,6 +650,14 @@ static ISADeviceInfo mc146818rtc_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_rtc);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void mc146818rtc_register(void)
>  {
>      isa_qdev_register(&mc146818rtc_info);
> diff --git a/hw/mst_fpga.c b/hw/mst_fpga.c
> index a04355c..c5111b9 100644
> --- a/hw/mst_fpga.c
> +++ b/hw/mst_fpga.c
> @@ -248,6 +248,14 @@ static SysBusDeviceInfo mst_fpga_info = {
>  	.qdev.vmsd = &vmstate_mst_fpga_regs,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_mst_fpga_regs);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void mst_fpga_register(void)
>  {
>  	sysbus_register_withprop(&mst_fpga_info);
> diff --git a/hw/musicpal.c b/hw/musicpal.c
> index d98aa8d..773b93c 100644
> --- a/hw/musicpal.c
> +++ b/hw/musicpal.c
> @@ -423,6 +423,14 @@ static SysBusDeviceInfo mv88w8618_eth_info = {
>      },
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&mv88w8618_eth_vmsd);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  /* LCD register offsets */
>  #define MP_LCD_IRQCTRL          0x180
>  #define MP_LCD_IRQSTAT          0x184
> @@ -637,6 +645,14 @@ static SysBusDeviceInfo musicpal_lcd_info = {
>      .qdev.vmsd = &musicpal_lcd_vmsd,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_1(void)
> +{
> +    register_vmstate_description(&musicpal_lcd_vmsd);
> +}
> +
> +vmstate_init(init_vmstate_description_1);
> +
>  /* PIC register offsets */
>  #define MP_PIC_STATUS           0x00
>  #define MP_PIC_ENABLE_SET       0x08
> @@ -753,6 +769,14 @@ static SysBusDeviceInfo mv88w8618_pic_info = {
>      .qdev.vmsd = &mv88w8618_pic_vmsd,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_2(void)
> +{
> +    register_vmstate_description(&mv88w8618_pic_vmsd);
> +}
> +
> +vmstate_init(init_vmstate_description_2);
> +
>  /* PIT register offsets */
>  #define MP_PIT_TIMER1_LENGTH    0x00
>  /* ... */
> @@ -927,6 +951,14 @@ static SysBusDeviceInfo mv88w8618_pit_info = {
>      .qdev.vmsd  = &mv88w8618_pit_vmsd,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_3(void)
> +{
> +    register_vmstate_description(&mv88w8618_pit_vmsd);
> +}
> +
> +vmstate_init(init_vmstate_description_3);
> +
>  /* Flash config register offsets */
>  #define MP_FLASHCFG_CFGR0    0x04
>  
> @@ -1004,6 +1036,14 @@ static SysBusDeviceInfo mv88w8618_flashcfg_info = {
>      .qdev.vmsd  = &mv88w8618_flashcfg_vmsd,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_4(void)
> +{
> +    register_vmstate_description(&mv88w8618_flashcfg_vmsd);
> +}
> +
> +vmstate_init(init_vmstate_description_4);
> +
>  /* Misc register offsets */
>  #define MP_MISC_BOARD_REVISION  0x18
>  
> @@ -1335,6 +1375,14 @@ static SysBusDeviceInfo musicpal_gpio_info = {
>      .qdev.vmsd  = &musicpal_gpio_vmsd,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_5(void)
> +{
> +    register_vmstate_description(&musicpal_gpio_vmsd);
> +}
> +
> +vmstate_init(init_vmstate_description_5);
> +
>  /* Keyboard codes & masks */
>  #define KEY_RELEASED            0x80
>  #define KEY_CODE                0x7f
> @@ -1478,6 +1526,14 @@ static SysBusDeviceInfo musicpal_key_info = {
>      .qdev.vmsd  = &musicpal_key_vmsd,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_6(void)
> +{
> +    register_vmstate_description(&musicpal_key_vmsd);
> +}
> +
> +vmstate_init(init_vmstate_description_6);
> +
>  static struct arm_boot_info musicpal_binfo = {
>      .loader_start = 0x0,
>      .board_id = 0x20e,
> diff --git a/hw/ne2000.c b/hw/ne2000.c
> index 5966359..270578b 100644
> --- a/hw/ne2000.c
> +++ b/hw/ne2000.c
> @@ -773,6 +773,14 @@ static PCIDeviceInfo ne2000_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_pci_ne2000);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void ne2000_register_devices(void)
>  {
>      pci_qdev_register(&ne2000_info);
> diff --git a/hw/pc.c b/hw/pc.c
> index 6939c04..5211b29 100644
> --- a/hw/pc.c
> +++ b/hw/pc.c
> @@ -497,6 +497,14 @@ static ISADeviceInfo port92_info = {
>      .init          = port92_initfn,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_port92_isa);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void port92_register(void)
>  {
>      isa_qdev_register(&port92_info);
> diff --git a/hw/pci.c b/hw/pci.c
> index 8b76cea..50b9a14 100644
> --- a/hw/pci.c
> +++ b/hw/pci.c
> @@ -269,6 +269,14 @@ void pci_bus_new_inplace(PCIBus *bus, DeviceState *parent,
>      vmstate_register(NULL, -1, &vmstate_pcibus, bus);
>  }
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description(void)
> +{
> +    register_vmstate_description(&vmstate_pcibus);
> +}
> +
> +vmstate_init(init_vmstate_description);
> +
>  PCIBus *pci_bus_new(DeviceState *parent, const char *name, int devfn_min)
>  {
>      PCIBus *bus;
> diff --git a/hw/pckbd.c b/hw/pckbd.c
> index ae65c04..027f69e 100644
> --- a/hw/pckbd.c
> +++ b/hw/pckbd.c
> @@ -433,6 +433,14 @@ void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq,
>      qemu_register_reset(kbd_reset, s);
>  }
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description(void)
> +{
> +    register_vmstate_description(&vmstate_kbd);
> +}
> +
> +vmstate_init(init_vmstate_description);
> +
>  typedef struct ISAKBDState {
>      ISADevice dev;
>      KBDState  kbd;
> @@ -492,6 +500,14 @@ static ISADeviceInfo i8042_info = {
>      .init          = i8042_initfn,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_kbd_isa);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void i8042_register(void)
>  {
>      isa_qdev_register(&i8042_info);
> diff --git a/hw/pcnet-pci.c b/hw/pcnet-pci.c
> index 339a401..d3c2738 100644
> --- a/hw/pcnet-pci.c
> +++ b/hw/pcnet-pci.c
> @@ -338,6 +338,14 @@ static PCIDeviceInfo pcnet_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_pci_pcnet);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void pci_pcnet_register_devices(void)
>  {
>      pci_qdev_register(&pcnet_info);
> diff --git a/hw/piix_pci.c b/hw/piix_pci.c
> index 358da58..1e5f379 100644
> --- a/hw/piix_pci.c
> +++ b/hw/piix_pci.c
> @@ -364,6 +364,14 @@ static PCIDeviceInfo i440fx_info[] = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_piix3);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static SysBusDeviceInfo i440fx_pcihost_info = {
>      .init         = i440fx_pcihost_initfn,
>      .qdev.name    = "i440FX-pcihost",
> diff --git a/hw/pl031.c b/hw/pl031.c
> index 8c2f9d0..5372e21 100644
> --- a/hw/pl031.c
> +++ b/hw/pl031.c
> @@ -229,6 +229,14 @@ static SysBusDeviceInfo pl031_info = {
>      .qdev.no_user = 1,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_pl031);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void pl031_register_devices(void)
>  {
>      sysbus_register_withprop(&pl031_info);
> diff --git a/hw/pl050.c b/hw/pl050.c
> index b155cc0..4c2b279 100644
> --- a/hw/pl050.c
> +++ b/hw/pl050.c
> @@ -171,6 +171,14 @@ static SysBusDeviceInfo pl050_kbd_info = {
>      .qdev.vmsd = &vmstate_pl050,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_pl050);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static SysBusDeviceInfo pl050_mouse_info = {
>      .init = pl050_init_mouse,
>      .qdev.name  = "pl050_mouse",
> @@ -178,6 +186,14 @@ static SysBusDeviceInfo pl050_mouse_info = {
>      .qdev.vmsd = &vmstate_pl050,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_1(void)
> +{
> +    register_vmstate_description(&vmstate_pl050);
> +}
> +
> +vmstate_init(init_vmstate_description_1);
> +
>  static void pl050_register_devices(void)
>  {
>      sysbus_register_withprop(&pl050_kbd_info);
> diff --git a/hw/pl080.c b/hw/pl080.c
> index 901f04a..1c6198b 100644
> --- a/hw/pl080.c
> +++ b/hw/pl080.c
> @@ -388,6 +388,14 @@ static SysBusDeviceInfo pl080_info = {
>      .qdev.no_user = 1,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_pl080);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static SysBusDeviceInfo pl081_info = {
>      .init = pl081_init,
>      .qdev.name = "pl081",
> @@ -396,6 +404,14 @@ static SysBusDeviceInfo pl081_info = {
>      .qdev.no_user = 1,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_1(void)
> +{
> +    register_vmstate_description(&vmstate_pl080);
> +}
> +
> +vmstate_init(init_vmstate_description_1);
> +
>  /* The PL080 and PL081 are the same except for the number of channels
>     they implement (8 and 2 respectively).  */
>  static void pl080_register_devices(void)
> diff --git a/hw/pl110.c b/hw/pl110.c
> index 06d2dfa..9073a40 100644
> --- a/hw/pl110.c
> +++ b/hw/pl110.c
> @@ -405,6 +405,14 @@ static SysBusDeviceInfo pl110_info = {
>      .qdev.no_user = 1,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_pl110);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static SysBusDeviceInfo pl110_versatile_info = {
>      .init = pl110_versatile_init,
>      .qdev.name = "pl110_versatile",
> @@ -413,6 +421,14 @@ static SysBusDeviceInfo pl110_versatile_info = {
>      .qdev.no_user = 1,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_1(void)
> +{
> +    register_vmstate_description(&vmstate_pl110);
> +}
> +
> +vmstate_init(init_vmstate_description_1);
> +
>  static void pl110_register_devices(void)
>  {
>      sysbus_register_withprop(&pl110_info);
> diff --git a/hw/pl190.c b/hw/pl190.c
> index 75f2ba1..a03db5c 100644
> --- a/hw/pl190.c
> +++ b/hw/pl190.c
> @@ -270,6 +270,14 @@ static SysBusDeviceInfo pl190_info = {
>      .qdev.no_user = 1,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_pl190);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void pl190_register_devices(void)
>  {
>      sysbus_register_withprop(&pl190_info);
> diff --git a/hw/ps2.c b/hw/ps2.c
> index 91b73e0..c77d5fc 100644
> --- a/hw/ps2.c
> +++ b/hw/ps2.c
> @@ -615,6 +615,14 @@ void *ps2_kbd_init(void (*update_irq)(void *, int), void *update_arg)
>      return s;
>  }
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_ps2_keyboard);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  void *ps2_mouse_init(void (*update_irq)(void *, int), void *update_arg)
>  {
>      PS2MouseState *s = (PS2MouseState *)qemu_mallocz(sizeof(PS2MouseState));
> @@ -626,3 +634,11 @@ void *ps2_mouse_init(void (*update_irq)(void *, int), void *update_arg)
>      qemu_register_reset(ps2_mouse_reset, s);
>      return s;
>  }
> +
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_1(void)
> +{
> +    register_vmstate_description(&vmstate_ps2_mouse);
> +}
> +
> +vmstate_init(init_vmstate_description_1);
> diff --git a/hw/pxa2xx.c b/hw/pxa2xx.c
> index 9b95e2c..d8f2943 100644
> --- a/hw/pxa2xx.c
> +++ b/hw/pxa2xx.c
> @@ -1293,6 +1293,14 @@ static SysBusDeviceInfo pxa2xx_rtc_sysbus_info = {
>      .qdev.vmsd  = &vmstate_pxa2xx_rtc_regs,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_pxa2xx_rtc_regs);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  /* I2C Interface */
>  typedef struct {
>      i2c_slave i2c;
> @@ -1595,6 +1603,14 @@ static SysBusDeviceInfo pxa2xx_i2c_info = {
>      },
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_1(void)
> +{
> +    register_vmstate_description(&vmstate_pxa2xx_i2c);
> +}
> +
> +vmstate_init(init_vmstate_description_1);
> +
>  /* PXA Inter-IC Sound Controller */
>  static void pxa2xx_i2s_reset(PXA2xxI2SState *i2s)
>  {
> diff --git a/hw/pxa2xx_dma.c b/hw/pxa2xx_dma.c
> index a67498b..6d5fb56 100644
> --- a/hw/pxa2xx_dma.c
> +++ b/hw/pxa2xx_dma.c
> @@ -561,6 +561,14 @@ static SysBusDeviceInfo pxa2xx_dma_info = {
>      },
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_pxa2xx_dma);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void pxa2xx_dma_register(void)
>  {
>      sysbus_register_withprop(&pxa2xx_dma_info);
> diff --git a/hw/pxa2xx_pic.c b/hw/pxa2xx_pic.c
> index e9a5361..fa6abba 100644
> --- a/hw/pxa2xx_pic.c
> +++ b/hw/pxa2xx_pic.c
> @@ -309,6 +309,14 @@ static SysBusDeviceInfo pxa2xx_pic_info = {
>      .qdev.vmsd  = &vmstate_pxa2xx_pic_regs,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_pxa2xx_pic_regs);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void pxa2xx_pic_register(void)
>  {
>      sysbus_register_withprop(&pxa2xx_pic_info);
> diff --git a/hw/pxa2xx_timer.c b/hw/pxa2xx_timer.c
> index f777a21..db0603e 100644
> --- a/hw/pxa2xx_timer.c
> +++ b/hw/pxa2xx_timer.c
> @@ -496,6 +496,14 @@ static SysBusDeviceInfo pxa25x_timer_dev_info = {
>      },
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_pxa2xx_timer_regs);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static SysBusDeviceInfo pxa27x_timer_dev_info = {
>      .init       = pxa2xx_timer_init,
>      .qdev.name  = "pxa27x-timer",
> @@ -510,6 +518,14 @@ static SysBusDeviceInfo pxa27x_timer_dev_info = {
>      },
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_1(void)
> +{
> +    register_vmstate_description(&vmstate_pxa2xx_timer_regs);
> +}
> +
> +vmstate_init(init_vmstate_description_1);
> +
>  static void pxa2xx_timer_register(void)
>  {
>      sysbus_register_withprop(&pxa25x_timer_dev_info);
> diff --git a/hw/qxl.c b/hw/qxl.c
> index fe4212b..2a0d090 100644
> --- a/hw/qxl.c
> +++ b/hw/qxl.c
> @@ -1504,6 +1504,14 @@ static PCIDeviceInfo qxl_info_primary = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&qxl_vmstate);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static PCIDeviceInfo qxl_info_secondary = {
>      .qdev.name    = "qxl",
>      .qdev.desc    = "Spice QXL GPU (secondary)",
> @@ -1522,6 +1530,14 @@ static PCIDeviceInfo qxl_info_secondary = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_1(void)
> +{
> +    register_vmstate_description(&qxl_vmstate);
> +}
> +
> +vmstate_init(init_vmstate_description_1);
> +
>  static void qxl_register(void)
>  {
>      pci_qdev_register(&qxl_info_primary);
> diff --git a/hw/rtl8139.c b/hw/rtl8139.c
> index 0ba51fc..3b2f61e 100644
> --- a/hw/rtl8139.c
> +++ b/hw/rtl8139.c
> @@ -3269,6 +3269,14 @@ static const VMStateDescription vmstate_rtl8139 = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_rtl8139_hotplug_ready);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  /***********************************************************/
>  /* PCI RTL8139 definitions */
>  
> @@ -3422,6 +3430,14 @@ static PCIDeviceInfo rtl8139_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_1(void)
> +{
> +    register_vmstate_description(&vmstate_rtl8139);
> +}
> +
> +vmstate_init(init_vmstate_description_1);
> +
>  static void rtl8139_register_devices(void)
>  {
>      pci_qdev_register(&rtl8139_info);
> diff --git a/hw/sb16.c b/hw/sb16.c
> index a76df1b..c98546a 100644
> --- a/hw/sb16.c
> +++ b/hw/sb16.c
> @@ -1413,6 +1413,14 @@ static ISADeviceInfo sb16_info = {
>      },
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_sb16);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void sb16_register (void)
>  {
>      isa_qdev_register (&sb16_info);
> diff --git a/hw/sbi.c b/hw/sbi.c
> index 53f66f2..53a236c 100644
> --- a/hw/sbi.c
> +++ b/hw/sbi.c
> @@ -140,6 +140,14 @@ static SysBusDeviceInfo sbi_info = {
>      .qdev.reset = sbi_reset,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_sbi);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void sbi_register_devices(void)
>  {
>      sysbus_register_withprop(&sbi_info);
> diff --git a/hw/serial.c b/hw/serial.c
> index 0ee61dd..c7ba97c 100644
> --- a/hw/serial.c
> +++ b/hw/serial.c
> @@ -804,8 +804,6 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
>      s->chr = chr;
>      serial_init_core(s);
>  
> -    vmstate_register(NULL, base, &vmstate_serial, s);
> -
>      register_ioport_write(base, 8, 1, serial_ioport_write, s);
>      register_ioport_read(base, 8, 1, serial_ioport_read, s);
>      return s;
> @@ -971,6 +969,14 @@ static ISADeviceInfo serial_isa_info = {
>      },
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_isa_serial);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void serial_register_devices(void)
>  {
>      isa_qdev_register(&serial_isa_info);
> diff --git a/hw/slavio_intctl.c b/hw/slavio_intctl.c
> index a83e5b8..8b3bdb5 100644
> --- a/hw/slavio_intctl.c
> +++ b/hw/slavio_intctl.c
> @@ -455,6 +455,14 @@ static SysBusDeviceInfo slavio_intctl_info = {
>      .qdev.reset = slavio_intctl_reset,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_intctl);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void slavio_intctl_register_devices(void)
>  {
>      sysbus_register_withprop(&slavio_intctl_info);
> diff --git a/hw/slavio_misc.c b/hw/slavio_misc.c
> index 198360d..0b415b9 100644
> --- a/hw/slavio_misc.c
> +++ b/hw/slavio_misc.c
> @@ -484,6 +484,14 @@ static SysBusDeviceInfo slavio_misc_info = {
>      .qdev.reset  = slavio_misc_reset,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_misc);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static SysBusDeviceInfo apc_info = {
>      .init = apc_init1,
>      .qdev.name  = "apc",
> diff --git a/hw/slavio_timer.c b/hw/slavio_timer.c
> index 5511313..0f95113 100644
> --- a/hw/slavio_timer.c
> +++ b/hw/slavio_timer.c
> @@ -416,6 +416,14 @@ static SysBusDeviceInfo slavio_timer_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_slavio_timer);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void slavio_timer_register_devices(void)
>  {
>      sysbus_register_withprop(&slavio_timer_info);
> diff --git a/hw/smc91c111.c b/hw/smc91c111.c
> index dafea5c..63b4507 100644
> --- a/hw/smc91c111.c
> +++ b/hw/smc91c111.c
> @@ -774,6 +774,14 @@ static SysBusDeviceInfo smc91c111_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_smc91c111);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void smc91c111_register_devices(void)
>  {
>      sysbus_register_withprop(&smc91c111_info);
> diff --git a/hw/sparc32_dma.c b/hw/sparc32_dma.c
> index e75694b..d8be398 100644
> --- a/hw/sparc32_dma.c
> +++ b/hw/sparc32_dma.c
> @@ -297,6 +297,14 @@ static SysBusDeviceInfo sparc32_dma_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_dma);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void sparc32_dma_register_devices(void)
>  {
>      sysbus_register_withprop(&sparc32_dma_info);
> diff --git a/hw/spitz.c b/hw/spitz.c
> index 006f7a9..1078486 100644
> --- a/hw/spitz.c
> +++ b/hw/spitz.c
> @@ -1043,6 +1043,14 @@ static SysBusDeviceInfo sl_nand_info = {
>      },
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_sl_nand_info);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static VMStateDescription vmstate_spitz_kbd = {
>      .name = "spitz-keyboard",
>      .version_id = 1,
> @@ -1067,6 +1075,14 @@ static SysBusDeviceInfo spitz_keyboard_info = {
>      },
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_1(void)
> +{
> +    register_vmstate_description(&vmstate_spitz_kbd);
> +}
> +
> +vmstate_init(init_vmstate_description_1);
> +
>  static const VMStateDescription vmstate_corgi_ssp_regs = {
>      .name = "corgi-ssp",
>      .version_id = 1,
> @@ -1086,6 +1102,14 @@ static SSISlaveInfo corgi_ssp_info = {
>      .transfer = corgi_ssp_transfer
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_2(void)
> +{
> +    register_vmstate_description(&vmstate_corgi_ssp_regs);
> +}
> +
> +vmstate_init(init_vmstate_description_2);
> +
>  static const VMStateDescription vmstate_spitz_lcdtg_regs = {
>      .name = "spitz-lcdtg",
>      .version_id = 1,
> @@ -1106,6 +1130,14 @@ static SSISlaveInfo spitz_lcdtg_info = {
>      .transfer = spitz_lcdtg_transfer
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_3(void)
> +{
> +    register_vmstate_description(&vmstate_spitz_lcdtg_regs);
> +}
> +
> +vmstate_init(init_vmstate_description_3);
> +
>  static void spitz_register_devices(void)
>  {
>      ssi_register_slave(&corgi_ssp_info);
> diff --git a/hw/ssd0303.c b/hw/ssd0303.c
> index 108c068..dc3012d 100644
> --- a/hw/ssd0303.c
> +++ b/hw/ssd0303.c
> @@ -304,6 +304,14 @@ static I2CSlaveInfo ssd0303_info = {
>      .send = ssd0303_send
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_ssd0303);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void ssd0303_register_devices(void)
>  {
>      i2c_register_slave(&ssd0303_info);
> diff --git a/hw/sun4c_intctl.c b/hw/sun4c_intctl.c
> index 5c7fdef..025ea92 100644
> --- a/hw/sun4c_intctl.c
> +++ b/hw/sun4c_intctl.c
> @@ -216,6 +216,14 @@ static SysBusDeviceInfo sun4c_intctl_info = {
>      .qdev.reset = sun4c_intctl_reset,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_sun4c_intctl);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void sun4c_intctl_register_devices(void)
>  {
>      sysbus_register_withprop(&sun4c_intctl_info);
> diff --git a/hw/sun4m_iommu.c b/hw/sun4m_iommu.c
> index bba69ee..bb24412 100644
> --- a/hw/sun4m_iommu.c
> +++ b/hw/sun4m_iommu.c
> @@ -370,6 +370,14 @@ static SysBusDeviceInfo iommu_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_iommu);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void iommu_register_devices(void)
>  {
>      sysbus_register_withprop(&iommu_info);
> diff --git a/hw/tcx.c b/hw/tcx.c
> index 0e32830..40a771b 100644
> --- a/hw/tcx.c
> +++ b/hw/tcx.c
> @@ -643,6 +643,14 @@ static SysBusDeviceInfo tcx_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_tcx);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void tcx_register_devices(void)
>  {
>      sysbus_register_withprop(&tcx_info);
> diff --git a/hw/tmp105.c b/hw/tmp105.c
> index f7e6f2b..9d3325c 100644
> --- a/hw/tmp105.c
> +++ b/hw/tmp105.c
> @@ -236,6 +236,14 @@ static I2CSlaveInfo tmp105_info = {
>      .send = tmp105_tx
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_tmp105);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void tmp105_register_devices(void)
>  {
>      i2c_register_slave(&tmp105_info);
> diff --git a/hw/twl92230.c b/hw/twl92230.c
> index 8e74acc..2b570a6 100644
> --- a/hw/twl92230.c
> +++ b/hw/twl92230.c
> @@ -868,6 +868,14 @@ static I2CSlaveInfo twl92230_info = {
>      .send = menelaus_tx
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_menelaus);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void twl92230_register_devices(void)
>  {
>      i2c_register_slave(&twl92230_info);
> diff --git a/hw/usb-hid.c b/hw/usb-hid.c
> index c25362c..e8fff11 100644
> --- a/hw/usb-hid.c
> +++ b/hw/usb-hid.c
> @@ -999,6 +999,14 @@ static struct USBDeviceInfo hid_info[] = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_usb_kbd);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void usb_hid_register_devices(void)
>  {
>      usb_qdev_register_many(hid_info);
> diff --git a/hw/usb-hub.c b/hw/usb-hub.c
> index 3dd31ba..dfac0ed 100644
> --- a/hw/usb-hub.c
> +++ b/hw/usb-hub.c
> @@ -583,6 +583,14 @@ static struct USBDeviceInfo hub_info = {
>      .handle_destroy = usb_hub_handle_destroy,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_usb_hub);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void usb_hub_register_devices(void)
>  {
>      usb_qdev_register(&hub_info);
> diff --git a/hw/usb-uhci.c b/hw/usb-uhci.c
> index 346db3e..bc8fc5b 100644
> --- a/hw/usb-uhci.c
> +++ b/hw/usb-uhci.c
> @@ -1207,6 +1207,14 @@ static PCIDeviceInfo uhci_info[] = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_uhci);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void uhci_register(void)
>  {
>      pci_qdev_register_many(uhci_info);
> diff --git a/hw/versatilepb.c b/hw/versatilepb.c
> index 9f1bfcf..659359c 100644
> --- a/hw/versatilepb.c
> +++ b/hw/versatilepb.c
> @@ -354,6 +354,14 @@ static SysBusDeviceInfo vpb_sic_info = {
>      .qdev.no_user = 1,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_vpb_sic);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void versatilepb_register_devices(void)
>  {
>      sysbus_register_withprop(&vpb_sic_info);
> diff --git a/hw/vga-isa.c b/hw/vga-isa.c
> index fde0d56..5f1ef76 100644
> --- a/hw/vga-isa.c
> +++ b/hw/vga-isa.c
> @@ -81,6 +81,14 @@ static ISADeviceInfo vga_info = {
>      .init          = vga_initfn,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_vga_common);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void vga_register(void)
>  {
>      isa_qdev_register(&vga_info);
> diff --git a/hw/vga-pci.c b/hw/vga-pci.c
> index ce9ec45..c91739f 100644
> --- a/hw/vga-pci.c
> +++ b/hw/vga-pci.c
> @@ -116,6 +116,14 @@ static PCIDeviceInfo vga_info = {
>      .romfile      = "vgabios-stdvga.bin",
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_vga_pci);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void vga_register(void)
>  {
>      pci_qdev_register(&vga_info);
> diff --git a/hw/vmmouse.c b/hw/vmmouse.c
> index 1113f33..f2de7d8 100644
> --- a/hw/vmmouse.c
> +++ b/hw/vmmouse.c
> @@ -282,6 +282,14 @@ static ISADeviceInfo vmmouse_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_vmmouse);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void vmmouse_dev_register(void)
>  {
>      isa_qdev_register(&vmmouse_info);
> diff --git a/hw/vmware_vga.c b/hw/vmware_vga.c
> index 4656767..106c9b4 100644
> --- a/hw/vmware_vga.c
> +++ b/hw/vmware_vga.c
> @@ -1318,6 +1318,14 @@ static PCIDeviceInfo vmsvga_info = {
>      .romfile      = "vgabios-vmware.bin",
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_vmware_vga);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void vmsvga_register(void)
>  {
>      pci_qdev_register(&vmsvga_info);
> diff --git a/hw/vt82c686.c b/hw/vt82c686.c
> index 818460d..62b8c63 100644
> --- a/hw/vt82c686.c
> +++ b/hw/vt82c686.c
> @@ -522,6 +522,14 @@ static PCIDeviceInfo via_pm_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_acpi);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void vt82c686b_pm_register(void)
>  {
>      pci_qdev_register(&via_pm_info);
> @@ -587,6 +595,14 @@ static PCIDeviceInfo via_info = {
>      .config_write = vt82c686b_write_config,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_1(void)
> +{
> +    register_vmstate_description(&vmstate_via);
> +}
> +
> +vmstate_init(init_vmstate_description_1);
> +
>  static void vt82c686b_register(void)
>  {
>      pci_qdev_register(&via_info);
> diff --git a/hw/wdt_i6300esb.c b/hw/wdt_i6300esb.c
> index 4a7fba7..99f3c9b 100644
> --- a/hw/wdt_i6300esb.c
> +++ b/hw/wdt_i6300esb.c
> @@ -439,6 +439,14 @@ static PCIDeviceInfo i6300esb_info = {
>      .init         = i6300esb_init,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_i6300esb);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void i6300esb_register_devices(void)
>  {
>      watchdog_add_model(&model);
> diff --git a/hw/wdt_ib700.c b/hw/wdt_ib700.c
> index 81f22d0..4cd24b9 100644
> --- a/hw/wdt_ib700.c
> +++ b/hw/wdt_ib700.c
> @@ -128,6 +128,14 @@ static ISADeviceInfo wdt_ib700_info = {
>      .init       = wdt_ib700_init,
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_ib700);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void wdt_ib700_register_devices(void)
>  {
>      watchdog_add_model(&model);
> diff --git a/hw/wm8750.c b/hw/wm8750.c
> index c9c6744..dc46577 100644
> --- a/hw/wm8750.c
> +++ b/hw/wm8750.c
> @@ -699,6 +699,14 @@ static I2CSlaveInfo wm8750_info = {
>      .send = wm8750_tx
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_wm8750);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void wm8750_register_devices(void)
>  {
>      i2c_register_slave(&wm8750_info);
> diff --git a/hw/xio3130_downstream.c b/hw/xio3130_downstream.c
> index 5aa6a6b..f6fd902 100644
> --- a/hw/xio3130_downstream.c
> +++ b/hw/xio3130_downstream.c
> @@ -194,6 +194,14 @@ static PCIDeviceInfo xio3130_downstream_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_xio3130_downstream);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void xio3130_downstream_register(void)
>  {
>      pci_qdev_register(&xio3130_downstream_info);
> diff --git a/hw/xio3130_upstream.c b/hw/xio3130_upstream.c
> index a7640f5..0b503ee 100644
> --- a/hw/xio3130_upstream.c
> +++ b/hw/xio3130_upstream.c
> @@ -168,6 +168,14 @@ static PCIDeviceInfo xio3130_upstream_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_xio3130_upstream);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void xio3130_upstream_register(void)
>  {
>      pci_qdev_register(&xio3130_upstream_info);
> diff --git a/hw/zaurus.c b/hw/zaurus.c
> index c24aeb5..6ce61af 100644
> --- a/hw/zaurus.c
> +++ b/hw/zaurus.c
> @@ -236,6 +236,14 @@ static SysBusDeviceInfo scoop_sysbus_info = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_scoop_regs);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +
>  static void scoop_register(void)
>  {
>      sysbus_register_withprop(&scoop_sysbus_info);
> diff --git a/module.h b/module.h
> index 9263f1c..70c33a5 100644
> --- a/module.h
> +++ b/module.h
> @@ -24,12 +24,14 @@ typedef enum {
>      MODULE_INIT_BLOCK,
>      MODULE_INIT_DEVICE,
>      MODULE_INIT_MACHINE,
> +    MODULE_INIT_VMSTATE,
>      MODULE_INIT_MAX
>  } module_init_type;
>  
>  #define block_init(function) module_init(function, MODULE_INIT_BLOCK)
>  #define device_init(function) module_init(function, MODULE_INIT_DEVICE)
>  #define machine_init(function) module_init(function, MODULE_INIT_MACHINE)
> +#define vmstate_init(function) module_init(function, MODULE_INIT_MACHINE)
>  
>  void register_module_init(void (*fn)(void), module_init_type type);
>  
> diff --git a/savevm.c b/savevm.c
> index 03fce62..4a37917 100644
> --- a/savevm.c
> +++ b/savevm.c
> @@ -1285,6 +1285,10 @@ void vmstate_unregister(DeviceState *dev, const VMStateDescription *vmsd,
>      }
>  }
>  
> +void register_vmstate_description(const VMStateDescription *desc)
> +{
> +}
> +
>  static void vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd,
>                                      void *opaque);
>  static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
> diff --git a/target-i386/machine.c b/target-i386/machine.c
> index d78eceb..3a40520 100644
> --- a/target-i386/machine.c
> +++ b/target-i386/machine.c
> @@ -504,6 +504,14 @@ static const VMStateDescription vmstate_cpu = {
>      }
>  };
>  
> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description(void)
> +{
> +    register_vmstate_description(&vmstate_cpu);
> +}
> +
> +vmstate_init(init_vmstate_description);
> +
>  void cpu_save(QEMUFile *f, void *opaque)
>  {
>      vmstate_save_state(f, &vmstate_cpu, opaque);
> -- 
> 1.7.0.4
> 
>
Peter Maydell - March 23, 2011, 12:30 p.m.
On 23 March 2011 00:16, Anthony Liguori <aliguori@us.ibm.com> wrote:
> This is a purely mechanical change.

> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_ac97);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +

> +/* Register the VMState Description to support VMState introspection */
> +static void init_vmstate_description_0(void)
> +{
> +    register_vmstate_description(&vmstate_acpi);
> +}
> +
> +vmstate_init(init_vmstate_description_0);
> +

Do we really need five lines of boilerplate for every device?

(I'm wondering if there's some way you could avoid having
all this for the common case where the vmstate is pointed to
by the DeviceInfo struct, given that we already register
all the devices. Failing that, some sort of macro...)

-- PMM
Anthony Liguori - March 23, 2011, 12:37 p.m.
On 03/23/2011 07:30 AM, Peter Maydell wrote:
> On 23 March 2011 00:16, Anthony Liguori<aliguori@us.ibm.com>  wrote:
>> This is a purely mechanical change.
>> +/* Register the VMState Description to support VMState introspection */
>> +static void init_vmstate_description_0(void)
>> +{
>> +    register_vmstate_description(&vmstate_ac97);
>> +}
>> +
>> +vmstate_init(init_vmstate_description_0);
>> +
>> +/* Register the VMState Description to support VMState introspection */
>> +static void init_vmstate_description_0(void)
>> +{
>> +    register_vmstate_description(&vmstate_acpi);
>> +}
>> +
>> +vmstate_init(init_vmstate_description_0);
>> +
> Do we really need five lines of boilerplate for every device?
>
> (I'm wondering if there's some way you could avoid having
> all this for the common case where the vmstate is pointed to
> by the DeviceInfo struct, given that we already register
> all the devices. Failing that, some sort of macro...)

Heh, well that just goes right and head and tremendously simplifies 
everything :-)

There are just a few cases where VMStateDescription is not reachable via 
DeviceInfo so DeviceInfo is definitely the way to go.

Regards,

Anthony Liguori

> -- PMM
>

Patch

diff --git a/hw/ac97.c b/hw/ac97.c
index d71072d..bf818b8 100644
--- a/hw/ac97.c
+++ b/hw/ac97.c
@@ -1343,6 +1343,14 @@  static PCIDeviceInfo ac97_info = {
     .init         = ac97_initfn,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_ac97);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void ac97_register (void)
 {
     pci_qdev_register (&ac97_info);
diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c
index 0b2bc97..aaa009b 100644
--- a/hw/acpi_piix4.c
+++ b/hw/acpi_piix4.c
@@ -460,6 +460,14 @@  static PCIDeviceInfo piix4_pm_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_acpi);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void piix4_pm_register(void)
 {
     pci_qdev_register(&piix4_pm_info);
diff --git a/hw/apb_pci.c b/hw/apb_pci.c
index 84e9af7..e5d7954 100644
--- a/hw/apb_pci.c
+++ b/hw/apb_pci.c
@@ -472,6 +472,14 @@  static PCIDeviceInfo pbm_pci_bridge_info = {
     .is_bridge = 1,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pci_device);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void pbm_register_devices(void)
 {
     sysbus_register_withprop(&pbm_host_info);
diff --git a/hw/apic.c b/hw/apic.c
index 9febf40..cdf64dc 100644
--- a/hw/apic.c
+++ b/hw/apic.c
@@ -1025,6 +1025,14 @@  static SysBusDeviceInfo apic_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_apic);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void apic_register_devices(void)
 {
     sysbus_register_withprop(&apic_info);
diff --git a/hw/arm_sysctl.c b/hw/arm_sysctl.c
index 9225b58..e11b1ee 100644
--- a/hw/arm_sysctl.c
+++ b/hw/arm_sysctl.c
@@ -363,6 +363,14 @@  static SysBusDeviceInfo arm_sysctl_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_arm_sysctl);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void arm_sysctl_register_devices(void)
 {
     sysbus_register_withprop(&arm_sysctl_info);
diff --git a/hw/bonito.c b/hw/bonito.c
index 65a4a63..6ec0777 100644
--- a/hw/bonito.c
+++ b/hw/bonito.c
@@ -798,6 +798,14 @@  static PCIDeviceInfo bonito_info = {
     .init         = bonito_initfn,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_bonito);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static SysBusDeviceInfo bonito_pcihost_info = {
     .init         = bonito_pcihost_initfn,
     .qdev.name    = "Bonito-pcihost",
diff --git a/hw/cirrus_vga.c b/hw/cirrus_vga.c
index 2724f7b..97a1c4c 100644
--- a/hw/cirrus_vga.c
+++ b/hw/cirrus_vga.c
@@ -3145,6 +3145,14 @@  static PCIDeviceInfo cirrus_vga_info = {
     .config_write = pci_cirrus_write_config,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pci_cirrus_vga);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void cirrus_vga_register(void)
 {
     pci_qdev_register(&cirrus_vga_info);
diff --git a/hw/cs4231.c b/hw/cs4231.c
index a65b697..d9601d0 100644
--- a/hw/cs4231.c
+++ b/hw/cs4231.c
@@ -167,6 +167,14 @@  static SysBusDeviceInfo cs4231_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_cs4231);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void cs4231_register_devices(void)
 {
     sysbus_register_withprop(&cs4231_info);
diff --git a/hw/cs4231a.c b/hw/cs4231a.c
index 598f032..e036faf 100644
--- a/hw/cs4231a.c
+++ b/hw/cs4231a.c
@@ -679,6 +679,14 @@  static ISADeviceInfo cs4231a_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_cs4231a);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void cs4231a_register (void)
 {
     isa_qdev_register (&cs4231a_info);
diff --git a/hw/dec_pci.c b/hw/dec_pci.c
index bf88f2a..4924a43 100644
--- a/hw/dec_pci.c
+++ b/hw/dec_pci.c
@@ -76,6 +76,14 @@  static PCIDeviceInfo dec_21154_pci_bridge_info = {
     .is_bridge = 1,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pci_device);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 PCIBus *pci_dec_21154_init(PCIBus *parent_bus, int devfn)
 {
     PCIDevice *dev;
diff --git a/hw/e1000.c b/hw/e1000.c
index 2a4d5c7..e906c65 100644
--- a/hw/e1000.c
+++ b/hw/e1000.c
@@ -1212,6 +1212,14 @@  static PCIDeviceInfo e1000_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_e1000);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void e1000_register_devices(void)
 {
     pci_qdev_register(&e1000_info);
diff --git a/hw/eccmemctl.c b/hw/eccmemctl.c
index 2bda87b..770b6aa 100644
--- a/hw/eccmemctl.c
+++ b/hw/eccmemctl.c
@@ -323,6 +323,14 @@  static SysBusDeviceInfo ecc_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_ecc);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 
 static void ecc_register_devices(void)
 {
diff --git a/hw/eeprom93xx.c b/hw/eeprom93xx.c
index 660b28f..cfa695d 100644
--- a/hw/eeprom93xx.c
+++ b/hw/eeprom93xx.c
@@ -320,6 +320,14 @@  eeprom_t *eeprom93xx_new(DeviceState *dev, uint16_t nwords)
     return eeprom;
 }
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description(void)
+{
+    register_vmstate_description(&vmstate_eeprom);
+}
+
+vmstate_init(init_vmstate_description);
+
 void eeprom93xx_free(DeviceState *dev, eeprom_t *eeprom)
 {
     /* Destroy EEPROM. */
diff --git a/hw/es1370.c b/hw/es1370.c
index 40cb48c..d2f3671 100644
--- a/hw/es1370.c
+++ b/hw/es1370.c
@@ -1045,6 +1045,14 @@  static PCIDeviceInfo es1370_info = {
     .init         = es1370_initfn,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_es1370);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void es1370_register (void)
 {
     pci_qdev_register (&es1370_info);
diff --git a/hw/escc.c b/hw/escc.c
index f6fd919..08062e7 100644
--- a/hw/escc.c
+++ b/hw/escc.c
@@ -953,6 +953,14 @@  static SysBusDeviceInfo escc_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_escc);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void escc_register_devices(void)
 {
     sysbus_register_withprop(&escc_info);
diff --git a/hw/esp.c b/hw/esp.c
index fa9d2a2..977890e 100644
--- a/hw/esp.c
+++ b/hw/esp.c
@@ -743,6 +743,14 @@  static SysBusDeviceInfo esp_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_esp);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void esp_register_devices(void)
 {
     sysbus_register_withprop(&esp_info);
diff --git a/hw/fdc.c b/hw/fdc.c
index 9fdbc75..4b02dce 100644
--- a/hw/fdc.c
+++ b/hw/fdc.c
@@ -1938,6 +1938,14 @@  static ISADeviceInfo isa_fdc_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_isa_fdc);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static const VMStateDescription vmstate_sysbus_fdc ={
     .name = "fdc",
     .version_id = 2,
@@ -1961,6 +1969,14 @@  static SysBusDeviceInfo sysbus_fdc_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&vmstate_sysbus_fdc);
+}
+
+vmstate_init(init_vmstate_description_1);
+
 static SysBusDeviceInfo sun4m_fdc_info = {
     .init = sun4m_fdc_init1,
     .qdev.name  = "SUNW,fdtwo",
diff --git a/hw/fw_cfg.c b/hw/fw_cfg.c
index 85c8c3c..67603a9 100644
--- a/hw/fw_cfg.c
+++ b/hw/fw_cfg.c
@@ -399,6 +399,14 @@  static SysBusDeviceInfo fw_cfg_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_fw_cfg);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void fw_cfg_register_devices(void)
 {
     sysbus_register_withprop(&fw_cfg_info);
diff --git a/hw/gus.c b/hw/gus.c
index ff9e7c7..8e35ffb 100644
--- a/hw/gus.c
+++ b/hw/gus.c
@@ -315,6 +315,14 @@  static ISADeviceInfo gus_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_gus);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void gus_register (void)
 {
     isa_qdev_register (&gus_info);
diff --git a/hw/hda-audio.c b/hw/hda-audio.c
index c699d6f..f384de6 100644
--- a/hw/hda-audio.c
+++ b/hw/hda-audio.c
@@ -906,6 +906,14 @@  static HDACodecDeviceInfo hda_audio_info_output = {
     .stream       = hda_audio_stream,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_hda_audio);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static HDACodecDeviceInfo hda_audio_info_duplex = {
     .qdev.name    = "hda-duplex",
     .qdev.desc    = "HDA Audio Codec, duplex",
diff --git a/hw/hpet.c b/hw/hpet.c
index ef9a2a0..9010f45 100644
--- a/hw/hpet.c
+++ b/hw/hpet.c
@@ -737,6 +737,14 @@  static SysBusDeviceInfo hpet_device_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_hpet);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void hpet_register_device(void)
 {
     sysbus_register_withprop(&hpet_device_info);
diff --git a/hw/hw.h b/hw/hw.h
index 1b09039..81bbd7a 100644
--- a/hw/hw.h
+++ b/hw/hw.h
@@ -914,4 +914,7 @@  int vmstate_register_with_alias_id(DeviceState *dev, int instance_id,
                                    int required_for_version);
 void vmstate_unregister(DeviceState *dev, const VMStateDescription *vmsd,
                         void *opaque);
+
+void register_vmstate_description(const VMStateDescription *desc);
+
 #endif
diff --git a/hw/i2c.c b/hw/i2c.c
index f80d12d..85ae1f9 100644
--- a/hw/i2c.c
+++ b/hw/i2c.c
@@ -66,6 +66,14 @@  i2c_bus *i2c_init_bus(DeviceState *parent, const char *name)
     return bus;
 }
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description(void)
+{
+    register_vmstate_description(&vmstate_i2c_bus);
+}
+
+vmstate_init(init_vmstate_description);
+
 void i2c_set_slave_address(i2c_slave *dev, uint8_t address)
 {
     dev->address = address;
diff --git a/hw/i8254.c b/hw/i8254.c
index a9ca9f6..261f860 100644
--- a/hw/i8254.c
+++ b/hw/i8254.c
@@ -539,6 +539,14 @@  static ISADeviceInfo pit_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pit);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void pit_register(void)
 {
     isa_qdev_register(&pit_info);
diff --git a/hw/i8259.c b/hw/i8259.c
index 84d330d..388e145 100644
--- a/hw/i8259.c
+++ b/hw/i8259.c
@@ -487,6 +487,14 @@  static void pic_init1(int io_addr, int elcr_addr, PicState *s)
     qemu_register_reset(pic_reset, s);
 }
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description(void)
+{
+    register_vmstate_description(&vmstate_pic);
+}
+
+vmstate_init(init_vmstate_description);
+
 void pic_info(Monitor *mon)
 {
     int i;
diff --git a/hw/intel-hda.c b/hw/intel-hda.c
index b0b1d12..a32d28d 100644
--- a/hw/intel-hda.c
+++ b/hw/intel-hda.c
@@ -1283,6 +1283,14 @@  static PCIDeviceInfo intel_hda_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_intel_hda);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void intel_hda_register(void)
 {
     pci_qdev_register(&intel_hda_info);
diff --git a/hw/ioapic.c b/hw/ioapic.c
index 569327d..8ac6d34 100644
--- a/hw/ioapic.c
+++ b/hw/ioapic.c
@@ -350,6 +350,14 @@  static SysBusDeviceInfo ioapic_info = {
     .qdev.no_user = 1,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_ioapic);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void ioapic_register_devices(void)
 {
     sysbus_register_withprop(&ioapic_info);
diff --git a/hw/ioh3420.c b/hw/ioh3420.c
index 95adf09..7b0b801 100644
--- a/hw/ioh3420.c
+++ b/hw/ioh3420.c
@@ -229,6 +229,14 @@  static PCIDeviceInfo ioh3420_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_ioh3420);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void ioh3420_register(void)
 {
     pci_qdev_register(&ioh3420_info);
diff --git a/hw/kvmclock.c b/hw/kvmclock.c
index b6ceddf..f9c05cd 100644
--- a/hw/kvmclock.c
+++ b/hw/kvmclock.c
@@ -99,6 +99,14 @@  static SysBusDeviceInfo kvmclock_info = {
     .init = kvmclock_init,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&kvmclock_vmsd);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 /* Note: Must be called after VCPU initialization. */
 void kvmclock_create(void)
 {
diff --git a/hw/lance.c b/hw/lance.c
index ddb1cbb..32d81ca 100644
--- a/hw/lance.c
+++ b/hw/lance.c
@@ -153,6 +153,14 @@  static SysBusDeviceInfo lance_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_lance);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void lance_register_devices(void)
 {
     sysbus_register_withprop(&lance_info);
diff --git a/hw/lm32_juart.c b/hw/lm32_juart.c
index fddcf7e..a49308c 100644
--- a/hw/lm32_juart.c
+++ b/hw/lm32_juart.c
@@ -142,6 +142,14 @@  static SysBusDeviceInfo lm32_juart_info = {
     .qdev.reset = juart_reset,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_lm32_juart);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void lm32_juart_register(void)
 {
     sysbus_register_withprop(&lm32_juart_info);
diff --git a/hw/lm32_pic.c b/hw/lm32_pic.c
index 02941a7..de4f310 100644
--- a/hw/lm32_pic.c
+++ b/hw/lm32_pic.c
@@ -182,6 +182,14 @@  static SysBusDeviceInfo lm32_pic_info = {
     .qdev.reset = pic_reset,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_lm32_pic);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void lm32_pic_register(void)
 {
     sysbus_register_withprop(&lm32_pic_info);
diff --git a/hw/lm32_sys.c b/hw/lm32_sys.c
index 427b05f..4c718b7 100644
--- a/hw/lm32_sys.c
+++ b/hw/lm32_sys.c
@@ -153,6 +153,14 @@  static SysBusDeviceInfo lm32_sys_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_lm32_sys);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void lm32_sys_register(void)
 {
     sysbus_register_withprop(&lm32_sys_info);
diff --git a/hw/lm32_timer.c b/hw/lm32_timer.c
index ed28984..445cfde 100644
--- a/hw/lm32_timer.c
+++ b/hw/lm32_timer.c
@@ -214,6 +214,14 @@  static SysBusDeviceInfo lm32_timer_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_lm32_timer);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void lm32_timer_register(void)
 {
     sysbus_register_withprop(&lm32_timer_info);
diff --git a/hw/lm32_uart.c b/hw/lm32_uart.c
index e225087..32c6ffd 100644
--- a/hw/lm32_uart.c
+++ b/hw/lm32_uart.c
@@ -280,6 +280,14 @@  static SysBusDeviceInfo lm32_uart_info = {
     .qdev.reset = uart_reset,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_lm32_uart);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void lm32_uart_register(void)
 {
     sysbus_register_withprop(&lm32_uart_info);
diff --git a/hw/lm832x.c b/hw/lm832x.c
index 590a4cc..ac097bd 100644
--- a/hw/lm832x.c
+++ b/hw/lm832x.c
@@ -504,6 +504,14 @@  static I2CSlaveInfo lm8323_info = {
     .send = lm_i2c_tx
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_lm_kbd);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void lm832x_register_devices(void)
 {
     i2c_register_slave(&lm8323_info);
diff --git a/hw/lsi53c895a.c b/hw/lsi53c895a.c
index 84a4992..699261b 100644
--- a/hw/lsi53c895a.c
+++ b/hw/lsi53c895a.c
@@ -2211,6 +2211,14 @@  static PCIDeviceInfo lsi_info = {
     .exit       = lsi_scsi_uninit,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_lsi_scsi);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void lsi53c895a_register_devices(void)
 {
     pci_qdev_register(&lsi_info);
diff --git a/hw/marvell_88w8618_audio.c b/hw/marvell_88w8618_audio.c
index 3eff925..25437ea 100644
--- a/hw/marvell_88w8618_audio.c
+++ b/hw/marvell_88w8618_audio.c
@@ -291,6 +291,14 @@  static SysBusDeviceInfo mv88w8618_audio_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&mv88w8618_audio_vmsd);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void mv88w8618_register_devices(void)
 {
     sysbus_register_withprop(&mv88w8618_audio_info);
diff --git a/hw/max7310.c b/hw/max7310.c
index c1bdb2e..12b8769 100644
--- a/hw/max7310.c
+++ b/hw/max7310.c
@@ -196,6 +196,14 @@  static I2CSlaveInfo max7310_info = {
     .send = max7310_tx
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_max7310);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void max7310_register_devices(void)
 {
     i2c_register_slave(&max7310_info);
diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c
index 1c9a706..7b80c18 100644
--- a/hw/mc146818rtc.c
+++ b/hw/mc146818rtc.c
@@ -650,6 +650,14 @@  static ISADeviceInfo mc146818rtc_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_rtc);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void mc146818rtc_register(void)
 {
     isa_qdev_register(&mc146818rtc_info);
diff --git a/hw/mst_fpga.c b/hw/mst_fpga.c
index a04355c..c5111b9 100644
--- a/hw/mst_fpga.c
+++ b/hw/mst_fpga.c
@@ -248,6 +248,14 @@  static SysBusDeviceInfo mst_fpga_info = {
 	.qdev.vmsd = &vmstate_mst_fpga_regs,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_mst_fpga_regs);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void mst_fpga_register(void)
 {
 	sysbus_register_withprop(&mst_fpga_info);
diff --git a/hw/musicpal.c b/hw/musicpal.c
index d98aa8d..773b93c 100644
--- a/hw/musicpal.c
+++ b/hw/musicpal.c
@@ -423,6 +423,14 @@  static SysBusDeviceInfo mv88w8618_eth_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&mv88w8618_eth_vmsd);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 /* LCD register offsets */
 #define MP_LCD_IRQCTRL          0x180
 #define MP_LCD_IRQSTAT          0x184
@@ -637,6 +645,14 @@  static SysBusDeviceInfo musicpal_lcd_info = {
     .qdev.vmsd = &musicpal_lcd_vmsd,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&musicpal_lcd_vmsd);
+}
+
+vmstate_init(init_vmstate_description_1);
+
 /* PIC register offsets */
 #define MP_PIC_STATUS           0x00
 #define MP_PIC_ENABLE_SET       0x08
@@ -753,6 +769,14 @@  static SysBusDeviceInfo mv88w8618_pic_info = {
     .qdev.vmsd = &mv88w8618_pic_vmsd,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_2(void)
+{
+    register_vmstate_description(&mv88w8618_pic_vmsd);
+}
+
+vmstate_init(init_vmstate_description_2);
+
 /* PIT register offsets */
 #define MP_PIT_TIMER1_LENGTH    0x00
 /* ... */
@@ -927,6 +951,14 @@  static SysBusDeviceInfo mv88w8618_pit_info = {
     .qdev.vmsd  = &mv88w8618_pit_vmsd,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_3(void)
+{
+    register_vmstate_description(&mv88w8618_pit_vmsd);
+}
+
+vmstate_init(init_vmstate_description_3);
+
 /* Flash config register offsets */
 #define MP_FLASHCFG_CFGR0    0x04
 
@@ -1004,6 +1036,14 @@  static SysBusDeviceInfo mv88w8618_flashcfg_info = {
     .qdev.vmsd  = &mv88w8618_flashcfg_vmsd,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_4(void)
+{
+    register_vmstate_description(&mv88w8618_flashcfg_vmsd);
+}
+
+vmstate_init(init_vmstate_description_4);
+
 /* Misc register offsets */
 #define MP_MISC_BOARD_REVISION  0x18
 
@@ -1335,6 +1375,14 @@  static SysBusDeviceInfo musicpal_gpio_info = {
     .qdev.vmsd  = &musicpal_gpio_vmsd,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_5(void)
+{
+    register_vmstate_description(&musicpal_gpio_vmsd);
+}
+
+vmstate_init(init_vmstate_description_5);
+
 /* Keyboard codes & masks */
 #define KEY_RELEASED            0x80
 #define KEY_CODE                0x7f
@@ -1478,6 +1526,14 @@  static SysBusDeviceInfo musicpal_key_info = {
     .qdev.vmsd  = &musicpal_key_vmsd,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_6(void)
+{
+    register_vmstate_description(&musicpal_key_vmsd);
+}
+
+vmstate_init(init_vmstate_description_6);
+
 static struct arm_boot_info musicpal_binfo = {
     .loader_start = 0x0,
     .board_id = 0x20e,
diff --git a/hw/ne2000.c b/hw/ne2000.c
index 5966359..270578b 100644
--- a/hw/ne2000.c
+++ b/hw/ne2000.c
@@ -773,6 +773,14 @@  static PCIDeviceInfo ne2000_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pci_ne2000);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void ne2000_register_devices(void)
 {
     pci_qdev_register(&ne2000_info);
diff --git a/hw/pc.c b/hw/pc.c
index 6939c04..5211b29 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -497,6 +497,14 @@  static ISADeviceInfo port92_info = {
     .init          = port92_initfn,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_port92_isa);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void port92_register(void)
 {
     isa_qdev_register(&port92_info);
diff --git a/hw/pci.c b/hw/pci.c
index 8b76cea..50b9a14 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -269,6 +269,14 @@  void pci_bus_new_inplace(PCIBus *bus, DeviceState *parent,
     vmstate_register(NULL, -1, &vmstate_pcibus, bus);
 }
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description(void)
+{
+    register_vmstate_description(&vmstate_pcibus);
+}
+
+vmstate_init(init_vmstate_description);
+
 PCIBus *pci_bus_new(DeviceState *parent, const char *name, int devfn_min)
 {
     PCIBus *bus;
diff --git a/hw/pckbd.c b/hw/pckbd.c
index ae65c04..027f69e 100644
--- a/hw/pckbd.c
+++ b/hw/pckbd.c
@@ -433,6 +433,14 @@  void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq,
     qemu_register_reset(kbd_reset, s);
 }
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description(void)
+{
+    register_vmstate_description(&vmstate_kbd);
+}
+
+vmstate_init(init_vmstate_description);
+
 typedef struct ISAKBDState {
     ISADevice dev;
     KBDState  kbd;
@@ -492,6 +500,14 @@  static ISADeviceInfo i8042_info = {
     .init          = i8042_initfn,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_kbd_isa);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void i8042_register(void)
 {
     isa_qdev_register(&i8042_info);
diff --git a/hw/pcnet-pci.c b/hw/pcnet-pci.c
index 339a401..d3c2738 100644
--- a/hw/pcnet-pci.c
+++ b/hw/pcnet-pci.c
@@ -338,6 +338,14 @@  static PCIDeviceInfo pcnet_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pci_pcnet);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void pci_pcnet_register_devices(void)
 {
     pci_qdev_register(&pcnet_info);
diff --git a/hw/piix_pci.c b/hw/piix_pci.c
index 358da58..1e5f379 100644
--- a/hw/piix_pci.c
+++ b/hw/piix_pci.c
@@ -364,6 +364,14 @@  static PCIDeviceInfo i440fx_info[] = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_piix3);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static SysBusDeviceInfo i440fx_pcihost_info = {
     .init         = i440fx_pcihost_initfn,
     .qdev.name    = "i440FX-pcihost",
diff --git a/hw/pl031.c b/hw/pl031.c
index 8c2f9d0..5372e21 100644
--- a/hw/pl031.c
+++ b/hw/pl031.c
@@ -229,6 +229,14 @@  static SysBusDeviceInfo pl031_info = {
     .qdev.no_user = 1,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pl031);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void pl031_register_devices(void)
 {
     sysbus_register_withprop(&pl031_info);
diff --git a/hw/pl050.c b/hw/pl050.c
index b155cc0..4c2b279 100644
--- a/hw/pl050.c
+++ b/hw/pl050.c
@@ -171,6 +171,14 @@  static SysBusDeviceInfo pl050_kbd_info = {
     .qdev.vmsd = &vmstate_pl050,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pl050);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static SysBusDeviceInfo pl050_mouse_info = {
     .init = pl050_init_mouse,
     .qdev.name  = "pl050_mouse",
@@ -178,6 +186,14 @@  static SysBusDeviceInfo pl050_mouse_info = {
     .qdev.vmsd = &vmstate_pl050,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&vmstate_pl050);
+}
+
+vmstate_init(init_vmstate_description_1);
+
 static void pl050_register_devices(void)
 {
     sysbus_register_withprop(&pl050_kbd_info);
diff --git a/hw/pl080.c b/hw/pl080.c
index 901f04a..1c6198b 100644
--- a/hw/pl080.c
+++ b/hw/pl080.c
@@ -388,6 +388,14 @@  static SysBusDeviceInfo pl080_info = {
     .qdev.no_user = 1,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pl080);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static SysBusDeviceInfo pl081_info = {
     .init = pl081_init,
     .qdev.name = "pl081",
@@ -396,6 +404,14 @@  static SysBusDeviceInfo pl081_info = {
     .qdev.no_user = 1,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&vmstate_pl080);
+}
+
+vmstate_init(init_vmstate_description_1);
+
 /* The PL080 and PL081 are the same except for the number of channels
    they implement (8 and 2 respectively).  */
 static void pl080_register_devices(void)
diff --git a/hw/pl110.c b/hw/pl110.c
index 06d2dfa..9073a40 100644
--- a/hw/pl110.c
+++ b/hw/pl110.c
@@ -405,6 +405,14 @@  static SysBusDeviceInfo pl110_info = {
     .qdev.no_user = 1,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pl110);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static SysBusDeviceInfo pl110_versatile_info = {
     .init = pl110_versatile_init,
     .qdev.name = "pl110_versatile",
@@ -413,6 +421,14 @@  static SysBusDeviceInfo pl110_versatile_info = {
     .qdev.no_user = 1,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&vmstate_pl110);
+}
+
+vmstate_init(init_vmstate_description_1);
+
 static void pl110_register_devices(void)
 {
     sysbus_register_withprop(&pl110_info);
diff --git a/hw/pl190.c b/hw/pl190.c
index 75f2ba1..a03db5c 100644
--- a/hw/pl190.c
+++ b/hw/pl190.c
@@ -270,6 +270,14 @@  static SysBusDeviceInfo pl190_info = {
     .qdev.no_user = 1,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pl190);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void pl190_register_devices(void)
 {
     sysbus_register_withprop(&pl190_info);
diff --git a/hw/ps2.c b/hw/ps2.c
index 91b73e0..c77d5fc 100644
--- a/hw/ps2.c
+++ b/hw/ps2.c
@@ -615,6 +615,14 @@  void *ps2_kbd_init(void (*update_irq)(void *, int), void *update_arg)
     return s;
 }
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_ps2_keyboard);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 void *ps2_mouse_init(void (*update_irq)(void *, int), void *update_arg)
 {
     PS2MouseState *s = (PS2MouseState *)qemu_mallocz(sizeof(PS2MouseState));
@@ -626,3 +634,11 @@  void *ps2_mouse_init(void (*update_irq)(void *, int), void *update_arg)
     qemu_register_reset(ps2_mouse_reset, s);
     return s;
 }
+
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&vmstate_ps2_mouse);
+}
+
+vmstate_init(init_vmstate_description_1);
diff --git a/hw/pxa2xx.c b/hw/pxa2xx.c
index 9b95e2c..d8f2943 100644
--- a/hw/pxa2xx.c
+++ b/hw/pxa2xx.c
@@ -1293,6 +1293,14 @@  static SysBusDeviceInfo pxa2xx_rtc_sysbus_info = {
     .qdev.vmsd  = &vmstate_pxa2xx_rtc_regs,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pxa2xx_rtc_regs);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 /* I2C Interface */
 typedef struct {
     i2c_slave i2c;
@@ -1595,6 +1603,14 @@  static SysBusDeviceInfo pxa2xx_i2c_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&vmstate_pxa2xx_i2c);
+}
+
+vmstate_init(init_vmstate_description_1);
+
 /* PXA Inter-IC Sound Controller */
 static void pxa2xx_i2s_reset(PXA2xxI2SState *i2s)
 {
diff --git a/hw/pxa2xx_dma.c b/hw/pxa2xx_dma.c
index a67498b..6d5fb56 100644
--- a/hw/pxa2xx_dma.c
+++ b/hw/pxa2xx_dma.c
@@ -561,6 +561,14 @@  static SysBusDeviceInfo pxa2xx_dma_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pxa2xx_dma);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void pxa2xx_dma_register(void)
 {
     sysbus_register_withprop(&pxa2xx_dma_info);
diff --git a/hw/pxa2xx_pic.c b/hw/pxa2xx_pic.c
index e9a5361..fa6abba 100644
--- a/hw/pxa2xx_pic.c
+++ b/hw/pxa2xx_pic.c
@@ -309,6 +309,14 @@  static SysBusDeviceInfo pxa2xx_pic_info = {
     .qdev.vmsd  = &vmstate_pxa2xx_pic_regs,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pxa2xx_pic_regs);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void pxa2xx_pic_register(void)
 {
     sysbus_register_withprop(&pxa2xx_pic_info);
diff --git a/hw/pxa2xx_timer.c b/hw/pxa2xx_timer.c
index f777a21..db0603e 100644
--- a/hw/pxa2xx_timer.c
+++ b/hw/pxa2xx_timer.c
@@ -496,6 +496,14 @@  static SysBusDeviceInfo pxa25x_timer_dev_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_pxa2xx_timer_regs);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static SysBusDeviceInfo pxa27x_timer_dev_info = {
     .init       = pxa2xx_timer_init,
     .qdev.name  = "pxa27x-timer",
@@ -510,6 +518,14 @@  static SysBusDeviceInfo pxa27x_timer_dev_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&vmstate_pxa2xx_timer_regs);
+}
+
+vmstate_init(init_vmstate_description_1);
+
 static void pxa2xx_timer_register(void)
 {
     sysbus_register_withprop(&pxa25x_timer_dev_info);
diff --git a/hw/qxl.c b/hw/qxl.c
index fe4212b..2a0d090 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -1504,6 +1504,14 @@  static PCIDeviceInfo qxl_info_primary = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&qxl_vmstate);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static PCIDeviceInfo qxl_info_secondary = {
     .qdev.name    = "qxl",
     .qdev.desc    = "Spice QXL GPU (secondary)",
@@ -1522,6 +1530,14 @@  static PCIDeviceInfo qxl_info_secondary = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&qxl_vmstate);
+}
+
+vmstate_init(init_vmstate_description_1);
+
 static void qxl_register(void)
 {
     pci_qdev_register(&qxl_info_primary);
diff --git a/hw/rtl8139.c b/hw/rtl8139.c
index 0ba51fc..3b2f61e 100644
--- a/hw/rtl8139.c
+++ b/hw/rtl8139.c
@@ -3269,6 +3269,14 @@  static const VMStateDescription vmstate_rtl8139 = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_rtl8139_hotplug_ready);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 /***********************************************************/
 /* PCI RTL8139 definitions */
 
@@ -3422,6 +3430,14 @@  static PCIDeviceInfo rtl8139_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&vmstate_rtl8139);
+}
+
+vmstate_init(init_vmstate_description_1);
+
 static void rtl8139_register_devices(void)
 {
     pci_qdev_register(&rtl8139_info);
diff --git a/hw/sb16.c b/hw/sb16.c
index a76df1b..c98546a 100644
--- a/hw/sb16.c
+++ b/hw/sb16.c
@@ -1413,6 +1413,14 @@  static ISADeviceInfo sb16_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_sb16);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void sb16_register (void)
 {
     isa_qdev_register (&sb16_info);
diff --git a/hw/sbi.c b/hw/sbi.c
index 53f66f2..53a236c 100644
--- a/hw/sbi.c
+++ b/hw/sbi.c
@@ -140,6 +140,14 @@  static SysBusDeviceInfo sbi_info = {
     .qdev.reset = sbi_reset,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_sbi);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void sbi_register_devices(void)
 {
     sysbus_register_withprop(&sbi_info);
diff --git a/hw/serial.c b/hw/serial.c
index 0ee61dd..c7ba97c 100644
--- a/hw/serial.c
+++ b/hw/serial.c
@@ -804,8 +804,6 @@  SerialState *serial_init(int base, qemu_irq irq, int baudbase,
     s->chr = chr;
     serial_init_core(s);
 
-    vmstate_register(NULL, base, &vmstate_serial, s);
-
     register_ioport_write(base, 8, 1, serial_ioport_write, s);
     register_ioport_read(base, 8, 1, serial_ioport_read, s);
     return s;
@@ -971,6 +969,14 @@  static ISADeviceInfo serial_isa_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_isa_serial);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void serial_register_devices(void)
 {
     isa_qdev_register(&serial_isa_info);
diff --git a/hw/slavio_intctl.c b/hw/slavio_intctl.c
index a83e5b8..8b3bdb5 100644
--- a/hw/slavio_intctl.c
+++ b/hw/slavio_intctl.c
@@ -455,6 +455,14 @@  static SysBusDeviceInfo slavio_intctl_info = {
     .qdev.reset = slavio_intctl_reset,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_intctl);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void slavio_intctl_register_devices(void)
 {
     sysbus_register_withprop(&slavio_intctl_info);
diff --git a/hw/slavio_misc.c b/hw/slavio_misc.c
index 198360d..0b415b9 100644
--- a/hw/slavio_misc.c
+++ b/hw/slavio_misc.c
@@ -484,6 +484,14 @@  static SysBusDeviceInfo slavio_misc_info = {
     .qdev.reset  = slavio_misc_reset,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_misc);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static SysBusDeviceInfo apc_info = {
     .init = apc_init1,
     .qdev.name  = "apc",
diff --git a/hw/slavio_timer.c b/hw/slavio_timer.c
index 5511313..0f95113 100644
--- a/hw/slavio_timer.c
+++ b/hw/slavio_timer.c
@@ -416,6 +416,14 @@  static SysBusDeviceInfo slavio_timer_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_slavio_timer);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void slavio_timer_register_devices(void)
 {
     sysbus_register_withprop(&slavio_timer_info);
diff --git a/hw/smc91c111.c b/hw/smc91c111.c
index dafea5c..63b4507 100644
--- a/hw/smc91c111.c
+++ b/hw/smc91c111.c
@@ -774,6 +774,14 @@  static SysBusDeviceInfo smc91c111_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_smc91c111);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void smc91c111_register_devices(void)
 {
     sysbus_register_withprop(&smc91c111_info);
diff --git a/hw/sparc32_dma.c b/hw/sparc32_dma.c
index e75694b..d8be398 100644
--- a/hw/sparc32_dma.c
+++ b/hw/sparc32_dma.c
@@ -297,6 +297,14 @@  static SysBusDeviceInfo sparc32_dma_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_dma);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void sparc32_dma_register_devices(void)
 {
     sysbus_register_withprop(&sparc32_dma_info);
diff --git a/hw/spitz.c b/hw/spitz.c
index 006f7a9..1078486 100644
--- a/hw/spitz.c
+++ b/hw/spitz.c
@@ -1043,6 +1043,14 @@  static SysBusDeviceInfo sl_nand_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_sl_nand_info);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static VMStateDescription vmstate_spitz_kbd = {
     .name = "spitz-keyboard",
     .version_id = 1,
@@ -1067,6 +1075,14 @@  static SysBusDeviceInfo spitz_keyboard_info = {
     },
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&vmstate_spitz_kbd);
+}
+
+vmstate_init(init_vmstate_description_1);
+
 static const VMStateDescription vmstate_corgi_ssp_regs = {
     .name = "corgi-ssp",
     .version_id = 1,
@@ -1086,6 +1102,14 @@  static SSISlaveInfo corgi_ssp_info = {
     .transfer = corgi_ssp_transfer
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_2(void)
+{
+    register_vmstate_description(&vmstate_corgi_ssp_regs);
+}
+
+vmstate_init(init_vmstate_description_2);
+
 static const VMStateDescription vmstate_spitz_lcdtg_regs = {
     .name = "spitz-lcdtg",
     .version_id = 1,
@@ -1106,6 +1130,14 @@  static SSISlaveInfo spitz_lcdtg_info = {
     .transfer = spitz_lcdtg_transfer
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_3(void)
+{
+    register_vmstate_description(&vmstate_spitz_lcdtg_regs);
+}
+
+vmstate_init(init_vmstate_description_3);
+
 static void spitz_register_devices(void)
 {
     ssi_register_slave(&corgi_ssp_info);
diff --git a/hw/ssd0303.c b/hw/ssd0303.c
index 108c068..dc3012d 100644
--- a/hw/ssd0303.c
+++ b/hw/ssd0303.c
@@ -304,6 +304,14 @@  static I2CSlaveInfo ssd0303_info = {
     .send = ssd0303_send
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_ssd0303);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void ssd0303_register_devices(void)
 {
     i2c_register_slave(&ssd0303_info);
diff --git a/hw/sun4c_intctl.c b/hw/sun4c_intctl.c
index 5c7fdef..025ea92 100644
--- a/hw/sun4c_intctl.c
+++ b/hw/sun4c_intctl.c
@@ -216,6 +216,14 @@  static SysBusDeviceInfo sun4c_intctl_info = {
     .qdev.reset = sun4c_intctl_reset,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_sun4c_intctl);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void sun4c_intctl_register_devices(void)
 {
     sysbus_register_withprop(&sun4c_intctl_info);
diff --git a/hw/sun4m_iommu.c b/hw/sun4m_iommu.c
index bba69ee..bb24412 100644
--- a/hw/sun4m_iommu.c
+++ b/hw/sun4m_iommu.c
@@ -370,6 +370,14 @@  static SysBusDeviceInfo iommu_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_iommu);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void iommu_register_devices(void)
 {
     sysbus_register_withprop(&iommu_info);
diff --git a/hw/tcx.c b/hw/tcx.c
index 0e32830..40a771b 100644
--- a/hw/tcx.c
+++ b/hw/tcx.c
@@ -643,6 +643,14 @@  static SysBusDeviceInfo tcx_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_tcx);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void tcx_register_devices(void)
 {
     sysbus_register_withprop(&tcx_info);
diff --git a/hw/tmp105.c b/hw/tmp105.c
index f7e6f2b..9d3325c 100644
--- a/hw/tmp105.c
+++ b/hw/tmp105.c
@@ -236,6 +236,14 @@  static I2CSlaveInfo tmp105_info = {
     .send = tmp105_tx
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_tmp105);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void tmp105_register_devices(void)
 {
     i2c_register_slave(&tmp105_info);
diff --git a/hw/twl92230.c b/hw/twl92230.c
index 8e74acc..2b570a6 100644
--- a/hw/twl92230.c
+++ b/hw/twl92230.c
@@ -868,6 +868,14 @@  static I2CSlaveInfo twl92230_info = {
     .send = menelaus_tx
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_menelaus);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void twl92230_register_devices(void)
 {
     i2c_register_slave(&twl92230_info);
diff --git a/hw/usb-hid.c b/hw/usb-hid.c
index c25362c..e8fff11 100644
--- a/hw/usb-hid.c
+++ b/hw/usb-hid.c
@@ -999,6 +999,14 @@  static struct USBDeviceInfo hid_info[] = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_usb_kbd);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void usb_hid_register_devices(void)
 {
     usb_qdev_register_many(hid_info);
diff --git a/hw/usb-hub.c b/hw/usb-hub.c
index 3dd31ba..dfac0ed 100644
--- a/hw/usb-hub.c
+++ b/hw/usb-hub.c
@@ -583,6 +583,14 @@  static struct USBDeviceInfo hub_info = {
     .handle_destroy = usb_hub_handle_destroy,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_usb_hub);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void usb_hub_register_devices(void)
 {
     usb_qdev_register(&hub_info);
diff --git a/hw/usb-uhci.c b/hw/usb-uhci.c
index 346db3e..bc8fc5b 100644
--- a/hw/usb-uhci.c
+++ b/hw/usb-uhci.c
@@ -1207,6 +1207,14 @@  static PCIDeviceInfo uhci_info[] = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_uhci);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void uhci_register(void)
 {
     pci_qdev_register_many(uhci_info);
diff --git a/hw/versatilepb.c b/hw/versatilepb.c
index 9f1bfcf..659359c 100644
--- a/hw/versatilepb.c
+++ b/hw/versatilepb.c
@@ -354,6 +354,14 @@  static SysBusDeviceInfo vpb_sic_info = {
     .qdev.no_user = 1,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_vpb_sic);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void versatilepb_register_devices(void)
 {
     sysbus_register_withprop(&vpb_sic_info);
diff --git a/hw/vga-isa.c b/hw/vga-isa.c
index fde0d56..5f1ef76 100644
--- a/hw/vga-isa.c
+++ b/hw/vga-isa.c
@@ -81,6 +81,14 @@  static ISADeviceInfo vga_info = {
     .init          = vga_initfn,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_vga_common);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void vga_register(void)
 {
     isa_qdev_register(&vga_info);
diff --git a/hw/vga-pci.c b/hw/vga-pci.c
index ce9ec45..c91739f 100644
--- a/hw/vga-pci.c
+++ b/hw/vga-pci.c
@@ -116,6 +116,14 @@  static PCIDeviceInfo vga_info = {
     .romfile      = "vgabios-stdvga.bin",
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_vga_pci);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void vga_register(void)
 {
     pci_qdev_register(&vga_info);
diff --git a/hw/vmmouse.c b/hw/vmmouse.c
index 1113f33..f2de7d8 100644
--- a/hw/vmmouse.c
+++ b/hw/vmmouse.c
@@ -282,6 +282,14 @@  static ISADeviceInfo vmmouse_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_vmmouse);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void vmmouse_dev_register(void)
 {
     isa_qdev_register(&vmmouse_info);
diff --git a/hw/vmware_vga.c b/hw/vmware_vga.c
index 4656767..106c9b4 100644
--- a/hw/vmware_vga.c
+++ b/hw/vmware_vga.c
@@ -1318,6 +1318,14 @@  static PCIDeviceInfo vmsvga_info = {
     .romfile      = "vgabios-vmware.bin",
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_vmware_vga);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void vmsvga_register(void)
 {
     pci_qdev_register(&vmsvga_info);
diff --git a/hw/vt82c686.c b/hw/vt82c686.c
index 818460d..62b8c63 100644
--- a/hw/vt82c686.c
+++ b/hw/vt82c686.c
@@ -522,6 +522,14 @@  static PCIDeviceInfo via_pm_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_acpi);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void vt82c686b_pm_register(void)
 {
     pci_qdev_register(&via_pm_info);
@@ -587,6 +595,14 @@  static PCIDeviceInfo via_info = {
     .config_write = vt82c686b_write_config,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_1(void)
+{
+    register_vmstate_description(&vmstate_via);
+}
+
+vmstate_init(init_vmstate_description_1);
+
 static void vt82c686b_register(void)
 {
     pci_qdev_register(&via_info);
diff --git a/hw/wdt_i6300esb.c b/hw/wdt_i6300esb.c
index 4a7fba7..99f3c9b 100644
--- a/hw/wdt_i6300esb.c
+++ b/hw/wdt_i6300esb.c
@@ -439,6 +439,14 @@  static PCIDeviceInfo i6300esb_info = {
     .init         = i6300esb_init,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_i6300esb);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void i6300esb_register_devices(void)
 {
     watchdog_add_model(&model);
diff --git a/hw/wdt_ib700.c b/hw/wdt_ib700.c
index 81f22d0..4cd24b9 100644
--- a/hw/wdt_ib700.c
+++ b/hw/wdt_ib700.c
@@ -128,6 +128,14 @@  static ISADeviceInfo wdt_ib700_info = {
     .init       = wdt_ib700_init,
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_ib700);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void wdt_ib700_register_devices(void)
 {
     watchdog_add_model(&model);
diff --git a/hw/wm8750.c b/hw/wm8750.c
index c9c6744..dc46577 100644
--- a/hw/wm8750.c
+++ b/hw/wm8750.c
@@ -699,6 +699,14 @@  static I2CSlaveInfo wm8750_info = {
     .send = wm8750_tx
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_wm8750);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void wm8750_register_devices(void)
 {
     i2c_register_slave(&wm8750_info);
diff --git a/hw/xio3130_downstream.c b/hw/xio3130_downstream.c
index 5aa6a6b..f6fd902 100644
--- a/hw/xio3130_downstream.c
+++ b/hw/xio3130_downstream.c
@@ -194,6 +194,14 @@  static PCIDeviceInfo xio3130_downstream_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_xio3130_downstream);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void xio3130_downstream_register(void)
 {
     pci_qdev_register(&xio3130_downstream_info);
diff --git a/hw/xio3130_upstream.c b/hw/xio3130_upstream.c
index a7640f5..0b503ee 100644
--- a/hw/xio3130_upstream.c
+++ b/hw/xio3130_upstream.c
@@ -168,6 +168,14 @@  static PCIDeviceInfo xio3130_upstream_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_xio3130_upstream);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void xio3130_upstream_register(void)
 {
     pci_qdev_register(&xio3130_upstream_info);
diff --git a/hw/zaurus.c b/hw/zaurus.c
index c24aeb5..6ce61af 100644
--- a/hw/zaurus.c
+++ b/hw/zaurus.c
@@ -236,6 +236,14 @@  static SysBusDeviceInfo scoop_sysbus_info = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description_0(void)
+{
+    register_vmstate_description(&vmstate_scoop_regs);
+}
+
+vmstate_init(init_vmstate_description_0);
+
 static void scoop_register(void)
 {
     sysbus_register_withprop(&scoop_sysbus_info);
diff --git a/module.h b/module.h
index 9263f1c..70c33a5 100644
--- a/module.h
+++ b/module.h
@@ -24,12 +24,14 @@  typedef enum {
     MODULE_INIT_BLOCK,
     MODULE_INIT_DEVICE,
     MODULE_INIT_MACHINE,
+    MODULE_INIT_VMSTATE,
     MODULE_INIT_MAX
 } module_init_type;
 
 #define block_init(function) module_init(function, MODULE_INIT_BLOCK)
 #define device_init(function) module_init(function, MODULE_INIT_DEVICE)
 #define machine_init(function) module_init(function, MODULE_INIT_MACHINE)
+#define vmstate_init(function) module_init(function, MODULE_INIT_MACHINE)
 
 void register_module_init(void (*fn)(void), module_init_type type);
 
diff --git a/savevm.c b/savevm.c
index 03fce62..4a37917 100644
--- a/savevm.c
+++ b/savevm.c
@@ -1285,6 +1285,10 @@  void vmstate_unregister(DeviceState *dev, const VMStateDescription *vmsd,
     }
 }
 
+void register_vmstate_description(const VMStateDescription *desc)
+{
+}
+
 static void vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd,
                                     void *opaque);
 static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
diff --git a/target-i386/machine.c b/target-i386/machine.c
index d78eceb..3a40520 100644
--- a/target-i386/machine.c
+++ b/target-i386/machine.c
@@ -504,6 +504,14 @@  static const VMStateDescription vmstate_cpu = {
     }
 };
 
+/* Register the VMState Description to support VMState introspection */
+static void init_vmstate_description(void)
+{
+    register_vmstate_description(&vmstate_cpu);
+}
+
+vmstate_init(init_vmstate_description);
+
 void cpu_save(QEMUFile *f, void *opaque)
 {
     vmstate_save_state(f, &vmstate_cpu, opaque);