qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/4] Test vmstate with scripts/vmstate-static-checker.py
@ 2025-04-29 15:21 Thomas Huth
  2025-04-29 15:21 ` [PATCH 1/4] tests/vmstate-static-checker-data: Remove old dump files Thomas Huth
                   ` (3 more replies)
  0 siblings, 4 replies; 16+ messages in thread
From: Thomas Huth @ 2025-04-29 15:21 UTC (permalink / raw)
  To: qemu-devel, Fabiano Rosas; +Cc: Peter Xu, John Snow

This set of patches adds an automatic test of the vmstate via the
scripts/vmstate-static-checker.py script. For this we need some
reference files from an older version of QEMU. There are already
some files available in tests/vmstate-static-checker-data/ but
they are of no use anymore since they have been taken from machines
that have already been removed a long time ago (and thus these files
now get removed, too). I chose to use QEMU 7.2 for the reference files
instead since this is a long term support release that is still actively
being maintained, so we certainly want to make sure that we don't
break migration from that version to the latest one.

Thomas Huth (4):
  tests/vmstate-static-checker-data: Remove old dump files
  scripts/vmstate-static-checker.py: Allow new name for ghes_addr_le
    field
  tests/data/vmstate-static-checker: Add dump files from QEMU 7.2.17
  tests/functional: Test with scripts/vmstate-static-checker.py

 MAINTAINERS                                   |    3 +-
 scripts/vmstate-static-checker.py             |    1 +
 .../aarch64/virt-7.2.json                     | 2571 +++++++++++++
 .../vmstate-static-checker/m68k/virt-7.2.json | 2936 ++++++++++++++
 .../ppc64/pseries-7.2.json}                   | 1276 ++++---
 .../s390x/s390-ccw-virtio-7.2.json            |  475 +++
 .../x86_64/pc-q35-7.2.json                    | 3402 +++++++++++++++++
 tests/functional/meson.build                  |   13 +-
 tests/functional/test_vmstate.py              |   56 +
 tests/vmstate-static-checker-data/dump1.json  | 1163 ------
 10 files changed, 10143 insertions(+), 1753 deletions(-)
 create mode 100644 tests/data/vmstate-static-checker/aarch64/virt-7.2.json
 create mode 100644 tests/data/vmstate-static-checker/m68k/virt-7.2.json
 rename tests/{vmstate-static-checker-data/dump2.json => data/vmstate-static-checker/ppc64/pseries-7.2.json} (51%)
 create mode 100644 tests/data/vmstate-static-checker/s390x/s390-ccw-virtio-7.2.json
 create mode 100644 tests/data/vmstate-static-checker/x86_64/pc-q35-7.2.json
 create mode 100755 tests/functional/test_vmstate.py
 delete mode 100644 tests/vmstate-static-checker-data/dump1.json

-- 
2.49.0



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

* [PATCH 1/4] tests/vmstate-static-checker-data: Remove old dump files
  2025-04-29 15:21 [PATCH 0/4] Test vmstate with scripts/vmstate-static-checker.py Thomas Huth
@ 2025-04-29 15:21 ` Thomas Huth
  2025-04-29 15:29   ` Philippe Mathieu-Daudé
  2025-04-29 22:13   ` Peter Xu
  2025-04-29 15:21 ` [PATCH 2/4] scripts/vmstate-static-checker.py: Allow new name for ghes_addr_le field Thomas Huth
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 16+ messages in thread
From: Thomas Huth @ 2025-04-29 15:21 UTC (permalink / raw)
  To: qemu-devel, Fabiano Rosas; +Cc: Peter Xu, John Snow

From: Thomas Huth <thuth@redhat.com>

These files reference QEMU machine types that have already been
removed and thus are of no use anymore.

Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 MAINTAINERS                                  |    1 -
 tests/vmstate-static-checker-data/dump1.json | 1163 ------------------
 tests/vmstate-static-checker-data/dump2.json |  968 ---------------
 3 files changed, 2132 deletions(-)
 delete mode 100644 tests/vmstate-static-checker-data/dump1.json
 delete mode 100644 tests/vmstate-static-checker-data/dump2.json

diff --git a/MAINTAINERS b/MAINTAINERS
index b3f9f2680bc..bb2a66b9866 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3524,7 +3524,6 @@ F: include/qemu/userfaultfd.h
 F: migration/
 F: scripts/vmstate-static-checker.py
 F: tests/functional/test_migration.py
-F: tests/vmstate-static-checker-data/
 F: tests/qtest/migration/
 F: tests/qtest/migration-*
 F: docs/devel/migration/
diff --git a/tests/vmstate-static-checker-data/dump1.json b/tests/vmstate-static-checker-data/dump1.json
deleted file mode 100644
index 334ec079631..00000000000
--- a/tests/vmstate-static-checker-data/dump1.json
+++ /dev/null
@@ -1,1163 +0,0 @@
-{
-  "vmschkmachine": {
-    "Name": "pc-i440fx-2.1"
-  },
-  "fw_cfg": {
-    "Name": "fw_cfg",
-    "version_id": 2,
-    "minimum_version_id": 1,
-    "Description": {
-      "name": "fw_cfg",
-      "version_id": 2,
-      "minimum_version_id": 1,
-      "Fields": [
-        {
-          "field": "cur_entry",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 2
-        },
-        {
-          "field": "cur_offset",
-          "version_id": 0,
-          "field_exists": true,
-          "size": 4
-        },
-        {
-          "field": "cur_offset",
-          "version_id": 2,
-          "field_exists": false,
-          "size": 4
-        }
-      ]
-    }
-  },
-  "fusbh200-ehci-usb": {
-    "Name": "fusbh200-ehci-usb",
-    "version_id": 2,
-    "minimum_version_id": 1,
-    "Description": {
-      "name": "ehci-sysbus",
-      "version_id": 2,
-      "minimum_version_id": 1,
-      "Fields": [
-        {
-          "field": "ehci",
-          "version_id": 2,
-          "field_exists": false,
-          "size": 1880,
-          "Description": {
-            "name": "ehci-core",
-            "version_id": 2,
-            "minimum_version_id": 1,
-            "Fields": [
-              {
-                "field": "usbcmd",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "usbsts",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "usbsts_pending",
-                "version_id": 2,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "usbsts_frindex",
-                "version_id": 2,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "usbintr",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "frindex",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "ctrldssegment",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "periodiclistbase",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "asynclistaddr",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "configflag",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "portsc[0]",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "portsc[1]",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "portsc[2]",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "portsc[3]",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "portsc[4]",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "portsc[5]",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "frame_timer",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 8
-              },
-              {
-                "field": "last_run_ns",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 8
-              },
-              {
-                "field": "async_stepdown",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "astate",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "pstate",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "a_fetch_addr",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "p_fetch_addr",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              }
-            ]
-          }
-        }
-      ]
-    }
-  },
-  "pci-serial-4x": {
-    "Name": "pci-serial-4x",
-    "version_id": 1,
-    "minimum_version_id": 1,
-    "Description": {
-      "name": "pci-serial-multi",
-      "version_id": 1,
-      "minimum_version_id": 1,
-      "Fields": [
-        {
-          "field": "dev",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 1944,
-          "Description": {
-            "name": "PCIDevice",
-            "version_id": 2,
-            "minimum_version_id": 1,
-            "Fields": [
-              {
-                "field": "version_id",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "config",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 256
-              },
-              {
-                "field": "irq_state",
-                "version_id": 2,
-                "field_exists": false,
-                "size": 16
-              }
-            ]
-          }
-        },
-        {
-          "field": "state",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 368,
-          "Description": {
-            "name": "serial",
-            "version_id": 3,
-            "minimum_version_id": 2,
-            "Fields": [
-              {
-                "field": "divider",
-                "version_id": 2,
-                "field_exists": false,
-                "size": 2
-              },
-              {
-                "field": "rbr",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "ier",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "iir",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "lcr",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "mcr",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "lsr",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "msr",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "scr",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "fcr_vmstate",
-                "version_id": 3,
-                "field_exists": false,
-                "size": 1
-              }
-            ]
-          }
-        },
-        {
-          "field": "level",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        }
-      ]
-    }
-  },
-  "intel-hda-generic": {
-    "Name": "intel-hda-generic",
-    "version_id": 1,
-    "minimum_version_id": 0,
-    "Description": {
-      "name": "intel-hda",
-      "version_id": 1,
-      "minimum_version_id": 0,
-      "Fields": [
-        {
-          "field": "pci",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 1944,
-          "Description": {
-            "name": "PCIDevice",
-            "version_id": 2,
-            "minimum_version_id": 1,
-            "Fields": [
-              {
-                "field": "version_id",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "config",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 256
-              },
-              {
-                "field": "irq_state",
-                "version_id": 2,
-                "field_exists": false,
-                "size": 16
-              }
-            ]
-          }
-        },
-        {
-          "field": "g_ctl",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "wake_en",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "state_sts",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "int_ctl",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "int_sts",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "wall_clk",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "corb_lbase",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "corb_ubase",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "corb_rp",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "corb_wp",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "corb_ctl",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "corb_sts",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "corb_size",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "rirb_lbase",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "rirb_ubase",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "rirb_wp",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "rirb_cnt",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "rirb_ctl",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "rirb_sts",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "rirb_size",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "dp_lbase",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "dp_ubase",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "icw",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "irr",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "ics",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "st",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 56,
-          "Description": {
-            "name": "intel-hda-stream",
-            "version_id": 1,
-            "minimum_version_id": 0,
-            "Fields": [
-              {
-                "field": "ctl",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "lpib",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "cbl",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "lvi",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "fmt",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "bdlp_lbase",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "bdlp_ubase",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              }
-            ]
-          }
-        },
-        {
-          "field": "rirb_count",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "wall_base_ns",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 8
-        }
-      ]
-    }
-  },
-  "cfi.pflash01": {
-    "Name": "cfi.pflash01",
-    "version_id": 1,
-    "minimum_version_id": 1,
-    "Description": {
-      "name": "pflash_cfi01",
-      "version_id": 1,
-      "minimum_version_id": 1,
-      "Fields": [
-        {
-          "field": "wcycle",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 1
-        },
-        {
-          "field": "cmd",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 1
-        },
-        {
-          "field": "status",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 1
-        },
-        {
-          "field": "counter",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 8
-        }
-      ]
-    }
-  },
-  "megasas": {
-    "Name": "megasas",
-    "version_id": 0,
-    "minimum_version_id": 0,
-    "Description": {
-      "name": "megasas",
-      "version_id": 0,
-      "minimum_version_id": 0,
-      "Fields": [
-        {
-          "field": "parent_obj",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 1944,
-          "Description": {
-            "name": "PCIDevice",
-            "version_id": 2,
-            "minimum_version_id": 1,
-            "Fields": [
-              {
-                "field": "version_id",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "config",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 256
-              },
-              {
-                "field": "irq_state",
-                "version_id": 2,
-                "field_exists": false,
-                "size": 16
-              }
-            ]
-          }
-        },
-        {
-          "field": "fw_state",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "intr_mask",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "doorbell",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "reply_queue_pa",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 8
-        },
-        {
-          "field": "consumer_pa",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 8
-        },
-        {
-          "field": "producer_pa",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 8
-        }
-      ]
-    }
-  },
-  "PIIX3-xen": {
-    "Name": "PIIX3-xen",
-    "version_id": 3,
-    "minimum_version_id": 2,
-    "Description": {
-      "name": "PIIX3",
-      "version_id": 1,
-      "minimum_version_id": 2,
-      "Fields": [
-        {
-          "field": "dev",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 1944,
-          "Description": {
-            "name": "PCIDevice",
-            "version_id": 2,
-            "minimum_version_id": 1,
-            "Fields": [
-              {
-                "field": "version_id",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "config",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 256
-              },
-              {
-                "field": "irq_state",
-                "version_id": 2,
-                "field_exists": false,
-                "size": 16
-              }
-            ]
-          }
-        },
-        {
-          "field": "pci_irq_levels_vmstate",
-          "version_id": 3,
-          "field_exists": false,
-          "size": 4
-        }
-      ],
-      "Subsections": [
-        {
-          "name": "PIIX3/rcr",
-          "version_id": 1,
-          "minimum_version_id": 1,
-          "Fields": [
-            {
-              "field": "rcr",
-              "version_id": 0,
-              "field_exists": false,
-              "size": 1
-            }
-          ]
-        }
-      ]
-    }
-  },
-  "tpci200": {
-    "Name": "tpci200",
-    "version_id": 1,
-    "minimum_version_id": 1,
-    "Description": {
-      "name": "tpci200",
-      "version_id": 1,
-      "minimum_version_id": 1,
-      "Fields": [
-        {
-          "field": "dev",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 1944,
-          "Description": {
-            "name": "PCIDevice",
-            "version_id": 2,
-            "minimum_version_id": 1,
-            "Fields": [
-              {
-                "field": "version_id",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "config",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 256
-              },
-              {
-                "field": "irq_state",
-                "version_id": 2,
-                "field_exists": false,
-                "size": 16
-              }
-            ]
-          }
-        },
-        {
-          "field": "big_endian",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 1
-        },
-        {
-          "field": "ctrl",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 1
-        },
-        {
-          "field": "status",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 2
-        },
-        {
-          "field": "int_set",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 1
-        }
-      ]
-    }
-  },
-  "sun-fdtwo": {
-    "Name": "sun-fdtwo",
-    "version_id": 2,
-    "minimum_version_id": 2,
-    "Description": {
-      "name": "fdc",
-      "version_id": 2,
-      "minimum_version_id": 2,
-      "Fields": [
-        {
-          "field": "state",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 360,
-          "Description": {
-            "name": "fdc",
-            "version_id": 2,
-            "minimum_version_id": 2,
-            "Fields": [
-              {
-                "field": "sra",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "srb",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "dor_vmstate",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "tdr",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "dsr",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "msr",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "status0",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "status1",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "status2",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "fifo",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "data_pos",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "data_len",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "data_state",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "data_dir",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "eot",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "timer0",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "timer1",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "precomp_trk",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "config",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "lock",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "pwrd",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "num_floppies",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "drives",
-                "version_id": 1,
-                "field_exists": false,
-                "size": 40,
-                "Description": {
-                  "name": "fdrive",
-                  "version_id": 1,
-                  "minimum_version_id": 1,
-                  "Fields": [
-                    {
-                      "field": "head",
-                      "version_id": 0,
-                      "field_exists": false,
-                      "size": 1
-                    },
-                    {
-                      "field": "track",
-                      "version_id": 0,
-                      "field_exists": false,
-                      "size": 1
-                    },
-                    {
-                      "field": "sect",
-                      "version_id": 0,
-                      "field_exists": false,
-                      "size": 1
-                    }
-                  ],
-                  "Subsections": [
-                    {
-                      "name": "fdrive/media_changed",
-                      "version_id": 1,
-                      "minimum_version_id": 1,
-                      "Fields": [
-                        {
-                          "field": "media_changed",
-                          "version_id": 0,
-                          "field_exists": false,
-                          "size": 1
-                        }
-                      ]
-                    },
-                    {
-                      "name": "fdrive/media_rate",
-                      "version_id": 1,
-                      "minimum_version_id": 1,
-                      "Fields": [
-                        {
-                          "field": "media_rate",
-                          "version_id": 0,
-                          "field_exists": false,
-                          "size": 1
-                        }
-                      ]
-                    }
-                  ]
-                }
-              }
-            ]
-          }
-        }
-      ]
-    }
-  },
-  "usb-kbd": {
-    "Name": "usb-kbd",
-    "version_id": 1,
-    "minimum_version_id": 1,
-    "Description": {
-      "name": "usb-kbd",
-      "version_id": 1,
-      "minimum_version_id": 1,
-      "Fields": [
-        {
-          "field": "dev",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4352,
-          "Description": {
-            "name": "USBDevice",
-            "version_id": 1,
-            "minimum_version_id": 1,
-            "Fields": [
-              {
-                "field": "addr",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "state",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "remote_wakeup",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "setup_state",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "setup_len",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "setup_index",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "setup_buf",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              }
-            ]
-          }
-        },
-        {
-          "field": "kbd.keycodes",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "head",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "n",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "kbd.modifiers",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 2
-        },
-        {
-          "field": "kbd.leds",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 1
-        },
-        {
-          "field": "kbd.key",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 1
-        },
-        {
-          "field": "kbd.keys",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "protocol",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "idle",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 1
-        }
-      ]
-    }
-  }
-}
diff --git a/tests/vmstate-static-checker-data/dump2.json b/tests/vmstate-static-checker-data/dump2.json
deleted file mode 100644
index 7184e9ccbb5..00000000000
--- a/tests/vmstate-static-checker-data/dump2.json
+++ /dev/null
@@ -1,968 +0,0 @@
-{
-  "vmschkmachine": {
-    "Name": "pc-i440fx-2.2"
-  },
-  "fw_cfg2": {
-    "Name": "fw_cfg",
-    "version_id": 2,
-    "minimum_version_id": 1,
-    "Description": {
-      "name": "fw_cfg",
-      "version_id": 2,
-      "minimum_version_id": 1,
-      "Fields": [
-        {
-          "field": "cur_entry",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 2
-        },
-        {
-          "field": "cur_offset",
-          "version_id": 0,
-          "field_exists": true,
-          "size": 4
-        },
-        {
-          "field": "cur_offset",
-          "version_id": 2,
-          "field_exists": false,
-          "size": 4
-        }
-      ]
-    }
-  },
-  "fusbh200-ehci-usb": {
-    "Name": "fusbh200-ehci-usb",
-    "version_id": 1,
-    "minimum_version_id": 1,
-    "Description": {
-      "name": "ehci-sysbus",
-      "version_id": 2,
-      "minimum_version_id": 1,
-      "Fields": [
-        {
-          "field": "ehci",
-          "version_id": 2,
-          "field_exists": false,
-          "size": 1880,
-          "Description": {
-            "name": "ehci-core",
-            "version_id": 2,
-            "minimum_version_id": 1,
-            "Fields": [
-              {
-                "field": "usbcmd",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "usbsts_pending",
-                "version_id": 2,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "usbsts_frindex",
-                "version_id": 2,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "usbintr",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "frindex",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "ctrldssegment",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "periodiclistbase",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "asynclistaddr",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "configflag",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "portsc[0]",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "portsc[1]",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "portsc[2]",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "portsc[3]",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "portsc[4]",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "portsc[5]",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "frame_timer",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 8
-              },
-              {
-                "field": "last_run_ns",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 8
-              },
-              {
-                "field": "async_stepdown",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "astate",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "pstate",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "a_fetch_addr",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "p_fetch_addr",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              }
-            ]
-          }
-        }
-      ]
-    }
-  },
-  "pci-serial-4x": {
-    "Name": "pci-serial-4x",
-    "version_id": 1,
-    "minimum_version_id": 1,
-    "Description": {
-      "name": "pci-serial-multi",
-      "version_id": 1,
-      "minimum_version_id": 1
-    }
-  },
-  "intel-hda-generic": {
-    "Name": "intel-hda-generic",
-    "version_id": 1,
-    "minimum_version_id": 0,
-    "Description": {
-      "name": "intel-hda",
-      "version_id": 1,
-      "minimum_version_id": 0,
-      "Fields": [
-        {
-          "field": "pci",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 1944
-        },
-        {
-          "field": "g_ctl",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "wake_en",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "state_sts",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "int_ctl",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "int_sts",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "wall_clk",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "corb_lbase",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "corb_ubase",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "corb_rp",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "corb_wp",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "corb_ctl",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "corb_sts",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "corb_size",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "rirb_lbase",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "rirb_ubase",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "rirb_wp",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "rirb_cnt",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "rirb_ctl",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "rirb_sts",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "rirb_size",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "dp_lbase",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "dp_ubase",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "icw",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "irr",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "ics",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "st",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 56,
-          "Description": {
-            "name": "intel-hda-stream",
-            "version_id": 1,
-            "minimum_version_id": 0,
-            "Fields": [
-              {
-                "field": "ctl",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "lpib",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "cbl",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "lvi",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "fmt",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "bdlp_lbase",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "bdlp_ubase",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              }
-            ]
-          }
-        },
-        {
-          "field": "rirb_count",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "wall_base_ns",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 8
-        }
-      ]
-    }
-  },
-  "cfi.pflash01": {
-    "Name": "cfi.pflash01",
-    "version_id": 1,
-    "minimum_version_id": 1
-  },
-  "megasas": {
-    "Name": "megasas",
-    "version_id": 0,
-    "minimum_version_id": 0,
-    "Description": {
-      "name": "megasas",
-      "version_id": 0,
-      "minimum_version_id": 0,
-      "Fields": [
-        {
-          "field": "parent_obj",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 1944,
-          "Description": {
-            "name": "PCIDevice",
-            "version_id": 2,
-            "minimum_version_id": 1,
-            "Fields": [
-              {
-                "field": "version_id",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "config",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 256
-              }
-            ]
-          }
-        },
-        {
-          "field": "fw_state",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "intr_mask",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "doorbell",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 4
-        },
-        {
-          "field": "reply_queue_pa",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 8
-        },
-        {
-          "field": "consumer_pa",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 8
-        },
-        {
-          "field": "producer_pa",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 8
-        }
-      ]
-    }
-  },
-  "PIIX3-xen": {
-    "Name": "PIIX3-xen",
-    "version_id": 3,
-    "minimum_version_id": 2,
-    "Description": {
-      "name": "PIIX3",
-      "version_id": 3,
-      "minimum_version_id": 2,
-      "Fields": [
-        {
-          "field": "dev",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 1944,
-          "Description": {
-            "name": "PCIDevice",
-            "version_id": 2,
-            "minimum_version_id": 1,
-            "Fields": [
-              {
-                "field": "version_id",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "config",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 256
-              },
-              {
-                "field": "irq_state",
-                "version_id": 2,
-                "field_exists": false,
-                "size": 16
-              }
-            ]
-          }
-        },
-        {
-          "field": "pci_irq_levels_vmstate",
-          "version_id": 3,
-          "field_exists": false,
-          "size": 4
-        }
-      ]
-    }
-  },
-  "tpci200": {
-    "Name": "tpci200",
-    "version_id": 1,
-    "minimum_version_id": 1,
-    "Description": {
-      "name": "tpci2002",
-      "version_id": 1,
-      "minimum_version_id": 1,
-      "Fields": [
-        {
-          "field": "dev",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 1944,
-          "Description": {
-            "name": "PCIDevice",
-            "version_id": 2,
-            "minimum_version_id": 1,
-            "Fields": [
-              {
-                "field": "version_id",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "config",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 256
-              },
-              {
-                "field": "irq_state",
-                "version_id": 2,
-                "field_exists": false,
-                "size": 16
-              }
-            ]
-          }
-        },
-        {
-          "field": "big_endian",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 1
-        },
-        {
-          "field": "ctrl",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 1
-        },
-        {
-          "field": "status",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 2
-        },
-        {
-          "field": "int_set",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 1
-        }
-      ]
-    }
-  },
-  "sun-fdtwo": {
-    "Name": "sun-fdtwo",
-    "version_id": 2,
-    "minimum_version_id": 2,
-    "Description": {
-      "name": "fdc",
-      "version_id": 1,
-      "minimum_version_id": 2,
-      "Fields": [
-        {
-          "field": "state",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 360,
-          "Description": {
-            "name": "fdc",
-            "version_id": 2,
-            "minimum_version_id": 2,
-            "Fields": [
-              {
-                "field": "sra",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "srb",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "dor_vmstate",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "tdr",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "dsr",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "msr",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "status0",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "status1",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "status2",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "fifo",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "data_pos",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "data_len",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "data_state",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "data_dir",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "eot",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "timer0",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "timer1",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "precomp_trk",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "config",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "lock",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "pwrd",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "num_floppies",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "drives",
-                "version_id": 1,
-                "field_exists": false,
-                "size": 40,
-                "Description": {
-                  "name": "fdrive",
-                  "version_id": 1,
-                  "minimum_version_id": 1,
-                  "Fields": [
-                    {
-                      "field": "head",
-                      "version_id": 0,
-                      "field_exists": false,
-                      "size": 1
-                    },
-                    {
-                      "field": "track",
-                      "version_id": 0,
-                      "field_exists": false,
-                      "size": 1
-                    },
-                    {
-                      "field": "sect",
-                      "version_id": 0,
-                      "field_exists": false,
-                      "size": 1
-                    }
-                  ],
-                  "Subsections": [
-                    {
-                      "name": "fdrive/media_changed",
-                      "version_id": 1,
-                      "minimum_version_id": 1,
-                      "Fields": [
-                        {
-                          "field": "media_changed",
-                          "version_id": 0,
-                          "field_exists": false,
-                          "size": 1
-                        }
-                      ]
-                    }
-                  ]
-                }
-              }
-            ]
-          }
-        }
-      ]
-    }
-  },
-  "usb-kbd": {
-    "Name": "usb-kbd",
-    "version_id": 1,
-    "minimum_version_id": 1,
-    "Description": {
-      "name": "usb-kbd",
-      "version_id": 1,
-      "minimum_version_id": 1,
-      "Fields": [
-        {
-          "field": "dev",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 5832,
-          "Description": {
-            "name": "USBDevice",
-            "version_id": 1,
-            "minimum_version_id": 1,
-            "Fields": [
-              {
-                "field": "addr",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "state",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "remote_wakeup",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "setup_state",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "setup_len",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "setup_index",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "setup_buf",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              }
-            ]
-          }
-        },
-        {
-          "field": "hid",
-          "version_id": 0,
-          "field_exists": false,
-          "size": 312,
-          "Description": {
-            "name": "HIDKeyboardDevice",
-            "version_id": 1,
-            "minimum_version_id": 1,
-            "Fields": [
-              {
-                "field": "kbd.keycodes",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 2
-              },
-              {
-                "field": "head",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "n",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "kbd.modifiers",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 2
-              },
-              {
-                "field": "kbd.leds",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "kbd.key",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              },
-              {
-                "field": "kbd.keys",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "protocol",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 4
-              },
-              {
-                "field": "idle",
-                "version_id": 0,
-                "field_exists": false,
-                "size": 1
-              }
-            ]
-          }
-        }
-      ]
-    }
-  }
-}
-- 
2.49.0



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

