Hello, In response to patches from Juan [1], this series implements a declarative way for CPUs to register their CPU-specific VMStateDescription.
v2 has style improvements by using stubs for *-user, suggested by Eduardo. To clarify status: * Patches 1-5 should hopefully be good to go now. Please ack. * Patches 6-8 depend on how we want to procede with future targets (cf. below). Available here: git://github.com/afaerber/qemu-cpu.git qom-cpu-vmstate.v2 https://github.com/afaerber/qemu-cpu/commits/qom-cpu-vmstate.v2 Preview of QOM CPUState part 9 v2 as follow-up to the x86 patch: https://github.com/afaerber/qemu-cpu/commits/qom-cpu-9 Original discussion: There are subtle differences between CPU and devices in how they register their savevm handlers and VMStateDescription respectively: * CPUs register one VMStateDescription "cpu_common" plus savevm handlers for the target-specifics (machine.c:cpu_{save,load}). Devices register one VMStateDescription with a subsection for common state where necessary. * CPUs use their cpu_index field as instance_id. Devices pass -1 as instance_id, resulting in highest index on the bus plus 1. Note: The current cpu_index numbering is not hot-unplug-safe. My code assumes that registering "cpu_common" for CPUArchState (until changed in CPUState part 9 series) while registering "cpu" for CPUState is compatible, since by not using DeviceState::vmsd infrastructure registration order remains guaranteed the same. Patches 6-8 demonstrate how two VMStateDescription-prepared but not yet migratable targets would look like if we want to adopt a consistent pattern for VMStateDescription registration and layout throughout targets. Question is whether we want to take that legacy burden on us or whether to simply expose exec.c:vmstate_cpu_common and embed it PCI-like into the prepared VMStateDescriptions for alpha and openrisc and register them through DeviceClass::vmsd instead. An alternative might be registering "cpu_common" as before but with instance_id -1 and registering "cpu" through DeviceClass::vmsd, since exec.c:calculate_new_instance_id() takes the name string into account. But that would be inconsistent with how devices behave VMState-wise. Targets that have not yet been converted to VMState [1, 2] are left untouched. What triggered this series was moving the halted and interrupt_request fields from CPU_COMMON to CPUState: https://lists.nongnu.org/archive/html/qemu-devel/2013-02/msg00203.html Since both are in vmstate_cpu_common, they needed to be moved together, and "cpu_common" will need to operate on CPUState then. At the same time x86 can no longer access the halted field from CPUX86State via VMSTATE_ macros, so either we need to drop uses of such fields (i.e., version 5) or make it possible to access CPUState fields in x86 VMState through parent_obj field. Further, in explaining intended uses of S390CPU vs. CPUS390XState I was reminded that VMState is currently a limiting factor for placing fields into CPUState-derived types rather than into CPU*State. Regards, Andreas [1] https://lists.nongnu.org/archive/html/qemu-devel/2012-05/msg00524.html [2] https://lists.nongnu.org/archive/html/qemu-devel/2012-09/msg03451.html v1 -> v2: * Add vmstate_register() and vmstate_dummy stubs to avoid #ifdefs (Eduardo). Cc: Juan Quintela <quint...@redhat.com> Cc: Michael Roth <mdr...@linux.vnet.ibm.com> Cc: Anthony Liguori <anth...@codemonkey.ws> Cc: Blue Swirl <blauwir...@gmail.com> Cc: Aurélien Jarno <aurel...@aurel32.net> Cc: Eduardo Habkost <ehabk...@redhat.com> Cc: Igor Mammedov <imamm...@redhat.com> Cc: Richard Henderson <r...@twiddle.net> Cc: Michael Walle <mich...@walle.cc> Cc: Jia Liu <pro...@gmail.com> Cc: Anthony Green <gr...@moxielogic.com> Cc: David Gibson <da...@gibson.dropbear.id.au> Cc: Alexander Graf <ag...@suse.de> Cc: qemu-...@nongnu.org Andreas Färber (8): stubs: Add vmstate_register() stub stubs: Add a vmstate_dummy struct for CONFIG_USER_ONLY cpu: Register VMStateDescription through CPUState target-i386: Update VMStateDescription to X86CPU target-lm32: Update VMStateDescription to LM32CPU target-alpha: Register VMStateDescription for AlphaCPU target-openrisc: Register VMStateDescription for OpenRISCCPU cpu: Guard cpu_{save,load}() definitions exec.c | 11 ++- include/migration/vmstate.h | 4 + include/qemu-common.h | 2 + include/qom/cpu.h | 3 + stubs/vmstate.c | 9 ++ target-alpha/cpu-qom.h | 6 ++ target-alpha/cpu.c | 2 + target-alpha/machine.c | 64 ++++++------- target-i386/cpu-qom.h | 6 ++ target-i386/cpu.c | 2 + target-i386/cpu.h | 2 - target-i386/machine.c | 215 +++++++++++++++++++++---------------------- target-lm32/cpu-qom.h | 6 ++ target-lm32/cpu.c | 2 + target-lm32/cpu.h | 2 - target-lm32/machine.c | 36 +++----- target-openrisc/cpu.c | 2 + target-openrisc/cpu.h | 6 +- target-openrisc/machine.c | 33 +++---- 19 Dateien geändert, 220 Zeilen hinzugefügt(+), 193 Zeilen entfernt(-) -- 1.7.10.4