* [PATCH 2/4] scripts/vmstate-static-checker.py: Allow new name for ghes_addr_le field
  2025-04-29 15:21 [PATCH 0/4] Test vmstate with scripts/vmstate-static-checker.py Thomas Huth
  2025-04-29 15:21 ` [PATCH 1/4] tests/vmstate-static-checker-data: Remove old dump files Thomas Huth
@ 2025-04-29 15:21 ` Thomas Huth
  2025-04-29 22:16   ` Peter Xu
  2025-04-29 15:21 ` [PATCH 3/4] tests/data/vmstate-static-checker: Add dump files from QEMU 7.2.17 Thomas Huth
  2025-04-29 15:21 ` [PATCH 4/4] tests/functional: Test with scripts/vmstate-static-checker.py Thomas Huth
  3 siblings, 1 reply; 16+ messages in thread
From: Thomas Huth @ 2025-04-29 15:21 UTC (permalink / raw)
  To: qemu-devel, Fabiano Rosas; +Cc: Peter Xu, John Snow

From: Thomas Huth <thuth@redhat.com>

ghes_addr_le has been renamed to hw_error_le in commit 652f6d86cbb
("acpi/ghes: better name the offset of the hardware error firmware").
Adjust the checker script to allow that changed field name.

Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 scripts/vmstate-static-checker.py | 1 +
 1 file changed, 1 insertion(+)

diff --git a/scripts/vmstate-static-checker.py b/scripts/vmstate-static-checker.py
index 9c0e6b81f21..25aca839a03 100755
--- a/scripts/vmstate-static-checker.py
+++ b/scripts/vmstate-static-checker.py
@@ -42,6 +42,7 @@ def check_fields_match(name, s_field, d_field):
     # Some fields changed names between qemu versions.  This list
     # is used to allow such changes in each section / description.
     changed_names = {
+        'acpi-ghes': ['ghes_addr_le', 'hw_error_le'],
         'apic': ['timer', 'timer_expiry'],
         'e1000': ['dev', 'parent_obj'],
         'ehci': ['dev', 'pcidev'],
-- 
2.49.0



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

* [PATCH 3/4] tests/data/vmstate-static-checker: Add dump files from QEMU 7.2.17
  2025-04-29 15:21 [PATCH 0/4] Test vmstate with scripts/vmstate-static-checker.py Thomas Huth
  2025-04-29 15:21 ` [PATCH 1/4] tests/vmstate-static-checker-data: Remove old dump files Thomas Huth
  2025-04-29 15:21 ` [PATCH 2/4] scripts/vmstate-static-checker.py: Allow new name for ghes_addr_le field Thomas Huth
@ 2025-04-29 15:21 ` Thomas Huth
  2025-04-29 22:30   ` Peter Xu
  2025-04-29 15:21 ` [PATCH 4/4] tests/functional: Test with scripts/vmstate-static-checker.py Thomas Huth
  3 siblings, 1 reply; 16+ messages in thread
From: Thomas Huth @ 2025-04-29 15:21 UTC (permalink / raw)
  To: qemu-devel, Fabiano Rosas; +Cc: Peter Xu, John Snow

From: Thomas Huth <thuth@redhat.com>

For automatic tests, we need reference files from older QEMU versions.
QEMU 7.2 is a long term stable release, so it's a good candidate for
checking whether the migration could still work correctly. Let's add the
files from that version that have been taken with the "-dump-vmstate"
parameter of QEMU (compiled with single machines and the configure switch
"--without-default-devices" to keep the json files reasonable small).

Some devices also have been removed manually from the json files, e.g.
the "pci-bridge" (which can be disabled in later QEMU versions via Kconfig),
and some Linux-related devices like "scsi-block" and "scsi-generic" and
KVM-related devices. Without removing them, we might get errors otherwise
if these devices have not been compiled into the destination QEMU build.

Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 MAINTAINERS                                   |    1 +
 .../aarch64/virt-7.2.json                     | 2571 +++++++++++++
 .../vmstate-static-checker/m68k/virt-7.2.json | 2936 ++++++++++++++
 .../ppc64/pseries-7.2.json                    | 1068 ++++++
 .../s390x/s390-ccw-virtio-7.2.json            |  475 +++
 .../x86_64/pc-q35-7.2.json                    | 3402 +++++++++++++++++
 6 files changed, 10453 insertions(+)
 create mode 100644 tests/data/vmstate-static-checker/aarch64/virt-7.2.json
 create mode 100644 tests/data/vmstate-static-checker/m68k/virt-7.2.json
 create mode 100644 tests/data/vmstate-static-checker/ppc64/pseries-7.2.json
 create mode 100644 tests/data/vmstate-static-checker/s390x/s390-ccw-virtio-7.2.json
 create mode 100644 tests/data/vmstate-static-checker/x86_64/pc-q35-7.2.json

diff --git a/MAINTAINERS b/MAINTAINERS
index bb2a66b9866..65fb61844b3 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3523,6 +3523,7 @@ F: include/migration/
 F: include/qemu/userfaultfd.h
 F: migration/
 F: scripts/vmstate-static-checker.py
+F: tests/data/vmstate-static-checker/
 F: tests/functional/test_migration.py
 F: tests/qtest/migration/
 F: tests/qtest/migration-*
diff --git a/tests/data/vmstate-static-checker/aarch64/virt-7.2.json b/tests/data/vmstate-static-checker/aarch64/virt-7.2.json
new file mode 100644
index 00000000000..d7491be99cb
--- /dev/null
+++ b/tests/data/vmstate-static-checker/aarch64/virt-7.2.json
@@ -0,0 +1,2571 @@
+{
+  "vmschkmachine": {
+    "Name": "virt-7.2"
+  },
+  "gpex-pcihost": {
+    "Name": "gpex-pcihost",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "PCIHost",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "config_reg",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ]
+    }
+  },
+  "arm_gic": {
+    "Name": "arm_gic",
+    "version_id": 12,
+    "minimum_version_id": 12,
+    "Description": {
+      "name": "arm_gic",
+      "version_id": 12,
+      "minimum_version_id": 12,
+      "Fields": [
+        {
+          "field": "ctlr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "cpu_ctlr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "irq_state",
+          "version_id": 1,
+          "field_exists": false,
+          "size": 7,
+          "Description": {
+            "name": "arm_gic_irq_state",
+            "version_id": 1,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "enabled",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "pending",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "active",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "level",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "model",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "edge_trigger",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "group",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              }
+            ]
+          }
+        },
+        {
+          "field": "irq_target",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "priority1",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "priority2",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "sgi_pending",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "priority_mask",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "running_priority",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "current_pending",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "bpr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "abpr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "apr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "nsapr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "arm_gic_virt_state",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "h_hcr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "h_misr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "h_lr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "h_apr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "cpu_ctlr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "priority_mask",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 2
+            },
+            {
+              "field": "running_priority",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 2
+            },
+            {
+              "field": "current_pending",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 2
+            },
+            {
+              "field": "bpr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 1
+            },
+            {
+              "field": "abpr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 1
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "arm-gicv3-its-common": {
+    "Name": "arm-gicv3-its-common",
+    "version_id": 0,
+    "minimum_version_id": 0,
+    "Description": {
+      "name": "arm_gicv3_its",
+      "version_id": 0,
+      "minimum_version_id": 0,
+      "Fields": [
+        {
+          "field": "ctlr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "iidr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "cbaser",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "cwriter",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "creadr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "baser",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        }
+      ]
+    }
+  },
+  "arm-gicv3-common": {
+    "Name": "arm-gicv3-common",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "arm_gicv3",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "gicd_ctlr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "gicd_statusr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "group",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "grpmod",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "enabled",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "pending",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "active",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "level",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "edge_trigger",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "gicd_ipriority",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "gicd_irouter",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "gicd_nsacr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "cpu",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 664,
+          "Description": {
+            "name": "arm_gicv3_cpu",
+            "version_id": 1,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "level",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "gicr_ctlr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "gicr_statusr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "gicr_waker",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "gicr_propbaser",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "gicr_pendbaser",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "gicr_igroupr0",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "gicr_ienabler0",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "gicr_ipendr0",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "gicr_iactiver0",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "edge_trigger",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "gicr_igrpmodr0",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "gicr_nsacr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "gicr_ipriorityr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "icc_ctlr_el1",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "icc_pmr_el1",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "icc_bpr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "icc_apr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "icc_igrpen",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "icc_ctlr_el3",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              }
+            ],
+            "Subsections": [
+              {
+                "name": "arm_gicv3_cpu/virt",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "ich_apr",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 8
+                  },
+                  {
+                    "field": "ich_hcr_el2",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 8
+                  },
+                  {
+                    "field": "ich_lr_el2",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 8
+                  },
+                  {
+                    "field": "ich_vmcr_el2",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 8
+                  }
+                ]
+              },
+              {
+                "name": "arm_gicv3_cpu/sre_el1",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "icc_sre_el1",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 8
+                  }
+                ]
+              },
+              {
+                "name": "arm_gicv3_cpu/gicv4",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "gicr_vpropbaser",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 8
+                  },
+                  {
+                    "field": "gicr_vpendbaser",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 8
+                  }
+                ]
+              }
+            ]
+          }
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "arm_gicv3/gicd_no_migration_shift_bug",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "gicd_no_migration_shift_bug",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 1
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "fw_cfg": {
+    "Name": "fw_cfg",
+    "version_id": 2,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "fw_cfg",
+      "version_id": 2,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "cur_entry",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 0,
+          "field_exists": true,
+          "size": 4
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "fw_cfg/dma",
+          "version_id": 0,
+          "minimum_version_id": 0,
+          "Fields": [
+            {
+              "field": "dma_addr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        },
+        {
+          "name": "fw_cfg/acpi_mr",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "table_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "linker_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "rsdp_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "cfi.pflash01": {
+    "Name": "cfi.pflash01",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "pflash_cfi01",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "wcycle",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "cmd",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "status",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "counter",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "pflash_cfi01_blk_write",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "blk_bytes",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 0
+            },
+            {
+              "field": "blk_offset",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "pl061_luminary": {
+    "Name": "pl061_luminary",
+    "version_id": 4,
+    "minimum_version_id": 4,
+    "Description": {
+      "name": "pl061",
+      "version_id": 4,
+      "minimum_version_id": 4,
+      "Fields": [
+        {
+          "field": "locked",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "data",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "old_out_data",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "old_in_data",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "dir",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "isense",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "ibe",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "iev",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "im",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "istate",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "afsel",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "dr2r",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "dr4r",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "dr8r",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "odr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "pur",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "pdr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "slr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "den",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "cr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "amsel",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 4
+        }
+      ]
+    }
+  },
+  "pl011_luminary": {
+    "Name": "pl011_luminary",
+    "version_id": 2,
+    "minimum_version_id": 2,
+    "Description": {
+      "name": "pl011",
+      "version_id": 2,
+      "minimum_version_id": 2,
+      "Fields": [
+        {
+          "field": "readbuff",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "flags",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "lcr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "rsr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "cr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "dmacr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "int_enabled",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "int_level",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "read_fifo",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "ilpr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "ibrd",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "fbrd",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "ifl",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "read_pos",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "read_count",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "read_trigger",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "pl011/clock",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "clk",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8,
+              "Description": {
+                "name": "clock",
+                "version_id": 0,
+                "minimum_version_id": 0,
+                "Fields": [
+                  {
+                    "field": "period",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 8
+                  }
+                ],
+                "Subsections": [
+                  {
+                    "name": "clock/muldiv",
+                    "version_id": 1,
+                    "minimum_version_id": 1,
+                    "Fields": [
+                      {
+                        "field": "multiplier",
+                        "version_id": 0,
+                        "field_exists": false,
+                        "size": 4
+                      },
+                      {
+                        "field": "divider",
+                        "version_id": 0,
+                        "field_exists": false,
+                        "size": 4
+                      }
+                    ]
+                  }
+                ]
+              }
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "pl061": {
+    "Name": "pl061",
+    "version_id": 4,
+    "minimum_version_id": 4,
+    "Description": {
+      "name": "pl061",
+      "version_id": 4,
+      "minimum_version_id": 4,
+      "Fields": [
+        {
+          "field": "locked",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "data",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "old_out_data",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "old_in_data",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "dir",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "isense",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "ibe",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "iev",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "im",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "istate",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "afsel",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "dr2r",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "dr4r",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "dr8r",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "odr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "pur",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "pdr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "slr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "den",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "cr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "amsel",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 4
+        }
+      ]
+    }
+  },
+  "vmcoreinfo": {
+    "Name": "vmcoreinfo",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "vmcoreinfo",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "has_vmcoreinfo",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "vmcoreinfo.host_format",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "vmcoreinfo.guest_format",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "vmcoreinfo.size",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "vmcoreinfo.paddr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        }
+      ]
+    }
+  },
+  "arm_gic_common": {
+    "Name": "arm_gic_common",
+    "version_id": 12,
+    "minimum_version_id": 12,
+    "Description": {
+      "name": "arm_gic",
+      "version_id": 12,
+      "minimum_version_id": 12,
+      "Fields": [
+        {
+          "field": "ctlr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "cpu_ctlr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "irq_state",
+          "version_id": 1,
+          "field_exists": false,
+          "size": 7,
+          "Description": {
+            "name": "arm_gic_irq_state",
+            "version_id": 1,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "enabled",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "pending",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "active",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "level",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "model",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "edge_trigger",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "group",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              }
+            ]
+          }
+        },
+        {
+          "field": "irq_target",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "priority1",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "priority2",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "sgi_pending",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "priority_mask",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "running_priority",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "current_pending",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "bpr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "abpr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "apr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "nsapr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "arm_gic_virt_state",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "h_hcr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "h_misr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "h_lr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "h_apr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "cpu_ctlr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "priority_mask",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 2
+            },
+            {
+              "field": "running_priority",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 2
+            },
+            {
+              "field": "current_pending",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 2
+            },
+            {
+              "field": "bpr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 1
+            },
+            {
+              "field": "abpr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 1
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "arm-smmuv3": {
+    "Name": "arm-smmuv3",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "smmuv3",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "features",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "sid_size",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "sid_split",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "cr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "cr0ack",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "statusr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "irq_ctrl",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "gerror",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "gerrorn",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "gerror_irq_cfg0",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "gerror_irq_cfg1",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "gerror_irq_cfg2",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "strtab_base",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "strtab_base_cfg",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "eventq_irq_cfg0",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "eventq_irq_cfg1",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "eventq_irq_cfg2",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "cmdq",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 24,
+          "Description": {
+            "name": "smmuv3_queue",
+            "version_id": 1,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "base",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "prod",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "cons",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "log2size",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              }
+            ]
+          }
+        },
+        {
+          "field": "eventq",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 24,
+          "Description": {
+            "name": "smmuv3_queue",
+            "version_id": 1,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "base",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "prod",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "cons",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "log2size",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              }
+            ]
+          }
+        }
+      ]
+    }
+  },
+  "pl011": {
+    "Name": "pl011",
+    "version_id": 2,
+    "minimum_version_id": 2,
+    "Description": {
+      "name": "pl011",
+      "version_id": 2,
+      "minimum_version_id": 2,
+      "Fields": [
+        {
+          "field": "readbuff",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "flags",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "lcr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "rsr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "cr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "dmacr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "int_enabled",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "int_level",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "read_fifo",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "ilpr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "ibrd",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "fbrd",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "ifl",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "read_pos",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "read_count",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "read_trigger",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "pl011/clock",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "clk",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8,
+              "Description": {
+                "name": "clock",
+                "version_id": 0,
+                "minimum_version_id": 0,
+                "Fields": [
+                  {
+                    "field": "period",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 8
+                  }
+                ],
+                "Subsections": [
+                  {
+                    "name": "clock/muldiv",
+                    "version_id": 1,
+                    "minimum_version_id": 1,
+                    "Fields": [
+                      {
+                        "field": "multiplier",
+                        "version_id": 0,
+                        "field_exists": false,
+                        "size": 4
+                      },
+                      {
+                        "field": "divider",
+                        "version_id": 0,
+                        "field_exists": false,
+                        "size": 4
+                      }
+                    ]
+                  }
+                ]
+              }
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "armv7m": {
+    "Name": "armv7m",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "armv7m",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "refclk",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8,
+          "Description": {
+            "name": "clock",
+            "version_id": 0,
+            "minimum_version_id": 0,
+            "Fields": [
+              {
+                "field": "period",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              }
+            ],
+            "Subsections": [
+              {
+                "name": "clock/muldiv",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "multiplier",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 4
+                  },
+                  {
+                    "field": "divider",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 4
+                  }
+                ]
+              }
+            ]
+          }
+        },
+        {
+          "field": "cpuclk",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8,
+          "Description": {
+            "name": "clock",
+            "version_id": 0,
+            "minimum_version_id": 0,
+            "Fields": [
+              {
+                "field": "period",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              }
+            ],
+            "Subsections": [
+              {
+                "name": "clock/muldiv",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "multiplier",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 4
+                  },
+                  {
+                    "field": "divider",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 4
+                  }
+                ]
+              }
+            ]
+          }
+        }
+      ]
+    }
+  },
+  "fw_cfg_mem": {
+    "Name": "fw_cfg_mem",
+    "version_id": 2,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "fw_cfg",
+      "version_id": 2,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "cur_entry",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 0,
+          "field_exists": true,
+          "size": 4
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "fw_cfg/dma",
+          "version_id": 0,
+          "minimum_version_id": 0,
+          "Fields": [
+            {
+              "field": "dma_addr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        },
+        {
+          "name": "fw_cfg/acpi_mr",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "table_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "linker_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "rsdp_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "pl031": {
+    "Name": "pl031",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "pl031",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "tick_offset_vmstate",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "mr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "lr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "cr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "im",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "is",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "pl031/tick-offset",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "tick_offset",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "fw_cfg_io": {
+    "Name": "fw_cfg_io",
+    "version_id": 2,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "fw_cfg",
+      "version_id": 2,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "cur_entry",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 0,
+          "field_exists": true,
+          "size": 4
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "fw_cfg/dma",
+          "version_id": 0,
+          "minimum_version_id": 0,
+          "Fields": [
+            {
+              "field": "dma_addr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        },
+        {
+          "name": "fw_cfg/acpi_mr",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "table_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "linker_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "rsdp_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "virtio-serial-device": {
+    "Name": "virtio-serial-device",
+    "version_id": 3,
+    "minimum_version_id": 3,
+    "Description": {
+      "name": "virtio-console",
+      "version_id": 3,
+      "minimum_version_id": 3,
+      "Fields": [
+        {
+          "field": "virtio",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 0
+        }
+      ]
+    }
+  },
+  "acpi-ged": {
+    "Name": "acpi-ged",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "acpi-ged",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "ged_state",
+          "version_id": 1,
+          "field_exists": false,
+          "size": 560,
+          "Description": {
+            "name": "acpi-ged-state",
+            "version_id": 1,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "sel",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              }
+            ]
+          }
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "acpi-ged/memhp",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "memhp_state",
+              "version_id": 1,
+              "field_exists": false,
+              "size": 304,
+              "Description": {
+                "name": "memory hotplug state",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "selector",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 4
+                  },
+                  {
+                    "field": "devs",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 24,
+                    "Description": {
+                      "name": "memory hotplug device state",
+                      "version_id": 1,
+                      "minimum_version_id": 1,
+                      "Fields": [
+                        {
+                          "field": "is_enabled",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 1
+                        },
+                        {
+                          "field": "is_inserting",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 1
+                        },
+                        {
+                          "field": "ost_event",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 4
+                        },
+                        {
+                          "field": "ost_status",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 4
+                        }
+                      ]
+                    }
+                  }
+                ]
+              }
+            }
+          ]
+        },
+        {
+          "name": "acpi-ged/ghes",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "ghes_state",
+              "version_id": 1,
+              "field_exists": false,
+              "size": 16,
+              "Description": {
+                "name": "acpi-ghes",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "ghes_addr_le",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 8
+                  }
+                ]
+              }
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "pcie-host-bridge": {
+    "Name": "pcie-host-bridge",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "PCIHost",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "config_reg",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ]
+    }
+  },
+  "gpio-key": {
+    "Name": "gpio-key",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "gpio-key",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "timer",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        }
+      ]
+    }
+  },
+  "armv7m_nvic": {
+    "Name": "armv7m_nvic",
+    "version_id": 4,
+    "minimum_version_id": 4,
+    "Description": {
+      "name": "armv7m_nvic",
+      "version_id": 4,
+      "minimum_version_id": 4,
+      "Fields": [
+        {
+          "field": "vectors",
+          "version_id": 1,
+          "field_exists": false,
+          "size": 6,
+          "Description": {
+            "name": "armv7m_nvic_info",
+            "version_id": 1,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "prio",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 2
+              },
+              {
+                "field": "enabled",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "pending",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "active",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "level",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              }
+            ]
+          }
+        },
+        {
+          "field": "prigroup[M_REG_NS]",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "armv7m_nvic/m-security",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "sec_vectors",
+              "version_id": 1,
+              "field_exists": false,
+              "size": 6,
+              "Description": {
+                "name": "armv7m_nvic_info",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "prio",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 2
+                  },
+                  {
+                    "field": "enabled",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 1
+                  },
+                  {
+                    "field": "pending",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 1
+                  },
+                  {
+                    "field": "active",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 1
+                  },
+                  {
+                    "field": "level",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 1
+                  }
+                ]
+              }
+            },
+            {
+              "field": "prigroup[M_REG_S]",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "itns",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 1
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "pci-host-bridge": {
+    "Name": "pci-host-bridge",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "PCIHost",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "config_reg",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ]
+    }
+  },
+  "gpex-root": {
+    "Name": "gpex-root",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "gpex_root",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "parent_obj",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2608,
+          "Description": {
+            "name": "PCIDevice",
+            "version_id": 2,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "version_id",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "config",
+                "version_id": 0,
+                "field_exists": true,
+                "size": 256
+              },
+              {
+                "field": "config",
+                "version_id": 0,
+                "field_exists": true,
+                "size": 4096
+              },
+              {
+                "field": "irq_state",
+                "version_id": 2,
+                "field_exists": false,
+                "size": 16
+              }
+            ]
+          }
+        }
+      ]
+    }
+  },
+  "armv7m_systick": {
+    "Name": "armv7m_systick",
+    "version_id": 3,
+    "minimum_version_id": 3,
+    "Description": {
+      "name": "armv7m_systick",
+      "version_id": 3,
+      "minimum_version_id": 3,
+      "Fields": [
+        {
+          "field": "refclk",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8,
+          "Description": {
+            "name": "clock",
+            "version_id": 0,
+            "minimum_version_id": 0,
+            "Fields": [
+              {
+                "field": "period",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              }
+            ],
+            "Subsections": [
+              {
+                "name": "clock/muldiv",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "multiplier",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 4
+                  },
+                  {
+                    "field": "divider",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 4
+                  }
+                ]
+              }
+            ]
+          }
+        },
+        {
+          "field": "cpuclk",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8,
+          "Description": {
+            "name": "clock",
+            "version_id": 0,
+            "minimum_version_id": 0,
+            "Fields": [
+              {
+                "field": "period",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              }
+            ],
+            "Subsections": [
+              {
+                "name": "clock/muldiv",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "multiplier",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 4
+                  },
+                  {
+                    "field": "divider",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 4
+                  }
+                ]
+              }
+            ]
+          }
+        },
+        {
+          "field": "control",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "tick",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "ptimer",
+          "version_id": 1,
+          "field_exists": false,
+          "size": 8,
+          "Description": {
+            "name": "ptimer",
+            "version_id": 1,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "enabled",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "limit",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "delta",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "period_frac",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "period",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "last_event",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "next_event",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "timer",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              }
+            ]
+          }
+        }
+      ]
+    }
+  }
+}
diff --git a/tests/data/vmstate-static-checker/m68k/virt-7.2.json b/tests/data/vmstate-static-checker/m68k/virt-7.2.json
new file mode 100644
index 00000000000..16bee8cdad0
--- /dev/null
+++ b/tests/data/vmstate-static-checker/m68k/virt-7.2.json
@@ -0,0 +1,2936 @@
+{
+  "vmschkmachine": {
+    "Name": "virt-7.2"
+  },
+  "m68020-m68k-cpu": {
+    "Name": "m68020-m68k-cpu",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "cpu",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "env.dregs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.aregs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pc",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.sr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.current_sp",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.sp",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_op",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_x",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_n",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_v",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_c",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_z",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pending_vector",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pending_level",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "cpu/fpu",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.fpcr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.fpsr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.fregs",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 16,
+              "Description": {
+                "name": "freg",
+                "version_id": 0,
+                "minimum_version_id": 0,
+                "Fields": [
+                  {
+                    "field": "tmp",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 24,
+                    "Description": {
+                      "name": "freg_tmp",
+                      "version_id": 0,
+                      "minimum_version_id": 0,
+                      "Fields": [
+                        {
+                          "field": "tmp_mant",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 8
+                        },
+                        {
+                          "field": "tmp_exp",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 2
+                        }
+                      ]
+                    }
+                  }
+                ]
+              }
+            },
+            {
+              "field": "env.fp_result",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 16,
+              "Description": {
+                "name": "freg",
+                "version_id": 0,
+                "minimum_version_id": 0,
+                "Fields": [
+                  {
+                    "field": "tmp",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 24,
+                    "Description": {
+                      "name": "freg_tmp",
+                      "version_id": 0,
+                      "minimum_version_id": 0,
+                      "Fields": [
+                        {
+                          "field": "tmp_mant",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 8
+                        },
+                        {
+                          "field": "tmp_exp",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 2
+                        }
+                      ]
+                    }
+                  }
+                ]
+              }
+            }
+          ]
+        },
+        {
+          "name": "cpu/cf_spregs",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.macc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "env.macsr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mac_mask",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.rambar0",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mbar",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        },
+        {
+          "name": "cpu/68040_mmu",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.mmu.ar",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.ssw",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.tcr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 2
+            },
+            {
+              "field": "env.mmu.urp",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.srp",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.fault",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 1
+            },
+            {
+              "field": "env.mmu.ttr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.mmusr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        },
+        {
+          "name": "cpu/68040_spregs",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.vbr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.cacr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.sfc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.dfc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "m68030-m68k-cpu": {
+    "Name": "m68030-m68k-cpu",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "cpu",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "env.dregs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.aregs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pc",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.sr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.current_sp",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.sp",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_op",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_x",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_n",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_v",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_c",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_z",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pending_vector",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pending_level",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "cpu/fpu",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.fpcr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.fpsr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.fregs",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 16,
+              "Description": {
+                "name": "freg",
+                "version_id": 0,
+                "minimum_version_id": 0,
+                "Fields": [
+                  {
+                    "field": "tmp",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 24,
+                    "Description": {
+                      "name": "freg_tmp",
+                      "version_id": 0,
+                      "minimum_version_id": 0,
+                      "Fields": [
+                        {
+                          "field": "tmp_mant",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 8
+                        },
+                        {
+                          "field": "tmp_exp",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 2
+                        }
+                      ]
+                    }
+                  }
+                ]
+              }
+            },
+            {
+              "field": "env.fp_result",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 16,
+              "Description": {
+                "name": "freg",
+                "version_id": 0,
+                "minimum_version_id": 0,
+                "Fields": [
+                  {
+                    "field": "tmp",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 24,
+                    "Description": {
+                      "name": "freg_tmp",
+                      "version_id": 0,
+                      "minimum_version_id": 0,
+                      "Fields": [
+                        {
+                          "field": "tmp_mant",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 8
+                        },
+                        {
+                          "field": "tmp_exp",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 2
+                        }
+                      ]
+                    }
+                  }
+                ]
+              }
+            }
+          ]
+        },
+        {
+          "name": "cpu/cf_spregs",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.macc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "env.macsr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mac_mask",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.rambar0",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mbar",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        },
+        {
+          "name": "cpu/68040_mmu",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.mmu.ar",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.ssw",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.tcr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 2
+            },
+            {
+              "field": "env.mmu.urp",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.srp",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.fault",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 1
+            },
+            {
+              "field": "env.mmu.ttr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.mmusr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        },
+        {
+          "name": "cpu/68040_spregs",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.vbr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.cacr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.sfc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.dfc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "fw_cfg": {
+    "Name": "fw_cfg",
+    "version_id": 2,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "fw_cfg",
+      "version_id": 2,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "cur_entry",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 0,
+          "field_exists": true,
+          "size": 4
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "fw_cfg/dma",
+          "version_id": 0,
+          "minimum_version_id": 0,
+          "Fields": [
+            {
+              "field": "dma_addr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        },
+        {
+          "name": "fw_cfg/acpi_mr",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "table_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "linker_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "rsdp_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "m68k-irq-controller": {
+    "Name": "m68k-irq-controller",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "m68k-irqc",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "ipr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        }
+      ]
+    }
+  },
+  "virt-ctrl": {
+    "Name": "virt-ctrl",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "virt-ctrl",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "irq_enabled",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ]
+    }
+  },
+  "m68040-m68k-cpu": {
+    "Name": "m68040-m68k-cpu",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "cpu",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "env.dregs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.aregs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pc",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.sr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.current_sp",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.sp",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_op",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_x",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_n",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_v",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_c",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_z",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pending_vector",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pending_level",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "cpu/fpu",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.fpcr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.fpsr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.fregs",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 16,
+              "Description": {
+                "name": "freg",
+                "version_id": 0,
+                "minimum_version_id": 0,
+                "Fields": [
+                  {
+                    "field": "tmp",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 24,
+                    "Description": {
+                      "name": "freg_tmp",
+                      "version_id": 0,
+                      "minimum_version_id": 0,
+                      "Fields": [
+                        {
+                          "field": "tmp_mant",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 8
+                        },
+                        {
+                          "field": "tmp_exp",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 2
+                        }
+                      ]
+                    }
+                  }
+                ]
+              }
+            },
+            {
+              "field": "env.fp_result",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 16,
+              "Description": {
+                "name": "freg",
+                "version_id": 0,
+                "minimum_version_id": 0,
+                "Fields": [
+                  {
+                    "field": "tmp",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 24,
+                    "Description": {
+                      "name": "freg_tmp",
+                      "version_id": 0,
+                      "minimum_version_id": 0,
+                      "Fields": [
+                        {
+                          "field": "tmp_mant",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 8
+                        },
+                        {
+                          "field": "tmp_exp",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 2
+                        }
+                      ]
+                    }
+                  }
+                ]
+              }
+            }
+          ]
+        },
+        {
+          "name": "cpu/cf_spregs",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.macc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "env.macsr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mac_mask",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.rambar0",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mbar",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        },
+        {
+          "name": "cpu/68040_mmu",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.mmu.ar",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.ssw",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.tcr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 2
+            },
+            {
+              "field": "env.mmu.urp",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.srp",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.fault",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 1
+            },
+            {
+              "field": "env.mmu.ttr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.mmusr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        },
+        {
+          "name": "cpu/68040_spregs",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.vbr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.cacr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.sfc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.dfc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "goldfish_pic": {
+    "Name": "goldfish_pic",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "goldfish_pic",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "pending",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "enabled",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ]
+    }
+  },
+  "goldfish_tty": {
+    "Name": "goldfish_tty",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "goldfish_tty",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "data_len",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "data_ptr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "int_enabled",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "rx_fifo",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 24,
+          "Description": {
+            "name": "Fifo8",
+            "version_id": 1,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "data",
+                "version_id": 1,
+                "field_exists": false,
+                "size": 0
+              },
+              {
+                "field": "head",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "num",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              }
+            ]
+          }
+        }
+      ]
+    }
+  },
+  "m68000-m68k-cpu": {
+    "Name": "m68000-m68k-cpu",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "cpu",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "env.dregs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.aregs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pc",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.sr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.current_sp",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.sp",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_op",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_x",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_n",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_v",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_c",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_z",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pending_vector",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pending_level",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "cpu/fpu",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.fpcr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.fpsr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.fregs",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 16,
+              "Description": {
+                "name": "freg",
+                "version_id": 0,
+                "minimum_version_id": 0,
+                "Fields": [
+                  {
+                    "field": "tmp",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 24,
+                    "Description": {
+                      "name": "freg_tmp",
+                      "version_id": 0,
+                      "minimum_version_id": 0,
+                      "Fields": [
+                        {
+                          "field": "tmp_mant",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 8
+                        },
+                        {
+                          "field": "tmp_exp",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 2
+                        }
+                      ]
+                    }
+                  }
+                ]
+              }
+            },
+            {
+              "field": "env.fp_result",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 16,
+              "Description": {
+                "name": "freg",
+                "version_id": 0,
+                "minimum_version_id": 0,
+                "Fields": [
+                  {
+                    "field": "tmp",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 24,
+                    "Description": {
+                      "name": "freg_tmp",
+                      "version_id": 0,
+                      "minimum_version_id": 0,
+                      "Fields": [
+                        {
+                          "field": "tmp_mant",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 8
+                        },
+                        {
+                          "field": "tmp_exp",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 2
+                        }
+                      ]
+                    }
+                  }
+                ]
+              }
+            }
+          ]
+        },
+        {
+          "name": "cpu/cf_spregs",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.macc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "env.macsr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mac_mask",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.rambar0",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mbar",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        },
+        {
+          "name": "cpu/68040_mmu",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.mmu.ar",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.ssw",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.tcr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 2
+            },
+            {
+              "field": "env.mmu.urp",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.srp",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.fault",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 1
+            },
+            {
+              "field": "env.mmu.ttr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.mmusr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        },
+        {
+          "name": "cpu/68040_spregs",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.vbr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.cacr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.sfc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.dfc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "m68010-m68k-cpu": {
+    "Name": "m68010-m68k-cpu",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "cpu",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "env.dregs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.aregs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pc",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.sr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.current_sp",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.sp",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_op",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_x",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_n",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_v",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_c",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_z",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pending_vector",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pending_level",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "cpu/fpu",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.fpcr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.fpsr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.fregs",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 16,
+              "Description": {
+                "name": "freg",
+                "version_id": 0,
+                "minimum_version_id": 0,
+                "Fields": [
+                  {
+                    "field": "tmp",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 24,
+                    "Description": {
+                      "name": "freg_tmp",
+                      "version_id": 0,
+                      "minimum_version_id": 0,
+                      "Fields": [
+                        {
+                          "field": "tmp_mant",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 8
+                        },
+                        {
+                          "field": "tmp_exp",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 2
+                        }
+                      ]
+                    }
+                  }
+                ]
+              }
+            },
+            {
+              "field": "env.fp_result",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 16,
+              "Description": {
+                "name": "freg",
+                "version_id": 0,
+                "minimum_version_id": 0,
+                "Fields": [
+                  {
+                    "field": "tmp",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 24,
+                    "Description": {
+                      "name": "freg_tmp",
+                      "version_id": 0,
+                      "minimum_version_id": 0,
+                      "Fields": [
+                        {
+                          "field": "tmp_mant",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 8
+                        },
+                        {
+                          "field": "tmp_exp",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 2
+                        }
+                      ]
+                    }
+                  }
+                ]
+              }
+            }
+          ]
+        },
+        {
+          "name": "cpu/cf_spregs",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.macc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "env.macsr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mac_mask",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.rambar0",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mbar",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        },
+        {
+          "name": "cpu/68040_mmu",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.mmu.ar",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.ssw",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.tcr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 2
+            },
+            {
+              "field": "env.mmu.urp",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.srp",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.fault",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 1
+            },
+            {
+              "field": "env.mmu.ttr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.mmusr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        },
+        {
+          "name": "cpu/68040_spregs",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.vbr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.cacr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.sfc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.dfc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "m68060-m68k-cpu": {
+    "Name": "m68060-m68k-cpu",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "cpu",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "env.dregs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.aregs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pc",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.sr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.current_sp",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.sp",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_op",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_x",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_n",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_v",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_c",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_z",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pending_vector",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pending_level",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "cpu/fpu",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.fpcr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.fpsr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.fregs",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 16,
+              "Description": {
+                "name": "freg",
+                "version_id": 0,
+                "minimum_version_id": 0,
+                "Fields": [
+                  {
+                    "field": "tmp",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 24,
+                    "Description": {
+                      "name": "freg_tmp",
+                      "version_id": 0,
+                      "minimum_version_id": 0,
+                      "Fields": [
+                        {
+                          "field": "tmp_mant",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 8
+                        },
+                        {
+                          "field": "tmp_exp",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 2
+                        }
+                      ]
+                    }
+                  }
+                ]
+              }
+            },
+            {
+              "field": "env.fp_result",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 16,
+              "Description": {
+                "name": "freg",
+                "version_id": 0,
+                "minimum_version_id": 0,
+                "Fields": [
+                  {
+                    "field": "tmp",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 24,
+                    "Description": {
+                      "name": "freg_tmp",
+                      "version_id": 0,
+                      "minimum_version_id": 0,
+                      "Fields": [
+                        {
+                          "field": "tmp_mant",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 8
+                        },
+                        {
+                          "field": "tmp_exp",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 2
+                        }
+                      ]
+                    }
+                  }
+                ]
+              }
+            }
+          ]
+        },
+        {
+          "name": "cpu/cf_spregs",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.macc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "env.macsr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mac_mask",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.rambar0",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mbar",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        },
+        {
+          "name": "cpu/68040_mmu",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.mmu.ar",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.ssw",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.tcr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 2
+            },
+            {
+              "field": "env.mmu.urp",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.srp",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.fault",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 1
+            },
+            {
+              "field": "env.mmu.ttr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.mmusr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        },
+        {
+          "name": "cpu/68040_spregs",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.vbr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.cacr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.sfc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.dfc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "fw_cfg_mem": {
+    "Name": "fw_cfg_mem",
+    "version_id": 2,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "fw_cfg",
+      "version_id": 2,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "cur_entry",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 0,
+          "field_exists": true,
+          "size": 4
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "fw_cfg/dma",
+          "version_id": 0,
+          "minimum_version_id": 0,
+          "Fields": [
+            {
+              "field": "dma_addr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        },
+        {
+          "name": "fw_cfg/acpi_mr",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "table_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "linker_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "rsdp_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "any-m68k-cpu": {
+    "Name": "any-m68k-cpu",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "cpu",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "env.dregs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.aregs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pc",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.sr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.current_sp",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.sp",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_op",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_x",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_n",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_v",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_c",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_z",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pending_vector",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pending_level",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "cpu/fpu",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.fpcr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.fpsr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.fregs",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 16,
+              "Description": {
+                "name": "freg",
+                "version_id": 0,
+                "minimum_version_id": 0,
+                "Fields": [
+                  {
+                    "field": "tmp",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 24,
+                    "Description": {
+                      "name": "freg_tmp",
+                      "version_id": 0,
+                      "minimum_version_id": 0,
+                      "Fields": [
+                        {
+                          "field": "tmp_mant",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 8
+                        },
+                        {
+                          "field": "tmp_exp",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 2
+                        }
+                      ]
+                    }
+                  }
+                ]
+              }
+            },
+            {
+              "field": "env.fp_result",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 16,
+              "Description": {
+                "name": "freg",
+                "version_id": 0,
+                "minimum_version_id": 0,
+                "Fields": [
+                  {
+                    "field": "tmp",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 24,
+                    "Description": {
+                      "name": "freg_tmp",
+                      "version_id": 0,
+                      "minimum_version_id": 0,
+                      "Fields": [
+                        {
+                          "field": "tmp_mant",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 8
+                        },
+                        {
+                          "field": "tmp_exp",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 2
+                        }
+                      ]
+                    }
+                  }
+                ]
+              }
+            }
+          ]
+        },
+        {
+          "name": "cpu/cf_spregs",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.macc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "env.macsr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mac_mask",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.rambar0",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mbar",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        },
+        {
+          "name": "cpu/68040_mmu",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.mmu.ar",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.ssw",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.tcr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 2
+            },
+            {
+              "field": "env.mmu.urp",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.srp",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.fault",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 1
+            },
+            {
+              "field": "env.mmu.ttr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.mmusr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        },
+        {
+          "name": "cpu/68040_spregs",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.vbr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.cacr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.sfc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.dfc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "fw_cfg_io": {
+    "Name": "fw_cfg_io",
+    "version_id": 2,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "fw_cfg",
+      "version_id": 2,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "cur_entry",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 0,
+          "field_exists": true,
+          "size": 4
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "fw_cfg/dma",
+          "version_id": 0,
+          "minimum_version_id": 0,
+          "Fields": [
+            {
+              "field": "dma_addr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        },
+        {
+          "name": "fw_cfg/acpi_mr",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "table_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "linker_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "rsdp_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "virtio-serial-device": {
+    "Name": "virtio-serial-device",
+    "version_id": 3,
+    "minimum_version_id": 3,
+    "Description": {
+      "name": "virtio-console",
+      "version_id": 3,
+      "minimum_version_id": 3,
+      "Fields": [
+        {
+          "field": "virtio",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 0
+        }
+      ]
+    }
+  },
+  "goldfish_rtc": {
+    "Name": "goldfish_rtc",
+    "version_id": 3,
+    "minimum_version_id": 0,
+    "Description": {
+      "name": "goldfish_rtc",
+      "version_id": 3,
+      "minimum_version_id": 0,
+      "Fields": [
+        {
+          "field": "tick_offset_vmstate",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "alarm_next",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "alarm_running",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "irq_pending",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "irq_enabled",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "time_high",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "tick_offset",
+          "version_id": 3,
+          "field_exists": false,
+          "size": 8
+        }
+      ]
+    }
+  },
+  "m68k-cpu": {
+    "Name": "m68k-cpu",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "cpu",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "env.dregs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.aregs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pc",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.sr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.current_sp",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.sp",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_op",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_x",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_n",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_v",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_c",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.cc_z",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pending_vector",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "env.pending_level",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "cpu/fpu",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.fpcr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.fpsr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.fregs",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 16,
+              "Description": {
+                "name": "freg",
+                "version_id": 0,
+                "minimum_version_id": 0,
+                "Fields": [
+                  {
+                    "field": "tmp",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 24,
+                    "Description": {
+                      "name": "freg_tmp",
+                      "version_id": 0,
+                      "minimum_version_id": 0,
+                      "Fields": [
+                        {
+                          "field": "tmp_mant",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 8
+                        },
+                        {
+                          "field": "tmp_exp",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 2
+                        }
+                      ]
+                    }
+                  }
+                ]
+              }
+            },
+            {
+              "field": "env.fp_result",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 16,
+              "Description": {
+                "name": "freg",
+                "version_id": 0,
+                "minimum_version_id": 0,
+                "Fields": [
+                  {
+                    "field": "tmp",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 24,
+                    "Description": {
+                      "name": "freg_tmp",
+                      "version_id": 0,
+                      "minimum_version_id": 0,
+                      "Fields": [
+                        {
+                          "field": "tmp_mant",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 8
+                        },
+                        {
+                          "field": "tmp_exp",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 2
+                        }
+                      ]
+                    }
+                  }
+                ]
+              }
+            }
+          ]
+        },
+        {
+          "name": "cpu/cf_spregs",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.macc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "env.macsr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mac_mask",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.rambar0",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mbar",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        },
+        {
+          "name": "cpu/68040_mmu",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.mmu.ar",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.ssw",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.tcr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 2
+            },
+            {
+              "field": "env.mmu.urp",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.srp",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.fault",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 1
+            },
+            {
+              "field": "env.mmu.ttr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.mmu.mmusr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        },
+        {
+          "name": "cpu/68040_spregs",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "env.vbr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.cacr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.sfc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            },
+            {
+              "field": "env.dfc",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        }
+      ]
+    }
+  }
+}
diff --git a/tests/data/vmstate-static-checker/ppc64/pseries-7.2.json b/tests/data/vmstate-static-checker/ppc64/pseries-7.2.json
new file mode 100644
index 00000000000..330bbbefedf
--- /dev/null
+++ b/tests/data/vmstate-static-checker/ppc64/pseries-7.2.json
@@ -0,0 +1,1068 @@
+{
+  "vmschkmachine": {
+    "Name": "pseries-7.2"
+  },
+  "spapr-nvram": {
+    "Name": "spapr-nvram",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "spapr_nvram",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "size",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "buf",
+          "version_id": 1,
+          "field_exists": false,
+          "size": 0
+        }
+      ]
+    }
+  },
+  "xive-source": {
+    "Name": "xive-source",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "xive-source",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "nr_irqs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "status",
+          "version_id": 1,
+          "field_exists": false,
+          "size": 0
+        }
+      ]
+    }
+  },
+  "xive-tctx": {
+    "Name": "xive-tctx",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "xive-tctx",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "regs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 64
+        }
+      ]
+    }
+  },
+  "pci-host-bridge": {
+    "Name": "pci-host-bridge",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "PCIHost",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "config_reg",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ]
+    }
+  },
+  "ics-spapr": {
+    "Name": "ics-spapr",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "ics",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "nr_irqs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "irqs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8,
+          "Description": {
+            "name": "ics/irq",
+            "version_id": 2,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "server",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "priority",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "saved_priority",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "status",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "flags",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              }
+            ]
+          }
+        }
+      ]
+    }
+  },
+  "scsi-cd": {
+    "Name": "scsi-cd",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "scsi-disk",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "qdev",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 608,
+          "Description": {
+            "name": "SCSIDevice",
+            "version_id": 1,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "unit_attention.key",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "unit_attention.asc",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "unit_attention.ascq",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "sense_is_ua",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "sense",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "sense_len",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "requests",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 0
+              }
+            ],
+            "Subsections": [
+              {
+                "name": "SCSIDevice/sense",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "sense",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 1
+                  }
+                ]
+              }
+            ]
+          }
+        },
+        {
+          "field": "media_changed",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "media_event",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "eject_request",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "tray_open",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "tray_locked",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        }
+      ]
+    }
+  },
+  "spapr-xive": {
+    "Name": "spapr-xive",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "spapr-xive",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "nr_irqs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "eat",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8,
+          "Description": {
+            "name": "spapr-xive/eas",
+            "version_id": 1,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "w",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              }
+            ]
+          }
+        },
+        {
+          "field": "endt",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 32,
+          "Description": {
+            "name": "spapr-xive/end",
+            "version_id": 1,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "w0",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "w1",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "w2",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "w3",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "w4",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "w5",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "w6",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "w7",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              }
+            ]
+          }
+        }
+      ]
+    }
+  },
+  "scsi-hd": {
+    "Name": "scsi-hd",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "scsi-disk",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "qdev",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 608,
+          "Description": {
+            "name": "SCSIDevice",
+            "version_id": 1,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "unit_attention.key",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "unit_attention.asc",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "unit_attention.ascq",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "sense_is_ua",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "sense",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "sense_len",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "requests",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 0
+              }
+            ],
+            "Subsections": [
+              {
+                "name": "SCSIDevice/sense",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "sense",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 1
+                  }
+                ]
+              }
+            ]
+          }
+        },
+        {
+          "field": "media_changed",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "media_event",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "eject_request",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "tray_open",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "tray_locked",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        }
+      ]
+    }
+  },
+  "fw_cfg_mem": {
+    "Name": "fw_cfg_mem",
+    "version_id": 2,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "fw_cfg",
+      "version_id": 2,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "cur_entry",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 0,
+          "field_exists": true,
+          "size": 4
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "fw_cfg/dma",
+          "version_id": 0,
+          "minimum_version_id": 0,
+          "Fields": [
+            {
+              "field": "dma_addr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        },
+        {
+          "name": "fw_cfg/acpi_mr",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "table_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "linker_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "rsdp_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "spapr-vty": {
+    "Name": "spapr-vty",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "spapr_vty",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "sdev",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 848,
+          "Description": {
+            "name": "spapr_vio",
+            "version_id": 1,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "reg",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "irq",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "signal_state",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "crq.qladdr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "crq.qsize",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "crq.qnext",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              }
+            ]
+          }
+        },
+        {
+          "field": "in",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "out",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "buf",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 16
+        }
+      ]
+    }
+  },
+  "spapr-wdt": {
+    "Name": "spapr-wdt",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "spapr_watchdog",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "timer",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 48
+        },
+        {
+          "field": "action",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "leave_others",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        }
+      ]
+    }
+  },
+  "fw_cfg_io": {
+    "Name": "fw_cfg_io",
+    "version_id": 2,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "fw_cfg",
+      "version_id": 2,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "cur_entry",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 0,
+          "field_exists": true,
+          "size": 4
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "fw_cfg/dma",
+          "version_id": 0,
+          "minimum_version_id": 0,
+          "Fields": [
+            {
+              "field": "dma_addr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        },
+        {
+          "name": "fw_cfg/acpi_mr",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "table_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "linker_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "rsdp_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "spapr-vscsi": {
+    "Name": "spapr-vscsi",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "spapr_vscsi",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "vdev",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 848,
+          "Description": {
+            "name": "spapr_vio",
+            "version_id": 1,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "reg",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "irq",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "signal_state",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "crq.qladdr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "crq.qsize",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "crq.qnext",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              }
+            ]
+          }
+        }
+      ]
+    }
+  },
+  "spapr-rtc": {
+    "Name": "spapr-rtc",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "spapr/rtc",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "ns_offset",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        }
+      ]
+    }
+  },
+  "spapr-vlan": {
+    "Name": "spapr-vlan",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "spapr_llan",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "sdev",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 848,
+          "Description": {
+            "name": "spapr_vio",
+            "version_id": 1,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "reg",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "irq",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "signal_state",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "crq.qladdr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "crq.qsize",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "crq.qnext",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              }
+            ]
+          }
+        },
+        {
+          "field": "isopen",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "buf_list",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "add_buf_ptr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "use_buf_ptr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "rx_bufs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "rxq_ptr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "spapr_llan/rx_pools",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "rx_pool",
+              "version_id": 1,
+              "field_exists": false,
+              "size": 8,
+              "Description": {
+                "name": "spapr_llan/rx_buffer_pool",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "bufsize",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 4
+                  },
+                  {
+                    "field": "count",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 4
+                  },
+                  {
+                    "field": "bds",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 8
+                  }
+                ]
+              }
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "fw_cfg": {
+    "Name": "fw_cfg",
+    "version_id": 2,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "fw_cfg",
+      "version_id": 2,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "cur_entry",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 0,
+          "field_exists": true,
+          "size": 4
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "fw_cfg/dma",
+          "version_id": 0,
+          "minimum_version_id": 0,
+          "Fields": [
+            {
+              "field": "dma_addr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        },
+        {
+          "name": "fw_cfg/acpi_mr",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "table_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "linker_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "rsdp_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "ics": {
+    "Name": "ics",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "ics",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "nr_irqs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "irqs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8,
+          "Description": {
+            "name": "ics/irq",
+            "version_id": 2,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "server",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "priority",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "saved_priority",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "status",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "flags",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              }
+            ]
+          }
+        }
+      ]
+    }
+  }
+}
diff --git a/tests/data/vmstate-static-checker/s390x/s390-ccw-virtio-7.2.json b/tests/data/vmstate-static-checker/s390x/s390-ccw-virtio-7.2.json
new file mode 100644
index 00000000000..9698852bd38
--- /dev/null
+++ b/tests/data/vmstate-static-checker/s390x/s390-ccw-virtio-7.2.json
@@ -0,0 +1,475 @@
+{
+  "vmschkmachine": {
+    "Name": "s390-ccw-virtio-7.2"
+  },
+  "sclpquiesce": {
+    "Name": "sclpquiesce",
+    "version_id": 0,
+    "minimum_version_id": 0,
+    "Description": {
+      "name": "sclpquiesce",
+      "version_id": 0,
+      "minimum_version_id": 0,
+      "Fields": [
+        {
+          "field": "event_pending",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        }
+      ]
+    }
+  },
+  "s390-sclp-event-facility": {
+    "Name": "s390-sclp-event-facility",
+    "version_id": 0,
+    "minimum_version_id": 0,
+    "Description": {
+      "name": "vmstate-event-facility",
+      "version_id": 0,
+      "minimum_version_id": 0,
+      "Fields": [
+        {
+          "field": "receive_mask_pieces[1]",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "vmstate-event-facility/mask64",
+          "version_id": 0,
+          "minimum_version_id": 0,
+          "Fields": [
+            {
+              "field": "receive_mask_pieces[0]",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        },
+        {
+          "name": "vmstate-event-facility/mask_length",
+          "version_id": 0,
+          "minimum_version_id": 0,
+          "Fields": [
+            {
+              "field": "mask_length",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 2
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "zpci": {
+    "Name": "zpci",
+    "version_id": 0,
+    "minimum_version_id": 0,
+    "Description": {
+      "name": "zpci",
+      "version_id": 0,
+      "minimum_version_id": 0
+    }
+  },
+  "sclpconsole": {
+    "Name": "sclpconsole",
+    "version_id": 0,
+    "minimum_version_id": 0,
+    "Description": {
+      "name": "sclpconsole",
+      "version_id": 0,
+      "minimum_version_id": 0,
+      "Fields": [
+        {
+          "field": "event.event_pending",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "iov",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "iov_sclp",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "iov_bs",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "iov_data_len",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "iov_sclp_rest",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ]
+    }
+  },
+  "virtio-serial-device": {
+    "Name": "virtio-serial-device",
+    "version_id": 3,
+    "minimum_version_id": 3,
+    "Description": {
+      "name": "virtio-console",
+      "version_id": 3,
+      "minimum_version_id": 3,
+      "Fields": [
+        {
+          "field": "virtio",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 0
+        }
+      ]
+    }
+  },
+  "sclplmconsole": {
+    "Name": "sclplmconsole",
+    "version_id": 0,
+    "minimum_version_id": 0,
+    "Description": {
+      "name": "sclplmconsole",
+      "version_id": 0,
+      "minimum_version_id": 0,
+      "Fields": [
+        {
+          "field": "event.event_pending",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "write_errors",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "length",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "buf",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        }
+      ]
+    }
+  },
+  "s390-pcihost": {
+    "Name": "s390-pcihost",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "PCIHost",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "config_reg",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ]
+    }
+  },
+  "s390-flic-qemu": {
+    "Name": "s390-flic-qemu",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "qemu-s390-flic",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "simm",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "nimm",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        }
+      ]
+    }
+  },
+  "fw_cfg_io": {
+    "Name": "fw_cfg_io",
+    "version_id": 2,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "fw_cfg",
+      "version_id": 2,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "cur_entry",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 0,
+          "field_exists": true,
+          "size": 4
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "fw_cfg/dma",
+          "version_id": 0,
+          "minimum_version_id": 0,
+          "Fields": [
+            {
+              "field": "dma_addr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        },
+        {
+          "name": "fw_cfg/acpi_mr",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "table_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "linker_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "rsdp_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "s390-ipl": {
+    "Name": "s390-ipl",
+    "version_id": 0,
+    "minimum_version_id": 0,
+    "Description": {
+      "name": "ipl",
+      "version_id": 0,
+      "minimum_version_id": 0,
+      "Fields": [
+        {
+          "field": "compat_start_addr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "compat_bios_start_addr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "iplb",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4096,
+          "Description": {
+            "name": "ipl/iplb",
+            "version_id": 0,
+            "minimum_version_id": 0,
+            "Fields": [
+              {
+                "field": "reserved1",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "devno",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 2
+              },
+              {
+                "field": "reserved2",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              }
+            ],
+            "Subsections": [
+              {
+                "name": "ipl/iplb_extended",
+                "version_id": 0,
+                "minimum_version_id": 0,
+                "Fields": [
+                  {
+                    "field": "reserved_ext",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 1
+                  }
+                ]
+              }
+            ]
+          }
+        },
+        {
+          "field": "iplb_valid",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "cssid",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "ssid",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "devno",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        }
+      ]
+    }
+  },
+  "pci-host-bridge": {
+    "Name": "pci-host-bridge",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "PCIHost",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "config_reg",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ]
+    }
+  },
+  "fw_cfg_mem": {
+    "Name": "fw_cfg_mem",
+    "version_id": 2,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "fw_cfg",
+      "version_id": 2,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "cur_entry",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 0,
+          "field_exists": true,
+          "size": 4
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "fw_cfg/dma",
+          "version_id": 0,
+          "minimum_version_id": 0,
+          "Fields": [
+            {
+              "field": "dma_addr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        },
+        {
+          "name": "fw_cfg/acpi_mr",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "table_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "linker_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "rsdp_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        }
+      ]
+    }
+  }
+}
diff --git a/tests/data/vmstate-static-checker/x86_64/pc-q35-7.2.json b/tests/data/vmstate-static-checker/x86_64/pc-q35-7.2.json
new file mode 100644
index 00000000000..c450639a48d
--- /dev/null
+++ b/tests/data/vmstate-static-checker/x86_64/pc-q35-7.2.json
@@ -0,0 +1,3402 @@
+{
+  "vmschkmachine": {
+    "Name": "pc-q35-7.2"
+  },
+  "fw_cfg": {
+    "Name": "fw_cfg",
+    "version_id": 2,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "fw_cfg",
+      "version_id": 2,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "cur_entry",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 0,
+          "field_exists": true,
+          "size": 4
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "fw_cfg/dma",
+          "version_id": 0,
+          "minimum_version_id": 0,
+          "Fields": [
+            {
+              "field": "dma_addr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        },
+        {
+          "name": "fw_cfg/acpi_mr",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "table_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "linker_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "rsdp_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "pcie-host-bridge": {
+    "Name": "pcie-host-bridge",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "PCIHost",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "config_reg",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ]
+    }
+  },
+  "isa-pit": {
+    "Name": "isa-pit",
+    "version_id": 3,
+    "minimum_version_id": 2,
+    "Description": {
+      "name": "i8254",
+      "version_id": 3,
+      "minimum_version_id": 2,
+      "Fields": [
+        {
+          "field": "channels[0].irq_disabled",
+          "version_id": 3,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "channels",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 56,
+          "Description": {
+            "name": "pit channel",
+            "version_id": 2,
+            "minimum_version_id": 2,
+            "Fields": [
+              {
+                "field": "count",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "latched_count",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 2
+              },
+              {
+                "field": "count_latched",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "status_latched",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "status",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "read_state",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "write_state",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "write_latch",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "rw_mode",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "mode",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "bcd",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "gate",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "count_load_time",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "next_transition_time",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              }
+            ]
+          }
+        },
+        {
+          "field": "channels[0].next_transition_time",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        }
+      ]
+    }
+  },
+  "mch": {
+    "Name": "mch",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "mch",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "parent_obj",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2608,
+          "Description": {
+            "name": "PCIDevice",
+            "version_id": 2,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "version_id",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "config",
+                "version_id": 0,
+                "field_exists": true,
+                "size": 256
+              },
+              {
+                "field": "config",
+                "version_id": 0,
+                "field_exists": true,
+                "size": 4096
+              },
+              {
+                "field": "irq_state",
+                "version_id": 2,
+                "field_exists": false,
+                "size": 16
+              }
+            ]
+          }
+        },
+        {
+          "field": "unused",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        }
+      ]
+    }
+  },
+  "pic-common": {
+    "Name": "pic-common",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "i8259",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "last_irr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "irr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "imr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "isr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "priority_add",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "irq_base",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "read_reg_select",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "poll",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "special_mask",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "init_state",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "auto_eoi",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "rotate_on_auto_eoi",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "special_fully_nested_mode",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "init4",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "single_mode",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "elcr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        }
+      ]
+    }
+  },
+  "ICH9-LPC": {
+    "Name": "ICH9-LPC",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "ICH9LPC",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "d",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2608,
+          "Description": {
+            "name": "PCIDevice",
+            "version_id": 2,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "version_id",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "config",
+                "version_id": 0,
+                "field_exists": true,
+                "size": 256
+              },
+              {
+                "field": "config",
+                "version_id": 0,
+                "field_exists": true,
+                "size": 4096
+              },
+              {
+                "field": "irq_state",
+                "version_id": 2,
+                "field_exists": false,
+                "size": 16
+              }
+            ]
+          }
+        },
+        {
+          "field": "apm",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 304,
+          "Description": {
+            "name": "APM State",
+            "version_id": 1,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "apmc",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "apms",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              }
+            ]
+          }
+        },
+        {
+          "field": "pm",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 6480,
+          "Description": {
+            "name": "ich9_pm",
+            "version_id": 1,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "acpi_regs.pm1.evt.sts",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 2
+              },
+              {
+                "field": "acpi_regs.pm1.evt.en",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 2
+              },
+              {
+                "field": "acpi_regs.pm1.cnt.cnt",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 2
+              },
+              {
+                "field": "acpi_regs.tmr.timer",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "acpi_regs.tmr.overflow_time",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "acpi_regs.gpe.sts",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "acpi_regs.gpe.en",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "smi_en",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "smi_sts",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              }
+            ],
+            "Subsections": [
+              {
+                "name": "ich9_pm/memhp",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "acpi_memory_hotplug",
+                    "version_id": 1,
+                    "field_exists": false,
+                    "size": 304,
+                    "Description": {
+                      "name": "memory hotplug state",
+                      "version_id": 1,
+                      "minimum_version_id": 1,
+                      "Fields": [
+                        {
+                          "field": "selector",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 4
+                        },
+                        {
+                          "field": "devs",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 24,
+                          "Description": {
+                            "name": "memory hotplug device state",
+                            "version_id": 1,
+                            "minimum_version_id": 1,
+                            "Fields": [
+                              {
+                                "field": "is_enabled",
+                                "version_id": 0,
+                                "field_exists": false,
+                                "size": 1
+                              },
+                              {
+                                "field": "is_inserting",
+                                "version_id": 0,
+                                "field_exists": false,
+                                "size": 1
+                              },
+                              {
+                                "field": "ost_event",
+                                "version_id": 0,
+                                "field_exists": false,
+                                "size": 4
+                              },
+                              {
+                                "field": "ost_status",
+                                "version_id": 0,
+                                "field_exists": false,
+                                "size": 4
+                              }
+                            ]
+                          }
+                        }
+                      ]
+                    }
+                  }
+                ]
+              },
+              {
+                "name": "ich9_pm/tco",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "tco_regs",
+                    "version_id": 1,
+                    "field_exists": false,
+                    "size": 320,
+                    "Description": {
+                      "name": "tco io device status",
+                      "version_id": 1,
+                      "minimum_version_id": 1,
+                      "Fields": [
+                        {
+                          "field": "tco.rld",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 2
+                        },
+                        {
+                          "field": "tco.din",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 1
+                        },
+                        {
+                          "field": "tco.dout",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 1
+                        },
+                        {
+                          "field": "tco.sts1",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 2
+                        },
+                        {
+                          "field": "tco.sts2",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 2
+                        },
+                        {
+                          "field": "tco.cnt1",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 2
+                        },
+                        {
+                          "field": "tco.cnt2",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 2
+                        },
+                        {
+                          "field": "tco.msg1",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 1
+                        },
+                        {
+                          "field": "tco.msg2",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 1
+                        },
+                        {
+                          "field": "tco.wdcnt",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 1
+                        },
+                        {
+                          "field": "tco.tmr",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 2
+                        },
+                        {
+                          "field": "sw_irq_gen",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 1
+                        },
+                        {
+                          "field": "tco_timer",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 8
+                        },
+                        {
+                          "field": "expire_time",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 8
+                        },
+                        {
+                          "field": "timeouts_no",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 1
+                        }
+                      ]
+                    }
+                  }
+                ]
+              },
+              {
+                "name": "ich9_pm/cpuhp",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "cpuhp_state",
+                    "version_id": 1,
+                    "field_exists": false,
+                    "size": 304,
+                    "Description": {
+                      "name": "CPU hotplug state",
+                      "version_id": 1,
+                      "minimum_version_id": 1,
+                      "Fields": [
+                        {
+                          "field": "selector",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 4
+                        },
+                        {
+                          "field": "command",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 1
+                        },
+                        {
+                          "field": "devs",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 32,
+                          "Description": {
+                            "name": "CPU hotplug device state",
+                            "version_id": 1,
+                            "minimum_version_id": 1,
+                            "Fields": [
+                              {
+                                "field": "is_inserting",
+                                "version_id": 0,
+                                "field_exists": false,
+                                "size": 1
+                              },
+                              {
+                                "field": "is_removing",
+                                "version_id": 0,
+                                "field_exists": false,
+                                "size": 1
+                              },
+                              {
+                                "field": "ost_event",
+                                "version_id": 0,
+                                "field_exists": false,
+                                "size": 4
+                              },
+                              {
+                                "field": "ost_status",
+                                "version_id": 0,
+                                "field_exists": false,
+                                "size": 4
+                              }
+                            ]
+                          }
+                        }
+                      ]
+                    }
+                  }
+                ]
+              },
+              {
+                "name": "ich9_pm/pcihp",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "acpi_pci_hotplug.hotplug_select",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 4
+                  },
+                  {
+                    "field": "acpi_pci_hotplug.acpi_pcihp_pci_status",
+                    "version_id": 1,
+                    "field_exists": false,
+                    "size": 12,
+                    "Description": {
+                      "name": "acpi_pcihp_pci_status",
+                      "version_id": 1,
+                      "minimum_version_id": 1,
+                      "Fields": [
+                        {
+                          "field": "up",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 4
+                        },
+                        {
+                          "field": "down",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 4
+                        }
+                      ]
+                    }
+                  },
+                  {
+                    "field": "acpi_pci_hotplug.acpi_index",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 4
+                  }
+                ]
+              }
+            ]
+          }
+        },
+        {
+          "field": "chip_config",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "sci_level",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "ICH9LPC/rst_cnt",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "rst_cnt",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 1
+            }
+          ]
+        },
+        {
+          "name": "ICH9LPC/smi_feat",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "smi_guest_features_le",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 1
+            },
+            {
+              "field": "smi_features_ok",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 1
+            },
+            {
+              "field": "smi_negotiated_features",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "pit-common": {
+    "Name": "pit-common",
+    "version_id": 3,
+    "minimum_version_id": 2,
+    "Description": {
+      "name": "i8254",
+      "version_id": 3,
+      "minimum_version_id": 2,
+      "Fields": [
+        {
+          "field": "channels[0].irq_disabled",
+          "version_id": 3,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "channels",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 56,
+          "Description": {
+            "name": "pit channel",
+            "version_id": 2,
+            "minimum_version_id": 2,
+            "Fields": [
+              {
+                "field": "count",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "latched_count",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 2
+              },
+              {
+                "field": "count_latched",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "status_latched",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "status",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "read_state",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "write_state",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "write_latch",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "rw_mode",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "mode",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "bcd",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "gate",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "count_load_time",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "next_transition_time",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              }
+            ]
+          }
+        },
+        {
+          "field": "channels[0].next_transition_time",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        }
+      ]
+    }
+  },
+  "vmgenid": {
+    "Name": "vmgenid",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "vmgenid",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "vmgenid_addr_le",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        }
+      ]
+    }
+  },
+  "ioapic-common": {
+    "Name": "ioapic-common",
+    "version_id": 3,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "ioapic",
+      "version_id": 3,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "id",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "ioregsel",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "unused",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "irr",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "ioredtbl",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        }
+      ]
+    }
+  },
+  "isa-i8259": {
+    "Name": "isa-i8259",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "i8259",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "last_irr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "irr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "imr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "isr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "priority_add",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "irq_base",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "read_reg_select",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "poll",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "special_mask",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "init_state",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "auto_eoi",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "rotate_on_auto_eoi",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "special_fully_nested_mode",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "init4",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "single_mode",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "elcr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        }
+      ]
+    }
+  },
+  "cfi.pflash01": {
+    "Name": "cfi.pflash01",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "pflash_cfi01",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "wcycle",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "cmd",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "status",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "counter",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "pflash_cfi01_blk_write",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "blk_bytes",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 0
+            },
+            {
+              "field": "blk_offset",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "i8042-mmio": {
+    "Name": "i8042-mmio",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "pckbd-mmio",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "kbd",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2328,
+          "Description": {
+            "name": "pckbd",
+            "version_id": 3,
+            "minimum_version_id": 3,
+            "Fields": [
+              {
+                "field": "write_cmd",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "status",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "mode",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "pending_tmp",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              }
+            ],
+            "Subsections": [
+              {
+                "name": "pckbd_outport",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "outport",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 1
+                  }
+                ]
+              },
+              {
+                "name": "pckbd/extended_state",
+                "version_id": 0,
+                "minimum_version_id": 0,
+                "Fields": [
+                  {
+                    "field": "migration_flags",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 4
+                  },
+                  {
+                    "field": "obsrc",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 4
+                  },
+                  {
+                    "field": "obdata",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 1
+                  },
+                  {
+                    "field": "cbdata",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 1
+                  }
+                ]
+              }
+            ]
+          }
+        }
+      ]
+    }
+  },
+  "isa-serial": {
+    "Name": "isa-serial",
+    "version_id": 3,
+    "minimum_version_id": 2,
+    "Description": {
+      "name": "serial",
+      "version_id": 3,
+      "minimum_version_id": 2,
+      "Fields": [
+        {
+          "field": "state",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 656,
+          "Description": {
+            "name": "serial",
+            "version_id": 3,
+            "minimum_version_id": 2,
+            "Fields": [
+              {
+                "field": "divider",
+                "version_id": 2,
+                "field_exists": false,
+                "size": 2
+              },
+              {
+                "field": "rbr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "ier",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "iir",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "lcr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "mcr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "lsr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "msr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "scr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "fcr_vmstate",
+                "version_id": 3,
+                "field_exists": false,
+                "size": 1
+              }
+            ],
+            "Subsections": [
+              {
+                "name": "serial/thr_ipending",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "thr_ipending",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 4
+                  }
+                ]
+              },
+              {
+                "name": "serial/tsr",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "tsr_retry",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 4
+                  },
+                  {
+                    "field": "thr",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 1
+                  },
+                  {
+                    "field": "tsr",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 1
+                  }
+                ]
+              },
+              {
+                "name": "serial/recv_fifo",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "recv_fifo",
+                    "version_id": 1,
+                    "field_exists": false,
+                    "size": 24,
+                    "Description": {
+                      "name": "Fifo8",
+                      "version_id": 1,
+                      "minimum_version_id": 1,
+                      "Fields": [
+                        {
+                          "field": "data",
+                          "version_id": 1,
+                          "field_exists": false,
+                          "size": 0
+                        },
+                        {
+                          "field": "head",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 4
+                        },
+                        {
+                          "field": "num",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 4
+                        }
+                      ]
+                    }
+                  }
+                ]
+              },
+              {
+                "name": "serial/xmit_fifo",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "xmit_fifo",
+                    "version_id": 1,
+                    "field_exists": false,
+                    "size": 24,
+                    "Description": {
+                      "name": "Fifo8",
+                      "version_id": 1,
+                      "minimum_version_id": 1,
+                      "Fields": [
+                        {
+                          "field": "data",
+                          "version_id": 1,
+                          "field_exists": false,
+                          "size": 0
+                        },
+                        {
+                          "field": "head",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 4
+                        },
+                        {
+                          "field": "num",
+                          "version_id": 0,
+                          "field_exists": false,
+                          "size": 4
+                        }
+                      ]
+                    }
+                  }
+                ]
+              },
+              {
+                "name": "serial/fifo_timeout_timer",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "fifo_timeout_timer",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 8
+                  }
+                ]
+              },
+              {
+                "name": "serial/timeout_ipending",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "timeout_ipending",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 4
+                  }
+                ]
+              },
+              {
+                "name": "serial/poll",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "poll_msl",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 4
+                  },
+                  {
+                    "field": "modem_status_poll",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 8
+                  }
+                ]
+              }
+            ]
+          }
+        }
+      ]
+    }
+  },
+  "ps2-mouse": {
+    "Name": "ps2-mouse",
+    "version_id": 2,
+    "minimum_version_id": 2,
+    "Description": {
+      "name": "ps2mouse",
+      "version_id": 2,
+      "minimum_version_id": 2,
+      "Fields": [
+        {
+          "field": "parent_obj",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1104,
+          "Description": {
+            "name": "PS2 Common State",
+            "version_id": 3,
+            "minimum_version_id": 2,
+            "Fields": [
+              {
+                "field": "write_cmd",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "queue.rptr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "queue.wptr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "queue.count",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "queue.data",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 256
+              }
+            ]
+          }
+        },
+        {
+          "field": "mouse_status",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "mouse_resolution",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "mouse_sample_rate",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "mouse_wrap",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "mouse_type",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "mouse_detect_state",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "mouse_dx",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "mouse_dy",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "mouse_dz",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "mouse_buttons",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        }
+      ]
+    }
+  },
+  "kvmvapic": {
+    "Name": "kvmvapic",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "kvm-tpr-opt",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "rom_state",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 124,
+          "Description": {
+            "name": "kvmvapic-guest-rom",
+            "version_id": 1,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "unused",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 8
+              },
+              {
+                "field": "vaddr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "fixup_start",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "fixup_end",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "vapic_vaddr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "vapic_size",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "vcpu_shift",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "real_tpr_addr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "up",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 44,
+                "Description": {
+                  "name": "kvmvapic-handlers",
+                  "version_id": 1,
+                  "minimum_version_id": 1,
+                  "Fields": [
+                    {
+                      "field": "set_tpr",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "set_tpr_eax",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "get_tpr",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "get_tpr_stack",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    }
+                  ]
+                }
+              },
+              {
+                "field": "mp",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 44,
+                "Description": {
+                  "name": "kvmvapic-handlers",
+                  "version_id": 1,
+                  "minimum_version_id": 1,
+                  "Fields": [
+                    {
+                      "field": "set_tpr",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "set_tpr_eax",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "get_tpr",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "get_tpr_stack",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    }
+                  ]
+                }
+              }
+            ]
+          }
+        },
+        {
+          "field": "state",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "real_tpr_addr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "rom_state_vaddr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "vapic_paddr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "rom_state_paddr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ]
+    }
+  },
+  "ich9-ahci": {
+    "Name": "ich9-ahci",
+    "version_id": 1,
+    "minimum_version_id": 0,
+    "Description": {
+      "name": "ich9_ahci",
+      "version_id": 1,
+      "minimum_version_id": 0,
+      "Fields": [
+        {
+          "field": "parent_obj",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2608,
+          "Description": {
+            "name": "PCIDevice",
+            "version_id": 2,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "version_id",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "config",
+                "version_id": 0,
+                "field_exists": true,
+                "size": 256
+              },
+              {
+                "field": "config",
+                "version_id": 0,
+                "field_exists": true,
+                "size": 4096
+              },
+              {
+                "field": "irq_state",
+                "version_id": 2,
+                "field_exists": false,
+                "size": 16
+              }
+            ]
+          }
+        },
+        {
+          "field": "ahci",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 624,
+          "Description": {
+            "name": "ahci",
+            "version_id": 1,
+            "minimum_version_id": 0,
+            "Fields": [
+              {
+                "field": "dev",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 6088,
+                "Description": {
+                  "name": "ahci port",
+                  "version_id": 1,
+                  "minimum_version_id": 0,
+                  "Fields": [
+                    {
+                      "field": "port",
+                      "version_id": 1,
+                      "field_exists": false,
+                      "size": 2304,
+                      "Description": {
+                        "name": "ide_bus",
+                        "version_id": 1,
+                        "minimum_version_id": 1,
+                        "Fields": [
+                          {
+                            "field": "cmd",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 1
+                          },
+                          {
+                            "field": "unit",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 1
+                          }
+                        ],
+                        "Subsections": [
+                          {
+                            "name": "ide_bus/error",
+                            "version_id": 2,
+                            "minimum_version_id": 1,
+                            "Fields": [
+                              {
+                                "field": "error_status",
+                                "version_id": 0,
+                                "field_exists": false,
+                                "size": 4
+                              },
+                              {
+                                "field": "retry_sector_num",
+                                "version_id": 2,
+                                "field_exists": false,
+                                "size": 8
+                              },
+                              {
+                                "field": "retry_nsector",
+                                "version_id": 2,
+                                "field_exists": false,
+                                "size": 4
+                              },
+                              {
+                                "field": "retry_unit",
+                                "version_id": 2,
+                                "field_exists": false,
+                                "size": 1
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    },
+                    {
+                      "field": "port.ifs[0]",
+                      "version_id": 1,
+                      "field_exists": false,
+                      "size": 984,
+                      "Description": {
+                        "name": "ide_drive",
+                        "version_id": 3,
+                        "minimum_version_id": 0,
+                        "Fields": [
+                          {
+                            "field": "mult_sectors",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 4
+                          },
+                          {
+                            "field": "identify_set",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 4
+                          },
+                          {
+                            "field": "identify_data",
+                            "version_id": 0,
+                            "field_exists": true,
+                            "size": 512
+                          },
+                          {
+                            "field": "feature",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 1
+                          },
+                          {
+                            "field": "error",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 1
+                          },
+                          {
+                            "field": "nsector",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 4
+                          },
+                          {
+                            "field": "sector",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 1
+                          },
+                          {
+                            "field": "lcyl",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 1
+                          },
+                          {
+                            "field": "hcyl",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 1
+                          },
+                          {
+                            "field": "hob_feature",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 1
+                          },
+                          {
+                            "field": "hob_sector",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 1
+                          },
+                          {
+                            "field": "hob_nsector",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 1
+                          },
+                          {
+                            "field": "hob_lcyl",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 1
+                          },
+                          {
+                            "field": "hob_hcyl",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 1
+                          },
+                          {
+                            "field": "select",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 1
+                          },
+                          {
+                            "field": "status",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 1
+                          },
+                          {
+                            "field": "lba48",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 1
+                          },
+                          {
+                            "field": "sense_key",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 1
+                          },
+                          {
+                            "field": "asc",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 1
+                          },
+                          {
+                            "field": "cdrom_changed",
+                            "version_id": 3,
+                            "field_exists": false,
+                            "size": 1
+                          }
+                        ],
+                        "Subsections": [
+                          {
+                            "name": "ide_drive/pio_state",
+                            "version_id": 1,
+                            "minimum_version_id": 1,
+                            "Fields": [
+                              {
+                                "field": "req_nb_sectors",
+                                "version_id": 0,
+                                "field_exists": false,
+                                "size": 4
+                              },
+                              {
+                                "field": "io_buffer",
+                                "version_id": 1,
+                                "field_exists": false,
+                                "size": 1
+                              },
+                              {
+                                "field": "cur_io_buffer_offset",
+                                "version_id": 0,
+                                "field_exists": false,
+                                "size": 4
+                              },
+                              {
+                                "field": "cur_io_buffer_len",
+                                "version_id": 0,
+                                "field_exists": false,
+                                "size": 4
+                              },
+                              {
+                                "field": "end_transfer_fn_idx",
+                                "version_id": 0,
+                                "field_exists": false,
+                                "size": 1
+                              },
+                              {
+                                "field": "elementary_transfer_size",
+                                "version_id": 0,
+                                "field_exists": false,
+                                "size": 4
+                              },
+                              {
+                                "field": "packet_transfer_size",
+                                "version_id": 0,
+                                "field_exists": false,
+                                "size": 4
+                              }
+                            ]
+                          },
+                          {
+                            "name": "ide_drive/tray_state",
+                            "version_id": 1,
+                            "minimum_version_id": 1,
+                            "Fields": [
+                              {
+                                "field": "tray_open",
+                                "version_id": 0,
+                                "field_exists": false,
+                                "size": 1
+                              },
+                              {
+                                "field": "tray_locked",
+                                "version_id": 0,
+                                "field_exists": false,
+                                "size": 1
+                              }
+                            ]
+                          },
+                          {
+                            "name": "ide_drive/atapi/gesn_state",
+                            "version_id": 1,
+                            "minimum_version_id": 1,
+                            "Fields": [
+                              {
+                                "field": "events.new_media",
+                                "version_id": 0,
+                                "field_exists": false,
+                                "size": 1
+                              },
+                              {
+                                "field": "events.eject_request",
+                                "version_id": 0,
+                                "field_exists": false,
+                                "size": 1
+                              }
+                            ]
+                          }
+                        ]
+                      }
+                    },
+                    {
+                      "field": "port_state",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "finished",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "port_regs.lst_addr",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "port_regs.lst_addr_hi",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "port_regs.fis_addr",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "port_regs.fis_addr_hi",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "port_regs.irq_stat",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "port_regs.irq_mask",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "port_regs.cmd",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "port_regs.tfdata",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "port_regs.sig",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "port_regs.scr_stat",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "port_regs.scr_ctl",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "port_regs.scr_err",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "port_regs.scr_act",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "port_regs.cmd_issue",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "done_first_drq",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 1
+                    },
+                    {
+                      "field": "busy_slot",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 4
+                    },
+                    {
+                      "field": "init_d2h_sent",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 1
+                    },
+                    {
+                      "field": "ncq_tfs",
+                      "version_id": 1,
+                      "field_exists": false,
+                      "size": 112,
+                      "Description": {
+                        "name": "ncq state",
+                        "version_id": 1,
+                        "minimum_version_id": 0,
+                        "Fields": [
+                          {
+                            "field": "sector_count",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 4
+                          },
+                          {
+                            "field": "lba",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 8
+                          },
+                          {
+                            "field": "tag",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 1
+                          },
+                          {
+                            "field": "cmd",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 1
+                          },
+                          {
+                            "field": "slot",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 1
+                          },
+                          {
+                            "field": "used",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 1
+                          },
+                          {
+                            "field": "halt",
+                            "version_id": 0,
+                            "field_exists": false,
+                            "size": 1
+                          }
+                        ]
+                      }
+                    }
+                  ]
+                }
+              },
+              {
+                "field": "control_regs.cap",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "control_regs.ghc",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "control_regs.irqstatus",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "control_regs.impl",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "control_regs.version",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "idp_index",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "ports",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              }
+            ]
+          }
+        }
+      ]
+    }
+  },
+  "i8042": {
+    "Name": "i8042",
+    "version_id": 3,
+    "minimum_version_id": 3,
+    "Description": {
+      "name": "pckbd",
+      "version_id": 3,
+      "minimum_version_id": 3,
+      "Fields": [
+        {
+          "field": "kbd",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2328,
+          "Description": {
+            "name": "pckbd",
+            "version_id": 3,
+            "minimum_version_id": 3,
+            "Fields": [
+              {
+                "field": "write_cmd",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "status",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "mode",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "pending_tmp",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              }
+            ],
+            "Subsections": [
+              {
+                "name": "pckbd_outport",
+                "version_id": 1,
+                "minimum_version_id": 1,
+                "Fields": [
+                  {
+                    "field": "outport",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 1
+                  }
+                ]
+              },
+              {
+                "name": "pckbd/extended_state",
+                "version_id": 0,
+                "minimum_version_id": 0,
+                "Fields": [
+                  {
+                    "field": "migration_flags",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 4
+                  },
+                  {
+                    "field": "obsrc",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 4
+                  },
+                  {
+                    "field": "obdata",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 1
+                  },
+                  {
+                    "field": "cbdata",
+                    "version_id": 0,
+                    "field_exists": false,
+                    "size": 1
+                  }
+                ]
+              }
+            ]
+          }
+        }
+      ]
+    }
+  },
+  "fw_cfg_io": {
+    "Name": "fw_cfg_io",
+    "version_id": 2,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "fw_cfg",
+      "version_id": 2,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "cur_entry",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 0,
+          "field_exists": true,
+          "size": 4
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "fw_cfg/dma",
+          "version_id": 0,
+          "minimum_version_id": 0,
+          "Fields": [
+            {
+              "field": "dma_addr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        },
+        {
+          "name": "fw_cfg/acpi_mr",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "table_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "linker_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "rsdp_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "vmcoreinfo": {
+    "Name": "vmcoreinfo",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "vmcoreinfo",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "has_vmcoreinfo",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "vmcoreinfo.host_format",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "vmcoreinfo.guest_format",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "vmcoreinfo.size",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "vmcoreinfo.paddr",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        }
+      ]
+    }
+  },
+  "ps2-kbd": {
+    "Name": "ps2-kbd",
+    "version_id": 3,
+    "minimum_version_id": 2,
+    "Description": {
+      "name": "ps2kbd",
+      "version_id": 3,
+      "minimum_version_id": 2,
+      "Fields": [
+        {
+          "field": "parent_obj",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1104,
+          "Description": {
+            "name": "PS2 Common State",
+            "version_id": 3,
+            "minimum_version_id": 2,
+            "Fields": [
+              {
+                "field": "write_cmd",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "queue.rptr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "queue.wptr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "queue.count",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "queue.data",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 256
+              }
+            ]
+          }
+        },
+        {
+          "field": "scan_enabled",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "translate",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "scancode_set",
+          "version_id": 3,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "ps2kbd/ledstate",
+          "version_id": 3,
+          "minimum_version_id": 2,
+          "Fields": [
+            {
+              "field": "ledstate",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        },
+        {
+          "name": "ps2kbd/need_high_bit",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "need_high_bit",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 1
+            }
+          ]
+        },
+        {
+          "name": "ps2kbd/command_reply_queue",
+          "version_id": 0,
+          "minimum_version_id": 0,
+          "Fields": [
+            {
+              "field": "parent_obj.queue.cwptr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 4
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "ICH9-SMB": {
+    "Name": "ICH9-SMB",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "ich9_smb",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "dev",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2608,
+          "Description": {
+            "name": "PCIDevice",
+            "version_id": 2,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "version_id",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "config",
+                "version_id": 0,
+                "field_exists": true,
+                "size": 256
+              },
+              {
+                "field": "config",
+                "version_id": 0,
+                "field_exists": true,
+                "size": 4096
+              },
+              {
+                "field": "irq_state",
+                "version_id": 2,
+                "field_exists": false,
+                "size": 16
+              }
+            ]
+          }
+        },
+        {
+          "field": "irq_enabled",
+          "version_id": 0,
+          "field_exists": true,
+          "size": 1
+        },
+        {
+          "field": "smb",
+          "version_id": 1,
+          "field_exists": true,
+          "size": 384,
+          "Description": {
+            "name": "pmsmb",
+            "version_id": 1,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "smb_stat",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "smb_ctl",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "smb_cmd",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "smb_addr",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "smb_data0",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "smb_data1",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "smb_index",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "smb_data",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "smb_auxctl",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "smb_blkdata",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "i2c_enable",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "op_done",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "in_i2c_block_read",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "start_transaction_on_status_read",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              }
+            ]
+          }
+        }
+      ]
+    }
+  },
+  "isa-pcspk": {
+    "Name": "isa-pcspk",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "pcspk",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "data_on",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "dummy_refresh_clock",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        }
+      ]
+    }
+  },
+  "acpi-erst": {
+    "Name": "acpi-erst",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "acpi-erst",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "operation",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "busy_status",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "command_status",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "record_offset",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "reg_action",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "reg_value",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "record_identifier",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "next_record_index",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ]
+    }
+  },
+  "i8257": {
+    "Name": "i8257",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "dma",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "command",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "mask",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "flip_flop",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "dshift",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "regs",
+          "version_id": 1,
+          "field_exists": false,
+          "size": 40,
+          "Description": {
+            "name": "dma_regs",
+            "version_id": 1,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "now",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "base",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 2
+              },
+              {
+                "field": "mode",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "page",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "pageh",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "dack",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              },
+              {
+                "field": "eop",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              }
+            ]
+          }
+        }
+      ]
+    }
+  },
+  "port92": {
+    "Name": "port92",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "port92",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "outport",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        }
+      ]
+    }
+  },
+  "q35-pcihost": {
+    "Name": "q35-pcihost",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "PCIHost",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "config_reg",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ]
+    }
+  },
+  "ioapic": {
+    "Name": "ioapic",
+    "version_id": 3,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "ioapic",
+      "version_id": 3,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "id",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "ioregsel",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "unused",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "irr",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "ioredtbl",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        }
+      ]
+    }
+  },
+  "smbus-eeprom": {
+    "Name": "smbus-eeprom",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "smbus-eeprom",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "smbusdev",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 216,
+          "Description": {
+            "name": "smbus-device",
+            "version_id": 1,
+            "minimum_version_id": 1,
+            "Fields": [
+              {
+                "field": "i2c",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 168,
+                "Description": {
+                  "name": "I2CSlave",
+                  "version_id": 1,
+                  "minimum_version_id": 1,
+                  "Fields": [
+                    {
+                      "field": "address",
+                      "version_id": 0,
+                      "field_exists": false,
+                      "size": 1
+                    }
+                  ]
+                }
+              },
+              {
+                "field": "mode",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "data_len",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 4
+              },
+              {
+                "field": "data_buf",
+                "version_id": 0,
+                "field_exists": false,
+                "size": 1
+              }
+            ]
+          }
+        },
+        {
+          "field": "data",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "offset",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "accessed",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        }
+      ]
+    }
+  },
+  "mc146818rtc": {
+    "Name": "mc146818rtc",
+    "version_id": 3,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "mc146818rtc",
+      "version_id": 3,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "cmos_data",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 128
+        },
+        {
+          "field": "cmos_index",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 1
+        },
+        {
+          "field": "unused",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 28
+        },
+        {
+          "field": "periodic_timer",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "next_periodic_time",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "unused",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 24
+        },
+        {
+          "field": "irq_coalesced",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "period",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 4
+        },
+        {
+          "field": "base_rtc",
+          "version_id": 3,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "last_update",
+          "version_id": 3,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "offset",
+          "version_id": 3,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "update_timer",
+          "version_id": 3,
+          "field_exists": false,
+          "size": 8
+        },
+        {
+          "field": "next_alarm_time",
+          "version_id": 3,
+          "field_exists": false,
+          "size": 8
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "mc146818rtc/irq_reinject_on_ack_count",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "irq_reinject_on_ack_count",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 2
+            }
+          ]
+        }
+      ]
+    }
+  },
+  "pci-host-bridge": {
+    "Name": "pci-host-bridge",
+    "version_id": 1,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "PCIHost",
+      "version_id": 1,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "config_reg",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 4
+        }
+      ]
+    }
+  },
+  "fw_cfg_mem": {
+    "Name": "fw_cfg_mem",
+    "version_id": 2,
+    "minimum_version_id": 1,
+    "Description": {
+      "name": "fw_cfg",
+      "version_id": 2,
+      "minimum_version_id": 1,
+      "Fields": [
+        {
+          "field": "cur_entry",
+          "version_id": 0,
+          "field_exists": false,
+          "size": 2
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 0,
+          "field_exists": true,
+          "size": 4
+        },
+        {
+          "field": "cur_offset",
+          "version_id": 2,
+          "field_exists": false,
+          "size": 4
+        }
+      ],
+      "Subsections": [
+        {
+          "name": "fw_cfg/dma",
+          "version_id": 0,
+          "minimum_version_id": 0,
+          "Fields": [
+            {
+              "field": "dma_addr",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        },
+        {
+          "name": "fw_cfg/acpi_mr",
+          "version_id": 1,
+          "minimum_version_id": 1,
+          "Fields": [
+            {
+              "field": "table_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "linker_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            },
+            {
+              "field": "rsdp_mr_size",
+              "version_id": 0,
+              "field_exists": false,
+              "size": 8
+            }
+          ]
+        }
+      ]
+    }
+  }
+}
-- 
2.49.0



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

* [PATCH 4/4] tests/functional: Test with scripts/vmstate-static-checker.py
  2025-04-29 15:21 [PATCH 0/4] Test vmstate with scripts/vmstate-static-checker.py Thomas Huth
                   ` (2 preceding siblings ...)
  2025-04-29 15:21 ` [PATCH 3/4] tests/data/vmstate-static-checker: Add dump files from QEMU 7.2.17 Thomas Huth
@ 2025-04-29 15:21 ` Thomas Huth
  2025-04-30 16:10   ` Pierrick Bouvier
  3 siblings, 1 reply; 16+ messages in thread
From: Thomas Huth @ 2025-04-29 15:21 UTC (permalink / raw)
  To: qemu-devel, Fabiano Rosas; +Cc: Peter Xu, John Snow

From: Thomas Huth <thuth@redhat.com>

We've got this nice vmstate-static-checker.py script that can help
to detect screw-ups in the migration states. Unfortunately, it's
currently only run manually, so there could be regressions that nobody
notices immediately. Let's run it from a functional test automatically
so that we got at least a basic coverage in each CI run.

Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 MAINTAINERS                      |  1 +
 tests/functional/meson.build     | 13 +++++++-
 tests/functional/test_vmstate.py | 56 ++++++++++++++++++++++++++++++++
 3 files changed, 69 insertions(+), 1 deletion(-)
 create mode 100755 tests/functional/test_vmstate.py

diff --git a/MAINTAINERS b/MAINTAINERS
index 65fb61844b3..6a8d81458ad 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3525,6 +3525,7 @@ F: migration/
 F: scripts/vmstate-static-checker.py
 F: tests/data/vmstate-static-checker/
 F: tests/functional/test_migration.py
+F: tests/functional/test_vmstate.py
 F: tests/qtest/migration/
 F: tests/qtest/migration-*
 F: docs/devel/migration/
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
index b317ad42c5a..9f339e626f6 100644
--- a/tests/functional/meson.build
+++ b/tests/functional/meson.build
@@ -76,6 +76,7 @@ tests_generic_bsduser = [
 
 tests_aarch64_system_quick = [
   'migration',
+  'vmstate',
 ]
 
 tests_aarch64_system_thorough = [
@@ -164,6 +165,10 @@ tests_loongarch64_system_thorough = [
   'loongarch64_virt',
 ]
 
+tests_m68k_system_quick = [
+  'vmstate',
+]
+
 tests_m68k_system_thorough = [
   'm68k_mcf5208evb',
   'm68k_nextcube',
@@ -230,6 +235,7 @@ tests_ppc_system_thorough = [
 
 tests_ppc64_system_quick = [
   'migration',
+  'vmstate',
 ]
 
 tests_ppc64_system_thorough = [
@@ -265,6 +271,10 @@ tests_rx_system_thorough = [
   'rx_gdbsim',
 ]
 
+tests_s390x_system_quick = [
+  'vmstate',
+]
+
 tests_s390x_system_thorough = [
   's390x_ccw_virtio',
   's390x_replay',
@@ -305,8 +315,9 @@ tests_x86_64_system_quick = [
   'migration',
   'pc_cpu_hotplug_props',
   'virtio_version',
-  'x86_cpu_model_versions',
+  'vmstate',
   'vnc',
+  'x86_cpu_model_versions',
 ]
 
 tests_x86_64_system_thorough = [
diff --git a/tests/functional/test_vmstate.py b/tests/functional/test_vmstate.py
new file mode 100755
index 00000000000..3ba56d580db
--- /dev/null
+++ b/tests/functional/test_vmstate.py
@@ -0,0 +1,56 @@
+#!/usr/bin/env python3
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+# This test runs the vmstate-static-checker script with the current QEMU
+
+import subprocess
+
+from qemu_test import QemuSystemTest
+
+
+class VmStateTest(QemuSystemTest):
+
+    def test_vmstate(self):
+        target_machine = {
+            'aarch64': 'virt-7.2',
+            'm68k': 'virt-7.2',
+            'ppc64': 'pseries-7.2',
+            's390x': 's390-ccw-virtio-7.2',
+            'x86_64': 'pc-q35-7.2',
+        }
+        self.set_machine(target_machine[self.arch])
+
+        # Run QEMU to get the current vmstate json file:
+        dst_json = self.scratch_file('dest.json')
+        self.log.info('Dumping vmstate from ' + self.qemu_bin)
+        cp = subprocess.run([self.qemu_bin, '-nodefaults',
+                             '-M', target_machine[self.arch],
+                             '-dump-vmstate', dst_json],
+                            stdout=subprocess.PIPE,
+                            stderr=subprocess.STDOUT,
+                            text=True)
+        if cp.returncode != 0:
+            self.fail('Running QEMU failed:\n' + cp.stdout)
+        if cp.stdout:
+            self.log.info('QEMU output: ' + cp.stdout)
+
+        # Check whether the old vmstate json file is still compatible:
+        src_json = self.data_file('..', 'data', 'vmstate-static-checker',
+                                  self.arch,
+                                  target_machine[self.arch] + '.json')
+        vmstate_checker = self.data_file('..', '..', 'scripts',
+                                         'vmstate-static-checker.py')
+        self.log.info('Comparing vmstate with ' + src_json)
+        cp = subprocess.run([vmstate_checker, '-s', src_json, '-d', dst_json],
+                            stdout=subprocess.PIPE,
+                            stderr=subprocess.STDOUT,
+                            text=True)
+        if cp.returncode != 0:
+            self.fail('Running vmstate-static-checker failed:\n' + cp.stdout)
+        if cp.stdout:
+            self.log.warning('vmstate-static-checker output: ' + cp.stdout)
+
+
+if __name__ == '__main__':
+    QemuSystemTest.main()
-- 
2.49.0



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

* Re: [PATCH 1/4] tests/vmstate-static-checker-data: Remove old dump files
  2025-04-29 15:21 ` [PATCH 1/4] tests/vmstate-static-checker-data: Remove old dump files Thomas Huth
@ 2025-04-29 15:29   ` Philippe Mathieu-Daudé
  2025-04-29 22:13   ` Peter Xu
  1 sibling, 0 replies; 16+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-04-29 15:29 UTC (permalink / raw)
  To: Thomas Huth, qemu-devel, Fabiano Rosas; +Cc: Peter Xu, John Snow

On 29/4/25 17:21, Thomas Huth wrote:
> From: Thomas Huth <thuth@redhat.com>
> 
> These files reference QEMU machine types that have already been
> removed and thus are of no use anymore.
> 
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
>   MAINTAINERS                                  |    1 -
>   tests/vmstate-static-checker-data/dump1.json | 1163 ------------------
>   tests/vmstate-static-checker-data/dump2.json |  968 ---------------
>   3 files changed, 2132 deletions(-)
>   delete mode 100644 tests/vmstate-static-checker-data/dump1.json
>   delete mode 100644 tests/vmstate-static-checker-data/dump2.json

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



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

* Re: [PATCH 1/4] tests/vmstate-static-checker-data: Remove old dump files
  2025-04-29 15:21 ` [PATCH 1/4] tests/vmstate-static-checker-data: Remove old dump files Thomas Huth
  2025-04-29 15:29   ` Philippe Mathieu-Daudé
@ 2025-04-29 22:13   ` Peter Xu
  2025-04-30 10:55     ` Thomas Huth
  1 sibling, 1 reply; 16+ messages in thread
From: Peter Xu @ 2025-04-29 22:13 UTC (permalink / raw)
  To: Thomas Huth; +Cc: qemu-devel, Fabiano Rosas, John Snow

On Tue, Apr 29, 2025 at 05:21:38PM +0200, Thomas Huth wrote:
> From: Thomas Huth <thuth@redhat.com>
> 
> These files reference QEMU machine types that have already been
> removed and thus are of no use anymore.
> 
> Signed-off-by: Thomas Huth <thuth@redhat.com>

I never noticed these files, but when looking it seems to me these two
dumps are tailored to be used to test the script itself..

See:

$ git ls tests/vmstate-static-checker-data/
e178113ff6 hw: Replace anti-social QOM type names
38ef86b5a6 tests: vmstate static checker: add size mismatch inside substructure
af3713f6b9 tests: vmstate static checker: add substructure for usb-kbd for hid section
c7173a9c18 tests: vmstate static checker: remove Subsections
aa2a12bb82 tests: vmstate static checker: remove a subsection
b5968f0ab3 tests: vmstate static checker: remove Description inside Fields
ff29b8573f tests: vmstate static checker: remove Description
083bac3484 tests: vmstate static checker: remove Fields
1d681c712a tests: vmstate static checker: change description name
fd52ffb9bf tests: vmstate static checker: remove last field in a struct
55e8e0e19c tests: vmstate static checker: remove a field
ab99bdbe33 tests: vmstate static checker: remove a section
7daa3d76df tests: vmstate static checker: minimum_version_id check
4efa6e1d64 tests: vmstate static checker: version mismatch inside a Description
a81d3fad87 tests: vmstate static checker: add version error in main section
bc178dc563 tests: vmstate static checker: incompat machine types
a10413e4fc tests: vmstate static checker: add dump1 and dump2 files

So dump2.json was deliberately modified to trigger all kinds of error that
the python script can detect.

Maybe we can still keep it there, but at least make it clearer that it's
testing the script?  For example, we could create a bash under the same dir
running the script over the two dumps and comparing the results to be the
expected one?

Currently the output:

$ scripts/vmstate-static-checker.py -s ./tests/vmstate-static-checker-data/dump1.json -d ./tests/vmstate-static-checker-data/dump2.json 
Warning: checking incompatible machine types: "pc-i440fx-2.1", "pc-i440fx-2.2"
Section "fw_cfg" does not exist in dest
Section "fusbh200-ehci-usb" version error: 2 > 1
Section "fusbh200-ehci-usb", Description "ehci-core": expected field "usbsts", got "usbsts_pending"; skipping rest
Section "pci-serial-4x" Description "pci-serial-multi": Entry "Fields" missing
Section "intel-hda-generic", Description "intel-hda", Field "pci": missing description
Section "cfi.pflash01": Entry "Description" missing
Section "megasas", Description "PCIDevice": expected field "irq_state", while dest has no further fields
Section "PIIX3-xen" Description "PIIX3": minimum version error: 1 < 2
Section "PIIX3-xen" Description "PIIX3": Entry "Subsections" missing
Section "tpci200": Description "tpci200" missing, got "tpci2002" instead; skipping
Section "sun-fdtwo" Description "fdc": version error: 2 > 1
Section "sun-fdtwo", Description "fdrive": Subsection "fdrive/media_rate" not found
Section "usb-kbd" Description "usb-kbd" Field "kbd.keycodes" size mismatch: 4 , 2

So the bash can make sure the result is exactly that.  If we want, we could
even route that to CI, but I'd say optional.

-- 
Peter Xu



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

* Re: [PATCH 2/4] scripts/vmstate-static-checker.py: Allow new name for ghes_addr_le field
  2025-04-29 15:21 ` [PATCH 2/4] scripts/vmstate-static-checker.py: Allow new name for ghes_addr_le field Thomas Huth
@ 2025-04-29 22:16   ` Peter Xu
  0 siblings, 0 replies; 16+ messages in thread
From: Peter Xu @ 2025-04-29 22:16 UTC (permalink / raw)
  To: Thomas Huth; +Cc: qemu-devel, Fabiano Rosas, John Snow

On Tue, Apr 29, 2025 at 05:21:39PM +0200, Thomas Huth wrote:
> From: Thomas Huth <thuth@redhat.com>
> 
> ghes_addr_le has been renamed to hw_error_le in commit 652f6d86cbb
> ("acpi/ghes: better name the offset of the hardware error firmware").
> Adjust the checker script to allow that changed field name.
> 
> Signed-off-by: Thomas Huth <thuth@redhat.com>

Reviewed-by: Peter Xu <peterx@redhat.com>

> ---
>  scripts/vmstate-static-checker.py | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/scripts/vmstate-static-checker.py b/scripts/vmstate-static-checker.py
> index 9c0e6b81f21..25aca839a03 100755
> --- a/scripts/vmstate-static-checker.py
> +++ b/scripts/vmstate-static-checker.py
> @@ -42,6 +42,7 @@ def check_fields_match(name, s_field, d_field):
>      # Some fields changed names between qemu versions.  This list
>      # is used to allow such changes in each section / description.
>      changed_names = {
> +        'acpi-ghes': ['ghes_addr_le', 'hw_error_le'],
>          'apic': ['timer', 'timer_expiry'],
>          'e1000': ['dev', 'parent_obj'],
>          'ehci': ['dev', 'pcidev'],
> -- 
> 2.49.0
> 

-- 
Peter Xu



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

* Re: [PATCH 3/4] tests/data/vmstate-static-checker: Add dump files from QEMU 7.2.17
  2025-04-29 15:21 ` [PATCH 3/4] tests/data/vmstate-static-checker: Add dump files from QEMU 7.2.17 Thomas Huth
@ 2025-04-29 22:30   ` Peter Xu
  2025-04-30 11:13     ` Thomas Huth
  0 siblings, 1 reply; 16+ messages in thread
From: Peter Xu @ 2025-04-29 22:30 UTC (permalink / raw)
  To: Thomas Huth; +Cc: qemu-devel, Fabiano Rosas, John Snow

On Tue, Apr 29, 2025 at 05:21:40PM +0200, Thomas Huth wrote:
> From: Thomas Huth <thuth@redhat.com>
> 
> For automatic tests, we need reference files from older QEMU versions.
> QEMU 7.2 is a long term stable release, so it's a good candidate for
> checking whether the migration could still work correctly. Let's add the
> files from that version that have been taken with the "-dump-vmstate"
> parameter of QEMU (compiled with single machines and the configure switch
> "--without-default-devices" to keep the json files reasonable small).
> 
> Some devices also have been removed manually from the json files, e.g.
> the "pci-bridge" (which can be disabled in later QEMU versions via Kconfig),
> and some Linux-related devices like "scsi-block" and "scsi-generic" and
> KVM-related devices. Without removing them, we might get errors otherwise
> if these devices have not been compiled into the destination QEMU build.
> 
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
>  MAINTAINERS                                   |    1 +
>  .../aarch64/virt-7.2.json                     | 2571 +++++++++++++
>  .../vmstate-static-checker/m68k/virt-7.2.json | 2936 ++++++++++++++
>  .../ppc64/pseries-7.2.json                    | 1068 ++++++
>  .../s390x/s390-ccw-virtio-7.2.json            |  475 +++
>  .../x86_64/pc-q35-7.2.json                    | 3402 +++++++++++++++++
>  6 files changed, 10453 insertions(+)
>  create mode 100644 tests/data/vmstate-static-checker/aarch64/virt-7.2.json
>  create mode 100644 tests/data/vmstate-static-checker/m68k/virt-7.2.json
>  create mode 100644 tests/data/vmstate-static-checker/ppc64/pseries-7.2.json
>  create mode 100644 tests/data/vmstate-static-checker/s390x/s390-ccw-virtio-7.2.json
>  create mode 100644 tests/data/vmstate-static-checker/x86_64/pc-q35-7.2.json

This looks like an improvement indeed, it so far only covers machine type
7.2, rather than all machine types.  I used to run these by hands before
each release.. and sometimes I forgot.  Before me, I am aware at least Dave
used to run also during softfreezes.

One thing I am wondering is if we can do it the same way as the compat
migration test in CI, so that we always compare with a base (which is the
previous release binary), then move the base after each release.

After all, due to migration-compat-common CI job, we always build the base
version of QEMU already in build-previous-qemu, so we already have two
binaries at hand.  IIUC we only need one new job to generate the two JSON
blobs, and feed them to the checker on both directions.

If that is the case, it might have a benefit that we can cover all the
machines as long as listed on both binaries, then check all of them?

Meanwhile, if we keep the ball rolling for each release (by boosting the
base QEMU binary version), IIUC it guarantees all the new binaries will
make sure to provide compatible VMSDs all across since we start running the
job.

Would that work?

-- 
Peter Xu



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

* Re: [PATCH 1/4] tests/vmstate-static-checker-data: Remove old dump files
  2025-04-29 22:13   ` Peter Xu
@ 2025-04-30 10:55     ` Thomas Huth
  0 siblings, 0 replies; 16+ messages in thread
From: Thomas Huth @ 2025-04-30 10:55 UTC (permalink / raw)
  To: Peter Xu; +Cc: qemu-devel, Fabiano Rosas, John Snow

On 30/04/2025 00.13, Peter Xu wrote:
> On Tue, Apr 29, 2025 at 05:21:38PM +0200, Thomas Huth wrote:
>> From: Thomas Huth <thuth@redhat.com>
>>
>> These files reference QEMU machine types that have already been
>> removed and thus are of no use anymore.
>>
>> Signed-off-by: Thomas Huth <thuth@redhat.com>
> 
> I never noticed these files, but when looking it seems to me these two
> dumps are tailored to be used to test the script itself..
> 
> See:
> 
> $ git ls tests/vmstate-static-checker-data/
> e178113ff6 hw: Replace anti-social QOM type names
> 38ef86b5a6 tests: vmstate static checker: add size mismatch inside substructure
> af3713f6b9 tests: vmstate static checker: add substructure for usb-kbd for hid section
> c7173a9c18 tests: vmstate static checker: remove Subsections
> aa2a12bb82 tests: vmstate static checker: remove a subsection
> b5968f0ab3 tests: vmstate static checker: remove Description inside Fields
> ff29b8573f tests: vmstate static checker: remove Description
> 083bac3484 tests: vmstate static checker: remove Fields
> 1d681c712a tests: vmstate static checker: change description name
> fd52ffb9bf tests: vmstate static checker: remove last field in a struct
> 55e8e0e19c tests: vmstate static checker: remove a field
> ab99bdbe33 tests: vmstate static checker: remove a section
> 7daa3d76df tests: vmstate static checker: minimum_version_id check
> 4efa6e1d64 tests: vmstate static checker: version mismatch inside a Description
> a81d3fad87 tests: vmstate static checker: add version error in main section
> bc178dc563 tests: vmstate static checker: incompat machine types
> a10413e4fc tests: vmstate static checker: add dump1 and dump2 files
> 
> So dump2.json was deliberately modified to trigger all kinds of error that
> the python script can detect.

Oh, good point, I should have looked at the history, too! ... the files 
clearly lacked an explanation / script that is using them!

> Maybe we can still keep it there, but at least make it clearer that it's
> testing the script?  For example, we could create a bash under the same dir
> running the script over the two dumps and comparing the results to be the
> expected one?
> 
> Currently the output:
> 
> $ scripts/vmstate-static-checker.py -s ./tests/vmstate-static-checker-data/dump1.json -d ./tests/vmstate-static-checker-data/dump2.json
> Warning: checking incompatible machine types: "pc-i440fx-2.1", "pc-i440fx-2.2"
> Section "fw_cfg" does not exist in dest
> Section "fusbh200-ehci-usb" version error: 2 > 1
> Section "fusbh200-ehci-usb", Description "ehci-core": expected field "usbsts", got "usbsts_pending"; skipping rest
> Section "pci-serial-4x" Description "pci-serial-multi": Entry "Fields" missing
> Section "intel-hda-generic", Description "intel-hda", Field "pci": missing description
> Section "cfi.pflash01": Entry "Description" missing
> Section "megasas", Description "PCIDevice": expected field "irq_state", while dest has no further fields
> Section "PIIX3-xen" Description "PIIX3": minimum version error: 1 < 2
> Section "PIIX3-xen" Description "PIIX3": Entry "Subsections" missing
> Section "tpci200": Description "tpci200" missing, got "tpci2002" instead; skipping
> Section "sun-fdtwo" Description "fdc": version error: 2 > 1
> Section "sun-fdtwo", Description "fdrive": Subsection "fdrive/media_rate" not found
> Section "usb-kbd" Description "usb-kbd" Field "kbd.keycodes" size mismatch: 4 , 2
> 
> So the bash can make sure the result is exactly that.  If we want, we could
> even route that to CI, but I'd say optional.

I can include such a test in the functional python test, no need for a 
separate bash script here, I think. I'll try to include that in v2.

  Thomas



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

* Re: [PATCH 3/4] tests/data/vmstate-static-checker: Add dump files from QEMU 7.2.17
  2025-04-29 22:30   ` Peter Xu
@ 2025-04-30 11:13     ` Thomas Huth
  2025-04-30 15:46       ` Peter Xu
  0 siblings, 1 reply; 16+ messages in thread
From: Thomas Huth @ 2025-04-30 11:13 UTC (permalink / raw)
  To: Peter Xu; +Cc: qemu-devel, Fabiano Rosas, John Snow

On 30/04/2025 00.30, Peter Xu wrote:
> On Tue, Apr 29, 2025 at 05:21:40PM +0200, Thomas Huth wrote:
>> From: Thomas Huth <thuth@redhat.com>
>>
>> For automatic tests, we need reference files from older QEMU versions.
>> QEMU 7.2 is a long term stable release, so it's a good candidate for
>> checking whether the migration could still work correctly. Let's add the
>> files from that version that have been taken with the "-dump-vmstate"
>> parameter of QEMU (compiled with single machines and the configure switch
>> "--without-default-devices" to keep the json files reasonable small).
>>
>> Some devices also have been removed manually from the json files, e.g.
>> the "pci-bridge" (which can be disabled in later QEMU versions via Kconfig),
>> and some Linux-related devices like "scsi-block" and "scsi-generic" and
>> KVM-related devices. Without removing them, we might get errors otherwise
>> if these devices have not been compiled into the destination QEMU build.
>>
>> Signed-off-by: Thomas Huth <thuth@redhat.com>
>> ---
>>   MAINTAINERS                                   |    1 +
>>   .../aarch64/virt-7.2.json                     | 2571 +++++++++++++
>>   .../vmstate-static-checker/m68k/virt-7.2.json | 2936 ++++++++++++++
>>   .../ppc64/pseries-7.2.json                    | 1068 ++++++
>>   .../s390x/s390-ccw-virtio-7.2.json            |  475 +++
>>   .../x86_64/pc-q35-7.2.json                    | 3402 +++++++++++++++++
>>   6 files changed, 10453 insertions(+)
>>   create mode 100644 tests/data/vmstate-static-checker/aarch64/virt-7.2.json
>>   create mode 100644 tests/data/vmstate-static-checker/m68k/virt-7.2.json
>>   create mode 100644 tests/data/vmstate-static-checker/ppc64/pseries-7.2.json
>>   create mode 100644 tests/data/vmstate-static-checker/s390x/s390-ccw-virtio-7.2.json
>>   create mode 100644 tests/data/vmstate-static-checker/x86_64/pc-q35-7.2.json
> 
> This looks like an improvement indeed, it so far only covers machine type
> 7.2, rather than all machine types.  I used to run these by hands before
> each release.. and sometimes I forgot.  Before me, I am aware at least Dave
> used to run also during softfreezes.

Since I had to strip down the dump files quite a bit (compiling QEMU with 
--without-default-devices etc.) to avoid errors when the current build is 
limited, it's maybe best if you continue checking manually at least once 
during the soft-freeze with a non-stripped json file.

> One thing I am wondering is if we can do it the same way as the compat
> migration test in CI, so that we always compare with a base (which is the
> previous release binary), then move the base after each release.
> 
> After all, due to migration-compat-common CI job, we always build the base
> version of QEMU already in build-previous-qemu, so we already have two
> binaries at hand.  IIUC we only need one new job to generate the two JSON
> blobs, and feed them to the checker on both directions.
> 
> If that is the case, it might have a benefit that we can cover all the
> machines as long as listed on both binaries, then check all of them?
> 
> Meanwhile, if we keep the ball rolling for each release (by boosting the
> base QEMU binary version), IIUC it guarantees all the new binaries will
> make sure to provide compatible VMSDs all across since we start running the
> job.
> 
> Would that work?

I can have a try, though we might need to teach the checker script some more 
things first, e.g. it's getting confused if we clean up old and unnecessary 
fields like in commit 445d3facffe82788b880107c0849dab9505b33d9 ...

  Thomas



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

* Re: [PATCH 3/4] tests/data/vmstate-static-checker: Add dump files from QEMU 7.2.17
  2025-04-30 11:13     ` Thomas Huth
@ 2025-04-30 15:46       ` Peter Xu
  0 siblings, 0 replies; 16+ messages in thread
From: Peter Xu @ 2025-04-30 15:46 UTC (permalink / raw)
  To: Thomas Huth; +Cc: qemu-devel, Fabiano Rosas, John Snow

On Wed, Apr 30, 2025 at 01:13:48PM +0200, Thomas Huth wrote:
> On 30/04/2025 00.30, Peter Xu wrote:
> > On Tue, Apr 29, 2025 at 05:21:40PM +0200, Thomas Huth wrote:
> > > From: Thomas Huth <thuth@redhat.com>
> > > 
> > > For automatic tests, we need reference files from older QEMU versions.
> > > QEMU 7.2 is a long term stable release, so it's a good candidate for
> > > checking whether the migration could still work correctly. Let's add the
> > > files from that version that have been taken with the "-dump-vmstate"
> > > parameter of QEMU (compiled with single machines and the configure switch
> > > "--without-default-devices" to keep the json files reasonable small).
> > > 
> > > Some devices also have been removed manually from the json files, e.g.
> > > the "pci-bridge" (which can be disabled in later QEMU versions via Kconfig),
> > > and some Linux-related devices like "scsi-block" and "scsi-generic" and
> > > KVM-related devices. Without removing them, we might get errors otherwise
> > > if these devices have not been compiled into the destination QEMU build.
> > > 
> > > Signed-off-by: Thomas Huth <thuth@redhat.com>
> > > ---
> > >   MAINTAINERS                                   |    1 +
> > >   .../aarch64/virt-7.2.json                     | 2571 +++++++++++++
> > >   .../vmstate-static-checker/m68k/virt-7.2.json | 2936 ++++++++++++++
> > >   .../ppc64/pseries-7.2.json                    | 1068 ++++++
> > >   .../s390x/s390-ccw-virtio-7.2.json            |  475 +++
> > >   .../x86_64/pc-q35-7.2.json                    | 3402 +++++++++++++++++
> > >   6 files changed, 10453 insertions(+)
> > >   create mode 100644 tests/data/vmstate-static-checker/aarch64/virt-7.2.json
> > >   create mode 100644 tests/data/vmstate-static-checker/m68k/virt-7.2.json
> > >   create mode 100644 tests/data/vmstate-static-checker/ppc64/pseries-7.2.json
> > >   create mode 100644 tests/data/vmstate-static-checker/s390x/s390-ccw-virtio-7.2.json
> > >   create mode 100644 tests/data/vmstate-static-checker/x86_64/pc-q35-7.2.json
> > 
> > This looks like an improvement indeed, it so far only covers machine type
> > 7.2, rather than all machine types.  I used to run these by hands before
> > each release.. and sometimes I forgot.  Before me, I am aware at least Dave
> > used to run also during softfreezes.
> 
> Since I had to strip down the dump files quite a bit (compiling QEMU with
> --without-default-devices etc.) to avoid errors when the current build is
> limited, it's maybe best if you continue checking manually at least once
> during the soft-freeze with a non-stripped json file.

Yep, will do (if I won't forget to..).

> 
> > One thing I am wondering is if we can do it the same way as the compat
> > migration test in CI, so that we always compare with a base (which is the
> > previous release binary), then move the base after each release.
> > 
> > After all, due to migration-compat-common CI job, we always build the base
> > version of QEMU already in build-previous-qemu, so we already have two
> > binaries at hand.  IIUC we only need one new job to generate the two JSON
> > blobs, and feed them to the checker on both directions.
> > 
> > If that is the case, it might have a benefit that we can cover all the
> > machines as long as listed on both binaries, then check all of them?
> > 
> > Meanwhile, if we keep the ball rolling for each release (by boosting the
> > base QEMU binary version), IIUC it guarantees all the new binaries will
> > make sure to provide compatible VMSDs all across since we start running the
> > job.
> > 
> > Would that work?
> 
> I can have a try, though we might need to teach the checker script some more
> things first, e.g. it's getting confused if we clean up old and unnecessary
> fields like in commit 445d3facffe82788b880107c0849dab9505b33d9 ...

Right, we definitely want to have such job allow_failure set.. And this is
also not the only way to fail it, e.g. I just ran it on the latest 10.0 for
q35-9.2 machine type, then I spot two more failures besides what you fixed
in this series.

x1:bin [migration-staging]$ ../scripts/vmstate-static-checker.py -s ./json.9.2 -d ./json.10.0 
Section "sysbus-ahci" does not exist in dest
Section "hpet", Description "hpet": expected field "num_timers", got "num_timers_save"; skipping rest

The first one is caused by a Kconfig change - CONFIG_AHCI used to be
selected via hw/ide on x86, now since there's the new ahci-sysbus.c since
1b26146e898086 in 10.0, vmstate_sysbus_ahci isn't available anymore on x86,
but only selected by hw/arm/Kconfig even if I built the binary using
exactly the same setup.

The 2nd one is a rename which is similarly benign.  I'll throw a patch soon
for that.

If one step further.. maybe we could also cache the checker's output for
each (arch, machine type) tuple, then we mark the job fail only if the
output changes.  That may help to warn maintainers that something changed
the VMSD so one can have a look.  But we could start from simple..

-- 
Peter Xu



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

* Re: [PATCH 4/4] tests/functional: Test with scripts/vmstate-static-checker.py
  2025-04-29 15:21 ` [PATCH 4/4] tests/functional: Test with scripts/vmstate-static-checker.py Thomas Huth
@ 2025-04-30 16:10   ` Pierrick Bouvier
  2025-05-01 14:28     ` Peter Xu
  0 siblings, 1 reply; 16+ messages in thread
From: Pierrick Bouvier @ 2025-04-30 16:10 UTC (permalink / raw)
  To: Thomas Huth, qemu-devel, Fabiano Rosas; +Cc: Peter Xu, John Snow

On 4/29/25 8:21 AM, Thomas Huth wrote:
> From: Thomas Huth <thuth@redhat.com>
> 
> We've got this nice vmstate-static-checker.py script that can help
> to detect screw-ups in the migration states. Unfortunately, it's
> currently only run manually, so there could be regressions that nobody
> notices immediately. Let's run it from a functional test automatically
> so that we got at least a basic coverage in each CI run.
> 
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
>   MAINTAINERS                      |  1 +
>   tests/functional/meson.build     | 13 +++++++-
>   tests/functional/test_vmstate.py | 56 ++++++++++++++++++++++++++++++++
>   3 files changed, 69 insertions(+), 1 deletion(-)
>   create mode 100755 tests/functional/test_vmstate.py
> 
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 65fb61844b3..6a8d81458ad 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -3525,6 +3525,7 @@ F: migration/
>   F: scripts/vmstate-static-checker.py
>   F: tests/data/vmstate-static-checker/
>   F: tests/functional/test_migration.py
> +F: tests/functional/test_vmstate.py
>   F: tests/qtest/migration/
>   F: tests/qtest/migration-*
>   F: docs/devel/migration/
> diff --git a/tests/functional/meson.build b/tests/functional/meson.build
> index b317ad42c5a..9f339e626f6 100644
> --- a/tests/functional/meson.build
> +++ b/tests/functional/meson.build
> @@ -76,6 +76,7 @@ tests_generic_bsduser = [
>   
>   tests_aarch64_system_quick = [
>     'migration',
> +  'vmstate',
>   ]
>   
>   tests_aarch64_system_thorough = [
> @@ -164,6 +165,10 @@ tests_loongarch64_system_thorough = [
>     'loongarch64_virt',
>   ]
>   
> +tests_m68k_system_quick = [
> +  'vmstate',
> +]
> +
>   tests_m68k_system_thorough = [
>     'm68k_mcf5208evb',
>     'm68k_nextcube',
> @@ -230,6 +235,7 @@ tests_ppc_system_thorough = [
>   
>   tests_ppc64_system_quick = [
>     'migration',
> +  'vmstate',
>   ]
>   
>   tests_ppc64_system_thorough = [
> @@ -265,6 +271,10 @@ tests_rx_system_thorough = [
>     'rx_gdbsim',
>   ]
>   
> +tests_s390x_system_quick = [
> +  'vmstate',
> +]
> +
>   tests_s390x_system_thorough = [
>     's390x_ccw_virtio',
>     's390x_replay',
> @@ -305,8 +315,9 @@ tests_x86_64_system_quick = [
>     'migration',
>     'pc_cpu_hotplug_props',
>     'virtio_version',
> -  'x86_cpu_model_versions',
> +  'vmstate',
>     'vnc',
> +  'x86_cpu_model_versions',
>   ]
>   
>   tests_x86_64_system_thorough = [
> diff --git a/tests/functional/test_vmstate.py b/tests/functional/test_vmstate.py
> new file mode 100755
> index 00000000000..3ba56d580db
> --- /dev/null
> +++ b/tests/functional/test_vmstate.py
> @@ -0,0 +1,56 @@
> +#!/usr/bin/env python3
> +#
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +#
> +# This test runs the vmstate-static-checker script with the current QEMU
> +
> +import subprocess
> +
> +from qemu_test import QemuSystemTest
> +
> +
> +class VmStateTest(QemuSystemTest):
> +
> +    def test_vmstate(self):
> +        target_machine = {
> +            'aarch64': 'virt-7.2',
> +            'm68k': 'virt-7.2',
> +            'ppc64': 'pseries-7.2',
> +            's390x': 's390-ccw-virtio-7.2',
> +            'x86_64': 'pc-q35-7.2',
> +        }
> +        self.set_machine(target_machine[self.arch])
> +
> +        # Run QEMU to get the current vmstate json file:
> +        dst_json = self.scratch_file('dest.json')
> +        self.log.info('Dumping vmstate from ' + self.qemu_bin)
> +        cp = subprocess.run([self.qemu_bin, '-nodefaults',
> +                             '-M', target_machine[self.arch],
> +                             '-dump-vmstate', dst_json],
> +                            stdout=subprocess.PIPE,
> +                            stderr=subprocess.STDOUT,
> +                            text=True)
> +        if cp.returncode != 0:
> +            self.fail('Running QEMU failed:\n' + cp.stdout)
> +        if cp.stdout:
> +            self.log.info('QEMU output: ' + cp.stdout)
> +
> +        # Check whether the old vmstate json file is still compatible:
> +        src_json = self.data_file('..', 'data', 'vmstate-static-checker',
> +                                  self.arch,
> +                                  target_machine[self.arch] + '.json')
> +        vmstate_checker = self.data_file('..', '..', 'scripts',
> +                                         'vmstate-static-checker.py')
> +        self.log.info('Comparing vmstate with ' + src_json)
> +        cp = subprocess.run([vmstate_checker, '-s', src_json, '-d', dst_json],
> +                            stdout=subprocess.PIPE,
> +                            stderr=subprocess.STDOUT,
> +                            text=True)
> +        if cp.returncode != 0:
> +            self.fail('Running vmstate-static-checker failed:\n' + cp.stdout)
> +        if cp.stdout:
> +            self.log.warning('vmstate-static-checker output: ' + cp.stdout)
> +
> +
> +if __name__ == '__main__':
> +    QemuSystemTest.main()

Thanks for this series Thomas, it's very useful.
Could we extend this automatically to test migration on all 
combinations: {qemu-system-*} x {machine}?
We could generate a single list of references, containing hashes of all 
outputs, and a simple and clean command to regenerate all those, and 
associated jsons, so we don't pollute qemu code with tons of json.

This way, we can automatically detect that we never regress, not only 
from release to release, but commit to commit.

In case we need to update reference, people can point what's the actual 
difference in the commit message.

As well, since I took a look into that before, this check is not enough 
regarding migration. Beyonds the VMDstate, we should check as well that 
the default values of every field are not changed. For instance, we 
recently changed the default pauth property of arm cpus, and without a 
careful backcompat, it would have break migration. It's a bit more 
tricky, since there is nothing available now to dump this (I hacked that 
using a custom trace). And definitely not something in the scope of your 
series, just worth mentioning.

I hope we can one day get rid of all "Is this change safe regarding 
migration?" comments because we know we can trust our CI instead.

Regards,
Pierrick


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

* Re: [PATCH 4/4] tests/functional: Test with scripts/vmstate-static-checker.py
  2025-04-30 16:10   ` Pierrick Bouvier
@ 2025-05-01 14:28     ` Peter Xu
  2025-05-01 15:58       ` Pierrick Bouvier
  0 siblings, 1 reply; 16+ messages in thread
From: Peter Xu @ 2025-05-01 14:28 UTC (permalink / raw)
  To: Pierrick Bouvier; +Cc: Thomas Huth, qemu-devel, Fabiano Rosas, John Snow

On Wed, Apr 30, 2025 at 09:10:30AM -0700, Pierrick Bouvier wrote:
> On 4/29/25 8:21 AM, Thomas Huth wrote:
> > From: Thomas Huth <thuth@redhat.com>
> > 
> > We've got this nice vmstate-static-checker.py script that can help
> > to detect screw-ups in the migration states. Unfortunately, it's
> > currently only run manually, so there could be regressions that nobody
> > notices immediately. Let's run it from a functional test automatically
> > so that we got at least a basic coverage in each CI run.
> > 
> > Signed-off-by: Thomas Huth <thuth@redhat.com>
> > ---
> >   MAINTAINERS                      |  1 +
> >   tests/functional/meson.build     | 13 +++++++-
> >   tests/functional/test_vmstate.py | 56 ++++++++++++++++++++++++++++++++
> >   3 files changed, 69 insertions(+), 1 deletion(-)
> >   create mode 100755 tests/functional/test_vmstate.py
> > 
> > diff --git a/MAINTAINERS b/MAINTAINERS
> > index 65fb61844b3..6a8d81458ad 100644
> > --- a/MAINTAINERS
> > +++ b/MAINTAINERS
> > @@ -3525,6 +3525,7 @@ F: migration/
> >   F: scripts/vmstate-static-checker.py
> >   F: tests/data/vmstate-static-checker/
> >   F: tests/functional/test_migration.py
> > +F: tests/functional/test_vmstate.py
> >   F: tests/qtest/migration/
> >   F: tests/qtest/migration-*
> >   F: docs/devel/migration/
> > diff --git a/tests/functional/meson.build b/tests/functional/meson.build
> > index b317ad42c5a..9f339e626f6 100644
> > --- a/tests/functional/meson.build
> > +++ b/tests/functional/meson.build
> > @@ -76,6 +76,7 @@ tests_generic_bsduser = [
> >   tests_aarch64_system_quick = [
> >     'migration',
> > +  'vmstate',
> >   ]
> >   tests_aarch64_system_thorough = [
> > @@ -164,6 +165,10 @@ tests_loongarch64_system_thorough = [
> >     'loongarch64_virt',
> >   ]
> > +tests_m68k_system_quick = [
> > +  'vmstate',
> > +]
> > +
> >   tests_m68k_system_thorough = [
> >     'm68k_mcf5208evb',
> >     'm68k_nextcube',
> > @@ -230,6 +235,7 @@ tests_ppc_system_thorough = [
> >   tests_ppc64_system_quick = [
> >     'migration',
> > +  'vmstate',
> >   ]
> >   tests_ppc64_system_thorough = [
> > @@ -265,6 +271,10 @@ tests_rx_system_thorough = [
> >     'rx_gdbsim',
> >   ]
> > +tests_s390x_system_quick = [
> > +  'vmstate',
> > +]
> > +
> >   tests_s390x_system_thorough = [
> >     's390x_ccw_virtio',
> >     's390x_replay',
> > @@ -305,8 +315,9 @@ tests_x86_64_system_quick = [
> >     'migration',
> >     'pc_cpu_hotplug_props',
> >     'virtio_version',
> > -  'x86_cpu_model_versions',
> > +  'vmstate',
> >     'vnc',
> > +  'x86_cpu_model_versions',
> >   ]
> >   tests_x86_64_system_thorough = [
> > diff --git a/tests/functional/test_vmstate.py b/tests/functional/test_vmstate.py
> > new file mode 100755
> > index 00000000000..3ba56d580db
> > --- /dev/null
> > +++ b/tests/functional/test_vmstate.py
> > @@ -0,0 +1,56 @@
> > +#!/usr/bin/env python3
> > +#
> > +# SPDX-License-Identifier: GPL-2.0-or-later
> > +#
> > +# This test runs the vmstate-static-checker script with the current QEMU
> > +
> > +import subprocess
> > +
> > +from qemu_test import QemuSystemTest
> > +
> > +
> > +class VmStateTest(QemuSystemTest):
> > +
> > +    def test_vmstate(self):
> > +        target_machine = {
> > +            'aarch64': 'virt-7.2',
> > +            'm68k': 'virt-7.2',
> > +            'ppc64': 'pseries-7.2',
> > +            's390x': 's390-ccw-virtio-7.2',
> > +            'x86_64': 'pc-q35-7.2',
> > +        }
> > +        self.set_machine(target_machine[self.arch])
> > +
> > +        # Run QEMU to get the current vmstate json file:
> > +        dst_json = self.scratch_file('dest.json')
> > +        self.log.info('Dumping vmstate from ' + self.qemu_bin)
> > +        cp = subprocess.run([self.qemu_bin, '-nodefaults',
> > +                             '-M', target_machine[self.arch],
> > +                             '-dump-vmstate', dst_json],
> > +                            stdout=subprocess.PIPE,
> > +                            stderr=subprocess.STDOUT,
> > +                            text=True)
> > +        if cp.returncode != 0:
> > +            self.fail('Running QEMU failed:\n' + cp.stdout)
> > +        if cp.stdout:
> > +            self.log.info('QEMU output: ' + cp.stdout)
> > +
> > +        # Check whether the old vmstate json file is still compatible:
> > +        src_json = self.data_file('..', 'data', 'vmstate-static-checker',
> > +                                  self.arch,
> > +                                  target_machine[self.arch] + '.json')
> > +        vmstate_checker = self.data_file('..', '..', 'scripts',
> > +                                         'vmstate-static-checker.py')
> > +        self.log.info('Comparing vmstate with ' + src_json)
> > +        cp = subprocess.run([vmstate_checker, '-s', src_json, '-d', dst_json],
> > +                            stdout=subprocess.PIPE,
> > +                            stderr=subprocess.STDOUT,
> > +                            text=True)
> > +        if cp.returncode != 0:
> > +            self.fail('Running vmstate-static-checker failed:\n' + cp.stdout)
> > +        if cp.stdout:
> > +            self.log.warning('vmstate-static-checker output: ' + cp.stdout)
> > +
> > +
> > +if __name__ == '__main__':
> > +    QemuSystemTest.main()
> 
> Thanks for this series Thomas, it's very useful.
> Could we extend this automatically to test migration on all combinations:
> {qemu-system-*} x {machine}?
> We could generate a single list of references, containing hashes of all
> outputs, and a simple and clean command to regenerate all those, and
> associated jsons, so we don't pollute qemu code with tons of json.

I think a major challenge would be false positives, and how to filter
them.. when we put anything into CI.

Side note: yesterday I just wrote a script to do exactly this, by auto
build binaries and check all relevant archs over all machine types
supported.  It looks like this:

https://gitlab.com/peterx/qemu/-/commit/c4abfa39f8943cd62f0d982ecb36537df398ae70

The plan is I can run this at the end of each release, though.. not yet for
CI.  I also don't have plan to upstream this script, maybe I'll keep it
myself as of now unless someone thinks we should have it.

PS: I just ran it over v9.2..v10.0 over the default 4 archs
(x86,arm,ppc,s390) and a huge list was generated..  I believe most of them
are false positives, I'll delay walking the list for some time..  I
attached the result at the end in case anyone is interested.

> 
> This way, we can automatically detect that we never regress, not only from
> release to release, but commit to commit.
> 
> In case we need to update reference, people can point what's the actual
> difference in the commit message.
> 
> As well, since I took a look into that before, this check is not enough
> regarding migration. Beyonds the VMDstate, we should check as well that the
> default values of every field are not changed. For instance, we recently
> changed the default pauth property of arm cpus, and without a careful
> backcompat, it would have break migration. It's a bit more tricky, since
> there is nothing available now to dump this (I hacked that using a custom
> trace). And definitely not something in the scope of your series, just worth
> mentioning.
> 
> I hope we can one day get rid of all "Is this change safe regarding
> migration?" comments because we know we can trust our CI instead.

IMHO it's extremely hard (if not impossible) to guarantee that, because
some migration bug may only trigger in special paths that not always
happen, e.g. it can even involve guest driver behavior.

Said that, Fabiano used to work on supporting device-specific tests in
qtests/migration-test.c.  I don't think it landed but maybe we have room
for specific device tests using qtests/migration-test.c framework.

https://lore.kernel.org/all/20240523201922.28007-1-farosas@suse.de/

Thanks,

-- 
Peter Xu



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

* Re: [PATCH 4/4] tests/functional: Test with scripts/vmstate-static-checker.py
  2025-05-01 14:28     ` Peter Xu
@ 2025-05-01 15:58       ` Pierrick Bouvier
  2025-05-06 22:05         ` Peter Xu
  0 siblings, 1 reply; 16+ messages in thread
From: Pierrick Bouvier @ 2025-05-01 15:58 UTC (permalink / raw)
  To: Peter Xu; +Cc: Thomas Huth, qemu-devel, Fabiano Rosas, John Snow

On 5/1/25 7:28 AM, Peter Xu wrote:
> On Wed, Apr 30, 2025 at 09:10:30AM -0700, Pierrick Bouvier wrote:
>> On 4/29/25 8:21 AM, Thomas Huth wrote:
>>> From: Thomas Huth <thuth@redhat.com>
>>>
>>> We've got this nice vmstate-static-checker.py script that can help
>>> to detect screw-ups in the migration states. Unfortunately, it's
>>> currently only run manually, so there could be regressions that nobody
>>> notices immediately. Let's run it from a functional test automatically
>>> so that we got at least a basic coverage in each CI run.
>>>
>>> Signed-off-by: Thomas Huth <thuth@redhat.com>
>>> ---
>>>    MAINTAINERS                      |  1 +
>>>    tests/functional/meson.build     | 13 +++++++-
>>>    tests/functional/test_vmstate.py | 56 ++++++++++++++++++++++++++++++++
>>>    3 files changed, 69 insertions(+), 1 deletion(-)
>>>    create mode 100755 tests/functional/test_vmstate.py
>>>
>>> diff --git a/MAINTAINERS b/MAINTAINERS
>>> index 65fb61844b3..6a8d81458ad 100644
>>> --- a/MAINTAINERS
>>> +++ b/MAINTAINERS
>>> @@ -3525,6 +3525,7 @@ F: migration/
>>>    F: scripts/vmstate-static-checker.py
>>>    F: tests/data/vmstate-static-checker/
>>>    F: tests/functional/test_migration.py
>>> +F: tests/functional/test_vmstate.py
>>>    F: tests/qtest/migration/
>>>    F: tests/qtest/migration-*
>>>    F: docs/devel/migration/
>>> diff --git a/tests/functional/meson.build b/tests/functional/meson.build
>>> index b317ad42c5a..9f339e626f6 100644
>>> --- a/tests/functional/meson.build
>>> +++ b/tests/functional/meson.build
>>> @@ -76,6 +76,7 @@ tests_generic_bsduser = [
>>>    tests_aarch64_system_quick = [
>>>      'migration',
>>> +  'vmstate',
>>>    ]
>>>    tests_aarch64_system_thorough = [
>>> @@ -164,6 +165,10 @@ tests_loongarch64_system_thorough = [
>>>      'loongarch64_virt',
>>>    ]
>>> +tests_m68k_system_quick = [
>>> +  'vmstate',
>>> +]
>>> +
>>>    tests_m68k_system_thorough = [
>>>      'm68k_mcf5208evb',
>>>      'm68k_nextcube',
>>> @@ -230,6 +235,7 @@ tests_ppc_system_thorough = [
>>>    tests_ppc64_system_quick = [
>>>      'migration',
>>> +  'vmstate',
>>>    ]
>>>    tests_ppc64_system_thorough = [
>>> @@ -265,6 +271,10 @@ tests_rx_system_thorough = [
>>>      'rx_gdbsim',
>>>    ]
>>> +tests_s390x_system_quick = [
>>> +  'vmstate',
>>> +]
>>> +
>>>    tests_s390x_system_thorough = [
>>>      's390x_ccw_virtio',
>>>      's390x_replay',
>>> @@ -305,8 +315,9 @@ tests_x86_64_system_quick = [
>>>      'migration',
>>>      'pc_cpu_hotplug_props',
>>>      'virtio_version',
>>> -  'x86_cpu_model_versions',
>>> +  'vmstate',
>>>      'vnc',
>>> +  'x86_cpu_model_versions',
>>>    ]
>>>    tests_x86_64_system_thorough = [
>>> diff --git a/tests/functional/test_vmstate.py b/tests/functional/test_vmstate.py
>>> new file mode 100755
>>> index 00000000000..3ba56d580db
>>> --- /dev/null
>>> +++ b/tests/functional/test_vmstate.py
>>> @@ -0,0 +1,56 @@
>>> +#!/usr/bin/env python3
>>> +#
>>> +# SPDX-License-Identifier: GPL-2.0-or-later
>>> +#
>>> +# This test runs the vmstate-static-checker script with the current QEMU
>>> +
>>> +import subprocess
>>> +
>>> +from qemu_test import QemuSystemTest
>>> +
>>> +
>>> +class VmStateTest(QemuSystemTest):
>>> +
>>> +    def test_vmstate(self):
>>> +        target_machine = {
>>> +            'aarch64': 'virt-7.2',
>>> +            'm68k': 'virt-7.2',
>>> +            'ppc64': 'pseries-7.2',
>>> +            's390x': 's390-ccw-virtio-7.2',
>>> +            'x86_64': 'pc-q35-7.2',
>>> +        }
>>> +        self.set_machine(target_machine[self.arch])
>>> +
>>> +        # Run QEMU to get the current vmstate json file:
>>> +        dst_json = self.scratch_file('dest.json')
>>> +        self.log.info('Dumping vmstate from ' + self.qemu_bin)
>>> +        cp = subprocess.run([self.qemu_bin, '-nodefaults',
>>> +                             '-M', target_machine[self.arch],
>>> +                             '-dump-vmstate', dst_json],
>>> +                            stdout=subprocess.PIPE,
>>> +                            stderr=subprocess.STDOUT,
>>> +                            text=True)
>>> +        if cp.returncode != 0:
>>> +            self.fail('Running QEMU failed:\n' + cp.stdout)
>>> +        if cp.stdout:
>>> +            self.log.info('QEMU output: ' + cp.stdout)
>>> +
>>> +        # Check whether the old vmstate json file is still compatible:
>>> +        src_json = self.data_file('..', 'data', 'vmstate-static-checker',
>>> +                                  self.arch,
>>> +                                  target_machine[self.arch] + '.json')
>>> +        vmstate_checker = self.data_file('..', '..', 'scripts',
>>> +                                         'vmstate-static-checker.py')
>>> +        self.log.info('Comparing vmstate with ' + src_json)
>>> +        cp = subprocess.run([vmstate_checker, '-s', src_json, '-d', dst_json],
>>> +                            stdout=subprocess.PIPE,
>>> +                            stderr=subprocess.STDOUT,
>>> +                            text=True)
>>> +        if cp.returncode != 0:
>>> +            self.fail('Running vmstate-static-checker failed:\n' + cp.stdout)
>>> +        if cp.stdout:
>>> +            self.log.warning('vmstate-static-checker output: ' + cp.stdout)
>>> +
>>> +
>>> +if __name__ == '__main__':
>>> +    QemuSystemTest.main()
>>
>> Thanks for this series Thomas, it's very useful.
>> Could we extend this automatically to test migration on all combinations:
>> {qemu-system-*} x {machine}?
>> We could generate a single list of references, containing hashes of all
>> outputs, and a simple and clean command to regenerate all those, and
>> associated jsons, so we don't pollute qemu code with tons of json.
> 
> I think a major challenge would be false positives, and how to filter
> them.. when we put anything into CI.
>

A fail would be expected everytime something changes:
- it can be a default field that has a new value (particularly sensitive 
for cpus)
- it can be a new cpu field that is added
- it can be a board definition change
- it can be a hardware related change

In all cases, even though it does not break migration, it's interesting 
to know such a change happen.
As well, if it's simple to update and get differences of the various 
dumps per {binary, board}, then it's trivial to identify and comment the 
"false positive". The more often it runs (ideally, per PR, or per 
series), the easier it is to identify what changed.

> Side note: yesterday I just wrote a script to do exactly this, by auto
> build binaries and check all relevant archs over all machine types
> supported.  It looks like this:
> 
> https://gitlab.com/peterx/qemu/-/commit/c4abfa39f8943cd62f0d982ecb36537df398ae70
> 
> The plan is I can run this at the end of each release, though.. not yet for
> CI.  I also don't have plan to upstream this script, maybe I'll keep it
> myself as of now unless someone thinks we should have it.
>

Glad to hear we have a script, but sad to hear "will run manually once 
every 6 months".

> PS: I just ran it over v9.2..v10.0 over the default 4 archs
> (x86,arm,ppc,s390) and a huge list was generated..  I believe most of them
> are false positives, I'll delay walking the list for some time..  I
> attached the result at the end in case anyone is interested.
>

Would that be possible to post this on an online forge like GitLab, and 
commit the previous and new versions of dumps (the data, not the list of 
failures), so we can see all the differences in a nice way?

>>
>> This way, we can automatically detect that we never regress, not only from
>> release to release, but commit to commit.
>>
>> In case we need to update reference, people can point what's the actual
>> difference in the commit message.
>>
>> As well, since I took a look into that before, this check is not enough
>> regarding migration. Beyonds the VMDstate, we should check as well that the
>> default values of every field are not changed. For instance, we recently
>> changed the default pauth property of arm cpus, and without a careful
>> backcompat, it would have break migration. It's a bit more tricky, since
>> there is nothing available now to dump this (I hacked that using a custom
>> trace). And definitely not something in the scope of your series, just worth
>> mentioning.
>>
>> I hope we can one day get rid of all "Is this change safe regarding
>> migration?" comments because we know we can trust our CI instead.
> 
> IMHO it's extremely hard (if not impossible) to guarantee that, because
> some migration bug may only trigger in special paths that not always
> happen, e.g. it can even involve guest driver behavior.
>

It would not cover 100%, but if we already make sure that a VM stopped 
at end of qemu_init() has a predictable dump, it's already a huge win 
over having nothing.
We can use the same argument that current QEMU CI does not cover 100% of 
the code (*much* less than that from what I tried), but it's still 
better than no test.

> Said that, Fabiano used to work on supporting device-specific tests in
> qtests/migration-test.c.  I don't think it landed but maybe we have room
> for specific device tests using qtests/migration-test.c framework.
> 
> https://lore.kernel.org/all/20240523201922.28007-1-farosas@suse.de/
> 
> Thanks,
> 

Regards,
Pierrick



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

* Re: [PATCH 4/4] tests/functional: Test with scripts/vmstate-static-checker.py
  2025-05-01 15:58       ` Pierrick Bouvier
@ 2025-05-06 22:05         ` Peter Xu
  0 siblings, 0 replies; 16+ messages in thread
From: Peter Xu @ 2025-05-06 22:05 UTC (permalink / raw)
  To: Pierrick Bouvier; +Cc: Thomas Huth, qemu-devel, Fabiano Rosas, John Snow

On Thu, May 01, 2025 at 08:58:33AM -0700, Pierrick Bouvier wrote:
> On 5/1/25 7:28 AM, Peter Xu wrote:
> > On Wed, Apr 30, 2025 at 09:10:30AM -0700, Pierrick Bouvier wrote:
> > > On 4/29/25 8:21 AM, Thomas Huth wrote:
> > > > From: Thomas Huth <thuth@redhat.com>
> > > > 
> > > > We've got this nice vmstate-static-checker.py script that can help
> > > > to detect screw-ups in the migration states. Unfortunately, it's
> > > > currently only run manually, so there could be regressions that nobody
> > > > notices immediately. Let's run it from a functional test automatically
> > > > so that we got at least a basic coverage in each CI run.
> > > > 
> > > > Signed-off-by: Thomas Huth <thuth@redhat.com>
> > > > ---
> > > >    MAINTAINERS                      |  1 +
> > > >    tests/functional/meson.build     | 13 +++++++-
> > > >    tests/functional/test_vmstate.py | 56 ++++++++++++++++++++++++++++++++
> > > >    3 files changed, 69 insertions(+), 1 deletion(-)
> > > >    create mode 100755 tests/functional/test_vmstate.py
> > > > 
> > > > diff --git a/MAINTAINERS b/MAINTAINERS
> > > > index 65fb61844b3..6a8d81458ad 100644
> > > > --- a/MAINTAINERS
> > > > +++ b/MAINTAINERS
> > > > @@ -3525,6 +3525,7 @@ F: migration/
> > > >    F: scripts/vmstate-static-checker.py
> > > >    F: tests/data/vmstate-static-checker/
> > > >    F: tests/functional/test_migration.py
> > > > +F: tests/functional/test_vmstate.py
> > > >    F: tests/qtest/migration/
> > > >    F: tests/qtest/migration-*
> > > >    F: docs/devel/migration/
> > > > diff --git a/tests/functional/meson.build b/tests/functional/meson.build
> > > > index b317ad42c5a..9f339e626f6 100644
> > > > --- a/tests/functional/meson.build
> > > > +++ b/tests/functional/meson.build
> > > > @@ -76,6 +76,7 @@ tests_generic_bsduser = [
> > > >    tests_aarch64_system_quick = [
> > > >      'migration',
> > > > +  'vmstate',
> > > >    ]
> > > >    tests_aarch64_system_thorough = [
> > > > @@ -164,6 +165,10 @@ tests_loongarch64_system_thorough = [
> > > >      'loongarch64_virt',
> > > >    ]
> > > > +tests_m68k_system_quick = [
> > > > +  'vmstate',
> > > > +]
> > > > +
> > > >    tests_m68k_system_thorough = [
> > > >      'm68k_mcf5208evb',
> > > >      'm68k_nextcube',
> > > > @@ -230,6 +235,7 @@ tests_ppc_system_thorough = [
> > > >    tests_ppc64_system_quick = [
> > > >      'migration',
> > > > +  'vmstate',
> > > >    ]
> > > >    tests_ppc64_system_thorough = [
> > > > @@ -265,6 +271,10 @@ tests_rx_system_thorough = [
> > > >      'rx_gdbsim',
> > > >    ]
> > > > +tests_s390x_system_quick = [
> > > > +  'vmstate',
> > > > +]
> > > > +
> > > >    tests_s390x_system_thorough = [
> > > >      's390x_ccw_virtio',
> > > >      's390x_replay',
> > > > @@ -305,8 +315,9 @@ tests_x86_64_system_quick = [
> > > >      'migration',
> > > >      'pc_cpu_hotplug_props',
> > > >      'virtio_version',
> > > > -  'x86_cpu_model_versions',
> > > > +  'vmstate',
> > > >      'vnc',
> > > > +  'x86_cpu_model_versions',
> > > >    ]
> > > >    tests_x86_64_system_thorough = [
> > > > diff --git a/tests/functional/test_vmstate.py b/tests/functional/test_vmstate.py
> > > > new file mode 100755
> > > > index 00000000000..3ba56d580db
> > > > --- /dev/null
> > > > +++ b/tests/functional/test_vmstate.py
> > > > @@ -0,0 +1,56 @@
> > > > +#!/usr/bin/env python3
> > > > +#
> > > > +# SPDX-License-Identifier: GPL-2.0-or-later
> > > > +#
> > > > +# This test runs the vmstate-static-checker script with the current QEMU
> > > > +
> > > > +import subprocess
> > > > +
> > > > +from qemu_test import QemuSystemTest
> > > > +
> > > > +
> > > > +class VmStateTest(QemuSystemTest):
> > > > +
> > > > +    def test_vmstate(self):
> > > > +        target_machine = {
> > > > +            'aarch64': 'virt-7.2',
> > > > +            'm68k': 'virt-7.2',
> > > > +            'ppc64': 'pseries-7.2',
> > > > +            's390x': 's390-ccw-virtio-7.2',
> > > > +            'x86_64': 'pc-q35-7.2',
> > > > +        }
> > > > +        self.set_machine(target_machine[self.arch])
> > > > +
> > > > +        # Run QEMU to get the current vmstate json file:
> > > > +        dst_json = self.scratch_file('dest.json')
> > > > +        self.log.info('Dumping vmstate from ' + self.qemu_bin)
> > > > +        cp = subprocess.run([self.qemu_bin, '-nodefaults',
> > > > +                             '-M', target_machine[self.arch],
> > > > +                             '-dump-vmstate', dst_json],
> > > > +                            stdout=subprocess.PIPE,
> > > > +                            stderr=subprocess.STDOUT,
> > > > +                            text=True)
> > > > +        if cp.returncode != 0:
> > > > +            self.fail('Running QEMU failed:\n' + cp.stdout)
> > > > +        if cp.stdout:
> > > > +            self.log.info('QEMU output: ' + cp.stdout)
> > > > +
> > > > +        # Check whether the old vmstate json file is still compatible:
> > > > +        src_json = self.data_file('..', 'data', 'vmstate-static-checker',
> > > > +                                  self.arch,
> > > > +                                  target_machine[self.arch] + '.json')
> > > > +        vmstate_checker = self.data_file('..', '..', 'scripts',
> > > > +                                         'vmstate-static-checker.py')
> > > > +        self.log.info('Comparing vmstate with ' + src_json)
> > > > +        cp = subprocess.run([vmstate_checker, '-s', src_json, '-d', dst_json],
> > > > +                            stdout=subprocess.PIPE,
> > > > +                            stderr=subprocess.STDOUT,
> > > > +                            text=True)
> > > > +        if cp.returncode != 0:
> > > > +            self.fail('Running vmstate-static-checker failed:\n' + cp.stdout)
> > > > +        if cp.stdout:
> > > > +            self.log.warning('vmstate-static-checker output: ' + cp.stdout)
> > > > +
> > > > +
> > > > +if __name__ == '__main__':
> > > > +    QemuSystemTest.main()
> > > 
> > > Thanks for this series Thomas, it's very useful.
> > > Could we extend this automatically to test migration on all combinations:
> > > {qemu-system-*} x {machine}?
> > > We could generate a single list of references, containing hashes of all
> > > outputs, and a simple and clean command to regenerate all those, and
> > > associated jsons, so we don't pollute qemu code with tons of json.
> > 
> > I think a major challenge would be false positives, and how to filter
> > them.. when we put anything into CI.
> > 
> 
> A fail would be expected everytime something changes:
> - it can be a default field that has a new value (particularly sensitive for
> cpus)
> - it can be a new cpu field that is added
> - it can be a board definition change
> - it can be a hardware related change
> 
> In all cases, even though it does not break migration, it's interesting to
> know such a change happen.
> As well, if it's simple to update and get differences of the various dumps
> per {binary, board}, then it's trivial to identify and comment the "false
> positive". The more often it runs (ideally, per PR, or per series), the
> easier it is to identify what changed.
> 
> > Side note: yesterday I just wrote a script to do exactly this, by auto
> > build binaries and check all relevant archs over all machine types
> > supported.  It looks like this:
> > 
> > https://gitlab.com/peterx/qemu/-/commit/c4abfa39f8943cd62f0d982ecb36537df398ae70
> > 
> > The plan is I can run this at the end of each release, though.. not yet for
> > CI.  I also don't have plan to upstream this script, maybe I'll keep it
> > myself as of now unless someone thinks we should have it.
> > 
> 
> Glad to hear we have a script, but sad to hear "will run manually once every
> 6 months".
> 
> > PS: I just ran it over v9.2..v10.0 over the default 4 archs
> > (x86,arm,ppc,s390) and a huge list was generated..  I believe most of them
> > are false positives, I'll delay walking the list for some time..  I
> > attached the result at the end in case anyone is interested.
> > 

I probably forgot to do that.  Here's the condensed list, and this time I
went throught it, even though I found zero real bug.. so all false
positives, AFAICT..

Found forward migration incompatibility issues:

  Section "acpi-ged", Description "acpi-ghes": expected field "ghes_addr_le", got "hw_error_le"; skipping rest
  Section "sysbus-ahci" does not exist in dest
  Section "imx.enet" Section "imx.enet" Description "imx.fec": minimum version error: 2 < 3
  Section "imx.enet", Description "imx.fec": expected field "phy_status", while dest has no further fields
  Section "npcm7xx-clk" Section "npcm7xx-clk" Description "npcm7xx-clk": minimum version error: 1 < 3
  Section "npcm7xx-clk": Description "npcm7xx-clk" missing, got "npcm-clk" instead; skipping
  Section "npcm7xx-gcr" Section "npcm7xx-gcr" Description "npcm7xx-gcr": minimum version error: 0 < 2
  Section "npcm7xx-gcr": Description "npcm7xx-gcr" missing, got "npcm-gcr" instead; skipping
  Section "lan9118" Section "lan9118" Description "lan9118": minimum version error: 2 < 3
  Section "lan9118", Description "lan9118": expected field "phy_status", got "eeprom_writable"; skipping rest
  Section "imx.fec" Section "imx.fec" Description "imx.fec": minimum version error: 2 < 3
  Section "imx.fec", Description "imx.fec": expected field "phy_status", while dest has no further fields

Found backward migration incompatibility issues:

  Section "uefi-vars-sysbus" does not exist in dest
  Section "acpi-ged", Description "acpi-ghes": expected field "hw_error_le", got "ghes_addr_le"; skipping rest
  Section "uefi-vars-x64" does not exist in dest
  Section "vmclock" does not exist in dest
  Section "virtio-mem" does not exist in dest
  Section "npcm8xx-gcr" does not exist in dest
  Section "imx.enet" version error: 3 > 2
  Section "imx.enet" Description "imx.fec": version error: 3 > 2
  Section "rs5c372" does not exist in dest
  Section "imx8mp.analog" does not exist in dest
  Section "npcm7xx-clk" version error: 3 > 1
  Section "npcm7xx-clk" Description "npcm-clk": version error: 3 > 1
  Section "npcm7xx-clk": Description "npcm-clk" missing, got "npcm7xx-clk" instead; skipping
  Section "imx8mp.ccm" does not exist in dest
  Section "npcm7xx-gcr" version error: 2 > 0
  Section "npcm7xx-gcr" Description "npcm-gcr": version error: 2 > 0
  Section "npcm7xx-gcr": Description "npcm-gcr" missing, got "npcm7xx-gcr" instead; skipping
  Section "fsl-imx8m-pcie-phy" does not exist in dest
  Section "imx8mp.gpt" does not exist in dest
  Section "lan9118" version error: 3 > 2
  Section "lan9118" Description "lan9118": version error: 3 > 2
  Section "lan9118", Description "lan9118": expected field "eeprom_writable", got "phy_status"; skipping rest
  Section "imx.fec" version error: 3 > 2
  Section "imx.fec" Description "imx.fec": version error: 3 > 2
  Section "lan9118-phy" does not exist in dest
  Section "aspeed.hace-ast2700" does not exist in dest
  Section "npcm-clk" does not exist in dest
  Section "aspeed.sdhci-ast2400" does not exist in dest
  Section "npcm-gcr" does not exist in dest
  Section "aspeed.sdhci-ast2500" does not exist in dest
  Section "npcm-pcs" does not exist in dest
  Section "aspeed.sdhci-ast2600" does not exist in dest
  Section "aspeed.timer-ast2700" does not exist in dest
  Section "npcm8xx-clk" does not exist in dest
  Section "aspeed.sdhci-ast2700" does not exist in dest

> 
> Would that be possible to post this on an online forge like GitLab, and
> commit the previous and new versions of dumps (the data, not the list of
> failures), so we can see all the differences in a nice way?

It should be easy to do, but now I'm thinking how much it would help
developers.

As discussed above, I finally went through the list for the previous
release cycle, and I see no real positive reports.

It could be that the script used to be able to capture more real issues,
but as more developers / maintainers got reports, then such issues are less
likely to happen.  Do any of us used that to find any real bug recently?

I also start to doubt whether we should keep growing the renaming list.
First of all, such list isn't that helpful if we don't run that on old
enough binaries - the rename will not cause false positive anymore as long
as we compare newer binaries from the commit it got changed.  So if we run
it per-release the rename will only bother us once per release..

> 
> > > 
> > > This way, we can automatically detect that we never regress, not only from
> > > release to release, but commit to commit.
> > > 
> > > In case we need to update reference, people can point what's the actual
> > > difference in the commit message.
> > > 
> > > As well, since I took a look into that before, this check is not enough
> > > regarding migration. Beyonds the VMDstate, we should check as well that the
> > > default values of every field are not changed. For instance, we recently
> > > changed the default pauth property of arm cpus, and without a careful
> > > backcompat, it would have break migration. It's a bit more tricky, since
> > > there is nothing available now to dump this (I hacked that using a custom
> > > trace). And definitely not something in the scope of your series, just worth
> > > mentioning.
> > > 
> > > I hope we can one day get rid of all "Is this change safe regarding
> > > migration?" comments because we know we can trust our CI instead.
> > 
> > IMHO it's extremely hard (if not impossible) to guarantee that, because
> > some migration bug may only trigger in special paths that not always
> > happen, e.g. it can even involve guest driver behavior.
> > 
> 
> It would not cover 100%, but if we already make sure that a VM stopped at
> end of qemu_init() has a predictable dump, it's already a huge win over
> having nothing.
> We can use the same argument that current QEMU CI does not cover 100% of the
> code (*much* less than that from what I tried), but it's still better than
> no test.

So now I start to question whether we need to work more on the whole
vmstate static checker..  I think I'll still try to keep running it once
per release for some while, but if I can't catch any real bug maybe we're
good from this regard, and people just started being very cautious on
e.g. randomly adding or removing vmsd fields.

Let me know if anyone thinks it differently..

Thanks,

-- 
Peter Xu



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

end of thread, other threads:[~2025-05-06 22:06 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-29 15:21 [PATCH 0/4] Test vmstate with scripts/vmstate-static-checker.py Thomas Huth
2025-04-29 15:21 ` [PATCH 1/4] tests/vmstate-static-checker-data: Remove old dump files Thomas Huth
2025-04-29 15:29   ` Philippe Mathieu-Daudé
2025-04-29 22:13   ` Peter Xu
2025-04-30 10:55     ` Thomas Huth
2025-04-29 15:21 ` [PATCH 2/4] scripts/vmstate-static-checker.py: Allow new name for ghes_addr_le field Thomas Huth
2025-04-29 22:16   ` Peter Xu
2025-04-29 15:21 ` [PATCH 3/4] tests/data/vmstate-static-checker: Add dump files from QEMU 7.2.17 Thomas Huth
2025-04-29 22:30   ` Peter Xu
2025-04-30 11:13     ` Thomas Huth
2025-04-30 15:46       ` Peter Xu
2025-04-29 15:21 ` [PATCH 4/4] tests/functional: Test with scripts/vmstate-static-checker.py Thomas Huth
2025-04-30 16:10   ` Pierrick Bouvier
2025-05-01 14:28     ` Peter Xu
2025-05-01 15:58       ` Pierrick Bouvier
2025-05-06 22:05         ` Peter Xu

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