All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers
@ 2017-03-29 19:41 Eduardo Habkost
  2017-03-29 19:41 ` [Qemu-devel] [RFC v2 1/9] configure: test if _Generic works as expected Eduardo Habkost
                   ` (11 more replies)
  0 siblings, 12 replies; 17+ messages in thread
From: Eduardo Habkost @ 2017-03-29 19:41 UTC (permalink / raw)
  To: qemu-devel
  Cc: Alexander Graf, Hervé Poussineau, Juergen Gross,
	Matthew Rosato, Laszlo Ersek, Paolo Bonzini,
	Dr. David Alan Gilbert, Igor Mammedov, Andreas Färber

The problem
-----------

QOM has a data model where class struct data is static: class
structs are initialized at class_init, and never changed again.

...except for a few rare cases where class data is changed
outside class_init. Those cases are:

  qbus_realize(), code added by:
  commit 61de36761b565a4138d8ad7ec75489ab28fe84b6
  Date:   Thu Feb 6 16:08:15 2014 +0100
      qdev: Keep global allocation counter per bus

  mips_jazz_init(), code added by:
  commit 54e755588cf1e90f0b1460c4e8e6b6a54b6d3a32
  Date:   Mon Nov 4 23:26:17 2013 +0100
      mips jazz: do not raise data bus exception when accessing invalid addresses

  xen_set_dynamic_sysbus(), code added by:
  commit 3a6c9172ac5951e6dac2b3f6cbce3cfccdec5894
  Date:   Tue Nov 22 07:10:58 2016 +0100
      xen: create qdev for each backend device

  s390_cpu_realizefn(), code added by:
  commit c6644fc88bed1176f67b4b7a9df691bcf25c0c5b
  Date:   Fri Mar 4 12:34:31 2016 -0500
      s390x/cpu: Get rid of side effects when creating a vcpu

I want to prevent that from happening again.

Proposal
--------

I propose we make object_get_class() and *_GET_CLASS macros
return const pointers. This way, anybody willing to change class
structs outside class_init will (hopefully) be aware that they
are doing something unexpected.

This would be very simple and trivial, except that:
* OBJECT_CLASS_CHECK cast its return value to a different
  (non-const) pointer type.
* OBJECT_CLASS_CHECK-based macros are used everywhere to
  cast class pointers to different class types.

I have addressed this problem using C11's _Generic keyword.
_Generic allows us to make OBJECT_CLASS_CHECK and other macros
return a const pointer if its argument is a const pointer, and a
non-const pointer otherwise.

This series changes OBJECT_CLASS, OBJECT_CLASS_CHECK,
object_class_dynamic_cast_assert(), object_class_dynamic_cast(),
and object_class_get_parent() to exhibit this const-aware
behavior.

If the compiler doesn't support _Generic, we keep the old
behavior, and the cast macros will keep returning non-const
pointers.

---
Cc: Alexander Graf <agraf@suse.de>
Cc: Hervé Poussineau <hpoussin@reactos.org>
Cc: Juergen Gross <jgross@suse.com>
Cc: Matthew Rosato <mjrosato@linux.vnet.ibm.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
Cc: Igor Mammedov <imammedo@redhat.com>
Cc: Andreas Färber <afaerber@suse.de>

Eduardo Habkost (9):
  configure: test if _Generic works as expected
  Simplify code using *MACHINE_GET_CLASS
  qom: QUALIFIED_CAST helper macro
  qom: Make object_class_get_parent() const-aware
  Make class parameter const at some functions
  Explicitly cast the *_GET_CLASS() value when we break the rules
  Use const variables for *_GET_CLASS values
  qom: Make class cast macros/functions const-aware
  qom: Make object_get_class() return const pointer

 configure                       | 20 +++++++++
 include/qom/cpu.h               | 12 +++---
 include/qom/object.h            | 94 ++++++++++++++++++++++++++++++++++-------
 target/ppc/mmu-book3s-v3.h      |  2 +-
 target/ppc/mmu-hash64.h         |  2 +-
 target/s390x/cpu.h              |  2 +-
 backends/cryptodev.c            | 10 ++---
 backends/hostmem.c              |  2 +-
 backends/rng.c                  |  4 +-
 backends/tpm.c                  | 28 ++++++------
 chardev/char-mux.c              |  2 +-
 chardev/char.c                  | 10 ++---
 cpu-exec.c                      | 14 +++---
 device-hotplug.c                |  2 +-
 disas.c                         |  4 +-
 exec.c                          |  6 +--
 gdbstub.c                       | 12 +++---
 hmp.c                           |  4 +-
 hw/acpi/acpi_interface.c        |  2 +-
 hw/acpi/cpu.c                   |  8 ++--
 hw/acpi/cpu_hotplug.c           |  4 +-
 hw/acpi/ipmi.c                  |  2 +-
 hw/acpi/memory_hotplug.c        |  2 +-
 hw/acpi/nvdimm.c                |  4 +-
 hw/acpi/pcihp.c                 |  4 +-
 hw/arm/aspeed.c                 |  2 +-
 hw/arm/aspeed_soc.c             |  4 +-
 hw/arm/boot.c                   |  2 +-
 hw/arm/exynos4_boards.c         |  2 +-
 hw/arm/vexpress.c               |  2 +-
 hw/arm/virt-acpi-build.c        |  6 +--
 hw/arm/virt.c                   |  6 +--
 hw/audio/cs4231a.c              | 10 ++---
 hw/audio/gus.c                  |  6 +--
 hw/audio/intel-hda.c            |  8 ++--
 hw/audio/sb16.c                 |  6 +--
 hw/block/dataplane/virtio-blk.c |  6 +--
 hw/block/fdc.c                  |  8 ++--
 hw/block/m25p80.c               |  2 +-
 hw/char/serial-pci.c            |  2 +-
 hw/char/virtio-console.c        |  6 +--
 hw/char/virtio-serial-bus.c     | 18 ++++----
 hw/core/bus.c                   |  4 +-
 hw/core/fw-path-provider.c      |  2 +-
 hw/core/generic-loader.c        |  2 +-
 hw/core/hotplug.c               |  8 ++--
 hw/core/loader.c                |  4 +-
 hw/core/machine.c               |  5 +--
 hw/core/nmi.c                   |  2 +-
 hw/core/qdev-properties.c       |  4 +-
 hw/core/qdev.c                  | 32 +++++++-------
 hw/core/stream.c                |  4 +-
 hw/core/sysbus.c                |  6 +--
 hw/display/cirrus_vga.c         |  2 +-
 hw/i2c/core.c                   | 10 ++---
 hw/i2c/smbus.c                  |  8 ++--
 hw/i386/acpi-build.c            | 16 +++----
 hw/i386/kvm/i8254.c             |  2 +-
 hw/i386/kvm/i8259.c             |  2 +-
 hw/i386/pc.c                    | 32 +++++++-------
 hw/i386/pc_piix.c               |  4 +-
 hw/i386/pc_q35.c                |  4 +-
 hw/i386/x86-iommu.c             |  2 +-
 hw/ide/microdrive.c             |  4 +-
 hw/ide/qdev.c                   |  2 +-
 hw/input/adb.c                  |  6 +--
 hw/input/virtio-input.c         | 12 +++---
 hw/intc/apic_common.c           | 26 ++++++------
 hw/intc/arm_gic.c               |  2 +-
 hw/intc/arm_gic_common.c        |  4 +-
 hw/intc/arm_gic_kvm.c           |  4 +-
 hw/intc/arm_gicv3.c             |  2 +-
 hw/intc/arm_gicv3_common.c      |  4 +-
 hw/intc/arm_gicv3_its_common.c  |  6 +--
 hw/intc/arm_gicv3_kvm.c         |  4 +-
 hw/intc/i8259.c                 |  2 +-
 hw/intc/i8259_common.c          |  4 +-
 hw/intc/ioapic_common.c         |  6 +--
 hw/intc/xics.c                  | 26 ++++++------
 hw/ipack/ipack.c                |  4 +-
 hw/ipack/tpci200.c              | 12 +++---
 hw/ipmi/ipmi_bmc_extern.c       | 12 +++---
 hw/ipmi/ipmi_bmc_sim.c          | 24 +++++------
 hw/ipmi/isa_ipmi_bt.c           | 22 +++++-----
 hw/ipmi/isa_ipmi_kcs.c          | 20 ++++-----
 hw/mem/pc-dimm.c                | 10 ++---
 hw/mips/mips_jazz.c             |  2 +-
 hw/misc/imx_ccm.c               |  2 +-
 hw/net/e1000.c                  |  2 +-
 hw/net/vhost_net.c              |  4 +-
 hw/net/vmxnet3.c                |  2 +-
 hw/nvram/fw_cfg.c               |  2 +-
 hw/pci-bridge/pcie_root_port.c  |  8 ++--
 hw/pci/pci.c                    | 17 ++++----
 hw/pcmcia/pxa2xx.c              | 16 +++----
 hw/ppc/pnv.c                    | 14 +++---
 hw/ppc/pnv_core.c               |  2 +-
 hw/ppc/pnv_xscom.c              |  6 +--
 hw/ppc/prep.c                   |  8 ++--
 hw/ppc/spapr.c                  | 50 +++++++++++-----------
 hw/ppc/spapr_cpu_core.c         |  4 +-
 hw/ppc/spapr_drc.c              | 20 ++++-----
 hw/ppc/spapr_events.c           |  6 +--
 hw/ppc/spapr_hcall.c            |  2 +-
 hw/ppc/spapr_pci.c              | 14 +++---
 hw/ppc/spapr_rtas.c             |  8 ++--
 hw/ppc/spapr_vio.c              | 12 +++---
 hw/s390x/css-bridge.c           |  2 +-
 hw/s390x/css.c                  |  6 +--
 hw/s390x/event-facility.c       | 14 +++---
 hw/s390x/s390-skeys-kvm.c       |  2 +-
 hw/s390x/s390-skeys.c           |  8 ++--
 hw/s390x/s390-virtio-ccw.c      |  8 ++--
 hw/s390x/sclp.c                 | 10 ++---
 hw/s390x/virtio-ccw.c           | 12 +++---
 hw/scsi/megasas.c               |  8 ++--
 hw/scsi/mptconfig.c             |  6 +--
 hw/scsi/scsi-bus.c              |  8 ++--
 hw/scsi/vhost-scsi.c            |  4 +-
 hw/scsi/virtio-scsi-dataplane.c |  6 +--
 hw/scsi/vmw_pvscsi.c            |  2 +-
 hw/sd/core.c                    | 18 ++++----
 hw/sh4/sh7750.c                 |  2 +-
 hw/smbios/smbios_type_38.c      |  2 +-
 hw/sparc/sun4m.c                |  2 +-
 hw/sparc64/sun4u.c              |  2 +-
 hw/ssi/aspeed_smc.c             |  2 +-
 hw/ssi/ssi.c                    |  8 ++--
 hw/ssi/xilinx_spips.c           |  2 +-
 hw/timer/i8254.c                |  2 +-
 hw/timer/i8254_common.c         | 10 ++---
 hw/timer/m48t59-isa.c           |  2 +-
 hw/timer/m48t59.c               |  2 +-
 hw/usb/bus.c                    | 32 +++++++-------
 hw/usb/dev-smartcard-reader.c   |  8 ++--
 hw/usb/hcd-ehci-pci.c           |  2 +-
 hw/usb/hcd-ehci-sysbus.c        |  2 +-
 hw/usb/hcd-uhci.c               |  2 +-
 hw/vfio/amd-xgbe.c              |  2 +-
 hw/vfio/calxeda-xgmac.c         |  2 +-
 hw/virtio/vhost-vsock.c         |  4 +-
 hw/virtio/vhost.c               |  2 +-
 hw/virtio/virtio-bus.c          | 24 +++++------
 hw/virtio/virtio-mmio.c         |  2 +-
 hw/virtio/virtio-pci.c          | 20 ++++-----
 hw/virtio/virtio.c              | 62 +++++++++++++--------------
 hw/xen/xen_backend.c            |  3 +-
 io/channel.c                    | 20 ++++-----
 kvm-all.c                       |  2 +-
 migration/migration.c           |  2 +-
 migration/savevm.c              |  2 +-
 monitor.c                       |  2 +-
 net/filter.c                    |  6 +--
 qdev-monitor.c                  | 12 +++---
 qmp.c                           |  4 +-
 qom/cpu.c                       | 26 ++++++------
 qom/object.c                    | 31 +++++++-------
 qom/object_interfaces.c         |  4 +-
 target/alpha/cpu.c              |  2 +-
 target/arm/cpu.c                |  8 ++--
 target/arm/kvm.c                |  2 +-
 target/cris/cpu.c               | 10 ++---
 target/cris/helper.c            |  2 +-
 target/hppa/cpu.c               |  2 +-
 target/i386/cpu.c               | 10 ++---
 target/i386/kvm.c               |  2 +-
 target/i386/machine.c           |  3 +-
 target/lm32/cpu.c               |  4 +-
 target/lm32/gdbstub.c           |  2 +-
 target/m68k/cpu.c               |  4 +-
 target/microblaze/cpu.c         |  4 +-
 target/microblaze/gdbstub.c     |  2 +-
 target/mips/cpu.c               |  4 +-
 target/moxie/cpu.c              |  4 +-
 target/nios2/cpu.c              |  8 ++--
 target/openrisc/cpu.c           |  4 +-
 target/openrisc/gdbstub.c       |  2 +-
 target/ppc/arch_dump.c          |  2 +-
 target/ppc/compat.c             |  4 +-
 target/ppc/excp_helper.c        |  2 +-
 target/ppc/mmu-hash64.c         |  6 +--
 target/ppc/mmu_helper.c         |  2 +-
 target/ppc/translate_init.c     | 14 +++---
 target/s390x/cpu.c              |  6 +--
 target/s390x/cpu_models.c       |  4 +-
 target/s390x/kvm.c              |  4 +-
 target/s390x/mem_helper.c       |  6 +--
 target/s390x/misc_helper.c      |  6 +--
 target/s390x/mmu_helper.c       |  2 +-
 target/sh4/cpu.c                |  4 +-
 target/sparc/cpu.c              |  4 +-
 target/tilegx/cpu.c             |  4 +-
 target/tricore/cpu.c            |  4 +-
 target/unicore32/cpu.c          |  2 +-
 target/xtensa/cpu.c             |  6 +--
 tests/check-qom-interface.c     |  2 +-
 user-exec.c                     |  2 +-
 vl.c                            |  2 +-
 198 files changed, 800 insertions(+), 721 deletions(-)

-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC v2 1/9] configure: test if _Generic works as expected
  2017-03-29 19:41 [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers Eduardo Habkost
@ 2017-03-29 19:41 ` Eduardo Habkost
  2017-03-29 19:41 ` [Qemu-devel] [RFC v2 2/9] Simplify code using *MACHINE_GET_CLASS Eduardo Habkost
                   ` (10 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: Eduardo Habkost @ 2017-03-29 19:41 UTC (permalink / raw)
  To: qemu-devel

Test if _Generic works as expected, and set HAVE_C11_GENERIC
config variable if it does.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 configure | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/configure b/configure
index d1ce33bc79..b29bce0b53 100755
--- a/configure
+++ b/configure
@@ -1548,6 +1548,22 @@ EOF
   fi
 fi
 
+# Ensure we support _Generic, and that it takes type qualifiers into account
+have_c11_generic=
+cat > $TMPC << EOF
+const int *p;
+typedef typeof(_Generic(p,
+                        const int *: (int *)0,
+                        int *: 0,
+                        default: 0)) T;
+T foo;
+int x(void);
+int x(void) { return *foo; }
+EOF
+if do_cc $QEMU_CFLAGS -Werror -c -o $TMPO $TMPC;then
+  have_c11_generic=yes
+fi
+
 # Workaround for http://gcc.gnu.org/PR55489.  Happens with -fPIE/-fPIC and
 # large functions that use global variables.  The bug is in all releases of
 # GCC, but it became particularly acute in 4.6.x and 4.7.x.  It is fixed in
@@ -5751,6 +5767,10 @@ if test "$have_sysmacros" = "yes" ; then
   echo "CONFIG_SYSMACROS=y" >> $config_host_mak
 fi
 
+if test "$have_c11_generic" = "yes" ; then
+  echo "HAVE_C11_GENERIC=y" >> $config_host_mak
+fi
+
 # Hold two types of flag:
 #   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
 #                                     a thread we have a handle to
-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC v2 2/9] Simplify code using *MACHINE_GET_CLASS
  2017-03-29 19:41 [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers Eduardo Habkost
  2017-03-29 19:41 ` [Qemu-devel] [RFC v2 1/9] configure: test if _Generic works as expected Eduardo Habkost
@ 2017-03-29 19:41 ` Eduardo Habkost
  2017-03-29 19:41 ` [Qemu-devel] [RFC v2 3/9] qom: QUALIFIED_CAST helper macro Eduardo Habkost
                   ` (9 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: Eduardo Habkost @ 2017-03-29 19:41 UTC (permalink / raw)
  To: qemu-devel

There's no need to use MACHINE_GET_CLASS/object_get_class()
followed by a *MACHINE_CLASS cast. Use *MACHINE_GET_CLASS()
directly.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 hw/core/machine.c     | 3 +--
 hw/pci/pci.c          | 3 +--
 hw/xen/xen_backend.c  | 3 +--
 target/i386/machine.c | 3 +--
 4 files changed, 4 insertions(+), 8 deletions(-)

diff --git a/hw/core/machine.c b/hw/core/machine.c
index ada9eea483..6aa452a792 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -342,8 +342,7 @@ static void error_on_sysbus_device(SysBusDevice *sbdev, void *opaque)
 static void machine_init_notify(Notifier *notifier, void *data)
 {
     Object *machine = qdev_get_machine();
-    ObjectClass *oc = object_get_class(machine);
-    MachineClass *mc = MACHINE_CLASS(oc);
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
 
     if (mc->has_dynamic_sysbus) {
         /* Our machine can handle dynamic sysbus devices, we're all good */
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index e6b08e1988..9151057bf5 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -1195,8 +1195,7 @@ static pcibus_t pci_bar_address(PCIDevice *d,
     int bar = pci_bar(d, reg);
     uint16_t cmd = pci_get_word(d->config + PCI_COMMAND);
     Object *machine = qdev_get_machine();
-    ObjectClass *oc = object_get_class(machine);
-    MachineClass *mc = MACHINE_CLASS(oc);
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
     bool allow_0_address = mc->pci_allow_0_address;
 
     if (type & PCI_BASE_ADDRESS_SPACE_IO) {
diff --git a/hw/xen/xen_backend.c b/hw/xen/xen_backend.c
index 6c21c37d68..6e530681f4 100644
--- a/hw/xen/xen_backend.c
+++ b/hw/xen/xen_backend.c
@@ -553,8 +553,7 @@ err:
 static void xen_set_dynamic_sysbus(void)
 {
     Object *machine = qdev_get_machine();
-    ObjectClass *oc = object_get_class(machine);
-    MachineClass *mc = MACHINE_CLASS(oc);
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
 
     mc->has_dynamic_sysbus = true;
 }
diff --git a/target/i386/machine.c b/target/i386/machine.c
index 78ae2f986b..5b9eb3a2f6 100644
--- a/target/i386/machine.c
+++ b/target/i386/machine.c
@@ -893,8 +893,7 @@ static bool tsc_khz_needed(void *opaque)
 {
     X86CPU *cpu = opaque;
     CPUX86State *env = &cpu->env;
-    MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
-    PCMachineClass *pcmc = PC_MACHINE_CLASS(mc);
+    PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(qdev_get_machine());
     return env->tsc_khz && pcmc->save_tsc_khz;
 }
 
-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC v2 3/9] qom: QUALIFIED_CAST helper macro
  2017-03-29 19:41 [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers Eduardo Habkost
  2017-03-29 19:41 ` [Qemu-devel] [RFC v2 1/9] configure: test if _Generic works as expected Eduardo Habkost
  2017-03-29 19:41 ` [Qemu-devel] [RFC v2 2/9] Simplify code using *MACHINE_GET_CLASS Eduardo Habkost
@ 2017-03-29 19:41 ` Eduardo Habkost
  2017-03-29 19:41 ` [Qemu-devel] [RFC v2 4/9] qom: Make object_class_get_parent() const-aware Eduardo Habkost
                   ` (8 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: Eduardo Habkost @ 2017-03-29 19:41 UTC (permalink / raw)
  To: qemu-devel

The new helper will help us write macros that keep const-ness of
the input arguments, using C11's _Generic keyword.

If _Generic is not supported by the compiler, QUALIFIED_CAST
becomes a regular non-const cast.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 include/qom/object.h | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)

diff --git a/include/qom/object.h b/include/qom/object.h
index cd0f412ce9..6829735f99 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -474,6 +474,52 @@ struct TypeInfo
     ((Object *)(obj))
 
 /**
+ * REFERENCED_TYPE:
+ * @t: a pointer type
+ *
+ * Returns the referenced type of a pointer type.
+ */
+#define REFERENCED_TYPE(t) \
+    typeof(*((t)0))
+
+/**
+ * QUALIFIED_CAST:
+ * @orig_type: Original type (a pointer type)
+ * @type: A pointer type to which an expression will be cast to.
+ *
+ * Helper to cast an expression to another pointer type while
+ * keeping the 'const' qualifier if it was present in
+ * @orig_type. If the compiler doesn't support _Generic, it
+ * becomes a regular non-const cast.
+ *
+ * Usage examples:
+ *   QUALIFIED_CAST(AType *, BType *)(expr)
+ *     equivalent to (BType *)(expr)
+ *
+ *   QUALIFIED_CAST(const AType *, BType *)(expr)
+ *     If supported, equivalent to: (const BType *)(expr)
+ *     otherwise, equivalent to:          (BType *)(expr)
+ *
+ *   AType *a;
+ *   QUALIFIED_CAST(typeof(a), BType *)(b)
+ *     equivalent to (BType *)(b)
+ *
+ *   const AType *a;
+ *   QUALIFIED_CAST(typeof(a), BType *)(b)
+ *     If supported, equivalent to: (const BType *)(expr)
+ *     otherwise, equivalent to:          (BType *)(expr)
+ */
+#ifdef HAVE_C11_GENERIC
+#define QUALIFIED_CAST(orig_type, type)                     \
+    (typeof(_Generic((const REFERENCED_TYPE(orig_type) *)0, \
+                     orig_type: (const type)(0),            \
+                     default:   (type)(0))))
+#else
+#define QUALIFIED_CAST(orig_type, type) \
+    (type)
+#endif
+
+/**
  * OBJECT_CLASS:
  * @class: A derivative of #ObjectClass.
  *
-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC v2 4/9] qom: Make object_class_get_parent() const-aware
  2017-03-29 19:41 [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers Eduardo Habkost
                   ` (2 preceding siblings ...)
  2017-03-29 19:41 ` [Qemu-devel] [RFC v2 3/9] qom: QUALIFIED_CAST helper macro Eduardo Habkost
@ 2017-03-29 19:41 ` Eduardo Habkost
  2017-03-29 19:41 ` [Qemu-devel] [RFC v2 5/9] Make class parameter const at some functions Eduardo Habkost
                   ` (7 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: Eduardo Habkost @ 2017-03-29 19:41 UTC (permalink / raw)
  To: qemu-devel

This makes object_class_get_parent() return a const pointer in
case its class argument is a const pointer.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 include/qom/object.h | 6 +++++-
 qom/object.c         | 2 +-
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index 6829735f99..674a45862d 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -873,7 +873,11 @@ ObjectClass *object_class_dynamic_cast(ObjectClass *klass,
  *
  * Returns: The parent for @klass or %NULL if none.
  */
-ObjectClass *object_class_get_parent(ObjectClass *klass);
+#define object_class_get_parent(klass)            \
+    (QUALIFIED_CAST(typeof(klass), ObjectClass *) \
+     object_class_get_parent_const(klass))
+
+const ObjectClass *object_class_get_parent_const(const ObjectClass *klass);
 
 /**
  * object_class_get_name:
diff --git a/qom/object.c b/qom/object.c
index eb4bc924ff..8f60ad9b8e 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -774,7 +774,7 @@ ObjectClass *object_class_by_name(const char *typename)
     return type->class;
 }
 
-ObjectClass *object_class_get_parent(ObjectClass *class)
+const ObjectClass *object_class_get_parent_const(const ObjectClass *class)
 {
     TypeImpl *type = type_get_parent(class->type);
 
-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC v2 5/9] Make class parameter const at some functions
  2017-03-29 19:41 [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers Eduardo Habkost
                   ` (3 preceding siblings ...)
  2017-03-29 19:41 ` [Qemu-devel] [RFC v2 4/9] qom: Make object_class_get_parent() const-aware Eduardo Habkost
@ 2017-03-29 19:41 ` Eduardo Habkost
  2017-03-29 19:41 ` [Qemu-devel] [RFC v2 6/9] Explicitly cast the *_GET_CLASS() value when we break the rules Eduardo Habkost
                   ` (6 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: Eduardo Habkost @ 2017-03-29 19:41 UTC (permalink / raw)
  To: qemu-devel

There are many functions that don't need a non-const class
pointer argument. Change them to accept a const argument. This
will allow us to change class pointer variables to const in most
of the code.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 include/qom/object.h        |  7 ++++---
 gdbstub.c                   |  2 +-
 qdev-monitor.c              |  4 ++--
 qom/object.c                | 10 +++++-----
 target/i386/cpu.c           |  2 +-
 target/ppc/translate_init.c |  2 +-
 6 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index 674a45862d..bb0be22ac7 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -885,7 +885,7 @@ const ObjectClass *object_class_get_parent_const(const ObjectClass *klass);
  *
  * Returns: The QOM typename for @klass.
  */
-const char *object_class_get_name(ObjectClass *klass);
+const char *object_class_get_name(const ObjectClass *klass);
 
 /**
  * object_class_is_abstract:
@@ -893,7 +893,7 @@ const char *object_class_get_name(ObjectClass *klass);
  *
  * Returns: %true if @klass is abstract, %false otherwise.
  */
-bool object_class_is_abstract(ObjectClass *klass);
+bool object_class_is_abstract(const ObjectClass *klass);
 
 /**
  * object_class_by_name:
@@ -984,7 +984,8 @@ ObjectProperty *object_class_property_add(ObjectClass *klass, const char *name,
  */
 ObjectProperty *object_property_find(Object *obj, const char *name,
                                      Error **errp);
-ObjectProperty *object_class_property_find(ObjectClass *klass, const char *name,
+ObjectProperty *object_class_property_find(const ObjectClass *klass,
+                                           const char *name,
                                            Error **errp);
 
 typedef struct ObjectPropertyIterator {
diff --git a/gdbstub.c b/gdbstub.c
index 991115361e..3c7e5f3a96 100644
--- a/gdbstub.c
+++ b/gdbstub.c
@@ -573,7 +573,7 @@ static int memtox(char *buf, const char *mem, int len)
 }
 
 static const char *get_feature_xml(const char *p, const char **newp,
-                                   CPUClass *cc)
+                                   const CPUClass *cc)
 {
     size_t len;
     int i;
diff --git a/qdev-monitor.c b/qdev-monitor.c
index 5f2fcdfc45..339775e49d 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -77,7 +77,7 @@ static const QDevAlias qdev_alias_table[] = {
     { }
 };
 
-static const char *qdev_class_get_alias(DeviceClass *dc)
+static const char *qdev_class_get_alias(const DeviceClass *dc)
 {
     const char *typename = object_class_get_name(OBJECT_CLASS(dc));
     int i;
@@ -96,7 +96,7 @@ static const char *qdev_class_get_alias(DeviceClass *dc)
     return NULL;
 }
 
-static bool qdev_class_has_alias(DeviceClass *dc)
+static bool qdev_class_has_alias(const DeviceClass *dc)
 {
     return (qdev_class_get_alias(dc) != NULL);
 }
diff --git a/qom/object.c b/qom/object.c
index 8f60ad9b8e..a25b1fffad 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -751,12 +751,12 @@ ObjectClass *object_get_class(Object *obj)
     return obj->class;
 }
 
-bool object_class_is_abstract(ObjectClass *klass)
+bool object_class_is_abstract(const ObjectClass *klass)
 {
     return klass->type->abstract;
 }
 
-const char *object_class_get_name(ObjectClass *klass)
+const char *object_class_get_name(const ObjectClass *klass)
 {
     return klass->type->name;
 }
@@ -1029,11 +1029,11 @@ ObjectProperty *object_property_iter_next(ObjectPropertyIterator *iter)
     return val;
 }
 
-ObjectProperty *object_class_property_find(ObjectClass *klass, const char *name,
-                                           Error **errp)
+ObjectProperty *object_class_property_find(const ObjectClass *klass,
+                                           const char *name, Error **errp)
 {
     ObjectProperty *prop;
-    ObjectClass *parent_klass;
+    const ObjectClass *parent_klass;
 
     parent_klass = object_class_get_parent(klass);
     if (parent_klass) {
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 7aa762245a..b1d6252ae0 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -735,7 +735,7 @@ static ObjectClass *x86_cpu_class_by_name(const char *cpu_model)
     return oc;
 }
 
-static char *x86_cpu_class_get_model_name(X86CPUClass *cc)
+static char *x86_cpu_class_get_model_name(const X86CPUClass *cc)
 {
     const char *class_name = object_class_get_name(OBJECT_CLASS(cc));
     assert(g_str_has_suffix(class_name, X86_CPU_TYPE_SUFFIX));
diff --git a/target/ppc/translate_init.c b/target/ppc/translate_init.c
index c1a901455c..ee8ff04fd2 100644
--- a/target/ppc/translate_init.c
+++ b/target/ppc/translate_init.c
@@ -9773,7 +9773,7 @@ static int ppc_fixup_cpu(PowerPCCPU *cpu)
     return 0;
 }
 
-static inline bool ppc_cpu_is_valid(PowerPCCPUClass *pcc)
+static inline bool ppc_cpu_is_valid(const PowerPCCPUClass *pcc)
 {
 #ifdef TARGET_PPCEMB
     return pcc->mmu_model == POWERPC_MMU_BOOKE ||
-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC v2 6/9] Explicitly cast the *_GET_CLASS() value when we break the rules
  2017-03-29 19:41 [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers Eduardo Habkost
                   ` (4 preceding siblings ...)
  2017-03-29 19:41 ` [Qemu-devel] [RFC v2 5/9] Make class parameter const at some functions Eduardo Habkost
@ 2017-03-29 19:41 ` Eduardo Habkost
  2017-03-29 19:41 ` [Qemu-devel] [RFC v2 7/9] Use const variables for *_GET_CLASS values Eduardo Habkost
                   ` (5 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: Eduardo Habkost @ 2017-03-29 19:41 UTC (permalink / raw)
  To: qemu-devel

object_get_class() and *_GET_CLASS() macros are going to be
changed to return const pointers because the class structs are
supposed to be initialized at class_init and not be changed
later.

However, there are a few places the code still break the
(proposed) rules, and change class data outside class_init. On
those cases, add an explicit cast to the *_GET_CLASS() return
value.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 hw/core/bus.c        | 2 +-
 hw/mips/mips_jazz.c  | 2 +-
 hw/xen/xen_backend.c | 2 +-
 target/s390x/cpu.c   | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/hw/core/bus.c b/hw/core/bus.c
index 4651f24486..9233f8723b 100644
--- a/hw/core/bus.c
+++ b/hw/core/bus.c
@@ -90,7 +90,7 @@ static void qbus_realize(BusState *bus, DeviceState *parent, const char *name)
         bus->name = g_strdup_printf("%s.%d", bus->parent->id, bus_id);
     } else {
         /* no id -> use lowercase bus type plus global bus-id for bus name */
-        bc = BUS_GET_CLASS(bus);
+        bc = (BusClass *)BUS_GET_CLASS(bus);
         bus_id = bc->automatic_ids++;
         bus->name = g_strdup_printf("%s.%d", typename, bus_id);
         for (i = 0; bus->name[i]; i++) {
diff --git a/hw/mips/mips_jazz.c b/hw/mips/mips_jazz.c
index 1cef581878..0407d998f1 100644
--- a/hw/mips/mips_jazz.c
+++ b/hw/mips/mips_jazz.c
@@ -166,7 +166,7 @@ static void mips_jazz_init(MachineState *machine,
      * CPU, which raise an exception.
      * Handle that case by hijacking the do_unassigned_access method on
      * the CPU, and do not raise exceptions for data access. */
-    cc = CPU_GET_CLASS(cpu);
+    cc = (CPUClass *)CPU_GET_CLASS(cpu);
     real_do_unassigned_access = cc->do_unassigned_access;
     cc->do_unassigned_access = mips_jazz_do_unassigned_access;
 
diff --git a/hw/xen/xen_backend.c b/hw/xen/xen_backend.c
index 6e530681f4..541ebb226c 100644
--- a/hw/xen/xen_backend.c
+++ b/hw/xen/xen_backend.c
@@ -553,7 +553,7 @@ err:
 static void xen_set_dynamic_sysbus(void)
 {
     Object *machine = qdev_get_machine();
-    MachineClass *mc = MACHINE_GET_CLASS(machine);
+    MachineClass *mc = (MachineClass *)MACHINE_GET_CLASS(machine);
 
     mc->has_dynamic_sysbus = true;
 }
diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
index 066dcd17df..07eb8b745f 100644
--- a/target/s390x/cpu.c
+++ b/target/s390x/cpu.c
@@ -174,7 +174,7 @@ static void s390_cpu_disas_set_info(CPUState *cpu, disassemble_info *info)
 static void s390_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
-    S390CPUClass *scc = S390_CPU_GET_CLASS(dev);
+    S390CPUClass *scc = (S390CPUClass *)S390_CPU_GET_CLASS(dev);
     S390CPU *cpu = S390_CPU(dev);
     CPUS390XState *env = &cpu->env;
     Error *err = NULL;
-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC v2 7/9] Use const variables for *_GET_CLASS values
  2017-03-29 19:41 [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers Eduardo Habkost
                   ` (5 preceding siblings ...)
  2017-03-29 19:41 ` [Qemu-devel] [RFC v2 6/9] Explicitly cast the *_GET_CLASS() value when we break the rules Eduardo Habkost
@ 2017-03-29 19:41 ` Eduardo Habkost
  2017-03-29 19:41 ` [Qemu-devel] [RFC v2 8/9] qom: Make class cast macros/functions const-aware Eduardo Habkost
                   ` (4 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: Eduardo Habkost @ 2017-03-29 19:41 UTC (permalink / raw)
  To: qemu-devel

Use const variables for the return value of *_GET_CLASS and
object_get_class(). This will allow us to make *_GET_CLASS and
object_get_class() return const pointers later.

Most of the changes were generated using the following Coccinelle
script, but some additional cases had to be udpated by hand after
running the script.

  @@
  type XClass;
  identifier oc;
  identifier X_GET_CLASS =~ ".*_GET_CLASS|object_get_class";
  @@
  -XClass *oc;
  +const XClass *oc;
   <+...
   oc = X_GET_CLASS(...);
   ...+>

  @@
  type XClass;
  identifier oc;
  identifier X_GET_CLASS =~ ".*_GET_CLASS|object_get_class";
  @@
  +const
   XClass *oc = X_GET_CLASS(...);

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 include/qom/cpu.h               | 12 ++++----
 include/qom/object.h            |  2 +-
 target/ppc/mmu-book3s-v3.h      |  2 +-
 target/ppc/mmu-hash64.h         |  2 +-
 target/s390x/cpu.h              |  2 +-
 backends/cryptodev.c            | 10 +++----
 backends/hostmem.c              |  2 +-
 backends/rng.c                  |  4 +--
 backends/tpm.c                  | 28 +++++++++----------
 chardev/char-mux.c              |  2 +-
 chardev/char.c                  | 10 +++----
 cpu-exec.c                      | 14 +++++-----
 device-hotplug.c                |  2 +-
 disas.c                         |  4 +--
 exec.c                          |  6 ++--
 gdbstub.c                       | 10 +++----
 hmp.c                           |  4 +--
 hw/acpi/acpi_interface.c        |  2 +-
 hw/acpi/cpu.c                   |  8 +++---
 hw/acpi/cpu_hotplug.c           |  4 +--
 hw/acpi/ipmi.c                  |  2 +-
 hw/acpi/memory_hotplug.c        |  2 +-
 hw/acpi/nvdimm.c                |  4 +--
 hw/acpi/pcihp.c                 |  4 +--
 hw/arm/aspeed.c                 |  2 +-
 hw/arm/aspeed_soc.c             |  4 +--
 hw/arm/boot.c                   |  2 +-
 hw/arm/exynos4_boards.c         |  2 +-
 hw/arm/vexpress.c               |  2 +-
 hw/arm/virt-acpi-build.c        |  6 ++--
 hw/arm/virt.c                   |  6 ++--
 hw/audio/cs4231a.c              | 10 +++----
 hw/audio/gus.c                  |  6 ++--
 hw/audio/intel-hda.c            |  8 +++---
 hw/audio/sb16.c                 |  6 ++--
 hw/block/dataplane/virtio-blk.c |  6 ++--
 hw/block/fdc.c                  |  8 +++---
 hw/block/m25p80.c               |  2 +-
 hw/char/serial-pci.c            |  2 +-
 hw/char/virtio-console.c        |  6 ++--
 hw/char/virtio-serial-bus.c     | 18 ++++++------
 hw/core/bus.c                   |  2 +-
 hw/core/fw-path-provider.c      |  2 +-
 hw/core/generic-loader.c        |  2 +-
 hw/core/hotplug.c               |  8 +++---
 hw/core/loader.c                |  4 +--
 hw/core/machine.c               |  4 +--
 hw/core/nmi.c                   |  2 +-
 hw/core/qdev-properties.c       |  4 +--
 hw/core/qdev.c                  | 32 ++++++++++-----------
 hw/core/stream.c                |  4 +--
 hw/core/sysbus.c                |  6 ++--
 hw/display/cirrus_vga.c         |  2 +-
 hw/i2c/core.c                   | 10 +++----
 hw/i2c/smbus.c                  |  8 +++---
 hw/i386/acpi-build.c            | 16 +++++------
 hw/i386/kvm/i8254.c             |  2 +-
 hw/i386/kvm/i8259.c             |  2 +-
 hw/i386/pc.c                    | 32 ++++++++++-----------
 hw/i386/pc_piix.c               |  4 +--
 hw/i386/pc_q35.c                |  4 +--
 hw/i386/x86-iommu.c             |  2 +-
 hw/ide/microdrive.c             |  4 +--
 hw/ide/qdev.c                   |  2 +-
 hw/input/adb.c                  |  6 ++--
 hw/input/virtio-input.c         | 12 ++++----
 hw/intc/apic_common.c           | 26 ++++++++---------
 hw/intc/arm_gic.c               |  2 +-
 hw/intc/arm_gic_common.c        |  4 +--
 hw/intc/arm_gic_kvm.c           |  4 +--
 hw/intc/arm_gicv3.c             |  2 +-
 hw/intc/arm_gicv3_common.c      |  4 +--
 hw/intc/arm_gicv3_its_common.c  |  6 ++--
 hw/intc/arm_gicv3_kvm.c         |  4 +--
 hw/intc/i8259.c                 |  2 +-
 hw/intc/i8259_common.c          |  4 +--
 hw/intc/ioapic_common.c         |  6 ++--
 hw/intc/xics.c                  | 26 ++++++++---------
 hw/ipack/ipack.c                |  4 +--
 hw/ipack/tpci200.c              | 12 ++++----
 hw/ipmi/ipmi_bmc_extern.c       | 12 ++++----
 hw/ipmi/ipmi_bmc_sim.c          | 24 ++++++++--------
 hw/ipmi/isa_ipmi_bt.c           | 22 +++++++--------
 hw/ipmi/isa_ipmi_kcs.c          | 20 ++++++-------
 hw/mem/pc-dimm.c                | 10 +++----
 hw/misc/imx_ccm.c               |  2 +-
 hw/net/e1000.c                  |  2 +-
 hw/net/vhost_net.c              |  4 +--
 hw/net/vmxnet3.c                |  2 +-
 hw/nvram/fw_cfg.c               |  2 +-
 hw/pci-bridge/pcie_root_port.c  |  8 +++---
 hw/pci/pci.c                    | 16 +++++------
 hw/pcmcia/pxa2xx.c              | 16 +++++------
 hw/ppc/pnv.c                    | 14 +++++-----
 hw/ppc/pnv_core.c               |  2 +-
 hw/ppc/pnv_xscom.c              |  6 ++--
 hw/ppc/prep.c                   |  8 +++---
 hw/ppc/spapr.c                  | 50 ++++++++++++++++-----------------
 hw/ppc/spapr_cpu_core.c         |  4 +--
 hw/ppc/spapr_drc.c              | 20 ++++++-------
 hw/ppc/spapr_events.c           |  6 ++--
 hw/ppc/spapr_hcall.c            |  2 +-
 hw/ppc/spapr_pci.c              | 14 +++++-----
 hw/ppc/spapr_rtas.c             |  8 +++---
 hw/ppc/spapr_vio.c              | 12 ++++----
 hw/s390x/css-bridge.c           |  2 +-
 hw/s390x/css.c                  |  6 ++--
 hw/s390x/event-facility.c       | 14 +++++-----
 hw/s390x/s390-skeys-kvm.c       |  2 +-
 hw/s390x/s390-skeys.c           |  8 +++---
 hw/s390x/s390-virtio-ccw.c      |  8 +++---
 hw/s390x/sclp.c                 | 10 +++----
 hw/s390x/virtio-ccw.c           | 12 ++++----
 hw/scsi/megasas.c               |  8 +++---
 hw/scsi/mptconfig.c             |  6 ++--
 hw/scsi/scsi-bus.c              |  8 +++---
 hw/scsi/vhost-scsi.c            |  4 +--
 hw/scsi/virtio-scsi-dataplane.c |  6 ++--
 hw/scsi/vmw_pvscsi.c            |  2 +-
 hw/sd/core.c                    | 18 ++++++------
 hw/sh4/sh7750.c                 |  2 +-
 hw/smbios/smbios_type_38.c      |  2 +-
 hw/sparc/sun4m.c                |  2 +-
 hw/sparc64/sun4u.c              |  2 +-
 hw/ssi/aspeed_smc.c             |  2 +-
 hw/ssi/ssi.c                    |  8 +++---
 hw/ssi/xilinx_spips.c           |  2 +-
 hw/timer/i8254.c                |  2 +-
 hw/timer/i8254_common.c         | 10 +++----
 hw/timer/m48t59-isa.c           |  2 +-
 hw/timer/m48t59.c               |  2 +-
 hw/usb/bus.c                    | 32 ++++++++++-----------
 hw/usb/dev-smartcard-reader.c   |  8 +++---
 hw/usb/hcd-ehci-pci.c           |  2 +-
 hw/usb/hcd-ehci-sysbus.c        |  2 +-
 hw/usb/hcd-uhci.c               |  2 +-
 hw/vfio/amd-xgbe.c              |  2 +-
 hw/vfio/calxeda-xgmac.c         |  2 +-
 hw/virtio/vhost-vsock.c         |  4 +--
 hw/virtio/vhost.c               |  2 +-
 hw/virtio/virtio-bus.c          | 24 ++++++++--------
 hw/virtio/virtio-mmio.c         |  2 +-
 hw/virtio/virtio-pci.c          | 20 ++++++-------
 hw/virtio/virtio.c              | 62 ++++++++++++++++++++---------------------
 io/channel.c                    | 20 ++++++-------
 kvm-all.c                       |  2 +-
 migration/migration.c           |  2 +-
 migration/savevm.c              |  2 +-
 monitor.c                       |  2 +-
 net/filter.c                    |  6 ++--
 qdev-monitor.c                  |  8 +++---
 qmp.c                           |  4 +--
 qom/cpu.c                       | 26 ++++++++---------
 qom/object.c                    |  2 +-
 qom/object_interfaces.c         |  4 +--
 target/alpha/cpu.c              |  2 +-
 target/arm/cpu.c                |  8 +++---
 target/arm/kvm.c                |  2 +-
 target/cris/cpu.c               | 10 +++----
 target/cris/helper.c            |  2 +-
 target/hppa/cpu.c               |  2 +-
 target/i386/cpu.c               |  8 +++---
 target/i386/kvm.c               |  2 +-
 target/i386/machine.c           |  2 +-
 target/lm32/cpu.c               |  4 +--
 target/lm32/gdbstub.c           |  2 +-
 target/m68k/cpu.c               |  4 +--
 target/microblaze/cpu.c         |  4 +--
 target/microblaze/gdbstub.c     |  2 +-
 target/mips/cpu.c               |  4 +--
 target/moxie/cpu.c              |  4 +--
 target/nios2/cpu.c              |  8 +++---
 target/openrisc/cpu.c           |  4 +--
 target/openrisc/gdbstub.c       |  2 +-
 target/ppc/arch_dump.c          |  2 +-
 target/ppc/compat.c             |  4 +--
 target/ppc/excp_helper.c        |  2 +-
 target/ppc/mmu-hash64.c         |  6 ++--
 target/ppc/mmu_helper.c         |  2 +-
 target/ppc/translate_init.c     | 12 ++++----
 target/s390x/cpu.c              |  4 +--
 target/s390x/cpu_models.c       |  4 +--
 target/s390x/kvm.c              |  4 +--
 target/s390x/mem_helper.c       |  6 ++--
 target/s390x/misc_helper.c      |  6 ++--
 target/s390x/mmu_helper.c       |  2 +-
 target/sh4/cpu.c                |  4 +--
 target/sparc/cpu.c              |  4 +--
 target/tilegx/cpu.c             |  4 +--
 target/tricore/cpu.c            |  4 +--
 target/unicore32/cpu.c          |  2 +-
 target/xtensa/cpu.c             |  6 ++--
 tests/check-qom-interface.c     |  2 +-
 user-exec.c                     |  2 +-
 vl.c                            |  2 +-
 195 files changed, 679 insertions(+), 679 deletions(-)

diff --git a/include/qom/cpu.h b/include/qom/cpu.h
index c3292efe1c..c6a5bfa8cd 100644
--- a/include/qom/cpu.h
+++ b/include/qom/cpu.h
@@ -549,7 +549,7 @@ void cpu_dump_statistics(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf,
 static inline hwaddr cpu_get_phys_page_attrs_debug(CPUState *cpu, vaddr addr,
                                                    MemTxAttrs *attrs)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
 
     if (cc->get_phys_page_attrs_debug) {
         return cc->get_phys_page_attrs_debug(cpu, addr, attrs);
@@ -585,7 +585,7 @@ static inline hwaddr cpu_get_phys_page_debug(CPUState *cpu, vaddr addr)
  */
 static inline int cpu_asidx_from_attrs(CPUState *cpu, MemTxAttrs attrs)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
 
     if (cc->asidx_from_attrs) {
         return cc->asidx_from_attrs(cpu, attrs);
@@ -644,7 +644,7 @@ CPUState *cpu_generic_init(const char *typename, const char *cpu_model);
  */
 static inline bool cpu_has_work(CPUState *cpu)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
 
     g_assert(cc->has_work);
     return cc->has_work(cpu);
@@ -811,7 +811,7 @@ static inline void cpu_unassigned_access(CPUState *cpu, hwaddr addr,
                                          bool is_write, bool is_exec,
                                          int opaque, unsigned size)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
 
     if (cc->do_unassigned_access) {
         cc->do_unassigned_access(cpu, addr, is_write, is_exec, opaque, size);
@@ -822,7 +822,7 @@ static inline void cpu_unaligned_access(CPUState *cpu, vaddr addr,
                                         MMUAccessType access_type,
                                         int mmu_idx, uintptr_t retaddr)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
 
     cc->do_unaligned_access(cpu, addr, access_type, mmu_idx, retaddr);
 }
@@ -837,7 +837,7 @@ static inline void cpu_unaligned_access(CPUState *cpu, vaddr addr,
  */
 static inline void cpu_set_pc(CPUState *cpu, vaddr addr)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
 
     cc->set_pc(cpu, addr);
 }
diff --git a/include/qom/object.h b/include/qom/object.h
index bb0be22ac7..4af3c8e232 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -989,7 +989,7 @@ ObjectProperty *object_class_property_find(const ObjectClass *klass,
                                            Error **errp);
 
 typedef struct ObjectPropertyIterator {
-    ObjectClass *nextclass;
+    const ObjectClass *nextclass;
     GHashTableIter iter;
 } ObjectPropertyIterator;
 
diff --git a/target/ppc/mmu-book3s-v3.h b/target/ppc/mmu-book3s-v3.h
index 636f6ab95f..0c58891732 100644
--- a/target/ppc/mmu-book3s-v3.h
+++ b/target/ppc/mmu-book3s-v3.h
@@ -34,7 +34,7 @@ static inline bool ppc64_use_proc_tbl(PowerPCCPU *cpu)
 
 static inline bool ppc64_radix_guest(PowerPCCPU *cpu)
 {
-    PPCVirtualHypervisorClass *vhc =
+    const PPCVirtualHypervisorClass *vhc =
         PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp);
 
     return !!(vhc->get_patbe(cpu->vhyp) & PATBE1_GR);
diff --git a/target/ppc/mmu-hash64.h b/target/ppc/mmu-hash64.h
index 54f1e37655..d62882b414 100644
--- a/target/ppc/mmu-hash64.h
+++ b/target/ppc/mmu-hash64.h
@@ -102,7 +102,7 @@ static inline hwaddr ppc_hash64_hpt_base(PowerPCCPU *cpu)
 static inline hwaddr ppc_hash64_hpt_mask(PowerPCCPU *cpu)
 {
     if (cpu->vhyp) {
-        PPCVirtualHypervisorClass *vhc =
+        const PPCVirtualHypervisorClass *vhc =
             PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp);
         return vhc->hpt_mask(cpu->vhyp);
     }
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 058ddad83a..1f904ad5d0 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -505,7 +505,7 @@ static inline hwaddr decode_basedisp_s(CPUS390XState *env, uint32_t ipb,
 /* helper functions for run_on_cpu() */
 static inline void s390_do_cpu_reset(CPUState *cs, run_on_cpu_data arg)
 {
-    S390CPUClass *scc = S390_CPU_GET_CLASS(cs);
+    const S390CPUClass *scc = S390_CPU_GET_CLASS(cs);
 
     scc->cpu_reset(cs);
 }
diff --git a/backends/cryptodev.c b/backends/cryptodev.c
index 832f056266..e0ec00278d 100644
--- a/backends/cryptodev.c
+++ b/backends/cryptodev.c
@@ -67,7 +67,7 @@ void cryptodev_backend_cleanup(
              CryptoDevBackend *backend,
              Error **errp)
 {
-    CryptoDevBackendClass *bc =
+    const CryptoDevBackendClass *bc =
                   CRYPTODEV_BACKEND_GET_CLASS(backend);
 
     if (bc->cleanup) {
@@ -80,7 +80,7 @@ int64_t cryptodev_backend_sym_create_session(
            CryptoDevBackendSymSessionInfo *sess_info,
            uint32_t queue_index, Error **errp)
 {
-    CryptoDevBackendClass *bc =
+    const CryptoDevBackendClass *bc =
                       CRYPTODEV_BACKEND_GET_CLASS(backend);
 
     if (bc->create_session) {
@@ -95,7 +95,7 @@ int cryptodev_backend_sym_close_session(
            uint64_t session_id,
            uint32_t queue_index, Error **errp)
 {
-    CryptoDevBackendClass *bc =
+    const CryptoDevBackendClass *bc =
                       CRYPTODEV_BACKEND_GET_CLASS(backend);
 
     if (bc->close_session) {
@@ -110,7 +110,7 @@ static int cryptodev_backend_sym_operation(
                  CryptoDevBackendSymOpInfo *op_info,
                  uint32_t queue_index, Error **errp)
 {
-    CryptoDevBackendClass *bc =
+    const CryptoDevBackendClass *bc =
                       CRYPTODEV_BACKEND_GET_CLASS(backend);
 
     if (bc->do_sym_op) {
@@ -178,7 +178,7 @@ static void
 cryptodev_backend_complete(UserCreatable *uc, Error **errp)
 {
     CryptoDevBackend *backend = CRYPTODEV_BACKEND(uc);
-    CryptoDevBackendClass *bc = CRYPTODEV_BACKEND_GET_CLASS(uc);
+    const CryptoDevBackendClass *bc = CRYPTODEV_BACKEND_GET_CLASS(uc);
     Error *local_err = NULL;
 
     if (bc->init) {
diff --git a/backends/hostmem.c b/backends/hostmem.c
index 89feb9ed75..2f5ca16dde 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -257,7 +257,7 @@ static void
 host_memory_backend_memory_complete(UserCreatable *uc, Error **errp)
 {
     HostMemoryBackend *backend = MEMORY_BACKEND(uc);
-    HostMemoryBackendClass *bc = MEMORY_BACKEND_GET_CLASS(uc);
+    const HostMemoryBackendClass *bc = MEMORY_BACKEND_GET_CLASS(uc);
     Error *local_err = NULL;
     void *ptr;
     uint64_t sz;
diff --git a/backends/rng.c b/backends/rng.c
index 398ebe4a7d..0f7c42ab9e 100644
--- a/backends/rng.c
+++ b/backends/rng.c
@@ -20,7 +20,7 @@ void rng_backend_request_entropy(RngBackend *s, size_t size,
                                  EntropyReceiveFunc *receive_entropy,
                                  void *opaque)
 {
-    RngBackendClass *k = RNG_BACKEND_GET_CLASS(s);
+    const RngBackendClass *k = RNG_BACKEND_GET_CLASS(s);
     RngRequest *req;
 
     if (k->request_entropy) {
@@ -53,7 +53,7 @@ static void rng_backend_complete(UserCreatable *uc, Error **errp)
 static void rng_backend_prop_set_opened(Object *obj, bool value, Error **errp)
 {
     RngBackend *s = RNG_BACKEND(obj);
-    RngBackendClass *k = RNG_BACKEND_GET_CLASS(s);
+    const RngBackendClass *k = RNG_BACKEND_GET_CLASS(s);
     Error *local_err = NULL;
 
     if (value == s->opened) {
diff --git a/backends/tpm.c b/backends/tpm.c
index 536f262bb7..d02f3bdce8 100644
--- a/backends/tpm.c
+++ b/backends/tpm.c
@@ -22,21 +22,21 @@
 
 enum TpmType tpm_backend_get_type(TPMBackend *s)
 {
-    TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
+    const TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
 
     return k->ops->type;
 }
 
 const char *tpm_backend_get_desc(TPMBackend *s)
 {
-    TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
+    const TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
 
     return k->ops->desc();
 }
 
 void tpm_backend_destroy(TPMBackend *s)
 {
-    TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
+    const TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
 
     k->ops->destroy(s);
 }
@@ -44,70 +44,70 @@ void tpm_backend_destroy(TPMBackend *s)
 int tpm_backend_init(TPMBackend *s, TPMState *state,
                      TPMRecvDataCB *datacb)
 {
-    TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
+    const TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
 
     return k->ops->init(s, state, datacb);
 }
 
 int tpm_backend_startup_tpm(TPMBackend *s)
 {
-    TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
+    const TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
 
     return k->ops->startup_tpm(s);
 }
 
 bool tpm_backend_had_startup_error(TPMBackend *s)
 {
-    TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
+    const TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
 
     return k->ops->had_startup_error(s);
 }
 
 size_t tpm_backend_realloc_buffer(TPMBackend *s, TPMSizedBuffer *sb)
 {
-    TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
+    const TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
 
     return k->ops->realloc_buffer(sb);
 }
 
 void tpm_backend_deliver_request(TPMBackend *s)
 {
-    TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
+    const TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
 
     k->ops->deliver_request(s);
 }
 
 void tpm_backend_reset(TPMBackend *s)
 {
-    TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
+    const TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
 
     k->ops->reset(s);
 }
 
 void tpm_backend_cancel_cmd(TPMBackend *s)
 {
-    TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
+    const TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
 
     k->ops->cancel_cmd(s);
 }
 
 bool tpm_backend_get_tpm_established_flag(TPMBackend *s)
 {
-    TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
+    const TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
 
     return k->ops->get_tpm_established_flag(s);
 }
 
 int tpm_backend_reset_tpm_established_flag(TPMBackend *s, uint8_t locty)
 {
-    TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
+    const TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
 
     return k->ops->reset_tpm_established_flag(s, locty);
 }
 
 TPMVersion tpm_backend_get_tpm_version(TPMBackend *s)
 {
-    TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
+    const TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
 
     return k->ops->get_tpm_version(s);
 }
@@ -127,7 +127,7 @@ void tpm_backend_open(TPMBackend *s, Error **errp)
 static void tpm_backend_prop_set_opened(Object *obj, bool value, Error **errp)
 {
     TPMBackend *s = TPM_BACKEND(obj);
-    TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
+    const TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
     Error *local_err = NULL;
 
     if (value == s->opened) {
diff --git a/chardev/char-mux.c b/chardev/char-mux.c
index 5547a36a0a..23f73825e3 100644
--- a/chardev/char-mux.c
+++ b/chardev/char-mux.c
@@ -241,7 +241,7 @@ static GSource *mux_chr_add_watch(Chardev *s, GIOCondition cond)
 {
     MuxChardev *d = MUX_CHARDEV(s);
     Chardev *chr = qemu_chr_fe_get_driver(&d->chr);
-    ChardevClass *cc = CHARDEV_GET_CLASS(chr);
+    const ChardevClass *cc = CHARDEV_GET_CLASS(chr);
 
     if (!cc->chr_add_watch) {
         return NULL;
diff --git a/chardev/char.c b/chardev/char.c
index 3df116350b..f4abfbf0fd 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -102,7 +102,7 @@ static void qemu_chr_fe_write_log(Chardev *s,
 static int qemu_chr_fe_write_buffer(Chardev *s,
                                     const uint8_t *buf, int len, int *offset)
 {
-    ChardevClass *cc = CHARDEV_GET_CLASS(s);
+    const ChardevClass *cc = CHARDEV_GET_CLASS(s);
     int res = 0;
     *offset = 0;
 
@@ -137,7 +137,7 @@ static bool qemu_chr_replay(Chardev *chr)
 int qemu_chr_fe_write(CharBackend *be, const uint8_t *buf, int len)
 {
     Chardev *s = be->chr;
-    ChardevClass *cc;
+    const ChardevClass *cc;
     int ret;
 
     if (!s) {
@@ -369,7 +369,7 @@ void qemu_chr_fe_printf(CharBackend *be, const char *fmt, ...)
 static void qemu_char_open(Chardev *chr, ChardevBackend *backend,
                            bool *be_opened, Error **errp)
 {
-    ChardevClass *cc = CHARDEV_GET_CLASS(chr);
+    const ChardevClass *cc = CHARDEV_GET_CLASS(chr);
     /* Any ChardevCommon member would work */
     ChardevCommon *common = backend ? backend->u.null.data : NULL;
 
@@ -549,7 +549,7 @@ void qemu_chr_fe_set_handlers(CharBackend *b,
                               bool set_open)
 {
     Chardev *s;
-    ChardevClass *cc;
+    const ChardevClass *cc;
     int fe_open;
 
     s = b->chr;
@@ -603,7 +603,7 @@ void qemu_chr_fe_take_focus(CharBackend *b)
 
 int qemu_chr_wait_connected(Chardev *chr, Error **errp)
 {
-    ChardevClass *cc = CHARDEV_GET_CLASS(chr);
+    const ChardevClass *cc = CHARDEV_GET_CLASS(chr);
 
     if (cc->chr_wait_connected) {
         return cc->chr_wait_connected(chr, errp);
diff --git a/cpu-exec.c b/cpu-exec.c
index 748cb66bca..45a4c7d0bd 100644
--- a/cpu-exec.c
+++ b/cpu-exec.c
@@ -174,7 +174,7 @@ static inline tcg_target_ulong cpu_tb_exec(CPUState *cpu, TranslationBlock *itb)
          * counter hit zero); we must restore the guest PC to the address
          * of the start of the TB.
          */
-        CPUClass *cc = CPU_GET_CLASS(cpu);
+        const CPUClass *cc = CPU_GET_CLASS(cpu);
         qemu_log_mask_and_addr(CPU_LOG_EXEC, last_tb->pc,
                                "Stopped execution of TB chain before %p ["
                                TARGET_FMT_lx "] %s\n",
@@ -223,7 +223,7 @@ static void cpu_exec_nocache(CPUState *cpu, int max_cycles,
 
 static void cpu_exec_step(CPUState *cpu)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
     CPUArchState *env = (CPUArchState *)cpu->env_ptr;
     TranslationBlock *tb;
     target_ulong cs_base, pc;
@@ -421,7 +421,7 @@ static inline bool cpu_handle_halt(CPUState *cpu)
 
 static inline void cpu_handle_debug_exception(CPUState *cpu)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
     CPUWatchpoint *wp;
 
     if (!cpu->watchpoint_hit) {
@@ -450,7 +450,7 @@ static inline bool cpu_handle_exception(CPUState *cpu, int *ret)
                which will be handled outside the cpu execution
                loop */
 #if defined(TARGET_I386)
-            CPUClass *cc = CPU_GET_CLASS(cpu);
+            const CPUClass *cc = CPU_GET_CLASS(cpu);
             cc->do_interrupt(cpu);
 #endif
             *ret = cpu->exception_index;
@@ -458,7 +458,7 @@ static inline bool cpu_handle_exception(CPUState *cpu, int *ret)
             return true;
 #else
             if (replay_exception()) {
-                CPUClass *cc = CPU_GET_CLASS(cpu);
+                const CPUClass *cc = CPU_GET_CLASS(cpu);
                 qemu_mutex_lock_iothread();
                 cc->do_interrupt(cpu);
                 qemu_mutex_unlock_iothread();
@@ -486,7 +486,7 @@ static inline bool cpu_handle_exception(CPUState *cpu, int *ret)
 static inline bool cpu_handle_interrupt(CPUState *cpu,
                                         TranslationBlock **last_tb)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
 
     if (unlikely(atomic_read(&cpu->interrupt_request))) {
         int interrupt_request;
@@ -621,7 +621,7 @@ static inline void cpu_loop_exec_tb(CPUState *cpu, TranslationBlock *tb,
 
 int cpu_exec(CPUState *cpu)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
     int ret;
     SyncClocks sc = { 0 };
 
diff --git a/device-hotplug.c b/device-hotplug.c
index 126f73c676..1ac178aa30 100644
--- a/device-hotplug.c
+++ b/device-hotplug.c
@@ -36,7 +36,7 @@ static DriveInfo *add_init_drive(const char *optstr)
 {
     DriveInfo *dinfo;
     QemuOpts *opts;
-    MachineClass *mc;
+    const MachineClass *mc;
 
     opts = drive_def(optstr);
     if (!opts)
diff --git a/disas.c b/disas.c
index d335c55bbf..4f4d7dddb5 100644
--- a/disas.c
+++ b/disas.c
@@ -181,7 +181,7 @@ static int print_insn_od_target(bfd_vma pc, disassemble_info *info)
 void target_disas(FILE *out, CPUState *cpu, target_ulong code,
                   target_ulong size, int flags)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
     target_ulong pc;
     int count;
     CPUDebug s;
@@ -369,7 +369,7 @@ monitor_read_memory (bfd_vma memaddr, bfd_byte *myaddr, int length,
 void monitor_disas(Monitor *mon, CPUState *cpu,
                    target_ulong pc, int nb_insn, int is_physical, int flags)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
     int count, i;
     CPUDebug s;
 
diff --git a/exec.c b/exec.c
index e57a8a2178..56e2a495a2 100644
--- a/exec.c
+++ b/exec.c
@@ -673,7 +673,7 @@ AddressSpace *cpu_get_address_space(CPUState *cpu, int asidx)
 
 void cpu_exec_unrealizefn(CPUState *cpu)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
 
     cpu_list_remove(cpu);
 
@@ -711,7 +711,7 @@ void cpu_exec_initfn(CPUState *cpu)
 
 void cpu_exec_realizefn(CPUState *cpu, Error **errp)
 {
-    CPUClass *cc ATTRIBUTE_UNUSED = CPU_GET_CLASS(cpu);
+    const CPUClass *cc ATTRIBUTE_UNUSED = CPU_GET_CLASS(cpu);
 
     cpu_list_add(cpu);
 
@@ -2207,7 +2207,7 @@ static const MemoryRegionOps notdirty_mem_ops = {
 static void check_watchpoint(int offset, int len, MemTxAttrs attrs, int flags)
 {
     CPUState *cpu = current_cpu;
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
     CPUArchState *env = cpu->env_ptr;
     target_ulong pc, cs_base;
     target_ulong vaddr;
diff --git a/gdbstub.c b/gdbstub.c
index 3c7e5f3a96..25216c06a6 100644
--- a/gdbstub.c
+++ b/gdbstub.c
@@ -47,7 +47,7 @@
 static inline int target_memory_rw_debug(CPUState *cpu, target_ulong addr,
                                          uint8_t *buf, int len, bool is_write)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
 
     if (cc->memory_rw_debug) {
         return cc->memory_rw_debug(cpu, addr, buf, len, is_write);
@@ -625,7 +625,7 @@ static const char *get_feature_xml(const char *p, const char **newp,
 
 static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
     CPUArchState *env = cpu->env_ptr;
     GDBRegisterState *r;
 
@@ -643,7 +643,7 @@ static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
 
 static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
     CPUArchState *env = cpu->env_ptr;
     GDBRegisterState *r;
 
@@ -710,7 +710,7 @@ static inline int xlat_gdb_type(CPUState *cpu, int gdbtype)
         [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
     };
 
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
     int cputype = xlat[gdbtype];
 
     if (cc->gdb_stop_before_watchpoint) {
@@ -943,7 +943,7 @@ out:
 static int gdb_handle_packet(GDBState *s, const char *line_buf)
 {
     CPUState *cpu;
-    CPUClass *cc;
+    const CPUClass *cc;
     const char *p;
     uint32_t thread;
     int ch, reg_size, type, res;
diff --git a/hmp.c b/hmp.c
index edb8970461..5e3641ed70 100644
--- a/hmp.c
+++ b/hmp.c
@@ -809,7 +809,7 @@ static void hmp_info_pci_device(Monitor *mon, const PciDeviceInfo *dev)
 static int hmp_info_irq_foreach(Object *obj, void *opaque)
 {
     InterruptStatsProvider *intc;
-    InterruptStatsProviderClass *k;
+    const InterruptStatsProviderClass *k;
     Monitor *mon = opaque;
 
     if (object_dynamic_cast(obj, TYPE_INTERRUPT_STATS_PROVIDER)) {
@@ -847,7 +847,7 @@ void hmp_info_irq(Monitor *mon, const QDict *qdict)
 static int hmp_info_pic_foreach(Object *obj, void *opaque)
 {
     InterruptStatsProvider *intc;
-    InterruptStatsProviderClass *k;
+    const InterruptStatsProviderClass *k;
     Monitor *mon = opaque;
 
     if (object_dynamic_cast(obj, TYPE_INTERRUPT_STATS_PROVIDER)) {
diff --git a/hw/acpi/acpi_interface.c b/hw/acpi/acpi_interface.c
index 6583917b8e..ed6c394c98 100644
--- a/hw/acpi/acpi_interface.c
+++ b/hw/acpi/acpi_interface.c
@@ -4,7 +4,7 @@
 
 void acpi_send_event(DeviceState *dev, AcpiEventStatusBits event)
 {
-    AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_GET_CLASS(dev);
+    const AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_GET_CLASS(dev);
     if (adevc->send_event) {
         AcpiDeviceIf *adev = ACPI_DEVICE_IF(dev);
         adevc->send_event(adev, event);
diff --git a/hw/acpi/cpu.c b/hw/acpi/cpu.c
index 8c719d3f9d..21b8c16c44 100644
--- a/hw/acpi/cpu.c
+++ b/hw/acpi/cpu.c
@@ -189,7 +189,7 @@ void cpu_hotplug_hw_init(MemoryRegion *as, Object *owner,
                          CPUHotplugState *state, hwaddr base_addr)
 {
     MachineState *machine = MACHINE(qdev_get_machine());
-    MachineClass *mc = MACHINE_GET_CLASS(machine);
+    const MachineClass *mc = MACHINE_GET_CLASS(machine);
     const CPUArchIdList *id_list;
     int i;
 
@@ -208,7 +208,7 @@ void cpu_hotplug_hw_init(MemoryRegion *as, Object *owner,
 
 static AcpiCpuStatus *get_cpu_status(CPUHotplugState *cpu_st, DeviceState *dev)
 {
-    CPUClass *k = CPU_GET_CLASS(dev);
+    const CPUClass *k = CPU_GET_CLASS(dev);
     uint64_t cpu_arch_id = k->get_arch_id(CPU(dev));
     int i;
 
@@ -323,11 +323,11 @@ void build_cpus_aml(Aml *table, MachineState *machine, CPUHotplugFeatures opts,
     Aml *zero = aml_int(0);
     Aml *one = aml_int(1);
     Aml *sb_scope = aml_scope("_SB");
-    MachineClass *mc = MACHINE_GET_CLASS(machine);
+    const MachineClass *mc = MACHINE_GET_CLASS(machine);
     const CPUArchIdList *arch_ids = mc->possible_cpu_arch_ids(machine);
     char *cphp_res_path = g_strdup_printf("%s." CPUHP_RES_DEVICE, res_root);
     Object *obj = object_resolve_path_type("", TYPE_ACPI_DEVICE_IF, NULL);
-    AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_GET_CLASS(obj);
+    const AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_GET_CLASS(obj);
     AcpiDeviceIf *adev = ACPI_DEVICE_IF(obj);
 
     cpu_ctrl_dev = aml_device("%s", cphp_res_path);
diff --git a/hw/acpi/cpu_hotplug.c b/hw/acpi/cpu_hotplug.c
index 5243918125..ab0bf1afb1 100644
--- a/hw/acpi/cpu_hotplug.c
+++ b/hw/acpi/cpu_hotplug.c
@@ -59,7 +59,7 @@ static const MemoryRegionOps AcpiCpuHotplug_ops = {
 static void acpi_set_cpu_present_bit(AcpiCpuHotplug *g, CPUState *cpu,
                                      Error **errp)
 {
-    CPUClass *k = CPU_GET_CLASS(cpu);
+    const CPUClass *k = CPU_GET_CLASS(cpu);
     int64_t cpu_id;
 
     cpu_id = k->get_arch_id(cpu);
@@ -127,7 +127,7 @@ void build_legacy_cpu_hotplug_aml(Aml *ctx, MachineState *machine,
     Aml *cpus_map = aml_name(CPU_ON_BITMAP);
     Aml *zero = aml_int(0);
     Aml *one = aml_int(1);
-    MachineClass *mc = MACHINE_GET_CLASS(machine);
+    const MachineClass *mc = MACHINE_GET_CLASS(machine);
     const CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(machine);
     PCMachineState *pcms = PC_MACHINE(machine);
 
diff --git a/hw/acpi/ipmi.c b/hw/acpi/ipmi.c
index 651e2e94ea..4dbad05982 100644
--- a/hw/acpi/ipmi.c
+++ b/hw/acpi/ipmi.c
@@ -88,7 +88,7 @@ void build_acpi_ipmi_devices(Aml *scope, BusState *bus)
 
     QTAILQ_FOREACH(kid, &bus->children,  sibling) {
         IPMIInterface *ii;
-        IPMIInterfaceClass *iic;
+        const IPMIInterfaceClass *iic;
         IPMIFwInfo info;
         Object *obj = object_dynamic_cast(OBJECT(kid->child),
                                           TYPE_IPMI_INTERFACE);
diff --git a/hw/acpi/memory_hotplug.c b/hw/acpi/memory_hotplug.c
index 210073d283..4e5f8a4ae9 100644
--- a/hw/acpi/memory_hotplug.c
+++ b/hw/acpi/memory_hotplug.c
@@ -262,7 +262,7 @@ void acpi_memory_plug_cb(HotplugHandler *hotplug_dev, MemHotplugState *mem_st,
                          DeviceState *dev, Error **errp)
 {
     MemStatus *mdev;
-    DeviceClass *dc = DEVICE_GET_CLASS(dev);
+    const DeviceClass *dc = DEVICE_GET_CLASS(dev);
 
     if (!dc->hotpluggable) {
         return;
diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c
index 8e7d6ec034..05d98dc3ff 100644
--- a/hw/acpi/nvdimm.c
+++ b/hw/acpi/nvdimm.c
@@ -690,7 +690,7 @@ static uint32_t nvdimm_rw_label_data_check(NVDIMMDevice *nvdimm,
 static void nvdimm_dsm_get_label_data(NVDIMMDevice *nvdimm, NvdimmDsmIn *in,
                                       hwaddr dsm_mem_addr)
 {
-    NVDIMMClass *nvc = NVDIMM_GET_CLASS(nvdimm);
+    const NVDIMMClass *nvc = NVDIMM_GET_CLASS(nvdimm);
     NvdimmFuncGetLabelDataIn *get_label_data;
     NvdimmFuncGetLabelDataOut *get_label_data_out;
     uint32_t status;
@@ -730,7 +730,7 @@ static void nvdimm_dsm_get_label_data(NVDIMMDevice *nvdimm, NvdimmDsmIn *in,
 static void nvdimm_dsm_set_label_data(NVDIMMDevice *nvdimm, NvdimmDsmIn *in,
                                       hwaddr dsm_mem_addr)
 {
-    NVDIMMClass *nvc = NVDIMM_GET_CLASS(nvdimm);
+    const NVDIMMClass *nvc = NVDIMM_GET_CLASS(nvdimm);
     NvdimmFuncSetLabelDataIn *set_label_data;
     uint32_t status;
 
diff --git a/hw/acpi/pcihp.c b/hw/acpi/pcihp.c
index 2b0f3e1bfb..48c9f3e583 100644
--- a/hw/acpi/pcihp.c
+++ b/hw/acpi/pcihp.c
@@ -106,8 +106,8 @@ static PCIBus *acpi_pcihp_find_hotplug_bus(AcpiPciHpState *s, int bsel)
 
 static bool acpi_pcihp_pc_no_hotplug(AcpiPciHpState *s, PCIDevice *dev)
 {
-    PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
-    DeviceClass *dc = DEVICE_GET_CLASS(dev);
+    const PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
+    const DeviceClass *dc = DEVICE_GET_CLASS(dev);
     /*
      * ACPI doesn't allow hotplug of bridge devices.  Don't allow
      * hot-unplug of bridge devices unless they were added by hotplug
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index 283c038814..21a506782d 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -164,7 +164,7 @@ static void aspeed_board_init(MachineState *machine,
                               const AspeedBoardConfig *cfg)
 {
     AspeedBoardState *bmc;
-    AspeedSoCClass *sc;
+    const AspeedSoCClass *sc;
     DriveInfo *drive0 = drive_get(IF_MTD, 0, 0);
 
     bmc = g_new0(AspeedBoardState, 1);
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
index 571e4f097b..020fe1b159 100644
--- a/hw/arm/aspeed_soc.c
+++ b/hw/arm/aspeed_soc.c
@@ -120,7 +120,7 @@ static const MemoryRegionOps aspeed_soc_io_ops = {
 static void aspeed_soc_init(Object *obj)
 {
     AspeedSoCState *s = ASPEED_SOC(obj);
-    AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
+    const AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
     char *cpu_typename;
     int i;
 
@@ -181,7 +181,7 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
 {
     int i;
     AspeedSoCState *s = ASPEED_SOC(dev);
-    AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
+    const AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
     Error *err = NULL, *local_err = NULL;
 
     /* IO space */
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
index ff621e4b6a..0e93aca969 100644
--- a/hw/arm/boot.c
+++ b/hw/arm/boot.c
@@ -702,7 +702,7 @@ static int do_arm_linux_init(Object *obj, void *opaque)
 {
     if (object_dynamic_cast(obj, TYPE_ARM_LINUX_BOOT_IF)) {
         ARMLinuxBootIf *albif = ARM_LINUX_BOOT_IF(obj);
-        ARMLinuxBootIfClass *albifc = ARM_LINUX_BOOT_IF_GET_CLASS(obj);
+        const ARMLinuxBootIfClass *albifc = ARM_LINUX_BOOT_IF_GET_CLASS(obj);
         struct arm_boot_info *info = opaque;
 
         if (albifc->arm_linux_init) {
diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
index 0efa194054..7101e38c13 100644
--- a/hw/arm/exynos4_boards.c
+++ b/hw/arm/exynos4_boards.c
@@ -98,7 +98,7 @@ static void lan9215_init(uint32_t base, qemu_irq irq)
 static Exynos4210State *exynos4_boards_init_common(MachineState *machine,
                                                    Exynos4BoardType board_type)
 {
-    MachineClass *mc = MACHINE_GET_CLASS(machine);
+    const MachineClass *mc = MACHINE_GET_CLASS(machine);
 
     if (smp_cpus != EXYNOS4210_NCPUS && !qtest_enabled()) {
         fprintf(stderr, "%s board supports only %d CPU cores. Ignoring smp_cpus"
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
index c6b1e674b4..266c27564f 100644
--- a/hw/arm/vexpress.c
+++ b/hw/arm/vexpress.c
@@ -543,7 +543,7 @@ static pflash_t *ve_pflash_cfi01_register(hwaddr base, const char *name,
 static void vexpress_common_init(MachineState *machine)
 {
     VexpressMachineState *vms = VEXPRESS_MACHINE(machine);
-    VexpressMachineClass *vmc = VEXPRESS_MACHINE_GET_CLASS(machine);
+    const VexpressMachineClass *vmc = VEXPRESS_MACHINE_GET_CLASS(machine);
     VEDBoardInfo *daughterboard = vmc->daughterboard;
     DeviceState *dev, *sysctl, *pl041;
     qemu_irq pic[64];
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index 0835e59bb2..605f54ee2d 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -546,7 +546,7 @@ build_mcfg(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
 static void
 build_gtdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
 {
-    VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
+    const VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
     int gtdt_start = table_data->len;
     AcpiGenericTimerTable *gtdt;
     uint32_t irqflags;
@@ -581,7 +581,7 @@ build_gtdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
 static void
 build_madt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
 {
-    VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
+    const VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
     int madt_start = table_data->len;
     const MemMapEntry *memmap = vms->memmap;
     const int *irqmap = vms->irqmap;
@@ -746,7 +746,7 @@ struct AcpiBuildState {
 static
 void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables)
 {
-    VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
+    const VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
     GArray *table_offsets;
     unsigned dsdt, rsdt;
     GArray *tables_blob = tables->table_data;
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 5f62a0321e..6579cb97a3 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -302,7 +302,7 @@ static void fdt_add_timer_nodes(const VirtMachineState *vms)
      * the correct information.
      */
     ARMCPU *armcpu;
-    VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
+    const VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
     uint32_t irqflags = GIC_FDT_IRQ_FLAGS_LEVEL_HI;
 
     if (vmc->claim_edge_triggered_timers) {
@@ -1197,7 +1197,7 @@ void virt_machine_done(Notifier *notifier, void *data)
 static void machvirt_init(MachineState *machine)
 {
     VirtMachineState *vms = VIRT_MACHINE(machine);
-    VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(machine);
+    const VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(machine);
     qemu_irq pic[NUM_IRQS];
     MemoryRegion *sysmem = get_system_memory();
     MemoryRegion *secure_sysmem = NULL;
@@ -1554,7 +1554,7 @@ type_init(machvirt_machine_init);
 static void virt_2_9_instance_init(Object *obj)
 {
     VirtMachineState *vms = VIRT_MACHINE(obj);
-    VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
+    const VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
 
     /* EL3 is disabled by default on virt: this makes us consistent
      * between KVM and TCG for this board, and it also allows us to
diff --git a/hw/audio/cs4231a.c b/hw/audio/cs4231a.c
index 3ecd0582bf..47630c7e77 100644
--- a/hw/audio/cs4231a.c
+++ b/hw/audio/cs4231a.c
@@ -266,7 +266,7 @@ static void cs_reset_voices (CSState *s, uint32_t val)
 {
     int xtal;
     struct audsettings as;
-    IsaDmaClass *k = ISADMA_GET_CLASS(s->isa_dma);
+    const IsaDmaClass *k = ISADMA_GET_CLASS(s->isa_dma);
 
 #ifdef DEBUG_XLAW
     if (val == 0 || val == 32)
@@ -455,7 +455,7 @@ static void cs_write (void *opaque, hwaddr addr,
             }
             else {
                 if (s->dma_running) {
-                    IsaDmaClass *k = ISADMA_GET_CLASS(s->isa_dma);
+                    const IsaDmaClass *k = ISADMA_GET_CLASS(s->isa_dma);
                     k->release_DREQ(s->isa_dma, s->dma);
                     AUD_set_active_out (s->voice, 0);
                     s->dma_running = 0;
@@ -521,7 +521,7 @@ static int cs_write_audio (CSState *s, int nchan, int dma_pos,
 {
     int temp, net;
     uint8_t tmpbuf[4096];
-    IsaDmaClass *k = ISADMA_GET_CLASS(s->isa_dma);
+    const IsaDmaClass *k = ISADMA_GET_CLASS(s->isa_dma);
 
     temp = len;
     net = 0;
@@ -604,7 +604,7 @@ static int cs4231a_pre_load (void *opaque)
     CSState *s = opaque;
 
     if (s->dma_running) {
-        IsaDmaClass *k = ISADMA_GET_CLASS(s->isa_dma);
+        const IsaDmaClass *k = ISADMA_GET_CLASS(s->isa_dma);
         k->release_DREQ(s->isa_dma, s->dma);
         AUD_set_active_out (s->voice, 0);
     }
@@ -661,7 +661,7 @@ static void cs4231a_realizefn (DeviceState *dev, Error **errp)
 {
     ISADevice *d = ISA_DEVICE (dev);
     CSState *s = CS4231A (dev);
-    IsaDmaClass *k;
+    const IsaDmaClass *k;
 
     isa_init_irq (d, &s->pic, s->irq);
     s->isa_dma = isa_get_dma(isa_bus_from_device(d), s->dma);
diff --git a/hw/audio/gus.c b/hw/audio/gus.c
index 3d08a6576a..07aba884d2 100644
--- a/hw/audio/gus.c
+++ b/hw/audio/gus.c
@@ -175,7 +175,7 @@ void GUS_irqclear (GUSEmuState *emu, int hwirq)
 void GUS_dmarequest (GUSEmuState *emu)
 {
     GUSState *s = emu->opaque;
-    IsaDmaClass *k = ISADMA_GET_CLASS(s->isa_dma);
+    const IsaDmaClass *k = ISADMA_GET_CLASS(s->isa_dma);
     ldebug ("dma request %d\n", der->gusdma);
     k->hold_DREQ(s->isa_dma, s->emu.gusdma);
 }
@@ -183,7 +183,7 @@ void GUS_dmarequest (GUSEmuState *emu)
 static int GUS_read_DMA (void *opaque, int nchan, int dma_pos, int dma_len)
 {
     GUSState *s = opaque;
-    IsaDmaClass *k = ISADMA_GET_CLASS(s->isa_dma);
+    const IsaDmaClass *k = ISADMA_GET_CLASS(s->isa_dma);
     char tmpbuf[4096];
     int pos = dma_pos, mode, left = dma_len - dma_pos;
 
@@ -238,7 +238,7 @@ static void gus_realizefn (DeviceState *dev, Error **errp)
 {
     ISADevice *d = ISA_DEVICE(dev);
     GUSState *s = GUS (dev);
-    IsaDmaClass *k;
+    const IsaDmaClass *k;
     struct audsettings as;
 
     AUD_register_card ("gus", &s->card);
diff --git a/hw/audio/intel-hda.c b/hw/audio/intel-hda.c
index 537face94d..afdb3e4912 100644
--- a/hw/audio/intel-hda.c
+++ b/hw/audio/intel-hda.c
@@ -55,7 +55,7 @@ static void hda_codec_dev_realize(DeviceState *qdev, Error **errp)
 {
     HDACodecBus *bus = HDA_BUS(qdev->parent_bus);
     HDACodecDevice *dev = HDA_CODEC_DEVICE(qdev);
-    HDACodecDeviceClass *cdc = HDA_CODEC_DEVICE_GET_CLASS(dev);
+    const HDACodecDeviceClass *cdc = HDA_CODEC_DEVICE_GET_CLASS(dev);
 
     if (dev->cad == -1) {
         dev->cad = bus->next_cad;
@@ -73,7 +73,7 @@ static void hda_codec_dev_realize(DeviceState *qdev, Error **errp)
 static int hda_codec_dev_exit(DeviceState *qdev)
 {
     HDACodecDevice *dev = HDA_CODEC_DEVICE(qdev);
-    HDACodecDeviceClass *cdc = HDA_CODEC_DEVICE_GET_CLASS(dev);
+    const HDACodecDeviceClass *cdc = HDA_CODEC_DEVICE_GET_CLASS(dev);
 
     if (cdc->exit) {
         cdc->exit(dev);
@@ -280,7 +280,7 @@ static int intel_hda_send_command(IntelHDAState *d, uint32_t verb)
 {
     uint32_t cad, nid, data;
     HDACodecDevice *codec;
-    HDACodecDeviceClass *cdc;
+    const HDACodecDeviceClass *cdc;
 
     cad = (verb >> 28) & 0x0f;
     if (verb & (1 << 27)) {
@@ -493,7 +493,7 @@ static void intel_hda_notify_codecs(IntelHDAState *d, uint32_t stream, bool runn
 
     QTAILQ_FOREACH(kid, &d->codecs.qbus.children, sibling) {
         DeviceState *qdev = kid->child;
-        HDACodecDeviceClass *cdc;
+        const HDACodecDeviceClass *cdc;
 
         cdev = HDA_CODEC_DEVICE(qdev);
         cdc = HDA_CODEC_DEVICE_GET_CLASS(cdev);
diff --git a/hw/audio/sb16.c b/hw/audio/sb16.c
index 6b4427f242..912ca5cf0e 100644
--- a/hw/audio/sb16.c
+++ b/hw/audio/sb16.c
@@ -170,7 +170,7 @@ static void control (SB16State *s, int hold)
 {
     int dma = s->use_hdma ? s->hdma : s->dma;
     IsaDma *isa_dma = s->use_hdma ? s->isa_hdma : s->isa_dma;
-    IsaDmaClass *k = ISADMA_GET_CLASS(isa_dma);
+    const IsaDmaClass *k = ISADMA_GET_CLASS(isa_dma);
     s->dma_running = hold;
 
     ldebug ("hold %d high %d dma %d\n", hold, s->use_hdma, dma);
@@ -1143,7 +1143,7 @@ static int write_audio (SB16State *s, int nchan, int dma_pos,
                         int dma_len, int len)
 {
     IsaDma *isa_dma = nchan == s->dma ? s->isa_dma : s->isa_hdma;
-    IsaDmaClass *k = ISADMA_GET_CLASS(isa_dma);
+    const IsaDmaClass *k = ISADMA_GET_CLASS(isa_dma);
     int temp, net;
     uint8_t tmpbuf[4096];
 
@@ -1362,7 +1362,7 @@ static void sb16_realizefn (DeviceState *dev, Error **errp)
 {
     ISADevice *isadev = ISA_DEVICE (dev);
     SB16State *s = SB16 (dev);
-    IsaDmaClass *k;
+    const IsaDmaClass *k;
 
     isa_init_irq (isadev, &s->pic, s->irq);
 
diff --git a/hw/block/dataplane/virtio-blk.c b/hw/block/dataplane/virtio-blk.c
index 5556f0e64e..81cc13e7e2 100644
--- a/hw/block/dataplane/virtio-blk.c
+++ b/hw/block/dataplane/virtio-blk.c
@@ -82,7 +82,7 @@ void virtio_blk_data_plane_create(VirtIODevice *vdev, VirtIOBlkConf *conf,
 {
     VirtIOBlockDataPlane *s;
     BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
 
     *dataplane = NULL;
 
@@ -164,7 +164,7 @@ int virtio_blk_data_plane_start(VirtIODevice *vdev)
     VirtIOBlock *vblk = VIRTIO_BLK(vdev);
     VirtIOBlockDataPlane *s = vblk->dataplane;
     BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vblk)));
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
     unsigned i;
     unsigned nvqs = s->conf->num_queues;
     int r;
@@ -232,7 +232,7 @@ void virtio_blk_data_plane_stop(VirtIODevice *vdev)
     VirtIOBlock *vblk = VIRTIO_BLK(vdev);
     VirtIOBlockDataPlane *s = vblk->dataplane;
     BusState *qbus = qdev_get_parent_bus(DEVICE(vblk));
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
     unsigned i;
     unsigned nvqs = s->conf->num_queues;
 
diff --git a/hw/block/fdc.c b/hw/block/fdc.c
index a328693d15..8e8bd3d589 100644
--- a/hw/block/fdc.c
+++ b/hw/block/fdc.c
@@ -1629,7 +1629,7 @@ static void fdctrl_stop_transfer(FDCtrl *fdctrl, uint8_t status0,
     fdctrl->fifo[6] = FD_SECTOR_SC;
     fdctrl->data_dir = FD_DIR_READ;
     if (!(fdctrl->msr & FD_MSR_NONDMA)) {
-        IsaDmaClass *k = ISADMA_GET_CLASS(fdctrl->dma);
+        const IsaDmaClass *k = ISADMA_GET_CLASS(fdctrl->dma);
         k->release_DREQ(fdctrl->dma, fdctrl->dma_chann);
     }
     fdctrl->msr |= FD_MSR_RQM | FD_MSR_DIO;
@@ -1717,7 +1717,7 @@ static void fdctrl_start_transfer(FDCtrl *fdctrl, int direction)
     fdctrl->eot = fdctrl->fifo[6];
     if (fdctrl->dor & FD_DOR_DMAEN) {
         IsaDmaTransferMode dma_mode;
-        IsaDmaClass *k = ISADMA_GET_CLASS(fdctrl->dma);
+        const IsaDmaClass *k = ISADMA_GET_CLASS(fdctrl->dma);
         bool dma_mode_ok;
         /* DMA transfer are enabled. Check if DMA channel is well programmed */
         dma_mode = k->get_transfer_mode(fdctrl->dma, fdctrl->dma_chann);
@@ -1791,7 +1791,7 @@ static int fdctrl_transfer_handler (void *opaque, int nchan,
     FDrive *cur_drv;
     int len, start_pos, rel_pos;
     uint8_t status0 = 0x00, status1 = 0x00, status2 = 0x00;
-    IsaDmaClass *k;
+    const IsaDmaClass *k;
 
     fdctrl = opaque;
     if (fdctrl->msr & FD_MSR_RQM) {
@@ -2667,7 +2667,7 @@ static void fdctrl_realize_common(DeviceState *dev, FDCtrl *fdctrl,
     fdctrl->num_floppies = MAX_FD;
 
     if (fdctrl->dma_chann != -1) {
-        IsaDmaClass *k;
+        const IsaDmaClass *k;
         assert(fdctrl->dma);
         k = ISADMA_GET_CLASS(fdctrl->dma);
         k->register_channel(fdctrl->dma, fdctrl->dma_chann,
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index 190573cefa..e5585eeca9 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -1214,7 +1214,7 @@ static uint32_t m25p80_transfer8(SSISlave *ss, uint32_t tx)
 static void m25p80_realize(SSISlave *ss, Error **errp)
 {
     Flash *s = M25P80(ss);
-    M25P80Class *mc = M25P80_GET_CLASS(s);
+    const M25P80Class *mc = M25P80_GET_CLASS(s);
     int ret;
 
     s->pi = mc->pi;
diff --git a/hw/char/serial-pci.c b/hw/char/serial-pci.c
index 303104dd19..be683a5559 100644
--- a/hw/char/serial-pci.c
+++ b/hw/char/serial-pci.c
@@ -88,7 +88,7 @@ static void multi_serial_irq_mux(void *opaque, int n, int level)
 
 static void multi_serial_pci_realize(PCIDevice *dev, Error **errp)
 {
-    PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
+    const PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
     PCIMultiSerialState *pci = DO_UPCAST(PCIMultiSerialState, dev, dev);
     SerialState *s;
     Error *err = NULL;
diff --git a/hw/char/virtio-console.c b/hw/char/virtio-console.c
index 798d9b69fd..d23ebe29f0 100644
--- a/hw/char/virtio-console.c
+++ b/hw/char/virtio-console.c
@@ -58,7 +58,7 @@ static ssize_t flush_buf(VirtIOSerialPort *port,
     trace_virtio_console_flush_buf(port->id, len, ret);
 
     if (ret < len) {
-        VirtIOSerialPortClass *k = VIRTIO_SERIAL_PORT_GET_CLASS(port);
+        const VirtIOSerialPortClass *k = VIRTIO_SERIAL_PORT_GET_CLASS(port);
 
         /*
          * Ideally we'd get a better error code than just -1, but
@@ -106,7 +106,7 @@ static void set_guest_connected(VirtIOSerialPort *port, int guest_connected)
 {
     VirtConsole *vcon = VIRTIO_CONSOLE(port);
     DeviceState *dev = DEVICE(port);
-    VirtIOSerialPortClass *k = VIRTIO_SERIAL_PORT_GET_CLASS(port);
+    const VirtIOSerialPortClass *k = VIRTIO_SERIAL_PORT_GET_CLASS(port);
 
     if (!k->is_console) {
         qemu_chr_fe_set_open(&vcon->chr, guest_connected);
@@ -167,7 +167,7 @@ static void virtconsole_realize(DeviceState *dev, Error **errp)
 {
     VirtIOSerialPort *port = VIRTIO_SERIAL_PORT(dev);
     VirtConsole *vcon = VIRTIO_CONSOLE(dev);
-    VirtIOSerialPortClass *k = VIRTIO_SERIAL_PORT_GET_CLASS(dev);
+    const VirtIOSerialPortClass *k = VIRTIO_SERIAL_PORT_GET_CLASS(dev);
     Chardev *chr = qemu_chr_fe_get_driver(&vcon->chr);
 
     if (port->id == 0 && !k->is_console) {
diff --git a/hw/char/virtio-serial-bus.c b/hw/char/virtio-serial-bus.c
index d797a6796e..dcb4aa0055 100644
--- a/hw/char/virtio-serial-bus.c
+++ b/hw/char/virtio-serial-bus.c
@@ -80,7 +80,7 @@ static VirtIOSerialPort *find_first_connected_console(VirtIOSerial *vser)
     VirtIOSerialPort *port;
 
     QTAILQ_FOREACH(port, &vser->ports, next) {
-        VirtIOSerialPortClass const *vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
+        const VirtIOSerialPortClass *vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
         if (vsc->is_console && port->host_connected) {
             return port;
         }
@@ -157,7 +157,7 @@ static void discard_throttle_data(VirtIOSerialPort *port)
 static void do_flush_queued_data(VirtIOSerialPort *port, VirtQueue *vq,
                                  VirtIODevice *vdev)
 {
-    VirtIOSerialPortClass *vsc;
+    const VirtIOSerialPortClass *vsc;
 
     assert(port);
     assert(virtio_queue_ready(vq));
@@ -342,7 +342,7 @@ static void handle_control_message(VirtIOSerial *vser, void *buf, size_t len)
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(vser);
     struct VirtIOSerialPort *port;
-    VirtIOSerialPortClass *vsc;
+    const VirtIOSerialPortClass *vsc;
     struct virtio_console_control cpkt, *gcpkt;
     uint8_t *buffer;
     size_t buffer_len;
@@ -524,7 +524,7 @@ static void handle_input(VirtIODevice *vdev, VirtQueue *vq)
      */
     VirtIOSerial *vser;
     VirtIOSerialPort *port;
-    VirtIOSerialPortClass *vsc;
+    const VirtIOSerialPortClass *vsc;
 
     vser = VIRTIO_SERIAL(vdev);
     port = find_port_by_vq(vser, vq);
@@ -579,7 +579,7 @@ static void set_config(VirtIODevice *vdev, const uint8_t *config_data)
         (struct virtio_console_config *)config_data;
     uint8_t emerg_wr_lo = le32_to_cpu(config->emerg_wr);
     VirtIOSerialPort *port = find_first_connected_console(vser);
-    VirtIOSerialPortClass *vsc;
+    const VirtIOSerialPortClass *vsc;
 
     if (!config->emerg_wr) {
         return;
@@ -597,7 +597,7 @@ static void set_config(VirtIODevice *vdev, const uint8_t *config_data)
 static void guest_reset(VirtIOSerial *vser)
 {
     VirtIOSerialPort *port;
-    VirtIOSerialPortClass *vsc;
+    const VirtIOSerialPortClass *vsc;
 
     QTAILQ_FOREACH(port, &vser->ports, next) {
         vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
@@ -702,7 +702,7 @@ static void virtio_serial_post_load_timer_cb(void *opaque)
     VirtIOSerial *s = VIRTIO_SERIAL(opaque);
     VirtIOSerialPort *port;
     uint8_t host_connected;
-    VirtIOSerialPortClass *vsc;
+    const VirtIOSerialPortClass *vsc;
 
     if (!s->post_load) {
         return;
@@ -919,7 +919,7 @@ static void remove_port(VirtIOSerial *vser, uint32_t port_id)
 static void virtser_port_device_realize(DeviceState *dev, Error **errp)
 {
     VirtIOSerialPort *port = VIRTIO_SERIAL_PORT(dev);
-    VirtIOSerialPortClass *vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
+    const VirtIOSerialPortClass *vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);
     VirtIOSerialBus *bus = VIRTIO_SERIAL_BUS(qdev_get_parent_bus(dev));
     int max_nr_ports;
     bool plugging_port0;
@@ -996,7 +996,7 @@ static void virtser_port_device_plug(HotplugHandler *hotplug_dev,
 static void virtser_port_device_unrealize(DeviceState *dev, Error **errp)
 {
     VirtIOSerialPort *port = VIRTIO_SERIAL_PORT(dev);
-    VirtIOSerialPortClass *vsc = VIRTIO_SERIAL_PORT_GET_CLASS(dev);
+    const VirtIOSerialPortClass *vsc = VIRTIO_SERIAL_PORT_GET_CLASS(dev);
     VirtIOSerial *vser = port->vser;
 
     qemu_bh_delete(port->bh);
diff --git a/hw/core/bus.c b/hw/core/bus.c
index 9233f8723b..1d913606b7 100644
--- a/hw/core/bus.c
+++ b/hw/core/bus.c
@@ -156,7 +156,7 @@ static bool bus_get_realized(Object *obj, Error **errp)
 static void bus_set_realized(Object *obj, bool value, Error **errp)
 {
     BusState *bus = BUS(obj);
-    BusClass *bc = BUS_GET_CLASS(bus);
+    const BusClass *bc = BUS_GET_CLASS(bus);
     BusChild *kid;
     Error *local_err = NULL;
 
diff --git a/hw/core/fw-path-provider.c b/hw/core/fw-path-provider.c
index 33b99830e7..808b4a0699 100644
--- a/hw/core/fw-path-provider.c
+++ b/hw/core/fw-path-provider.c
@@ -21,7 +21,7 @@
 char *fw_path_provider_get_dev_path(FWPathProvider *p, BusState *bus,
                                     DeviceState *dev)
 {
-    FWPathProviderClass *k = FW_PATH_PROVIDER_GET_CLASS(p);
+    const FWPathProviderClass *k = FW_PATH_PROVIDER_GET_CLASS(p);
 
     return k->get_dev_path(p, bus, dev);
 }
diff --git a/hw/core/generic-loader.c b/hw/core/generic-loader.c
index 58f1f02902..84d9134c7f 100644
--- a/hw/core/generic-loader.c
+++ b/hw/core/generic-loader.c
@@ -45,7 +45,7 @@ static void generic_loader_reset(void *opaque)
     GenericLoaderState *s = GENERIC_LOADER(opaque);
 
     if (s->set_pc) {
-        CPUClass *cc = CPU_GET_CLASS(s->cpu);
+        const CPUClass *cc = CPU_GET_CLASS(s->cpu);
         cpu_reset(s->cpu);
         if (cc) {
             cc->set_pc(s->cpu, s->addr);
diff --git a/hw/core/hotplug.c b/hw/core/hotplug.c
index 17ac986685..9ef66a9f15 100644
--- a/hw/core/hotplug.c
+++ b/hw/core/hotplug.c
@@ -17,7 +17,7 @@ void hotplug_handler_pre_plug(HotplugHandler *plug_handler,
                               DeviceState *plugged_dev,
                               Error **errp)
 {
-    HotplugHandlerClass *hdc = HOTPLUG_HANDLER_GET_CLASS(plug_handler);
+    const HotplugHandlerClass *hdc = HOTPLUG_HANDLER_GET_CLASS(plug_handler);
 
     if (hdc->pre_plug) {
         hdc->pre_plug(plug_handler, plugged_dev, errp);
@@ -28,7 +28,7 @@ void hotplug_handler_plug(HotplugHandler *plug_handler,
                           DeviceState *plugged_dev,
                           Error **errp)
 {
-    HotplugHandlerClass *hdc = HOTPLUG_HANDLER_GET_CLASS(plug_handler);
+    const HotplugHandlerClass *hdc = HOTPLUG_HANDLER_GET_CLASS(plug_handler);
 
     if (hdc->plug) {
         hdc->plug(plug_handler, plugged_dev, errp);
@@ -39,7 +39,7 @@ void hotplug_handler_unplug_request(HotplugHandler *plug_handler,
                                     DeviceState *plugged_dev,
                                     Error **errp)
 {
-    HotplugHandlerClass *hdc = HOTPLUG_HANDLER_GET_CLASS(plug_handler);
+    const HotplugHandlerClass *hdc = HOTPLUG_HANDLER_GET_CLASS(plug_handler);
 
     if (hdc->unplug_request) {
         hdc->unplug_request(plug_handler, plugged_dev, errp);
@@ -50,7 +50,7 @@ void hotplug_handler_unplug(HotplugHandler *plug_handler,
                             DeviceState *plugged_dev,
                             Error **errp)
 {
-    HotplugHandlerClass *hdc = HOTPLUG_HANDLER_GET_CLASS(plug_handler);
+    const HotplugHandlerClass *hdc = HOTPLUG_HANDLER_GET_CLASS(plug_handler);
 
     if (hdc->unplug) {
         hdc->unplug(plug_handler, plugged_dev, errp);
diff --git a/hw/core/loader.c b/hw/core/loader.c
index bf17b42cbe..3ea6ace302 100644
--- a/hw/core/loader.c
+++ b/hw/core/loader.c
@@ -884,7 +884,7 @@ int rom_add_file(const char *file, const char *fw_dir,
                  bool option_rom, MemoryRegion *mr,
                  AddressSpace *as)
 {
-    MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
+    const MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
     Rom *rom;
     int rc, fd = -1;
     char devpath[100];
@@ -989,7 +989,7 @@ MemoryRegion *rom_add_blob(const char *name, const void *blob, size_t len,
                    FWCfgReadCallback fw_callback, void *callback_opaque,
                    AddressSpace *as, bool read_only)
 {
-    MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
+    const MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
     Rom *rom;
     MemoryRegion *mr = NULL;
 
diff --git a/hw/core/machine.c b/hw/core/machine.c
index 6aa452a792..d49214a095 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -342,7 +342,7 @@ static void error_on_sysbus_device(SysBusDevice *sbdev, void *opaque)
 static void machine_init_notify(Notifier *notifier, void *data)
 {
     Object *machine = qdev_get_machine();
-    MachineClass *mc = MACHINE_GET_CLASS(machine);
+    const MachineClass *mc = MACHINE_GET_CLASS(machine);
 
     if (mc->has_dynamic_sysbus) {
         /* Our machine can handle dynamic sysbus devices, we're all good */
@@ -610,7 +610,7 @@ static void machine_register_compat_for_subclass(ObjectClass *oc, void *opaque)
 
 void machine_register_compat_props(MachineState *machine)
 {
-    MachineClass *mc = MACHINE_GET_CLASS(machine);
+    const MachineClass *mc = MACHINE_GET_CLASS(machine);
     int i;
     GlobalProperty *p;
     ObjectClass *oc;
diff --git a/hw/core/nmi.c b/hw/core/nmi.c
index bfd0896daf..ee90ae9b13 100644
--- a/hw/core/nmi.c
+++ b/hw/core/nmi.c
@@ -39,7 +39,7 @@ static int do_nmi(Object *o, void *opaque)
     NMIState *n = (NMIState *) object_dynamic_cast(o, TYPE_NMI);
 
     if (n) {
-        NMIClass *nc = NMI_GET_CLASS(n);
+        const NMIClass *nc = NMI_GET_CLASS(n);
 
         ns->handled = true;
         nc->nmi_monitor_handler(n, ns->cpu_index, &ns->err);
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 6ab4265eb4..6d0ef1ffe4 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -937,7 +937,7 @@ static Property *qdev_prop_walk(Property *props, const char *name)
 
 static Property *qdev_prop_find(DeviceState *dev, const char *name)
 {
-    ObjectClass *class;
+    const ObjectClass *class;
     Property *prop;
 
     /* device properties */
@@ -1118,7 +1118,7 @@ static void qdev_prop_set_globals_for_type(DeviceState *dev,
 
 void qdev_prop_set_globals(DeviceState *dev)
 {
-    ObjectClass *class = object_get_class(OBJECT(dev));
+    const ObjectClass *class = object_get_class(OBJECT(dev));
 
     do {
         qdev_prop_set_globals_for_type(dev, object_class_get_name(class));
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 1e7fb33246..87f46743d6 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -45,13 +45,13 @@ static bool qdev_hot_removed = false;
 
 const VMStateDescription *qdev_get_vmsd(DeviceState *dev)
 {
-    DeviceClass *dc = DEVICE_GET_CLASS(dev);
+    const DeviceClass *dc = DEVICE_GET_CLASS(dev);
     return dc->vmsd;
 }
 
 const char *qdev_fw_name(DeviceState *dev)
 {
-    DeviceClass *dc = DEVICE_GET_CLASS(dev);
+    const DeviceClass *dc = DEVICE_GET_CLASS(dev);
 
     if (dc->fw_name) {
         return dc->fw_name;
@@ -222,7 +222,7 @@ void device_listener_unregister(DeviceListener *listener)
 
 static void device_realize(DeviceState *dev, Error **errp)
 {
-    DeviceClass *dc = DEVICE_GET_CLASS(dev);
+    const DeviceClass *dc = DEVICE_GET_CLASS(dev);
 
     if (dc->init) {
         int rc = dc->init(dev);
@@ -235,7 +235,7 @@ static void device_realize(DeviceState *dev, Error **errp)
 
 static void device_unrealize(DeviceState *dev, Error **errp)
 {
-    DeviceClass *dc = DEVICE_GET_CLASS(dev);
+    const DeviceClass *dc = DEVICE_GET_CLASS(dev);
 
     if (dc->exit) {
         int rc = dc->exit(dev);
@@ -262,7 +262,7 @@ HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
         hotplug_ctrl = dev->parent_bus->hotplug_handler;
     } else if (object_dynamic_cast(qdev_get_machine(), TYPE_MACHINE)) {
         MachineState *machine = MACHINE(qdev_get_machine());
-        MachineClass *mc = MACHINE_GET_CLASS(machine);
+        const MachineClass *mc = MACHINE_GET_CLASS(machine);
 
         if (mc->get_hotplug_handler) {
             hotplug_ctrl = mc->get_hotplug_handler(machine, dev);
@@ -273,9 +273,9 @@ HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev)
 
 void qdev_unplug(DeviceState *dev, Error **errp)
 {
-    DeviceClass *dc = DEVICE_GET_CLASS(dev);
+    const DeviceClass *dc = DEVICE_GET_CLASS(dev);
     HotplugHandler *hotplug_ctrl;
-    HotplugHandlerClass *hdc;
+    const HotplugHandlerClass *hdc;
 
     if (dev->parent_bus && !qbus_is_hotpluggable(dev->parent_bus)) {
         error_setg(errp, QERR_BUS_NO_HOTPLUG, dev->parent_bus->name);
@@ -314,7 +314,7 @@ static int qdev_reset_one(DeviceState *dev, void *opaque)
 
 static int qbus_reset_one(BusState *bus, void *opaque)
 {
-    BusClass *bc = BUS_GET_CLASS(bus);
+    const BusClass *bc = BUS_GET_CLASS(bus);
     if (bc->reset) {
         bc->reset(bus);
     }
@@ -656,7 +656,7 @@ DeviceState *qdev_find_recursive(BusState *bus, const char *id)
 
 static char *bus_get_fw_dev_path(BusState *bus, DeviceState *dev)
 {
-    BusClass *bc = BUS_GET_CLASS(bus);
+    const BusClass *bc = BUS_GET_CLASS(bus);
 
     if (bc->get_fw_dev_path) {
         return bc->get_fw_dev_path(dev);
@@ -721,7 +721,7 @@ char* qdev_get_fw_dev_path(DeviceState *dev)
 
 char *qdev_get_dev_path(DeviceState *dev)
 {
-    BusClass *bc;
+    const BusClass *bc;
 
     if (!dev || !dev->parent_bus) {
         return NULL;
@@ -847,12 +847,12 @@ void qdev_property_add_static(DeviceState *dev, Property *prop,
  */
 void qdev_alias_all_properties(DeviceState *target, Object *source)
 {
-    ObjectClass *class;
+    const ObjectClass *class;
     Property *prop;
 
     class = object_get_class(OBJECT(target));
     do {
-        DeviceClass *dc = DEVICE_CLASS(class);
+        const DeviceClass *dc = DEVICE_CLASS(class);
 
         for (prop = dc->props; prop && prop->name; prop++) {
             object_property_add_alias(source, prop->name,
@@ -898,7 +898,7 @@ static bool device_get_realized(Object *obj, Error **errp)
 static void device_set_realized(Object *obj, bool value, Error **errp)
 {
     DeviceState *dev = DEVICE(obj);
-    DeviceClass *dc = DEVICE_GET_CLASS(dev);
+    const DeviceClass *dc = DEVICE_GET_CLASS(dev);
     HotplugHandler *hotplug_ctrl;
     BusState *bus;
     Error *local_err = NULL;
@@ -1023,7 +1023,7 @@ fail:
 
 static bool device_get_hotpluggable(Object *obj, Error **errp)
 {
-    DeviceClass *dc = DEVICE_GET_CLASS(obj);
+    const DeviceClass *dc = DEVICE_GET_CLASS(obj);
     DeviceState *dev = DEVICE(obj);
 
     return dc->hotpluggable && (dev->parent_bus == NULL ||
@@ -1047,7 +1047,7 @@ static void device_set_hotplugged(Object *obj, bool value, Error **err)
 static void device_initfn(Object *obj)
 {
     DeviceState *dev = DEVICE(obj);
-    ObjectClass *class;
+    const ObjectClass *class;
     Property *prop;
 
     if (qdev_hotplug) {
@@ -1163,7 +1163,7 @@ static void device_class_init(ObjectClass *class, void *data)
 
 void device_reset(DeviceState *dev)
 {
-    DeviceClass *klass = DEVICE_GET_CLASS(dev);
+    const DeviceClass *klass = DEVICE_GET_CLASS(dev);
 
     if (klass->reset) {
         klass->reset(dev);
diff --git a/hw/core/stream.c b/hw/core/stream.c
index 4439ecdf0b..e2e32da3d2 100644
--- a/hw/core/stream.c
+++ b/hw/core/stream.c
@@ -4,7 +4,7 @@
 size_t
 stream_push(StreamSlave *sink, uint8_t *buf, size_t len)
 {
-    StreamSlaveClass *k =  STREAM_SLAVE_GET_CLASS(sink);
+    const StreamSlaveClass *k =  STREAM_SLAVE_GET_CLASS(sink);
 
     return k->push(sink, buf, len);
 }
@@ -13,7 +13,7 @@ bool
 stream_can_push(StreamSlave *sink, StreamCanPushNotifyFn notify,
                 void *notify_opaque)
 {
-    StreamSlaveClass *k =  STREAM_SLAVE_GET_CLASS(sink);
+    const StreamSlaveClass *k =  STREAM_SLAVE_GET_CLASS(sink);
 
     return k->can_push ? k->can_push(sink, notify, notify_opaque) : true;
 }
diff --git a/hw/core/sysbus.c b/hw/core/sysbus.c
index c0f560b289..05a6e43b6a 100644
--- a/hw/core/sysbus.c
+++ b/hw/core/sysbus.c
@@ -110,7 +110,7 @@ qemu_irq sysbus_get_connected_irq(SysBusDevice *dev, int n)
 
 void sysbus_connect_irq(SysBusDevice *dev, int n, qemu_irq irq)
 {
-    SysBusDeviceClass *sbd = SYS_BUS_DEVICE_GET_CLASS(dev);
+    const SysBusDeviceClass *sbd = SYS_BUS_DEVICE_GET_CLASS(dev);
 
     qdev_connect_gpio_out_named(DEVICE(dev), SYSBUS_DEVICE_GPIO_IRQ, n, irq);
 
@@ -203,7 +203,7 @@ void sysbus_init_ioports(SysBusDevice *dev, uint32_t ioport, uint32_t size)
 static int sysbus_device_init(DeviceState *dev)
 {
     SysBusDevice *sd = SYS_BUS_DEVICE(dev);
-    SysBusDeviceClass *sbc = SYS_BUS_DEVICE_GET_CLASS(sd);
+    const SysBusDeviceClass *sbc = SYS_BUS_DEVICE_GET_CLASS(sd);
 
     if (!sbc->init) {
         return 0;
@@ -288,7 +288,7 @@ static void sysbus_dev_print(Monitor *mon, DeviceState *dev, int indent)
 static char *sysbus_get_fw_dev_path(DeviceState *dev)
 {
     SysBusDevice *s = SYS_BUS_DEVICE(dev);
-    SysBusDeviceClass *sbc = SYS_BUS_DEVICE_GET_CLASS(s);
+    const SysBusDeviceClass *sbc = SYS_BUS_DEVICE_GET_CLASS(s);
     /* for the explicit unit address fallback case: */
     char *addr, *fw_dev_path;
 
diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c
index afc290ab91..1897898fee 100644
--- a/hw/display/cirrus_vga.c
+++ b/hw/display/cirrus_vga.c
@@ -3096,7 +3096,7 @@ static void pci_cirrus_vga_realize(PCIDevice *dev, Error **errp)
 {
      PCICirrusVGAState *d = PCI_CIRRUS_VGA(dev);
      CirrusVGAState *s = &d->cirrus_vga;
-     PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
+     const PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
      int16_t device_id = pc->device_id;
 
      /* follow real hardware, cirrus card emulated has 4 MB video memory.
diff --git a/hw/i2c/core.c b/hw/i2c/core.c
index 2c1234cdff..7ec283c5ff 100644
--- a/hw/i2c/core.c
+++ b/hw/i2c/core.c
@@ -105,7 +105,7 @@ int i2c_bus_busy(I2CBus *bus)
 int i2c_start_transfer(I2CBus *bus, uint8_t address, int recv)
 {
     BusChild *kid;
-    I2CSlaveClass *sc;
+    const I2CSlaveClass *sc;
     I2CNode *node;
     bool bus_scanned = false;
 
@@ -168,7 +168,7 @@ int i2c_start_transfer(I2CBus *bus, uint8_t address, int recv)
 
 void i2c_end_transfer(I2CBus *bus)
 {
-    I2CSlaveClass *sc;
+    const I2CSlaveClass *sc;
     I2CNode *node, *next;
 
     QLIST_FOREACH_SAFE(node, &bus->current_devs, next, next) {
@@ -184,7 +184,7 @@ void i2c_end_transfer(I2CBus *bus)
 
 int i2c_send_recv(I2CBus *bus, uint8_t *data, bool send)
 {
-    I2CSlaveClass *sc;
+    const I2CSlaveClass *sc;
     I2CNode *node;
     int ret = 0;
 
@@ -232,7 +232,7 @@ int i2c_recv(I2CBus *bus)
 
 void i2c_nack(I2CBus *bus)
 {
-    I2CSlaveClass *sc;
+    const I2CSlaveClass *sc;
     I2CNode *node;
 
     if (QLIST_EMPTY(&bus->current_devs)) {
@@ -277,7 +277,7 @@ const VMStateDescription vmstate_i2c_slave = {
 static int i2c_slave_qdev_init(DeviceState *dev)
 {
     I2CSlave *s = I2C_SLAVE(dev);
-    I2CSlaveClass *sc = I2C_SLAVE_GET_CLASS(s);
+    const I2CSlaveClass *sc = I2C_SLAVE_GET_CLASS(s);
 
     if (sc->init) {
         return sc->init(s);
diff --git a/hw/i2c/smbus.c b/hw/i2c/smbus.c
index 2d1b79a689..42a01ca7b7 100644
--- a/hw/i2c/smbus.c
+++ b/hw/i2c/smbus.c
@@ -38,7 +38,7 @@ enum {
 
 static void smbus_do_quick_cmd(SMBusDevice *dev, int recv)
 {
-    SMBusDeviceClass *sc = SMBUS_DEVICE_GET_CLASS(dev);
+    const SMBusDeviceClass *sc = SMBUS_DEVICE_GET_CLASS(dev);
 
     DPRINTF("Quick Command %d\n", recv);
     if (sc->quick_cmd) {
@@ -48,7 +48,7 @@ static void smbus_do_quick_cmd(SMBusDevice *dev, int recv)
 
 static void smbus_do_write(SMBusDevice *dev)
 {
-    SMBusDeviceClass *sc = SMBUS_DEVICE_GET_CLASS(dev);
+    const SMBusDeviceClass *sc = SMBUS_DEVICE_GET_CLASS(dev);
 
     if (dev->data_len == 0) {
         smbus_do_quick_cmd(dev, 0);
@@ -155,7 +155,7 @@ static int smbus_i2c_event(I2CSlave *s, enum i2c_event event)
 static int smbus_i2c_recv(I2CSlave *s)
 {
     SMBusDevice *dev = SMBUS_DEVICE(s);
-    SMBusDeviceClass *sc = SMBUS_DEVICE_GET_CLASS(dev);
+    const SMBusDeviceClass *sc = SMBUS_DEVICE_GET_CLASS(dev);
     int ret;
 
     switch (dev->mode) {
@@ -205,7 +205,7 @@ static int smbus_i2c_send(I2CSlave *s, uint8_t data)
 static int smbus_device_init(I2CSlave *i2c)
 {
     SMBusDevice *dev = SMBUS_DEVICE(i2c);
-    SMBusDeviceClass *sc = SMBUS_DEVICE_GET_CLASS(dev);
+    const SMBusDeviceClass *sc = SMBUS_DEVICE_GET_CLASS(dev);
 
     return sc->init(dev);
 }
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 2073108577..47dba40ebd 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -373,10 +373,10 @@ void pc_madt_cpu_entry(AcpiDeviceIf *adev, int uid,
 static void
 build_madt(GArray *table_data, BIOSLinker *linker, PCMachineState *pcms)
 {
-    MachineClass *mc = MACHINE_GET_CLASS(pcms);
+    const MachineClass *mc = MACHINE_GET_CLASS(pcms);
     const CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(MACHINE(pcms));
     int madt_start = table_data->len;
-    AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_GET_CLASS(pcms->acpi_dev);
+    const AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_GET_CLASS(pcms->acpi_dev);
     AcpiDeviceIf *adev = ACPI_DEVICE_IF(pcms->acpi_dev);
     bool x2apic_mode = false;
 
@@ -507,8 +507,8 @@ static void build_append_pci_bus_devices(Aml *parent_scope, PCIBus *bus,
     }
 
     for (i = 0; i < ARRAY_SIZE(bus->devices); i += PCI_FUNC_MAX) {
-        DeviceClass *dc;
-        PCIDeviceClass *pc;
+        const DeviceClass *dc;
+        const PCIDeviceClass *pc;
         PCIDevice *pdev = bus->devices[i];
         int slot = PCI_SLOT(i);
         bool hotplug_enabled_dev;
@@ -1854,7 +1854,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
     Aml *dsdt, *sb_scope, *scope, *dev, *method, *field, *pkg, *crs;
     CrsRangeSet crs_range_set;
     PCMachineState *pcms = PC_MACHINE(machine);
-    PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(machine);
+    const PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(machine);
     uint32_t nr_mem = machine->ram_slots;
     int root_bus_limit = 0xFF;
     PCIBus *bus = NULL;
@@ -2293,7 +2293,7 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
     int i;
     int srat_start, numa_start, slots;
     uint64_t mem_len, mem_base, next_base;
-    MachineClass *mc = MACHINE_GET_CLASS(machine);
+    const MachineClass *mc = MACHINE_GET_CLASS(machine);
     const CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(machine);
     PCMachineState *pcms = PC_MACHINE(machine);
     ram_addr_t hotplugabble_address_space_size =
@@ -2600,7 +2600,7 @@ static
 void acpi_build(AcpiBuildTables *tables, MachineState *machine)
 {
     PCMachineState *pcms = PC_MACHINE(machine);
-    PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
+    const PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
     GArray *table_offsets;
     unsigned facs, dsdt, rsdt, fadt;
     AcpiPmInfo pm;
@@ -2829,7 +2829,7 @@ static const VMStateDescription vmstate_acpi_build = {
 void acpi_setup(void)
 {
     PCMachineState *pcms = PC_MACHINE(qdev_get_machine());
-    PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
+    const PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
     AcpiBuildTables tables;
     AcpiBuildState *build_state;
     Object *vmgenid_dev;
diff --git a/hw/i386/kvm/i8254.c b/hw/i386/kvm/i8254.c
index 521a58498a..6d5f079e26 100644
--- a/hw/i386/kvm/i8254.c
+++ b/hw/i386/kvm/i8254.c
@@ -255,7 +255,7 @@ static void kvm_pit_vm_state_change(void *opaque, int running,
 static void kvm_pit_realizefn(DeviceState *dev, Error **errp)
 {
     PITCommonState *pit = PIT_COMMON(dev);
-    KVMPITClass *kpc = KVM_PIT_GET_CLASS(dev);
+    const KVMPITClass *kpc = KVM_PIT_GET_CLASS(dev);
     KVMPITState *s = KVM_PIT(pit);
     struct kvm_pit_config config = {
         .flags = 0,
diff --git a/hw/i386/kvm/i8259.c b/hw/i386/kvm/i8259.c
index 11d1b726b6..ee1058ef9e 100644
--- a/hw/i386/kvm/i8259.c
+++ b/hw/i386/kvm/i8259.c
@@ -118,7 +118,7 @@ static void kvm_pic_set_irq(void *opaque, int irq, int level)
 static void kvm_pic_realize(DeviceState *dev, Error **errp)
 {
     PICCommonState *s = PIC_COMMON(dev);
-    KVMPICClass *kpc = KVM_PIC_GET_CLASS(dev);
+    const KVMPICClass *kpc = KVM_PIC_GET_CLASS(dev);
 
     memory_region_init_reservation(&s->base_io, NULL, "kvm-pic", 2);
     memory_region_init_reservation(&s->elcr_io, NULL, "kvm-elcr", 1);
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index d24388e05f..a376fd6f0a 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -841,7 +841,7 @@ static void load_linux(PCMachineState *pcms,
     FILE *f;
     char *vmode;
     MachineState *machine = MACHINE(pcms);
-    PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
+    const PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
     struct setup_data *setup_data;
     const char *kernel_filename = machine->kernel_filename;
     const char *initrd_filename = machine->initrd_filename;
@@ -1111,7 +1111,7 @@ static void pc_new_cpu(const char *typename, int64_t apic_id, Error **errp)
 
 void pc_hot_add_cpu(const int64_t id, Error **errp)
 {
-    ObjectClass *oc;
+    const ObjectClass *oc;
     MachineState *ms = MACHINE(qdev_get_machine());
     int64_t apic_id = x86_cpu_apic_id_from_index(id);
     Error *local_err = NULL;
@@ -1146,7 +1146,7 @@ void pc_cpus_init(PCMachineState *pcms)
     gchar **model_pieces;
     const CPUArchIdList *possible_cpus;
     MachineState *machine = MACHINE(pcms);
-    MachineClass *mc = MACHINE_GET_CLASS(pcms);
+    const MachineClass *mc = MACHINE_GET_CLASS(pcms);
 
     /* init CPUs */
     if (machine->cpu_model == NULL) {
@@ -1362,7 +1362,7 @@ void pc_memory_init(PCMachineState *pcms,
     MemoryRegion *ram_below_4g, *ram_above_4g;
     FWCfgState *fw_cfg;
     MachineState *machine = MACHINE(pcms);
-    PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
+    const PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
 
     assert(machine->ram_size == pcms->below_4g_mem_size +
                                 pcms->above_4g_mem_size);
@@ -1395,7 +1395,7 @@ void pc_memory_init(PCMachineState *pcms,
     if (!pcmc->has_reserved_memory &&
         (machine->ram_slots ||
          (machine->maxram_size > machine->ram_size))) {
-        MachineClass *mc = MACHINE_GET_CLASS(machine);
+        const MachineClass *mc = MACHINE_GET_CLASS(machine);
 
         error_report("\"-memory 'slots|maxmem'\" is not supported by: %s",
                      mc->name);
@@ -1460,7 +1460,7 @@ void pc_memory_init(PCMachineState *pcms,
 
     if (pcmc->has_reserved_memory && pcms->hotplug_memory.base) {
         uint64_t *val = g_malloc(sizeof(*val));
-        PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
+        const PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
         uint64_t res_mem_end = pcms->hotplug_memory.base;
 
         if (!pcmc->broken_reserved_end) {
@@ -1688,12 +1688,12 @@ void ioapic_init_gsi(GSIState *gsi_state, const char *parent_name)
 static void pc_dimm_plug(HotplugHandler *hotplug_dev,
                          DeviceState *dev, Error **errp)
 {
-    HotplugHandlerClass *hhc;
+    const HotplugHandlerClass *hhc;
     Error *local_err = NULL;
     PCMachineState *pcms = PC_MACHINE(hotplug_dev);
-    PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
+    const PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
     PCDIMMDevice *dimm = PC_DIMM(dev);
-    PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
+    const PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
     MemoryRegion *mr = ddc->get_memory_region(dimm);
     uint64_t align = TARGET_PAGE_SIZE;
 
@@ -1730,7 +1730,7 @@ out:
 static void pc_dimm_unplug_request(HotplugHandler *hotplug_dev,
                                    DeviceState *dev, Error **errp)
 {
-    HotplugHandlerClass *hhc;
+    const HotplugHandlerClass *hhc;
     Error *local_err = NULL;
     PCMachineState *pcms = PC_MACHINE(hotplug_dev);
 
@@ -1758,9 +1758,9 @@ static void pc_dimm_unplug(HotplugHandler *hotplug_dev,
 {
     PCMachineState *pcms = PC_MACHINE(hotplug_dev);
     PCDIMMDevice *dimm = PC_DIMM(dev);
-    PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
+    const PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
     MemoryRegion *mr = ddc->get_memory_region(dimm);
-    HotplugHandlerClass *hhc;
+    const HotplugHandlerClass *hhc;
     Error *local_err = NULL;
 
     hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev);
@@ -1807,7 +1807,7 @@ static void pc_cpu_plug(HotplugHandler *hotplug_dev,
                         DeviceState *dev, Error **errp)
 {
     CPUArchId *found_cpu;
-    HotplugHandlerClass *hhc;
+    const HotplugHandlerClass *hhc;
     Error *local_err = NULL;
     X86CPU *cpu = X86_CPU(dev);
     PCMachineState *pcms = PC_MACHINE(hotplug_dev);
@@ -1838,7 +1838,7 @@ static void pc_cpu_unplug_request_cb(HotplugHandler *hotplug_dev,
                                      DeviceState *dev, Error **errp)
 {
     int idx = -1;
-    HotplugHandlerClass *hhc;
+    const HotplugHandlerClass *hhc;
     Error *local_err = NULL;
     X86CPU *cpu = X86_CPU(dev);
     PCMachineState *pcms = PC_MACHINE(hotplug_dev);
@@ -1866,7 +1866,7 @@ static void pc_cpu_unplug_cb(HotplugHandler *hotplug_dev,
                              DeviceState *dev, Error **errp)
 {
     CPUArchId *found_cpu;
-    HotplugHandlerClass *hhc;
+    const HotplugHandlerClass *hhc;
     Error *local_err = NULL;
     X86CPU *cpu = X86_CPU(dev);
     PCMachineState *pcms = PC_MACHINE(hotplug_dev);
@@ -2033,7 +2033,7 @@ static void pc_machine_device_unplug_cb(HotplugHandler *hotplug_dev,
 static HotplugHandler *pc_get_hotpug_handler(MachineState *machine,
                                              DeviceState *dev)
 {
-    PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(machine);
+    const PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(machine);
 
     if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM) ||
         object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 9f102aa388..ead6e75503 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -66,7 +66,7 @@ static void pc_init1(MachineState *machine,
                      const char *host_type, const char *pci_type)
 {
     PCMachineState *pcms = PC_MACHINE(machine);
-    PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
+    const PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
     MemoryRegion *system_memory = get_system_memory();
     MemoryRegion *system_io = get_system_io();
     int i;
@@ -164,7 +164,7 @@ static void pc_init1(MachineState *machine,
     pc_guest_info_init(pcms);
 
     if (pcmc->smbios_defaults) {
-        MachineClass *mc = MACHINE_GET_CLASS(machine);
+        const MachineClass *mc = MACHINE_GET_CLASS(machine);
         /* These values are guest ABI, do not change */
         smbios_set_defaults("QEMU", "Standard PC (i440FX + PIIX, 1996)",
                             mc->name, pcmc->smbios_legacy_mode,
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index dd792a8547..9d21572ab9 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -55,7 +55,7 @@
 static void pc_q35_init(MachineState *machine)
 {
     PCMachineState *pcms = PC_MACHINE(machine);
-    PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
+    const PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
     Q35PCIHost *q35_host;
     PCIHostState *phb;
     PCIBus *host_bus;
@@ -75,7 +75,7 @@ static void pc_q35_init(MachineState *machine)
     PCIDevice *ahci;
     ram_addr_t lowmem;
     DriveInfo *hd[MAX_SATA_PORTS];
-    MachineClass *mc = MACHINE_GET_CLASS(machine);
+    const MachineClass *mc = MACHINE_GET_CLASS(machine);
 
     /* Check whether RAM fits below 4G (leaving 1/2 GByte for IO memory
      * and 256 Mbytes for PCI Express Enhanced Configuration Access Mapping
diff --git a/hw/i386/x86-iommu.c b/hw/i386/x86-iommu.c
index 23dcd3f039..4be7ee0609 100644
--- a/hw/i386/x86-iommu.c
+++ b/hw/i386/x86-iommu.c
@@ -79,7 +79,7 @@ IommuType x86_iommu_get_type(void)
 static void x86_iommu_realize(DeviceState *dev, Error **errp)
 {
     X86IOMMUState *x86_iommu = X86_IOMMU_DEVICE(dev);
-    X86IOMMUClass *x86_class = X86_IOMMU_GET_CLASS(dev);
+    const X86IOMMUClass *x86_class = X86_IOMMU_GET_CLASS(dev);
     QLIST_INIT(&x86_iommu->iec_notifiers);
     if (x86_class->realize) {
         x86_class->realize(dev, errp);
diff --git a/hw/ide/microdrive.c b/hw/ide/microdrive.c
index e3fd30e457..3103d15243 100644
--- a/hw/ide/microdrive.c
+++ b/hw/ide/microdrive.c
@@ -129,7 +129,7 @@ static void md_reset(DeviceState *dev)
 static uint8_t md_attr_read(PCMCIACardState *card, uint32_t at)
 {
     MicroDriveState *s = MICRODRIVE(card);
-    PCMCIACardClass *pcc = PCMCIA_CARD_GET_CLASS(card);
+    const PCMCIACardClass *pcc = PCMCIA_CARD_GET_CLASS(card);
 
     if (at < s->attr_base) {
         if (at < pcc->cis_len) {
@@ -536,7 +536,7 @@ static const uint8_t dscm1xxxx_cis[0x14a] = {
 static int dscm1xxxx_attach(PCMCIACardState *card)
 {
     MicroDriveState *md = MICRODRIVE(card);
-    PCMCIACardClass *pcc = PCMCIA_CARD_GET_CLASS(card);
+    const PCMCIACardClass *pcc = PCMCIA_CARD_GET_CLASS(card);
 
     md->attr_base = pcc->cis[0x74] | (pcc->cis[0x76] << 8);
     md->io_base = 0x0;
diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c
index 299e592fa2..28700d1a03 100644
--- a/hw/ide/qdev.c
+++ b/hw/ide/qdev.c
@@ -83,7 +83,7 @@ static char *idebus_get_fw_dev_path(DeviceState *dev)
 static int ide_qdev_init(DeviceState *qdev)
 {
     IDEDevice *dev = IDE_DEVICE(qdev);
-    IDEDeviceClass *dc = IDE_DEVICE_GET_CLASS(dev);
+    const IDEDeviceClass *dc = IDE_DEVICE_GET_CLASS(dev);
     IDEBus *bus = DO_UPCAST(IDEBus, qbus, qdev->parent_bus);
 
     if (dev->unit == -1) {
diff --git a/hw/input/adb.c b/hw/input/adb.c
index 43d3205472..51b510db73 100644
--- a/hw/input/adb.c
+++ b/hw/input/adb.c
@@ -87,7 +87,7 @@ int adb_request(ADBBusState *s, uint8_t *obuf, const uint8_t *buf, int len)
     for(i = 0; i < s->nb_devices; i++) {
         d = s->devices[i];
         if (d->devaddr == devaddr) {
-            ADBDeviceClass *adc = ADB_DEVICE_GET_CLASS(d);
+            const ADBDeviceClass *adc = ADB_DEVICE_GET_CLASS(d);
             return adc->devreq(d, obuf, buf, len);
         }
     }
@@ -491,7 +491,7 @@ static QemuInputHandler adb_keyboard_handler = {
 
 static void adb_kbd_realizefn(DeviceState *dev, Error **errp)
 {
-    ADBKeyboardClass *akc = ADB_KEYBOARD_GET_CLASS(dev);
+    const ADBKeyboardClass *akc = ADB_KEYBOARD_GET_CLASS(dev);
     akc->parent_realize(dev, errp);
     qemu_input_handler_register(dev, &adb_keyboard_handler);
 }
@@ -707,7 +707,7 @@ static const VMStateDescription vmstate_adb_mouse = {
 static void adb_mouse_realizefn(DeviceState *dev, Error **errp)
 {
     MouseState *s = ADB_MOUSE(dev);
-    ADBMouseClass *amc = ADB_MOUSE_GET_CLASS(dev);
+    const ADBMouseClass *amc = ADB_MOUSE_GET_CLASS(dev);
 
     amc->parent_realize(dev, errp);
 
diff --git a/hw/input/virtio-input.c b/hw/input/virtio-input.c
index 0e42f0d02c..9757a4cdeb 100644
--- a/hw/input/virtio-input.c
+++ b/hw/input/virtio-input.c
@@ -75,7 +75,7 @@ static void virtio_input_handle_evt(VirtIODevice *vdev, VirtQueue *vq)
 
 static void virtio_input_handle_sts(VirtIODevice *vdev, VirtQueue *vq)
 {
-    VirtIOInputClass *vic = VIRTIO_INPUT_GET_CLASS(vdev);
+    const VirtIOInputClass *vic = VIRTIO_INPUT_GET_CLASS(vdev);
     VirtIOInput *vinput = VIRTIO_INPUT(vdev);
     virtio_input_event event;
     VirtQueueElement *elem;
@@ -190,7 +190,7 @@ static uint64_t virtio_input_get_features(VirtIODevice *vdev, uint64_t f,
 
 static void virtio_input_set_status(VirtIODevice *vdev, uint8_t val)
 {
-    VirtIOInputClass *vic = VIRTIO_INPUT_GET_CLASS(vdev);
+    const VirtIOInputClass *vic = VIRTIO_INPUT_GET_CLASS(vdev);
     VirtIOInput *vinput = VIRTIO_INPUT(vdev);
 
     if (val & VIRTIO_CONFIG_S_DRIVER_OK) {
@@ -205,7 +205,7 @@ static void virtio_input_set_status(VirtIODevice *vdev, uint8_t val)
 
 static void virtio_input_reset(VirtIODevice *vdev)
 {
-    VirtIOInputClass *vic = VIRTIO_INPUT_GET_CLASS(vdev);
+    const VirtIOInputClass *vic = VIRTIO_INPUT_GET_CLASS(vdev);
     VirtIOInput *vinput = VIRTIO_INPUT(vdev);
 
     if (vinput->active) {
@@ -219,7 +219,7 @@ static void virtio_input_reset(VirtIODevice *vdev)
 static int virtio_input_post_load(void *opaque, int version_id)
 {
     VirtIOInput *vinput = opaque;
-    VirtIOInputClass *vic = VIRTIO_INPUT_GET_CLASS(vinput);
+    const VirtIOInputClass *vic = VIRTIO_INPUT_GET_CLASS(vinput);
     VirtIODevice *vdev = VIRTIO_DEVICE(vinput);
 
     vinput->active = vdev->status & VIRTIO_CONFIG_S_DRIVER_OK;
@@ -231,7 +231,7 @@ static int virtio_input_post_load(void *opaque, int version_id)
 
 static void virtio_input_device_realize(DeviceState *dev, Error **errp)
 {
-    VirtIOInputClass *vic = VIRTIO_INPUT_GET_CLASS(dev);
+    const VirtIOInputClass *vic = VIRTIO_INPUT_GET_CLASS(dev);
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIOInput *vinput = VIRTIO_INPUT(dev);
     VirtIOInputConfig *cfg;
@@ -276,7 +276,7 @@ static void virtio_input_finalize(Object *obj)
 }
 static void virtio_input_device_unrealize(DeviceState *dev, Error **errp)
 {
-    VirtIOInputClass *vic = VIRTIO_INPUT_GET_CLASS(dev);
+    const VirtIOInputClass *vic = VIRTIO_INPUT_GET_CLASS(dev);
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     Error *local_err = NULL;
 
diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
index c3829e31b5..a6748879d5 100644
--- a/hw/intc/apic_common.c
+++ b/hw/intc/apic_common.c
@@ -40,7 +40,7 @@ void cpu_set_apic_base(DeviceState *dev, uint64_t val)
 
     if (dev) {
         APICCommonState *s = APIC_COMMON(dev);
-        APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
+        const APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
         /* switching to x2APIC, reset possibly modified xAPIC ID */
         if (!(s->apicbase & MSR_IA32_APICBASE_EXTD) &&
             (val & MSR_IA32_APICBASE_EXTD)) {
@@ -65,7 +65,7 @@ uint64_t cpu_get_apic_base(DeviceState *dev)
 void cpu_set_apic_tpr(DeviceState *dev, uint8_t val)
 {
     APICCommonState *s;
-    APICCommonClass *info;
+    const APICCommonClass *info;
 
     if (!dev) {
         return;
@@ -80,7 +80,7 @@ void cpu_set_apic_tpr(DeviceState *dev, uint8_t val)
 uint8_t cpu_get_apic_tpr(DeviceState *dev)
 {
     APICCommonState *s;
-    APICCommonClass *info;
+    const APICCommonClass *info;
 
     if (!dev) {
         return 0;
@@ -95,7 +95,7 @@ uint8_t cpu_get_apic_tpr(DeviceState *dev)
 void apic_enable_tpr_access_reporting(DeviceState *dev, bool enable)
 {
     APICCommonState *s = APIC_COMMON(dev);
-    APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
+    const APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
 
     apic_report_tpr_access = enable;
     if (info->enable_tpr_reporting) {
@@ -106,7 +106,7 @@ void apic_enable_tpr_access_reporting(DeviceState *dev, bool enable)
 void apic_enable_vapic(DeviceState *dev, hwaddr paddr)
 {
     APICCommonState *s = APIC_COMMON(dev);
-    APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
+    const APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
 
     s->vapic_paddr = paddr;
     info->vapic_base_update(s);
@@ -149,7 +149,7 @@ int apic_get_irq_delivered(void)
 void apic_deliver_nmi(DeviceState *dev)
 {
     APICCommonState *s = APIC_COMMON(dev);
-    APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
+    const APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
 
     info->external_nmi(s);
 }
@@ -190,7 +190,7 @@ bool apic_next_timer(APICCommonState *s, int64_t current_time)
 void apic_init_reset(DeviceState *dev)
 {
     APICCommonState *s;
-    APICCommonClass *info;
+    const APICCommonClass *info;
     int i;
 
     if (!dev) {
@@ -244,7 +244,7 @@ void apic_designate_bsp(DeviceState *dev, bool bsp)
 static void apic_reset_common(DeviceState *dev)
 {
     APICCommonState *s = APIC_COMMON(dev);
-    APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
+    const APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
     uint32_t bsp;
 
     bsp = s->apicbase & MSR_IA32_APICBASE_BSP;
@@ -263,7 +263,7 @@ static void apic_reset_common(DeviceState *dev)
 static int apic_load_old(QEMUFile *f, void *opaque, int version_id)
 {
     APICCommonState *s = opaque;
-    APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
+    const APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
     int i;
 
     if (version_id > 2) {
@@ -310,7 +310,7 @@ static const VMStateDescription vmstate_apic_common;
 static void apic_common_realize(DeviceState *dev, Error **errp)
 {
     APICCommonState *s = APIC_COMMON(dev);
-    APICCommonClass *info;
+    const APICCommonClass *info;
     static DeviceState *vapic;
     int instance_id = s->id;
 
@@ -337,7 +337,7 @@ static void apic_common_realize(DeviceState *dev, Error **errp)
 static void apic_common_unrealize(DeviceState *dev, Error **errp)
 {
     APICCommonState *s = APIC_COMMON(dev);
-    APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
+    const APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
 
     vmstate_unregister(NULL, &vmstate_apic_common, s);
     info->unrealize(dev, errp);
@@ -363,7 +363,7 @@ static int apic_pre_load(void *opaque)
 static void apic_dispatch_pre_save(void *opaque)
 {
     APICCommonState *s = APIC_COMMON(opaque);
-    APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
+    const APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
 
     if (info->pre_save) {
         info->pre_save(s);
@@ -373,7 +373,7 @@ static void apic_dispatch_pre_save(void *opaque)
 static int apic_dispatch_post_load(void *opaque, int version_id)
 {
     APICCommonState *s = APIC_COMMON(opaque);
-    APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
+    const APICCommonClass *info = APIC_COMMON_GET_CLASS(s);
 
     if (info->post_load) {
         info->post_load(s);
diff --git a/hw/intc/arm_gic.c b/hw/intc/arm_gic.c
index b305d9032a..82a6c872bf 100644
--- a/hw/intc/arm_gic.c
+++ b/hw/intc/arm_gic.c
@@ -1403,7 +1403,7 @@ static void arm_gic_realize(DeviceState *dev, Error **errp)
     int i;
     GICState *s = ARM_GIC(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
-    ARMGICClass *agc = ARM_GIC_GET_CLASS(s);
+    const ARMGICClass *agc = ARM_GIC_GET_CLASS(s);
     Error *local_err = NULL;
 
     agc->parent_realize(dev, &local_err);
diff --git a/hw/intc/arm_gic_common.c b/hw/intc/arm_gic_common.c
index 70f1134823..eab755209a 100644
--- a/hw/intc/arm_gic_common.c
+++ b/hw/intc/arm_gic_common.c
@@ -26,7 +26,7 @@
 static void gic_pre_save(void *opaque)
 {
     GICState *s = (GICState *)opaque;
-    ARMGICCommonClass *c = ARM_GIC_COMMON_GET_CLASS(s);
+    const ARMGICCommonClass *c = ARM_GIC_COMMON_GET_CLASS(s);
 
     if (c->pre_save) {
         c->pre_save(s);
@@ -36,7 +36,7 @@ static void gic_pre_save(void *opaque)
 static int gic_post_load(void *opaque, int version_id)
 {
     GICState *s = (GICState *)opaque;
-    ARMGICCommonClass *c = ARM_GIC_COMMON_GET_CLASS(s);
+    const ARMGICCommonClass *c = ARM_GIC_COMMON_GET_CLASS(s);
 
     if (c->post_load) {
         c->post_load(s);
diff --git a/hw/intc/arm_gic_kvm.c b/hw/intc/arm_gic_kvm.c
index ec952ece93..522573b9eb 100644
--- a/hw/intc/arm_gic_kvm.c
+++ b/hw/intc/arm_gic_kvm.c
@@ -481,7 +481,7 @@ static void kvm_arm_gic_get(GICState *s)
 static void kvm_arm_gic_reset(DeviceState *dev)
 {
     GICState *s = ARM_GIC_COMMON(dev);
-    KVMARMGICClass *kgc = KVM_ARM_GIC_GET_CLASS(s);
+    const KVMARMGICClass *kgc = KVM_ARM_GIC_GET_CLASS(s);
 
     kgc->parent_reset(dev);
 
@@ -494,7 +494,7 @@ static void kvm_arm_gic_realize(DeviceState *dev, Error **errp)
 {
     int i;
     GICState *s = KVM_ARM_GIC(dev);
-    KVMARMGICClass *kgc = KVM_ARM_GIC_GET_CLASS(s);
+    const KVMARMGICClass *kgc = KVM_ARM_GIC_GET_CLASS(s);
     Error *local_err = NULL;
     int ret;
 
diff --git a/hw/intc/arm_gicv3.c b/hw/intc/arm_gicv3.c
index f0c967b304..dc7eaae45b 100644
--- a/hw/intc/arm_gicv3.c
+++ b/hw/intc/arm_gicv3.c
@@ -364,7 +364,7 @@ static void arm_gic_realize(DeviceState *dev, Error **errp)
 {
     /* Device instance realize function for the GIC sysbus device */
     GICv3State *s = ARM_GICV3(dev);
-    ARMGICv3Class *agc = ARM_GICV3_GET_CLASS(s);
+    const ARMGICv3Class *agc = ARM_GICV3_GET_CLASS(s);
     Error *local_err = NULL;
 
     agc->parent_realize(dev, &local_err);
diff --git a/hw/intc/arm_gicv3_common.c b/hw/intc/arm_gicv3_common.c
index c6493d6c07..bb86b35cd7 100644
--- a/hw/intc/arm_gicv3_common.c
+++ b/hw/intc/arm_gicv3_common.c
@@ -31,7 +31,7 @@
 static void gicv3_pre_save(void *opaque)
 {
     GICv3State *s = (GICv3State *)opaque;
-    ARMGICv3CommonClass *c = ARM_GICV3_COMMON_GET_CLASS(s);
+    const ARMGICv3CommonClass *c = ARM_GICV3_COMMON_GET_CLASS(s);
 
     if (c->pre_save) {
         c->pre_save(s);
@@ -41,7 +41,7 @@ static void gicv3_pre_save(void *opaque)
 static int gicv3_post_load(void *opaque, int version_id)
 {
     GICv3State *s = (GICv3State *)opaque;
-    ARMGICv3CommonClass *c = ARM_GICV3_COMMON_GET_CLASS(s);
+    const ARMGICv3CommonClass *c = ARM_GICV3_COMMON_GET_CLASS(s);
 
     if (c->post_load) {
         c->post_load(s);
diff --git a/hw/intc/arm_gicv3_its_common.c b/hw/intc/arm_gicv3_its_common.c
index 9d67c5c1ee..4e8870736c 100644
--- a/hw/intc/arm_gicv3_its_common.c
+++ b/hw/intc/arm_gicv3_its_common.c
@@ -26,7 +26,7 @@
 static void gicv3_its_pre_save(void *opaque)
 {
     GICv3ITSState *s = (GICv3ITSState *)opaque;
-    GICv3ITSCommonClass *c = ARM_GICV3_ITS_COMMON_GET_CLASS(s);
+    const GICv3ITSCommonClass *c = ARM_GICV3_ITS_COMMON_GET_CLASS(s);
 
     if (c->pre_save) {
         c->pre_save(s);
@@ -36,7 +36,7 @@ static void gicv3_its_pre_save(void *opaque)
 static int gicv3_its_post_load(void *opaque, int version_id)
 {
     GICv3ITSState *s = (GICv3ITSState *)opaque;
-    GICv3ITSCommonClass *c = ARM_GICV3_ITS_COMMON_GET_CLASS(s);
+    const GICv3ITSCommonClass *c = ARM_GICV3_ITS_COMMON_GET_CLASS(s);
 
     if (c->post_load) {
         c->post_load(s);
@@ -65,7 +65,7 @@ static MemTxResult gicv3_its_trans_write(void *opaque, hwaddr offset,
 {
     if (offset == 0x0040 && ((size == 2) || (size == 4))) {
         GICv3ITSState *s = ARM_GICV3_ITS_COMMON(opaque);
-        GICv3ITSCommonClass *c = ARM_GICV3_ITS_COMMON_GET_CLASS(s);
+        const GICv3ITSCommonClass *c = ARM_GICV3_ITS_COMMON_GET_CLASS(s);
         int ret = c->send_msi(s, le64_to_cpu(value), attrs.requester_id);
 
         if (ret <= 0) {
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
index 81f0403117..f3fe3916b4 100644
--- a/hw/intc/arm_gicv3_kvm.c
+++ b/hw/intc/arm_gicv3_kvm.c
@@ -633,7 +633,7 @@ static void arm_gicv3_icc_reset(CPUARMState *env, const ARMCPRegInfo *ri)
 static void kvm_arm_gicv3_reset(DeviceState *dev)
 {
     GICv3State *s = ARM_GICV3_COMMON(dev);
-    KVMARMGICv3Class *kgc = KVM_ARM_GICV3_GET_CLASS(s);
+    const KVMARMGICv3Class *kgc = KVM_ARM_GICV3_GET_CLASS(s);
 
     DPRINTF("Reset\n");
 
@@ -678,7 +678,7 @@ static const ARMCPRegInfo gicv3_cpuif_reginfo[] = {
 static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
 {
     GICv3State *s = KVM_ARM_GICV3(dev);
-    KVMARMGICv3Class *kgc = KVM_ARM_GICV3_GET_CLASS(s);
+    const KVMARMGICv3Class *kgc = KVM_ARM_GICV3_GET_CLASS(s);
     Error *local_err = NULL;
     int i;
 
diff --git a/hw/intc/i8259.c b/hw/intc/i8259.c
index fe9ecd6bd4..f0ed3fc75d 100644
--- a/hw/intc/i8259.c
+++ b/hw/intc/i8259.c
@@ -448,7 +448,7 @@ static const MemoryRegionOps pic_elcr_ioport_ops = {
 static void pic_realize(DeviceState *dev, Error **errp)
 {
     PICCommonState *s = PIC_COMMON(dev);
-    PICClass *pc = PIC_GET_CLASS(dev);
+    const PICClass *pc = PIC_GET_CLASS(dev);
 
     memory_region_init_io(&s->base_io, OBJECT(s), &pic_base_ioport_ops, s,
                           "pic", 2);
diff --git a/hw/intc/i8259_common.c b/hw/intc/i8259_common.c
index d9a5e8b217..8b3ab19aef 100644
--- a/hw/intc/i8259_common.c
+++ b/hw/intc/i8259_common.c
@@ -49,7 +49,7 @@ void pic_reset_common(PICCommonState *s)
 static void pic_dispatch_pre_save(void *opaque)
 {
     PICCommonState *s = opaque;
-    PICCommonClass *info = PIC_COMMON_GET_CLASS(s);
+    const PICCommonClass *info = PIC_COMMON_GET_CLASS(s);
 
     if (info->pre_save) {
         info->pre_save(s);
@@ -59,7 +59,7 @@ static void pic_dispatch_pre_save(void *opaque)
 static int pic_dispatch_post_load(void *opaque, int version_id)
 {
     PICCommonState *s = opaque;
-    PICCommonClass *info = PIC_COMMON_GET_CLASS(s);
+    const PICCommonClass *info = PIC_COMMON_GET_CLASS(s);
 
     if (info->post_load) {
         info->post_load(s);
diff --git a/hw/intc/ioapic_common.c b/hw/intc/ioapic_common.c
index 97c4f9c2df..ab2f981aa6 100644
--- a/hw/intc/ioapic_common.c
+++ b/hw/intc/ioapic_common.c
@@ -105,7 +105,7 @@ void ioapic_reset_common(DeviceState *dev)
 static void ioapic_dispatch_pre_save(void *opaque)
 {
     IOAPICCommonState *s = IOAPIC_COMMON(opaque);
-    IOAPICCommonClass *info = IOAPIC_COMMON_GET_CLASS(s);
+    const IOAPICCommonClass *info = IOAPIC_COMMON_GET_CLASS(s);
 
     if (info->pre_save) {
         info->pre_save(s);
@@ -115,7 +115,7 @@ static void ioapic_dispatch_pre_save(void *opaque)
 static int ioapic_dispatch_post_load(void *opaque, int version_id)
 {
     IOAPICCommonState *s = IOAPIC_COMMON(opaque);
-    IOAPICCommonClass *info = IOAPIC_COMMON_GET_CLASS(s);
+    const IOAPICCommonClass *info = IOAPIC_COMMON_GET_CLASS(s);
 
     if (info->post_load) {
         info->post_load(s);
@@ -126,7 +126,7 @@ static int ioapic_dispatch_post_load(void *opaque, int version_id)
 static void ioapic_common_realize(DeviceState *dev, Error **errp)
 {
     IOAPICCommonState *s = IOAPIC_COMMON(dev);
-    IOAPICCommonClass *info;
+    const IOAPICCommonClass *info;
 
     if (ioapic_no >= MAX_IOAPICS) {
         error_setg(errp, "Only %d ioapics allowed", MAX_IOAPICS);
diff --git a/hw/intc/xics.c b/hw/intc/xics.c
index e740989a11..85f3b3ebd0 100644
--- a/hw/intc/xics.c
+++ b/hw/intc/xics.c
@@ -66,7 +66,7 @@ void xics_cpu_setup(XICSFabric *xi, PowerPCCPU *cpu)
     CPUState *cs = CPU(cpu);
     CPUPPCState *env = &cpu->env;
     ICPState *icp = xics_icp_get(xi, cs->cpu_index);
-    ICPStateClass *icpc;
+    const ICPStateClass *icpc;
 
     assert(icp);
 
@@ -142,7 +142,7 @@ void ics_pic_print_info(ICSState *ics, Monitor *mon)
 
 static void ics_reject(ICSState *ics, uint32_t nr)
 {
-    ICSStateClass *k = ICS_BASE_GET_CLASS(ics);
+    const ICSStateClass *k = ICS_BASE_GET_CLASS(ics);
 
     if (k->reject) {
         k->reject(ics, nr);
@@ -151,7 +151,7 @@ static void ics_reject(ICSState *ics, uint32_t nr)
 
 void ics_resend(ICSState *ics)
 {
-    ICSStateClass *k = ICS_BASE_GET_CLASS(ics);
+    const ICSStateClass *k = ICS_BASE_GET_CLASS(ics);
 
     if (k->resend) {
         k->resend(ics);
@@ -160,7 +160,7 @@ void ics_resend(ICSState *ics)
 
 static void ics_eoi(ICSState *ics, int nr)
 {
-    ICSStateClass *k = ICS_BASE_GET_CLASS(ics);
+    const ICSStateClass *k = ICS_BASE_GET_CLASS(ics);
 
     if (k->eoi) {
         k->eoi(ics, nr);
@@ -188,7 +188,7 @@ static void icp_check_ipi(ICPState *icp)
 void icp_resend(ICPState *icp)
 {
     XICSFabric *xi = icp->xics;
-    XICSFabricClass *xic = XICS_FABRIC_GET_CLASS(xi);
+    const XICSFabricClass *xic = XICS_FABRIC_GET_CLASS(xi);
 
     if (icp->mfrr < CPPR(icp)) {
         icp_check_ipi(icp);
@@ -256,7 +256,7 @@ uint32_t icp_ipoll(ICPState *icp, uint32_t *mfrr)
 void icp_eoi(ICPState *icp, uint32_t xirr)
 {
     XICSFabric *xi = icp->xics;
-    XICSFabricClass *xic = XICS_FABRIC_GET_CLASS(xi);
+    const XICSFabricClass *xic = XICS_FABRIC_GET_CLASS(xi);
     ICSState *ics;
     uint32_t irq;
 
@@ -299,7 +299,7 @@ static void icp_irq(ICSState *ics, int server, int nr, uint8_t priority)
 static void icp_dispatch_pre_save(void *opaque)
 {
     ICPState *icp = opaque;
-    ICPStateClass *info = ICP_GET_CLASS(icp);
+    const ICPStateClass *info = ICP_GET_CLASS(icp);
 
     if (info->pre_save) {
         info->pre_save(icp);
@@ -309,7 +309,7 @@ static void icp_dispatch_pre_save(void *opaque)
 static int icp_dispatch_post_load(void *opaque, int version_id)
 {
     ICPState *icp = opaque;
-    ICPStateClass *info = ICP_GET_CLASS(icp);
+    const ICPStateClass *info = ICP_GET_CLASS(icp);
 
     if (info->post_load) {
         return info->post_load(icp, version_id);
@@ -545,7 +545,7 @@ static void ics_simple_reset(void *dev)
 static void ics_simple_dispatch_pre_save(void *opaque)
 {
     ICSState *ics = opaque;
-    ICSStateClass *info = ICS_BASE_GET_CLASS(ics);
+    const ICSStateClass *info = ICS_BASE_GET_CLASS(ics);
 
     if (info->pre_save) {
         info->pre_save(ics);
@@ -555,7 +555,7 @@ static void ics_simple_dispatch_pre_save(void *opaque)
 static int ics_simple_dispatch_post_load(void *opaque, int version_id)
 {
     ICSState *ics = opaque;
-    ICSStateClass *info = ICS_BASE_GET_CLASS(ics);
+    const ICSStateClass *info = ICS_BASE_GET_CLASS(ics);
 
     if (info->post_load) {
         return info->post_load(ics, version_id);
@@ -645,7 +645,7 @@ static const TypeInfo ics_simple_info = {
 
 static void ics_base_realize(DeviceState *dev, Error **errp)
 {
-    ICSStateClass *icsc = ICS_BASE_GET_CLASS(dev);
+    const ICSStateClass *icsc = ICS_BASE_GET_CLASS(dev);
     ICSState *ics = ICS_BASE(dev);
     Object *obj;
     Error *err = NULL;
@@ -691,7 +691,7 @@ static const TypeInfo xics_fabric_info = {
  */
 qemu_irq xics_get_qirq(XICSFabric *xi, int irq)
 {
-    XICSFabricClass *xic = XICS_FABRIC_GET_CLASS(xi);
+    const XICSFabricClass *xic = XICS_FABRIC_GET_CLASS(xi);
     ICSState *ics = xic->ics_get(xi, irq);
 
     if (ics) {
@@ -703,7 +703,7 @@ qemu_irq xics_get_qirq(XICSFabric *xi, int irq)
 
 ICPState *xics_icp_get(XICSFabric *xi, int server)
 {
-    XICSFabricClass *xic = XICS_FABRIC_GET_CLASS(xi);
+    const XICSFabricClass *xic = XICS_FABRIC_GET_CLASS(xi);
 
     return xic->icp_get(xi, server);
 }
diff --git a/hw/ipack/ipack.c b/hw/ipack/ipack.c
index 6021e6d135..3b944b75cf 100644
--- a/hw/ipack/ipack.c
+++ b/hw/ipack/ipack.c
@@ -40,7 +40,7 @@ static void ipack_device_realize(DeviceState *dev, Error **errp)
 {
     IPackDevice *idev = IPACK_DEVICE(dev);
     IPackBus *bus = IPACK_BUS(qdev_get_parent_bus(dev));
-    IPackDeviceClass *k = IPACK_DEVICE_GET_CLASS(dev);
+    const IPackDeviceClass *k = IPACK_DEVICE_GET_CLASS(dev);
 
     if (idev->slot < 0) {
         idev->slot = bus->free_slot;
@@ -59,7 +59,7 @@ static void ipack_device_realize(DeviceState *dev, Error **errp)
 static void ipack_device_unrealize(DeviceState *dev, Error **errp)
 {
     IPackDevice *idev = IPACK_DEVICE(dev);
-    IPackDeviceClass *k = IPACK_DEVICE_GET_CLASS(dev);
+    const IPackDeviceClass *k = IPACK_DEVICE_GET_CLASS(dev);
     Error *err = NULL;
 
     if (k->unrealize) {
diff --git a/hw/ipack/tpci200.c b/hw/ipack/tpci200.c
index 4dfa6b33f3..162753d512 100644
--- a/hw/ipack/tpci200.c
+++ b/hw/ipack/tpci200.c
@@ -321,7 +321,7 @@ static uint64_t tpci200_read_las1(void *opaque, hwaddr addr, unsigned size)
     if (ip == NULL) {
         DPRINTF("Read LAS1: IP module %u not installed\n", ip_n);
     } else {
-        IPackDeviceClass *k = IPACK_DEVICE_GET_CLASS(ip);
+        const IPackDeviceClass *k = IPACK_DEVICE_GET_CLASS(ip);
         switch (space) {
 
         case IP_ID_SPACE:
@@ -383,7 +383,7 @@ static void tpci200_write_las1(void *opaque, hwaddr addr, uint64_t val,
     if (ip == NULL) {
         DPRINTF("Write LAS1: IP module %u not installed\n", ip_n);
     } else {
-        IPackDeviceClass *k = IPACK_DEVICE_GET_CLASS(ip);
+        const IPackDeviceClass *k = IPACK_DEVICE_GET_CLASS(ip);
         switch (space) {
 
         case IP_ID_SPACE:
@@ -431,7 +431,7 @@ static uint64_t tpci200_read_las2(void *opaque, hwaddr addr, unsigned size)
     if (ip == NULL) {
         DPRINTF("Read LAS2: IP module %u not installed\n", ip_n);
     } else {
-        IPackDeviceClass *k = IPACK_DEVICE_GET_CLASS(ip);
+        const IPackDeviceClass *k = IPACK_DEVICE_GET_CLASS(ip);
         if (k->mem_read16) {
             ret = k->mem_read16(ip, offset);
         }
@@ -462,7 +462,7 @@ static void tpci200_write_las2(void *opaque, hwaddr addr, uint64_t val,
     if (ip == NULL) {
         DPRINTF("Write LAS2: IP module %u not installed\n", ip_n);
     } else {
-        IPackDeviceClass *k = IPACK_DEVICE_GET_CLASS(ip);
+        const IPackDeviceClass *k = IPACK_DEVICE_GET_CLASS(ip);
         if (k->mem_write16) {
             k->mem_write16(ip, offset, val);
         }
@@ -486,7 +486,7 @@ static uint64_t tpci200_read_las3(void *opaque, hwaddr addr, unsigned size)
     if (ip == NULL) {
         DPRINTF("Read LAS3: IP module %u not installed\n", ip_n);
     } else {
-        IPackDeviceClass *k = IPACK_DEVICE_GET_CLASS(ip);
+        const IPackDeviceClass *k = IPACK_DEVICE_GET_CLASS(ip);
         if (k->mem_read8) {
             ret = k->mem_read8(ip, offset);
         }
@@ -512,7 +512,7 @@ static void tpci200_write_las3(void *opaque, hwaddr addr, uint64_t val,
     if (ip == NULL) {
         DPRINTF("Write LAS3: IP module %u not installed\n", ip_n);
     } else {
-        IPackDeviceClass *k = IPACK_DEVICE_GET_CLASS(ip);
+        const IPackDeviceClass *k = IPACK_DEVICE_GET_CLASS(ip);
         if (k->mem_write8) {
             k->mem_write8(ip, offset, val);
         }
diff --git a/hw/ipmi/ipmi_bmc_extern.c b/hw/ipmi/ipmi_bmc_extern.c
index e8e3d250b6..2ea02f0478 100644
--- a/hw/ipmi/ipmi_bmc_extern.c
+++ b/hw/ipmi/ipmi_bmc_extern.c
@@ -152,7 +152,7 @@ static void extern_timeout(void *opaque)
 
     if (ibe->connected) {
         if (ibe->waiting_rsp && (ibe->outlen == 0)) {
-            IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
+            const IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
             /* The message response timed out, return an error. */
             ibe->waiting_rsp = false;
             ibe->inbuf[1] = ibe->outbuf[1] | 0x04;
@@ -208,7 +208,7 @@ static void ipmi_bmc_extern_handle_command(IPMIBmc *b,
         err = IPMI_CC_BMC_INIT_IN_PROGRESS;
     }
     if (err) {
-        IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
+        const IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
         unsigned char rsp[3];
         rsp[0] = cmd[0] | 0x04;
         rsp[1] = cmd[1];
@@ -238,7 +238,7 @@ static void ipmi_bmc_extern_handle_command(IPMIBmc *b,
 static void handle_hw_op(IPMIBmcExtern *ibe, unsigned char hw_op)
 {
     IPMIInterface *s = ibe->parent.intf;
-    IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
+    const IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
 
     switch (hw_op) {
     case VM_CMD_VERSION:
@@ -285,7 +285,7 @@ static void handle_hw_op(IPMIBmcExtern *ibe, unsigned char hw_op)
 
 static void handle_msg(IPMIBmcExtern *ibe)
 {
-    IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(ibe->parent.intf);
+    const IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(ibe->parent.intf);
 
     if (ibe->in_escape) {
         ipmi_debug("msg escape not ended\n");
@@ -385,7 +385,7 @@ static void chr_event(void *opaque, int event)
 {
     IPMIBmcExtern *ibe = opaque;
     IPMIInterface *s = ibe->parent.intf;
-    IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
+    const IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
     unsigned char v;
 
     switch (event) {
@@ -466,7 +466,7 @@ static int ipmi_bmc_extern_post_migrate(void *opaque, int version_id)
      */
     if (ibe->waiting_rsp) {
         IPMIInterface *ii = ibe->parent.intf;
-        IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
+        const IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
 
         ibe->waiting_rsp = false;
         ibe->inbuf[1] = ibe->outbuf[1] | 0x04;
diff --git a/hw/ipmi/ipmi_bmc_sim.c b/hw/ipmi/ipmi_bmc_sim.c
index c7883d6f5e..819bfad4ee 100644
--- a/hw/ipmi/ipmi_bmc_sim.c
+++ b/hw/ipmi/ipmi_bmc_sim.c
@@ -448,7 +448,7 @@ static void gen_event(IPMIBmcSim *ibs, unsigned int sens_num, uint8_t deassert,
                       uint8_t evd1, uint8_t evd2, uint8_t evd3)
 {
     IPMIInterface *s = ibs->parent.intf;
-    IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
+    const IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
     uint8_t evt[16];
     IPMISensor *sens = ibs->sensors + sens_num;
 
@@ -617,7 +617,7 @@ static void ipmi_sim_handle_command(IPMIBmc *b,
 {
     IPMIBmcSim *ibs = IPMI_BMC_SIMULATOR(b);
     IPMIInterface *s = ibs->parent.intf;
-    IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
+    const IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
     const IPMICmdHandler *hdl;
     RspBuffer rsp = RSP_BUFFER_INITIALIZER;
 
@@ -670,7 +670,7 @@ static void ipmi_sim_handle_command(IPMIBmc *b,
 static void ipmi_sim_handle_timeout(IPMIBmcSim *ibs)
 {
     IPMIInterface *s = ibs->parent.intf;
-    IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
+    const IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
 
     if (!ibs->watchdog_running) {
         goto out;
@@ -761,7 +761,7 @@ static void chassis_control(IPMIBmcSim *ibs,
                             RspBuffer *rsp)
 {
     IPMIInterface *s = ibs->parent.intf;
-    IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
+    const IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
 
     switch (cmd[2] & 0xf) {
     case 0: /* power down */
@@ -818,7 +818,7 @@ static void get_device_id(IPMIBmcSim *ibs,
 static void set_global_enables(IPMIBmcSim *ibs, uint8_t val)
 {
     IPMIInterface *s = ibs->parent.intf;
-    IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
+    const IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
     bool irqs_on;
 
     ibs->bmc_global_enables = val;
@@ -834,7 +834,7 @@ static void cold_reset(IPMIBmcSim *ibs,
                        RspBuffer *rsp)
 {
     IPMIInterface *s = ibs->parent.intf;
-    IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
+    const IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
 
     /* Disable all interrupts */
     set_global_enables(ibs, 1 << IPMI_BMC_EVENT_LOG_BIT);
@@ -849,7 +849,7 @@ static void warm_reset(IPMIBmcSim *ibs,
                        RspBuffer *rsp)
 {
     IPMIInterface *s = ibs->parent.intf;
-    IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
+    const IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
 
     if (k->reset) {
         k->reset(s, false);
@@ -901,7 +901,7 @@ static void clr_msg_flags(IPMIBmcSim *ibs,
                           RspBuffer *rsp)
 {
     IPMIInterface *s = ibs->parent.intf;
-    IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
+    const IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
 
     ibs->msg_flags &= ~cmd[2];
     k->set_atn(s, attn_set(ibs), attn_irq_enabled(ibs));
@@ -919,7 +919,7 @@ static void read_evt_msg_buf(IPMIBmcSim *ibs,
                              RspBuffer *rsp)
 {
     IPMIInterface *s = ibs->parent.intf;
-    IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
+    const IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
     unsigned int i;
 
     if (!(ibs->msg_flags & IPMI_BMC_MSG_FLAG_EVT_BUF_FULL)) {
@@ -951,7 +951,7 @@ static void get_msg(IPMIBmcSim *ibs,
 
     if (QTAILQ_EMPTY(&ibs->rcvbufs)) {
         IPMIInterface *s = ibs->parent.intf;
-        IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
+        const IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
 
         ibs->msg_flags &= ~IPMI_BMC_MSG_FLAG_RCV_MSG_QUEUE;
         k->set_atn(s, attn_set(ibs), attn_irq_enabled(ibs));
@@ -976,7 +976,7 @@ static void send_msg(IPMIBmcSim *ibs,
                      RspBuffer *rsp)
 {
     IPMIInterface *s = ibs->parent.intf;
-    IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
+    const IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
     IPMIRcvBufEntry *msg;
     uint8_t *buf;
     uint8_t netfn, rqLun, rsLun, rqSeq;
@@ -1092,7 +1092,7 @@ static void set_watchdog_timer(IPMIBmcSim *ibs,
                                RspBuffer *rsp)
 {
     IPMIInterface *s = ibs->parent.intf;
-    IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
+    const IPMIInterfaceClass *k = IPMI_INTERFACE_GET_CLASS(s);
     unsigned int val;
 
     val = cmd[2] & 0x7; /* Validate use */
diff --git a/hw/ipmi/isa_ipmi_bt.c b/hw/ipmi/isa_ipmi_bt.c
index 1c69cb33f8..3a60369d6b 100644
--- a/hw/ipmi/isa_ipmi_bt.c
+++ b/hw/ipmi/isa_ipmi_bt.c
@@ -125,7 +125,7 @@ typedef struct IPMIBT {
 
 static void ipmi_bt_handle_event(IPMIInterface *ii)
 {
-    IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
+    const IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
     IPMIBT *ib = iic->get_backend_data(ii);
 
     if (ib->inlen < 4) {
@@ -173,7 +173,7 @@ static void ipmi_bt_handle_event(IPMIInterface *ii)
     ib->waiting_seq = ib->inmsg[2];
     ib->inmsg[2] = ib->inmsg[1];
     {
-        IPMIBmcClass *bk = IPMI_BMC_GET_CLASS(ib->bmc);
+        const IPMIBmcClass *bk = IPMI_BMC_GET_CLASS(ib->bmc);
         bk->handle_command(ib->bmc, ib->inmsg + 2, ib->inlen - 2,
                            sizeof(ib->inmsg), ib->waiting_rsp);
     }
@@ -184,7 +184,7 @@ static void ipmi_bt_handle_event(IPMIInterface *ii)
 static void ipmi_bt_handle_rsp(IPMIInterface *ii, uint8_t msg_id,
                                 unsigned char *rsp, unsigned int rsp_len)
 {
-    IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
+    const IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
     IPMIBT *ib = iic->get_backend_data(ii);
 
     if (ib->waiting_rsp == msg_id) {
@@ -218,7 +218,7 @@ static void ipmi_bt_handle_rsp(IPMIInterface *ii, uint8_t msg_id,
 static uint64_t ipmi_bt_ioport_read(void *opaque, hwaddr addr, unsigned size)
 {
     IPMIInterface *ii = opaque;
-    IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
+    const IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
     IPMIBT *ib = iic->get_backend_data(ii);
     uint32_t ret = 0xff;
 
@@ -247,7 +247,7 @@ static uint64_t ipmi_bt_ioport_read(void *opaque, hwaddr addr, unsigned size)
 
 static void ipmi_bt_signal(IPMIBT *ib, IPMIInterface *ii)
 {
-    IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
+    const IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
 
     ib->do_wake = 1;
     while (ib->do_wake) {
@@ -260,7 +260,7 @@ static void ipmi_bt_ioport_write(void *opaque, hwaddr addr, uint64_t val,
                                  unsigned size)
 {
     IPMIInterface *ii = opaque;
-    IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
+    const IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
     IPMIBT *ib = iic->get_backend_data(ii);
 
     switch (addr & 3) {
@@ -333,7 +333,7 @@ static const MemoryRegionOps ipmi_bt_io_ops = {
 
 static void ipmi_bt_set_atn(IPMIInterface *ii, int val, int irq)
 {
-    IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
+    const IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
     IPMIBT *ib = iic->get_backend_data(ii);
 
     if (!!val == IPMI_BT_GET_SMS_ATN(ib->control_reg)) {
@@ -359,7 +359,7 @@ static void ipmi_bt_set_atn(IPMIInterface *ii, int val, int irq)
 
 static void ipmi_bt_handle_reset(IPMIInterface *ii, bool is_cold)
 {
-    IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
+    const IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
     IPMIBT *ib = iic->get_backend_data(ii);
 
     if (is_cold) {
@@ -374,7 +374,7 @@ static void ipmi_bt_handle_reset(IPMIInterface *ii, bool is_cold)
 
 static void ipmi_bt_set_irq_enable(IPMIInterface *ii, int val)
 {
-    IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
+    const IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
     IPMIBT *ib = iic->get_backend_data(ii);
 
     ib->irqs_enabled = val;
@@ -382,7 +382,7 @@ static void ipmi_bt_set_irq_enable(IPMIInterface *ii, int val)
 
 static void ipmi_bt_init(IPMIInterface *ii, Error **errp)
 {
-    IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
+    const IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
     IPMIBT *ib = iic->get_backend_data(ii);
 
     ib->io_length = 3;
@@ -436,7 +436,7 @@ static void isa_ipmi_bt_realize(DeviceState *dev, Error **errp)
     ISADevice *isadev = ISA_DEVICE(dev);
     ISAIPMIBTDevice *iib = ISA_IPMI_BT(dev);
     IPMIInterface *ii = IPMI_INTERFACE(dev);
-    IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
+    const IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
 
     if (!iib->bt.bmc) {
         error_setg(errp, "IPMI device requires a bmc attribute to be set");
diff --git a/hw/ipmi/isa_ipmi_kcs.c b/hw/ipmi/isa_ipmi_kcs.c
index 80444977a0..b036acc697 100644
--- a/hw/ipmi/isa_ipmi_kcs.c
+++ b/hw/ipmi/isa_ipmi_kcs.c
@@ -118,7 +118,7 @@ typedef struct IPMIKCS {
 
 static void ipmi_kcs_signal(IPMIKCS *ik, IPMIInterface *ii)
 {
-    IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
+    const IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
 
     ik->do_wake = 1;
     while (ik->do_wake) {
@@ -129,7 +129,7 @@ static void ipmi_kcs_signal(IPMIKCS *ik, IPMIInterface *ii)
 
 static void ipmi_kcs_handle_event(IPMIInterface *ii)
 {
-    IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
+    const IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
     IPMIKCS *ik = iic->get_backend_data(ii);
 
     if (ik->cmd_reg == IPMI_KCS_ABORT_STATUS_CMD) {
@@ -186,7 +186,7 @@ static void ipmi_kcs_handle_event(IPMIInterface *ii)
             ik->inlen++;
         }
         if (ik->write_end) {
-            IPMIBmcClass *bk = IPMI_BMC_GET_CLASS(ik->bmc);
+            const IPMIBmcClass *bk = IPMI_BMC_GET_CLASS(ik->bmc);
             ik->outlen = 0;
             ik->write_end = 0;
             ik->outpos = 0;
@@ -228,7 +228,7 @@ static void ipmi_kcs_handle_event(IPMIInterface *ii)
 static void ipmi_kcs_handle_rsp(IPMIInterface *ii, uint8_t msg_id,
                                 unsigned char *rsp, unsigned int rsp_len)
 {
-    IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
+    const IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
     IPMIKCS *ik = iic->get_backend_data(ii);
 
     if (ik->waiting_rsp == msg_id) {
@@ -252,7 +252,7 @@ static void ipmi_kcs_handle_rsp(IPMIInterface *ii, uint8_t msg_id,
 static uint64_t ipmi_kcs_ioport_read(void *opaque, hwaddr addr, unsigned size)
 {
     IPMIInterface *ii = opaque;
-    IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
+    const IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
     IPMIKCS *ik = iic->get_backend_data(ii);
     uint32_t ret;
 
@@ -284,7 +284,7 @@ static void ipmi_kcs_ioport_write(void *opaque, hwaddr addr, uint64_t val,
                                   unsigned size)
 {
     IPMIInterface *ii = opaque;
-    IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
+    const IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
     IPMIKCS *ik = iic->get_backend_data(ii);
 
     if (IPMI_KCS_GET_IBF(ik->status_reg)) {
@@ -316,7 +316,7 @@ const MemoryRegionOps ipmi_kcs_io_ops = {
 
 static void ipmi_kcs_set_atn(IPMIInterface *ii, int val, int irq)
 {
-    IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
+    const IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
     IPMIKCS *ik = iic->get_backend_data(ii);
 
     IPMI_KCS_SET_SMS_ATN(ik->status_reg, val);
@@ -339,7 +339,7 @@ static void ipmi_kcs_set_atn(IPMIInterface *ii, int val, int irq)
 
 static void ipmi_kcs_set_irq_enable(IPMIInterface *ii, int val)
 {
-    IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
+    const IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
     IPMIKCS *ik = iic->get_backend_data(ii);
 
     ik->irqs_enabled = val;
@@ -347,7 +347,7 @@ static void ipmi_kcs_set_irq_enable(IPMIInterface *ii, int val)
 
 static void ipmi_kcs_init(IPMIInterface *ii, Error **errp)
 {
-    IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
+    const IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
     IPMIKCS *ik = iic->get_backend_data(ii);
 
     ik->io_length = 2;
@@ -398,7 +398,7 @@ static void ipmi_isa_realize(DeviceState *dev, Error **errp)
     ISADevice *isadev = ISA_DEVICE(dev);
     ISAIPMIKCSDevice *iik = ISA_IPMI_KCS(dev);
     IPMIInterface *ii = IPMI_INTERFACE(dev);
-    IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
+    const IPMIInterfaceClass *iic = IPMI_INTERFACE_GET_CLASS(ii);
 
     if (!iik->kcs.bmc) {
         error_setg(errp, "IPMI device requires a bmc attribute to be set");
diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
index 9e8dab0e89..259454a3bc 100644
--- a/hw/mem/pc-dimm.c
+++ b/hw/mem/pc-dimm.c
@@ -40,7 +40,7 @@ void pc_dimm_memory_plug(DeviceState *dev, MemoryHotplugState *hpms,
     int slot;
     MachineState *machine = MACHINE(qdev_get_machine());
     PCDIMMDevice *dimm = PC_DIMM(dev);
-    PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
+    const PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
     MemoryRegion *vmstate_mr = ddc->get_vmstate_memory_region(dimm);
     Error *local_err = NULL;
     uint64_t existing_dimms_capacity = 0;
@@ -118,7 +118,7 @@ void pc_dimm_memory_unplug(DeviceState *dev, MemoryHotplugState *hpms,
                            MemoryRegion *mr)
 {
     PCDIMMDevice *dimm = PC_DIMM(dev);
-    PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
+    const PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
     MemoryRegion *vmstate_mr = ddc->get_vmstate_memory_region(dimm);
 
     numa_unset_mem_node_id(dimm->addr, memory_region_size(mr), dimm->node);
@@ -169,7 +169,7 @@ int qmp_pc_dimm_device_list(Object *obj, void *opaque)
             MemoryDeviceInfoList *elem = g_new0(MemoryDeviceInfoList, 1);
             MemoryDeviceInfo *info = g_new0(MemoryDeviceInfo, 1);
             PCDIMMDeviceInfo *di = g_new0(PCDIMMDeviceInfo, 1);
-            DeviceClass *dc = DEVICE_GET_CLASS(obj);
+            const DeviceClass *dc = DEVICE_GET_CLASS(obj);
             PCDIMMDevice *dimm = PC_DIMM(obj);
 
             if (dev->id) {
@@ -358,7 +358,7 @@ static void pc_dimm_get_size(Object *obj, Visitor *v, const char *name,
     int64_t value;
     MemoryRegion *mr;
     PCDIMMDevice *dimm = PC_DIMM(obj);
-    PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(obj);
+    const PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(obj);
 
     mr = ddc->get_memory_region(dimm);
     value = memory_region_size(mr);
@@ -398,7 +398,7 @@ static void pc_dimm_init(Object *obj)
 static void pc_dimm_realize(DeviceState *dev, Error **errp)
 {
     PCDIMMDevice *dimm = PC_DIMM(dev);
-    PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
+    const PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
 
     if (!dimm->hostmem) {
         error_setg(errp, "'" PC_DIMM_MEMDEV_PROP "' property is not set");
diff --git a/hw/misc/imx_ccm.c b/hw/misc/imx_ccm.c
index 7f239a41d8..8343526a84 100644
--- a/hw/misc/imx_ccm.c
+++ b/hw/misc/imx_ccm.c
@@ -31,7 +31,7 @@
 uint32_t imx_ccm_get_clock_frequency(IMXCCMState *dev, IMXClk clock)
 {
     uint32_t freq = 0;
-    IMXCCMClass *klass = IMX_GET_CLASS(dev);
+    const IMXCCMClass *klass = IMX_GET_CLASS(dev);
 
     if (klass->get_clock_frequency) {
         freq = klass->get_clock_frequency(dev, clock);
diff --git a/hw/net/e1000.c b/hw/net/e1000.c
index 93249497f4..9c501706b6 100644
--- a/hw/net/e1000.c
+++ b/hw/net/e1000.c
@@ -353,7 +353,7 @@ e1000_autoneg_timer(void *opaque)
 static void e1000_reset(void *opaque)
 {
     E1000State *d = opaque;
-    E1000BaseClass *edc = E1000_DEVICE_GET_CLASS(d);
+    const E1000BaseClass *edc = E1000_DEVICE_GET_CLASS(d);
     uint8_t *macaddr = d->conf.macaddr.a;
 
     timer_del(d->autoneg_timer);
diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
index 22874a9777..e63b2d0108 100644
--- a/hw/net/vhost_net.c
+++ b/hw/net/vhost_net.c
@@ -294,7 +294,7 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
 {
     BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(dev)));
     VirtioBusState *vbus = VIRTIO_BUS(qbus);
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
     int r, e, i;
 
     if (!k->set_guest_notifiers) {
@@ -360,7 +360,7 @@ void vhost_net_stop(VirtIODevice *dev, NetClientState *ncs,
 {
     BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(dev)));
     VirtioBusState *vbus = VIRTIO_BUS(qbus);
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
     int i, r;
 
     for (i = 0; i < total_queues; i++) {
diff --git a/hw/net/vmxnet3.c b/hw/net/vmxnet3.c
index 8b1fab24fd..c3050c2819 100644
--- a/hw/net/vmxnet3.c
+++ b/hw/net/vmxnet3.c
@@ -2604,7 +2604,7 @@ static Property vmxnet3_properties[] = {
 
 static void vmxnet3_realize(DeviceState *qdev, Error **errp)
 {
-    VMXNET3Class *vc = VMXNET3_DEVICE_GET_CLASS(qdev);
+    const VMXNET3Class *vc = VMXNET3_DEVICE_GET_CLASS(qdev);
     PCIDevice *pci_dev = PCI_DEVICE(qdev);
     VMXNET3State *s = VMXNET3(qdev);
 
diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
index 316fca9bc1..c1135b748a 100644
--- a/hw/nvram/fw_cfg.c
+++ b/hw/nvram/fw_cfg.c
@@ -792,7 +792,7 @@ void fw_cfg_add_file_callback(FWCfgState *s,  const char *filename,
 {
     int i, index, count;
     size_t dsize;
-    MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
+    const MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
     int order = 0;
 
     if (!s->files) {
diff --git a/hw/pci-bridge/pcie_root_port.c b/hw/pci-bridge/pcie_root_port.c
index cf3631806f..d558610494 100644
--- a/hw/pci-bridge/pcie_root_port.c
+++ b/hw/pci-bridge/pcie_root_port.c
@@ -18,7 +18,7 @@
 
 static void rp_aer_vector_update(PCIDevice *d)
 {
-    PCIERootPortClass *rpc = PCIE_ROOT_PORT_GET_CLASS(d);
+    const PCIERootPortClass *rpc = PCIE_ROOT_PORT_GET_CLASS(d);
 
     if (rpc->aer_vector) {
         pcie_aer_root_set_vector(d, rpc->aer_vector(d));
@@ -56,8 +56,8 @@ static void rp_realize(PCIDevice *d, Error **errp)
 {
     PCIEPort *p = PCIE_PORT(d);
     PCIESlot *s = PCIE_SLOT(d);
-    PCIDeviceClass *dc = PCI_DEVICE_GET_CLASS(d);
-    PCIERootPortClass *rpc = PCIE_ROOT_PORT_GET_CLASS(d);
+    const PCIDeviceClass *dc = PCI_DEVICE_GET_CLASS(d);
+    const PCIERootPortClass *rpc = PCIE_ROOT_PORT_GET_CLASS(d);
     int rc;
     Error *local_err = NULL;
 
@@ -122,7 +122,7 @@ err_bridge:
 
 static void rp_exit(PCIDevice *d)
 {
-    PCIERootPortClass *rpc = PCIE_ROOT_PORT_GET_CLASS(d);
+    const PCIERootPortClass *rpc = PCIE_ROOT_PORT_GET_CLASS(d);
     PCIESlot *s = PCIE_SLOT(d);
 
     pcie_aer_exit(d);
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index 9151057bf5..eaf4c14e28 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -353,7 +353,7 @@ const char *pci_root_bus_path(PCIDevice *dev)
 {
     PCIBus *rootbus = pci_device_root_bus(dev);
     PCIHostState *host_bridge = PCI_HOST_BRIDGE(rootbus->qbus.parent);
-    PCIHostBridgeClass *hc = PCI_HOST_BRIDGE_GET_CLASS(host_bridge);
+    const PCIHostBridgeClass *hc = PCI_HOST_BRIDGE_GET_CLASS(host_bridge);
 
     assert(host_bridge->bus == rootbus);
 
@@ -451,7 +451,7 @@ static int get_pci_config_device(QEMUFile *f, void *pv, size_t size,
                                  VMStateField *field)
 {
     PCIDevice *s = container_of(pv, PCIDevice, config);
-    PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(s);
+    const PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(s);
     uint8_t *config;
     int i;
 
@@ -952,7 +952,7 @@ static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, PCIBus *bus,
                                          const char *name, int devfn,
                                          Error **errp)
 {
-    PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(pci_dev);
+    const PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(pci_dev);
     PCIConfigReadFunc *config_read = pc->config_read;
     PCIConfigWriteFunc *config_write = pc->config_write;
     Error *local_err = NULL;
@@ -1070,7 +1070,7 @@ static void pci_unregister_io_regions(PCIDevice *pci_dev)
 static void pci_qdev_unrealize(DeviceState *dev, Error **errp)
 {
     PCIDevice *pci_dev = PCI_DEVICE(dev);
-    PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(pci_dev);
+    const PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(pci_dev);
 
     pci_unregister_io_regions(pci_dev);
     pci_del_option_rom(pci_dev);
@@ -1195,7 +1195,7 @@ static pcibus_t pci_bar_address(PCIDevice *d,
     int bar = pci_bar(d, reg);
     uint16_t cmd = pci_get_word(d->config + PCI_COMMAND);
     Object *machine = qdev_get_machine();
-    MachineClass *mc = MACHINE_GET_CLASS(machine);
+    const MachineClass *mc = MACHINE_GET_CLASS(machine);
     bool allow_0_address = mc->pci_allow_0_address;
 
     if (type & PCI_BASE_ADDRESS_SPACE_IO) {
@@ -1975,7 +1975,7 @@ PCIDevice *pci_find_device(PCIBus *bus, int bus_num, uint8_t devfn)
 static void pci_qdev_realize(DeviceState *qdev, Error **errp)
 {
     PCIDevice *pci_dev = (PCIDevice *)qdev;
-    PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(pci_dev);
+    const PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(pci_dev);
     Error *local_err = NULL;
     PCIBus *bus;
     bool is_default_rom;
@@ -2018,7 +2018,7 @@ static void pci_qdev_realize(DeviceState *qdev, Error **errp)
 
 static void pci_default_realize(PCIDevice *dev, Error **errp)
 {
-    PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
+    const PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
 
     if (pc->init) {
         if (pc->init(dev) < 0) {
@@ -2549,7 +2549,7 @@ void pci_setup_iommu(PCIBus *bus, PCIIOMMUFunc fn, void *opaque)
 static void pci_dev_get_w64(PCIBus *b, PCIDevice *dev, void *opaque)
 {
     Range *range = opaque;
-    PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
+    const PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
     uint16_t cmd = pci_get_word(dev->config + PCI_COMMAND);
     int i;
 
diff --git a/hw/pcmcia/pxa2xx.c b/hw/pcmcia/pxa2xx.c
index 20c9c753d2..6f3f3274df 100644
--- a/hw/pcmcia/pxa2xx.c
+++ b/hw/pcmcia/pxa2xx.c
@@ -39,7 +39,7 @@ static uint64_t pxa2xx_pcmcia_common_read(void *opaque,
                 hwaddr offset, unsigned size)
 {
     PXA2xxPCMCIAState *s = (PXA2xxPCMCIAState *) opaque;
-    PCMCIACardClass *pcc;
+    const PCMCIACardClass *pcc;
 
     if (s->slot.attached) {
         pcc = PCMCIA_CARD_GET_CLASS(s->card);
@@ -53,7 +53,7 @@ static void pxa2xx_pcmcia_common_write(void *opaque, hwaddr offset,
                                        uint64_t value, unsigned size)
 {
     PXA2xxPCMCIAState *s = (PXA2xxPCMCIAState *) opaque;
-    PCMCIACardClass *pcc;
+    const PCMCIACardClass *pcc;
 
     if (s->slot.attached) {
         pcc = PCMCIA_CARD_GET_CLASS(s->card);
@@ -65,7 +65,7 @@ static uint64_t pxa2xx_pcmcia_attr_read(void *opaque,
                 hwaddr offset, unsigned size)
 {
     PXA2xxPCMCIAState *s = (PXA2xxPCMCIAState *) opaque;
-    PCMCIACardClass *pcc;
+    const PCMCIACardClass *pcc;
 
     if (s->slot.attached) {
         pcc = PCMCIA_CARD_GET_CLASS(s->card);
@@ -79,7 +79,7 @@ static void pxa2xx_pcmcia_attr_write(void *opaque, hwaddr offset,
                                      uint64_t value, unsigned size)
 {
     PXA2xxPCMCIAState *s = (PXA2xxPCMCIAState *) opaque;
-    PCMCIACardClass *pcc;
+    const PCMCIACardClass *pcc;
 
     if (s->slot.attached) {
         pcc = PCMCIA_CARD_GET_CLASS(s->card);
@@ -91,7 +91,7 @@ static uint64_t pxa2xx_pcmcia_io_read(void *opaque,
                 hwaddr offset, unsigned size)
 {
     PXA2xxPCMCIAState *s = (PXA2xxPCMCIAState *) opaque;
-    PCMCIACardClass *pcc;
+    const PCMCIACardClass *pcc;
 
     if (s->slot.attached) {
         pcc = PCMCIA_CARD_GET_CLASS(s->card);
@@ -105,7 +105,7 @@ static void pxa2xx_pcmcia_io_write(void *opaque, hwaddr offset,
                                    uint64_t value, unsigned size)
 {
     PXA2xxPCMCIAState *s = (PXA2xxPCMCIAState *) opaque;
-    PCMCIACardClass *pcc;
+    const PCMCIACardClass *pcc;
 
     if (s->slot.attached) {
         pcc = PCMCIA_CARD_GET_CLASS(s->card);
@@ -195,7 +195,7 @@ static void pxa2xx_pcmcia_initfn(Object *obj)
 int pxa2xx_pcmcia_attach(void *opaque, PCMCIACardState *card)
 {
     PXA2xxPCMCIAState *s = (PXA2xxPCMCIAState *) opaque;
-    PCMCIACardClass *pcc;
+    const PCMCIACardClass *pcc;
 
     if (s->slot.attached) {
         return -EEXIST;
@@ -219,7 +219,7 @@ int pxa2xx_pcmcia_attach(void *opaque, PCMCIACardState *card)
 int pxa2xx_pcmcia_detach(void *opaque)
 {
     PXA2xxPCMCIAState *s = (PXA2xxPCMCIAState *) opaque;
-    PCMCIACardClass *pcc;
+    const PCMCIACardClass *pcc;
 
     if (!s->slot.attached) {
         return -ENOENT;
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 3fa722af82..7900b8176a 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -109,11 +109,11 @@ static int get_cpus_node(void *fdt)
 static void powernv_create_core_node(PnvChip *chip, PnvCore *pc, void *fdt)
 {
     CPUState *cs = CPU(DEVICE(pc->threads));
-    DeviceClass *dc = DEVICE_GET_CLASS(cs);
+    const DeviceClass *dc = DEVICE_GET_CLASS(cs);
     PowerPCCPU *cpu = POWERPC_CPU(cs);
     int smt_threads = CPU_CORE(pc)->nr_threads;
     CPUPPCState *env = &cpu->env;
-    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cs);
+    const PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cs);
     uint32_t servers_prop[smt_threads];
     int i;
     uint32_t segs[] = {cpu_to_be32(28), cpu_to_be32(40),
@@ -217,7 +217,7 @@ static void powernv_create_core_node(PnvChip *chip, PnvCore *pc, void *fdt)
 
 static void powernv_populate_chip(PnvChip *chip, void *fdt)
 {
-    PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
+    const PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
     char *typename = pnv_core_typename(pcc->cpu_model);
     size_t typesize = object_type_get_instance_size(typename);
     int i;
@@ -330,7 +330,7 @@ static ISABus *pnv_isa_create(PnvChip *chip)
     PnvLpcController *lpc = &chip->lpc;
     ISABus *isa_bus;
     qemu_irq *irqs;
-    PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
+    const PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
 
     /* let isa_bus_new() create its own bridge on SysBus otherwise
      * devices speficied on the command line won't find the bus and
@@ -601,7 +601,7 @@ static const TypeInfo pnv_chip_power9_info = {
 
 static void pnv_chip_core_sanitize(PnvChip *chip, Error **errp)
 {
-    PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
+    const PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
     int cores_max;
 
     /*
@@ -632,7 +632,7 @@ static void pnv_chip_core_sanitize(PnvChip *chip, Error **errp)
 static void pnv_chip_init(Object *obj)
 {
     PnvChip *chip = PNV_CHIP(obj);
-    PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
+    const PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
 
     chip->xscom_base = pcc->xscom_base;
 
@@ -644,7 +644,7 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp)
 {
     PnvChip *chip = PNV_CHIP(dev);
     Error *error = NULL;
-    PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
+    const PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
     char *typename = pnv_core_typename(pcc->cpu_model);
     size_t typesize = object_type_get_instance_size(typename);
     int i, core_hwid;
diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c
index d79d530b48..a13fae4329 100644
--- a/hw/ppc/pnv_core.c
+++ b/hw/ppc/pnv_core.c
@@ -133,7 +133,7 @@ static void pnv_core_realize(DeviceState *dev, Error **errp)
 {
     PnvCore *pc = PNV_CORE(OBJECT(dev));
     CPUCore *cc = CPU_CORE(OBJECT(dev));
-    PnvCoreClass *pcc = PNV_CORE_GET_CLASS(OBJECT(dev));
+    const PnvCoreClass *pcc = PNV_CORE_GET_CLASS(OBJECT(dev));
     const char *typename = object_class_get_name(pcc->cpu_oc);
     size_t size = object_type_get_instance_size(typename);
     Error *local_err = NULL;
diff --git a/hw/ppc/pnv_xscom.c b/hw/ppc/pnv_xscom.c
index 38bc85f117..272e6b646e 100644
--- a/hw/ppc/pnv_xscom.c
+++ b/hw/ppc/pnv_xscom.c
@@ -51,7 +51,7 @@ static void xscom_complete(CPUState *cs, uint64_t hmer_bits)
 
 static uint32_t pnv_xscom_pcba(PnvChip *chip, uint64_t addr)
 {
-    PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
+    const PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
 
     addr &= (PNV_XSCOM_SIZE - 1);
     if (pcc->chip_type == PNV_CHIP_POWER9) {
@@ -212,7 +212,7 @@ static int xscom_populate_child(Object *child, void *opaque)
     if (object_dynamic_cast(child, TYPE_PNV_XSCOM_INTERFACE)) {
         ForeachPopulateArgs *args = opaque;
         PnvXScomInterface *xd = PNV_XSCOM_INTERFACE(child);
-        PnvXScomInterfaceClass *xc = PNV_XSCOM_INTERFACE_GET_CLASS(xd);
+        const PnvXScomInterfaceClass *xc = PNV_XSCOM_INTERFACE_GET_CLASS(xd);
 
         if (xc->populate) {
             _FDT((xc->populate(xd, args->fdt, args->xscom_offset)));
@@ -231,7 +231,7 @@ int pnv_xscom_populate(PnvChip *chip, void *fdt, int root_offset)
     int xscom_offset;
     ForeachPopulateArgs args;
     char *name;
-    PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
+    const PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
 
     name = g_strdup_printf("xscom@%" PRIx64, be64_to_cpu(reg[0]));
     xscom_offset = fdt_add_subnode(fdt, root_offset, name);
diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
index 961230c569..4a684ab750 100644
--- a/hw/ppc/prep.c
+++ b/hw/ppc/prep.c
@@ -222,14 +222,14 @@ static void PREP_io_800_writeb (void *opaque, uint32_t addr, uint32_t val)
     case 0x0810:
         /* Password protect 1 register */
         if (sysctrl->nvram != NULL) {
-            NvramClass *k = NVRAM_GET_CLASS(sysctrl->nvram);
+            const NvramClass *k = NVRAM_GET_CLASS(sysctrl->nvram);
             (k->toggle_lock)(sysctrl->nvram, 1);
         }
         break;
     case 0x0812:
         /* Password protect 2 register */
         if (sysctrl->nvram != NULL) {
-            NvramClass *k = NVRAM_GET_CLASS(sysctrl->nvram);
+            const NvramClass *k = NVRAM_GET_CLASS(sysctrl->nvram);
             (k->toggle_lock)(sysctrl->nvram, 2);
         }
         break;
@@ -350,13 +350,13 @@ static PortioList prep_port_list;
 /* NVRAM helpers */
 static inline uint32_t nvram_read(Nvram *nvram, uint32_t addr)
 {
-    NvramClass *k = NVRAM_GET_CLASS(nvram);
+    const NvramClass *k = NVRAM_GET_CLASS(nvram);
     return (k->read)(nvram, addr);
 }
 
 static inline void nvram_write(Nvram *nvram, uint32_t addr, uint32_t val)
 {
-    NvramClass *k = NVRAM_GET_CLASS(nvram);
+    const NvramClass *k = NVRAM_GET_CLASS(nvram);
     (k->write)(nvram, addr, val);
 }
 
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 8aecea3dd1..45a0a7c6b8 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -236,7 +236,7 @@ static int spapr_fixup_cpu_dt(void *fdt, sPAPRMachineState *spapr)
 
     CPU_FOREACH(cs) {
         PowerPCCPU *cpu = POWERPC_CPU(cs);
-        DeviceClass *dc = DEVICE_GET_CLASS(cs);
+        const DeviceClass *dc = DEVICE_GET_CLASS(cs);
         int index = ppc_get_vcpu_dt_id(cpu);
         int compat_smt = MIN(smp_threads, ppc_compat_max_threads(cpu));
 
@@ -444,7 +444,7 @@ static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset,
 {
     PowerPCCPU *cpu = POWERPC_CPU(cs);
     CPUPPCState *env = &cpu->env;
-    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cs);
+    const PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cs);
     int index = ppc_get_vcpu_dt_id(cpu);
     uint32_t segs[] = {cpu_to_be32(28), cpu_to_be32(40),
                        0xffffffff, 0xffffffff};
@@ -457,7 +457,7 @@ static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset,
     uint32_t pft_size_prop[] = {0, cpu_to_be32(spapr->htab_shift)};
     int compat_smt = MIN(smp_threads, ppc_compat_max_threads(cpu));
     sPAPRDRConnector *drc;
-    sPAPRDRConnectorClass *drck;
+    const sPAPRDRConnectorClass *drck;
     int drc_index;
 
     drc = spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_CPU, index);
@@ -566,7 +566,7 @@ static void spapr_populate_cpus_dt_node(void *fdt, sPAPRMachineState *spapr)
     CPU_FOREACH_REVERSE(cs) {
         PowerPCCPU *cpu = POWERPC_CPU(cs);
         int index = ppc_get_vcpu_dt_id(cpu);
-        DeviceClass *dc = DEVICE_GET_CLASS(cs);
+        const DeviceClass *dc = DEVICE_GET_CLASS(cs);
         int offset;
 
         if ((index % smt) != 0) {
@@ -642,7 +642,7 @@ static int spapr_populate_drconf_memory(sPAPRMachineState *spapr, void *fdt)
 
         if (i >= hotplug_lmb_start) {
             sPAPRDRConnector *drc;
-            sPAPRDRConnectorClass *drck;
+            const sPAPRDRConnectorClass *drck;
 
             drc = spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_LMB, i);
             g_assert(drc);
@@ -705,7 +705,7 @@ out:
 static int spapr_dt_cas_updates(sPAPRMachineState *spapr, void *fdt,
                                 sPAPROptionVector *ov5_updates)
 {
-    sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
+    const sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
     int ret = 0, offset;
 
     /* Generate ibm,dynamic-reconfiguration-memory node if required */
@@ -927,8 +927,8 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr,
                              hwaddr rtas_size)
 {
     MachineState *machine = MACHINE(qdev_get_machine());
-    MachineClass *mc = MACHINE_GET_CLASS(machine);
-    sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
+    const MachineClass *mc = MACHINE_GET_CLASS(machine);
+    const sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
     int ret;
     void *fdt;
     sPAPRPHBState *phb;
@@ -1910,7 +1910,7 @@ static CPUArchId *spapr_find_cpu_slot(MachineState *ms, uint32_t id, int *idx)
 static void spapr_init_cpus(sPAPRMachineState *spapr)
 {
     MachineState *machine = MACHINE(spapr);
-    MachineClass *mc = MACHINE_GET_CLASS(machine);
+    const MachineClass *mc = MACHINE_GET_CLASS(machine);
     char *type = spapr_get_cpu_core_type(machine->cpu_model);
     int smt = kvmppc_smt_threads();
     const CPUArchIdList *possible_cpus;
@@ -1977,7 +1977,7 @@ static void spapr_init_cpus(sPAPRMachineState *spapr)
 static void ppc_spapr_init(MachineState *machine)
 {
     sPAPRMachineState *spapr = SPAPR_MACHINE(machine);
-    sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
+    const sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
     const char *kernel_filename = machine->kernel_filename;
     const char *initrd_filename = machine->initrd_filename;
     PCIHostState *phb;
@@ -2455,7 +2455,7 @@ static void spapr_add_lmbs(DeviceState *dev, uint64_t addr_start, uint64_t size,
                            Error **errp)
 {
     sPAPRDRConnector *drc;
-    sPAPRDRConnectorClass *drck;
+    const sPAPRDRConnectorClass *drck;
     uint32_t nr_lmbs = size/SPAPR_MEMORY_BLOCK_SIZE;
     int i, fdt_offset, fdt_size;
     void *fdt;
@@ -2503,7 +2503,7 @@ static void spapr_memory_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
     Error *local_err = NULL;
     sPAPRMachineState *ms = SPAPR_MACHINE(hotplug_dev);
     PCDIMMDevice *dimm = PC_DIMM(dev);
-    PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
+    const PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
     MemoryRegion *mr = ddc->get_memory_region(dimm);
     uint64_t align = memory_region_get_alignment(mr);
     uint64_t size = memory_region_size(mr);
@@ -2569,7 +2569,7 @@ static void spapr_del_lmbs(DeviceState *dev, uint64_t addr_start, uint64_t size,
                            Error **errp)
 {
     sPAPRDRConnector *drc;
-    sPAPRDRConnectorClass *drck;
+    const sPAPRDRConnectorClass *drck;
     uint32_t nr_lmbs = size / SPAPR_MEMORY_BLOCK_SIZE;
     int i;
     sPAPRDIMMState *ds = g_malloc0(sizeof(sPAPRDIMMState));
@@ -2599,7 +2599,7 @@ static void spapr_memory_unplug(HotplugHandler *hotplug_dev, DeviceState *dev,
 {
     sPAPRMachineState *ms = SPAPR_MACHINE(hotplug_dev);
     PCDIMMDevice *dimm = PC_DIMM(dev);
-    PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
+    const PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
     MemoryRegion *mr = ddc->get_memory_region(dimm);
 
     pc_dimm_memory_unplug(dev, &ms->hotplug_memory, mr);
@@ -2611,7 +2611,7 @@ static void spapr_memory_unplug_request(HotplugHandler *hotplug_dev,
 {
     Error *local_err = NULL;
     PCDIMMDevice *dimm = PC_DIMM(dev);
-    PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
+    const PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
     MemoryRegion *mr = ddc->get_memory_region(dimm);
     uint64_t size = memory_region_size(mr);
     uint64_t addr;
@@ -2630,7 +2630,7 @@ void *spapr_populate_hotplug_cpu_dt(CPUState *cs, int *fdt_offset,
                                     sPAPRMachineState *spapr)
 {
     PowerPCCPU *cpu = POWERPC_CPU(cs);
-    DeviceClass *dc = DEVICE_GET_CLASS(cs);
+    const DeviceClass *dc = DEVICE_GET_CLASS(cs);
     int id = ppc_get_vcpu_dt_id(cpu);
     void *fdt;
     int offset, fdt_size;
@@ -2672,7 +2672,7 @@ void spapr_core_unplug_request(HotplugHandler *hotplug_dev, DeviceState *dev,
 {
     int index;
     sPAPRDRConnector *drc;
-    sPAPRDRConnectorClass *drck;
+    const sPAPRDRConnectorClass *drck;
     Error *local_err = NULL;
     CPUCore *cc = CPU_CORE(dev);
     int smt = kvmppc_smt_threads();
@@ -2704,7 +2704,7 @@ static void spapr_core_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
                             Error **errp)
 {
     sPAPRMachineState *spapr = SPAPR_MACHINE(OBJECT(hotplug_dev));
-    MachineClass *mc = MACHINE_GET_CLASS(spapr);
+    const MachineClass *mc = MACHINE_GET_CLASS(spapr);
     sPAPRCPUCore *core = SPAPR_CPU_CORE(OBJECT(dev));
     CPUCore *cc = CPU_CORE(dev);
     CPUState *cs = CPU(core->threads);
@@ -2735,7 +2735,7 @@ static void spapr_core_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
     }
 
     if (drc) {
-        sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+        const sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
         drck->attach(drc, dev, fdt, fdt_offset, !dev->hotplugged, &local_err);
         if (local_err) {
             g_free(fdt);
@@ -2755,7 +2755,7 @@ static void spapr_core_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
          * Set the right DRC states for cold plugged CPU.
          */
         if (drc) {
-            sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+            const sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
             drck->set_allocation_state(drc, SPAPR_DR_ALLOCATION_STATE_USABLE);
             drck->set_isolation_state(drc, SPAPR_DR_ISOLATION_STATE_UNISOLATED);
         }
@@ -2767,7 +2767,7 @@ static void spapr_core_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
                                 Error **errp)
 {
     MachineState *machine = MACHINE(OBJECT(hotplug_dev));
-    MachineClass *mc = MACHINE_GET_CLASS(hotplug_dev);
+    const MachineClass *mc = MACHINE_GET_CLASS(hotplug_dev);
     Error *local_err = NULL;
     CPUCore *cc = CPU_CORE(dev);
     char *base_core_type = spapr_get_cpu_core_type(machine->cpu_model);
@@ -2809,7 +2809,7 @@ out:
 static void spapr_machine_device_plug(HotplugHandler *hotplug_dev,
                                       DeviceState *dev, Error **errp)
 {
-    sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(qdev_get_machine());
+    const sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(qdev_get_machine());
 
     if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
         int node;
@@ -2859,7 +2859,7 @@ static void spapr_machine_device_unplug(HotplugHandler *hotplug_dev,
                                       DeviceState *dev, Error **errp)
 {
     sPAPRMachineState *sms = SPAPR_MACHINE(qdev_get_machine());
-    MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
+    const MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
 
     if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
         if (spapr_ovec_test(sms->ov5_cas, OV5_HP_EVT)) {
@@ -2880,7 +2880,7 @@ static void spapr_machine_device_unplug_request(HotplugHandler *hotplug_dev,
                                                 DeviceState *dev, Error **errp)
 {
     sPAPRMachineState *sms = SPAPR_MACHINE(qdev_get_machine());
-    MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
+    const MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
 
     if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
         if (spapr_ovec_test(sms->ov5_cas, OV5_HP_EVT)) {
@@ -2932,7 +2932,7 @@ static const CPUArchIdList *spapr_possible_cpu_arch_ids(MachineState *machine)
 {
     int i;
     int spapr_max_cores = max_cpus / smp_threads;
-    MachineClass *mc = MACHINE_GET_CLASS(machine);
+    const MachineClass *mc = MACHINE_GET_CLASS(machine);
 
     if (!mc->has_hotpluggable_cpus) {
         spapr_max_cores = QEMU_ALIGN_UP(smp_cpus, smp_threads) / smp_threads;
diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
index 6883f0991a..364c7ae74a 100644
--- a/hw/ppc/spapr_cpu_core.c
+++ b/hw/ppc/spapr_cpu_core.c
@@ -116,7 +116,7 @@ char *spapr_get_cpu_core_type(const char *model)
 static void spapr_cpu_core_unrealizefn(DeviceState *dev, Error **errp)
 {
     sPAPRCPUCore *sc = SPAPR_CPU_CORE(OBJECT(dev));
-    sPAPRCPUCoreClass *scc = SPAPR_CPU_CORE_GET_CLASS(OBJECT(dev));
+    const sPAPRCPUCoreClass *scc = SPAPR_CPU_CORE_GET_CLASS(OBJECT(dev));
     const char *typename = object_class_get_name(scc->cpu_class);
     size_t size = object_type_get_instance_size(typename);
     CPUCore *cc = CPU_CORE(dev);
@@ -158,7 +158,7 @@ static void spapr_cpu_core_realize_child(Object *child, Error **errp)
 static void spapr_cpu_core_realize(DeviceState *dev, Error **errp)
 {
     sPAPRCPUCore *sc = SPAPR_CPU_CORE(OBJECT(dev));
-    sPAPRCPUCoreClass *scc = SPAPR_CPU_CORE_GET_CLASS(OBJECT(dev));
+    const sPAPRCPUCoreClass *scc = SPAPR_CPU_CORE_GET_CLASS(OBJECT(dev));
     CPUCore *cc = CPU_CORE(OBJECT(dev));
     const char *typename = object_class_get_name(scc->cpu_class);
     size_t size = object_type_get_instance_size(typename);
diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c
index 150f6bf2c7..b55d8c8f1b 100644
--- a/hw/ppc/spapr_drc.c
+++ b/hw/ppc/spapr_drc.c
@@ -54,7 +54,7 @@ static uint32_t get_index(sPAPRDRConnector *drc)
 static uint32_t set_isolation_state(sPAPRDRConnector *drc,
                                     sPAPRDRIsolationState state)
 {
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+    const sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
 
     trace_spapr_drc_set_isolation_state(get_index(drc), state);
 
@@ -122,7 +122,7 @@ static uint32_t set_indicator_state(sPAPRDRConnector *drc,
 static uint32_t set_allocation_state(sPAPRDRConnector *drc,
                                      sPAPRDRAllocationState state)
 {
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+    const sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
 
     trace_spapr_drc_set_allocation_state(get_index(drc), state);
 
@@ -233,7 +233,7 @@ static void prop_get_index(Object *obj, Visitor *v, const char *name,
                            void *opaque, Error **errp)
 {
     sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(obj);
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+    const sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
     uint32_t value = (uint32_t)drck->get_index(drc);
     visit_type_uint32(v, name, &value, errp);
 }
@@ -242,7 +242,7 @@ static void prop_get_type(Object *obj, Visitor *v, const char *name,
                           void *opaque, Error **errp)
 {
     sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(obj);
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+    const sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
     uint32_t value = (uint32_t)drck->get_type(drc);
     visit_type_uint32(v, name, &value, errp);
 }
@@ -250,7 +250,7 @@ static void prop_get_type(Object *obj, Visitor *v, const char *name,
 static char *prop_get_name(Object *obj, Error **errp)
 {
     sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(obj);
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+    const sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
     return g_strdup(drck->get_name(drc));
 }
 
@@ -258,7 +258,7 @@ static void prop_get_entity_sense(Object *obj, Visitor *v, const char *name,
                                   void *opaque, Error **errp)
 {
     sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(obj);
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+    const sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
     uint32_t value;
 
     drck->entity_sense(drc, &value);
@@ -465,7 +465,7 @@ static bool release_pending(sPAPRDRConnector *drc)
 static void reset(DeviceState *d)
 {
     sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(d);
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+    const sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
     sPAPRDREntitySense state;
 
     trace_spapr_drc_reset(drck->get_index(drc));
@@ -504,7 +504,7 @@ static void reset(DeviceState *d)
 static void realize(DeviceState *d, Error **errp)
 {
     sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(d);
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+    const sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
     Object *root_container;
     char link_name[256];
     gchar *child_name;
@@ -535,7 +535,7 @@ static void realize(DeviceState *d, Error **errp)
 static void unrealize(DeviceState *d, Error **errp)
 {
     sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(d);
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+    const sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
     Object *root_container;
     char name[256];
     Error *err = NULL;
@@ -773,7 +773,7 @@ int spapr_drc_populate_dt(void *fdt, int fdt_offset, Object *owner,
     while ((prop = object_property_iter_next(&iter))) {
         Object *obj;
         sPAPRDRConnector *drc;
-        sPAPRDRConnectorClass *drck;
+        const sPAPRDRConnectorClass *drck;
         uint32_t drc_index, drc_power_domain;
 
         if (!strstart(prop->type, "link<", NULL)) {
diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c
index 24a5758e62..38bacc5fc3 100644
--- a/hw/ppc/spapr_events.c
+++ b/hw/ppc/spapr_events.c
@@ -489,7 +489,7 @@ static void spapr_powerdown_req(Notifier *n, void *opaque)
 static void spapr_hotplug_set_signalled(uint32_t drc_index)
 {
     sPAPRDRConnector *drc = spapr_dr_connector_by_index(drc_index);
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+    const sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
     drck->set_signalled(drc);
 }
 
@@ -581,7 +581,7 @@ static void spapr_hotplug_req_event(uint8_t hp_id, uint8_t hp_action,
 
 void spapr_hotplug_req_add_by_index(sPAPRDRConnector *drc)
 {
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+    const sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
     sPAPRDRConnectorType drc_type = drck->get_type(drc);
     union drc_identifier drc_id;
 
@@ -592,7 +592,7 @@ void spapr_hotplug_req_add_by_index(sPAPRDRConnector *drc)
 
 void spapr_hotplug_req_remove_by_index(sPAPRDRConnector *drc)
 {
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+    const sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
     sPAPRDRConnectorType drc_type = drck->get_type(drc);
     union drc_identifier drc_id;
 
diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
index f05a90ed2c..f4d70b17be 100644
--- a/hw/ppc/spapr_hcall.c
+++ b/hw/ppc/spapr_hcall.c
@@ -836,7 +836,7 @@ static target_ulong h_set_mode_resource_addr_trans_mode(PowerPCCPU *cpu,
                                                         target_ulong value2)
 {
     CPUState *cs;
-    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
+    const PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
 
     if (!(pcc->insns_flags2 & PPC2_ISA207S)) {
         return H_P2;
diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
index 98c52e411f..394a7ede9d 100644
--- a/hw/ppc/spapr_pci.c
+++ b/hw/ppc/spapr_pci.c
@@ -1351,7 +1351,7 @@ static void spapr_phb_add_pci_device(sPAPRDRConnector *drc,
                                      PCIDevice *pdev,
                                      Error **errp)
 {
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+    const sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
     DeviceState *dev = DEVICE(pdev);
     void *fdt = NULL;
     int fdt_start_offset = 0, fdt_size;
@@ -1392,7 +1392,7 @@ static void spapr_phb_remove_pci_device(sPAPRDRConnector *drc,
                                         PCIDevice *pdev,
                                         Error **errp)
 {
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+    const sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
 
     drck->detach(drc, DEVICE(pdev), spapr_phb_remove_pci_device_cb, phb, errp);
 }
@@ -1418,7 +1418,7 @@ static uint32_t spapr_phb_get_pci_drc_index(sPAPRPHBState *phb,
                                             PCIDevice *pdev)
 {
     sPAPRDRConnector *drc = spapr_phb_get_pci_drc(phb, pdev);
-    sPAPRDRConnectorClass *drck;
+    const sPAPRDRConnectorClass *drck;
 
     if (!drc) {
         return 0;
@@ -1480,7 +1480,7 @@ static void spapr_phb_hot_plug_child(HotplugHandler *plug_handler,
 
         for (i = 0; i < 8; i++) {
             sPAPRDRConnector *func_drc;
-            sPAPRDRConnectorClass *func_drck;
+            const sPAPRDRConnectorClass *func_drck;
             sPAPRDREntitySense state;
 
             func_drc = spapr_phb_get_pci_func_drc(phb, pci_bus_num(bus),
@@ -1500,7 +1500,7 @@ static void spapr_phb_hot_unplug_child(HotplugHandler *plug_handler,
 {
     sPAPRPHBState *phb = SPAPR_PCI_HOST_BRIDGE(DEVICE(plug_handler));
     PCIDevice *pdev = PCI_DEVICE(plugged_dev);
-    sPAPRDRConnectorClass *drck;
+    const sPAPRDRConnectorClass *drck;
     sPAPRDRConnector *drc = spapr_phb_get_pci_drc(phb, pdev);
     Error *local_err = NULL;
 
@@ -1517,7 +1517,7 @@ static void spapr_phb_hot_unplug_child(HotplugHandler *plug_handler,
         PCIBus *bus = PCI_BUS(qdev_get_parent_bus(DEVICE(pdev)));
         uint32_t slotnr = PCI_SLOT(pdev->devfn);
         sPAPRDRConnector *func_drc;
-        sPAPRDRConnectorClass *func_drck;
+        const sPAPRDRConnectorClass *func_drck;
         sPAPRDREntitySense state;
         int i;
 
@@ -1577,7 +1577,7 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp)
         sphb->ddw_enabled ? SPAPR_PCI_DMA_MAX_WINDOWS : 1;
 
     if (sphb->index != (uint32_t)-1) {
-        sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
+        const sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
         Error *local_err = NULL;
 
         if ((sphb->buid != (uint64_t)-1) || (sphb->dma_liobn[0] != (uint32_t)-1)
diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c
index 619f32c054..47a5c0e11a 100644
--- a/hw/ppc/spapr_rtas.c
+++ b/hw/ppc/spapr_rtas.c
@@ -173,7 +173,7 @@ static void spapr_cpu_update_tb_offset(PowerPCCPU *cpu)
 static void spapr_cpu_set_endianness(PowerPCCPU *cpu)
 {
     PowerPCCPU *fcpu = POWERPC_CPU(first_cpu);
-    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(fcpu);
+    const PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(fcpu);
 
     if (!pcc->interrupts_big_endian(fcpu)) {
         cpu->env.spr[SPR_LPCR] |= LPCR_ILE;
@@ -412,7 +412,7 @@ static void rtas_set_indicator(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     uint32_t sensor_state;
     uint32_t ret = RTAS_OUT_SUCCESS;
     sPAPRDRConnector *drc;
-    sPAPRDRConnectorClass *drck;
+    const sPAPRDRConnectorClass *drck;
 
     if (nargs != 3 || nret != 1) {
         ret = RTAS_OUT_PARAM_ERROR;
@@ -482,7 +482,7 @@ static void rtas_get_sensor_state(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     uint32_t sensor_index;
     uint32_t sensor_state = 0;
     sPAPRDRConnector *drc;
-    sPAPRDRConnectorClass *drck;
+    const sPAPRDRConnectorClass *drck;
     uint32_t ret = RTAS_OUT_SUCCESS;
 
     if (nargs != 2 || nret != 2) {
@@ -544,7 +544,7 @@ static void rtas_ibm_configure_connector(PowerPCCPU *cpu,
     uint64_t wa_offset;
     uint32_t drc_index;
     sPAPRDRConnector *drc;
-    sPAPRDRConnectorClass *drck;
+    const sPAPRDRConnectorClass *drck;
     sPAPRConfigureConnectorState *ccs;
     sPAPRDRCCResponse resp = SPAPR_DR_CC_RESPONSE_CONTINUE;
     int rc;
diff --git a/hw/ppc/spapr_vio.c b/hw/ppc/spapr_vio.c
index a0ee4fd265..f8d4f714a8 100644
--- a/hw/ppc/spapr_vio.c
+++ b/hw/ppc/spapr_vio.c
@@ -49,7 +49,7 @@ static Property spapr_vio_props[] = {
 static char *spapr_vio_get_dev_name(DeviceState *qdev)
 {
     VIOsPAPRDevice *dev = VIO_SPAPR_DEVICE(qdev);
-    VIOsPAPRDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
+    const VIOsPAPRDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
 
     /* Device tree style name device@reg */
     return g_strdup_printf("%s@%x", pc->dt_name, dev->reg);
@@ -88,7 +88,7 @@ VIOsPAPRDevice *spapr_vio_find_by_reg(VIOsPAPRBus *bus, uint32_t reg)
 static int vio_make_devnode(VIOsPAPRDevice *dev,
                             void *fdt)
 {
-    VIOsPAPRDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
+    const VIOsPAPRDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
     int vdevice_off, node_off, ret;
     char *dt_name;
 
@@ -402,7 +402,7 @@ static VIOsPAPRDevice *reg_conflict(VIOsPAPRDevice *dev)
 static void spapr_vio_busdev_reset(DeviceState *qdev)
 {
     VIOsPAPRDevice *dev = VIO_SPAPR_DEVICE(qdev);
-    VIOsPAPRDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
+    const VIOsPAPRDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
 
     /* Shut down the request queue and TCEs if necessary */
     spapr_vio_quiesce_one(dev);
@@ -419,7 +419,7 @@ static void spapr_vio_busdev_realize(DeviceState *qdev, Error **errp)
 {
     sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
     VIOsPAPRDevice *dev = (VIOsPAPRDevice *)qdev;
-    VIOsPAPRDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
+    const VIOsPAPRDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
     char *id;
     Error *local_err = NULL;
 
@@ -489,7 +489,7 @@ static target_ulong h_vio_signal(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     target_ulong reg = args[0];
     target_ulong mode = args[1];
     VIOsPAPRDevice *dev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
-    VIOsPAPRDeviceClass *pc;
+    const VIOsPAPRDeviceClass *pc;
 
     if (!dev) {
         return H_PARAMETER;
@@ -651,7 +651,7 @@ void spapr_dt_vdevice(VIOsPAPRBus *bus, void *fdt)
      * to know that will mean they are in forward order in the tree. */
     for (i = num - 1; i >= 0; i--) {
         VIOsPAPRDevice *dev = (VIOsPAPRDevice *)(qdevs[i]);
-        VIOsPAPRDeviceClass *vdc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
+        const VIOsPAPRDeviceClass *vdc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
 
         ret = vio_make_devnode(dev, fdt);
         if (ret < 0) {
diff --git a/hw/s390x/css-bridge.c b/hw/s390x/css-bridge.c
index 9a7f7ee60c..cd1f3ec678 100644
--- a/hw/s390x/css-bridge.c
+++ b/hw/s390x/css-bridge.c
@@ -27,7 +27,7 @@ static void ccw_device_unplug(HotplugHandler *hotplug_dev,
                               DeviceState *dev, Error **errp)
 {
     CcwDevice *ccw_dev = CCW_DEVICE(dev);
-    CCWDeviceClass *k = CCW_DEVICE_GET_CLASS(ccw_dev);
+    const CCWDeviceClass *k = CCW_DEVICE_GET_CLASS(ccw_dev);
     SubchDev *sch = ccw_dev->sch;
     Error *err = NULL;
 
diff --git a/hw/s390x/css.c b/hw/s390x/css.c
index 37caa98195..bfdc7b7826 100644
--- a/hw/s390x/css.c
+++ b/hw/s390x/css.c
@@ -100,7 +100,7 @@ static int s390_io_adapter_map(AdapterInfo *adapter, uint64_t map_addr,
                                bool do_map)
 {
     S390FLICState *fs = s390_get_flic();
-    S390FLICStateClass *fsc = S390_FLIC_COMMON_GET_CLASS(fs);
+    const S390FLICStateClass *fsc = S390_FLIC_COMMON_GET_CLASS(fs);
 
     return fsc->io_adapter_map(fs, adapter->adapter_id, map_addr, do_map);
 }
@@ -162,7 +162,7 @@ int css_register_io_adapter(uint8_t type, uint8_t isc, bool swap,
     bool found = false;
     int ret;
     S390FLICState *fs = s390_get_flic();
-    S390FLICStateClass *fsc = S390_FLIC_COMMON_GET_CLASS(fs);
+    const S390FLICStateClass *fsc = S390_FLIC_COMMON_GET_CLASS(fs);
 
     *id = 0;
     QTAILQ_FOREACH(adapter, &channel_subsys.io_adapters, sibling) {
@@ -201,7 +201,7 @@ static void css_clear_io_interrupt(uint16_t subchannel_id,
     Error *err = NULL;
     static bool no_clear_irq;
     S390FLICState *fs = s390_get_flic();
-    S390FLICStateClass *fsc = S390_FLIC_COMMON_GET_CLASS(fs);
+    const S390FLICStateClass *fsc = S390_FLIC_COMMON_GET_CLASS(fs);
     int r;
 
     if (unlikely(no_clear_irq)) {
diff --git a/hw/s390x/event-facility.c b/hw/s390x/event-facility.c
index 34b2faf013..d1312b678f 100644
--- a/hw/s390x/event-facility.c
+++ b/hw/s390x/event-facility.c
@@ -38,7 +38,7 @@ static bool event_pending(SCLPEventFacility *ef)
 {
     BusChild *kid;
     SCLPEvent *event;
-    SCLPEventClass *event_class;
+    const SCLPEventClass *event_class;
 
     QTAILQ_FOREACH(kid, &ef->sbus.qbus.children, sibling) {
         DeviceState *qdev = kid->child;
@@ -56,7 +56,7 @@ static unsigned int get_host_send_mask(SCLPEventFacility *ef)
 {
     unsigned int mask;
     BusChild *kid;
-    SCLPEventClass *child;
+    const SCLPEventClass *child;
 
     mask = 0;
 
@@ -72,7 +72,7 @@ static unsigned int get_host_receive_mask(SCLPEventFacility *ef)
 {
     unsigned int mask;
     BusChild *kid;
-    SCLPEventClass *child;
+    const SCLPEventClass *child;
 
     mask = 0;
 
@@ -111,7 +111,7 @@ static uint16_t handle_write_event_buf(SCLPEventFacility *ef,
     uint16_t rc;
     BusChild *kid;
     SCLPEvent *event;
-    SCLPEventClass *ec;
+    const SCLPEventClass *ec;
 
     rc = SCLP_RC_INVALID_FUNCTION;
 
@@ -187,7 +187,7 @@ static uint16_t handle_sccb_read_events(SCLPEventFacility *ef, SCCB *sccb,
     unsigned elen;
     BusChild *kid;
     SCLPEvent *event;
-    SCLPEventClass *ec;
+    const SCLPEventClass *ec;
     EventBufferHeader *event_buf;
     ReadEventData *red = (ReadEventData *) sccb;
 
@@ -397,7 +397,7 @@ static const TypeInfo sclp_event_facility_info = {
 static void event_realize(DeviceState *qdev, Error **errp)
 {
     SCLPEvent *event = SCLP_EVENT(qdev);
-    SCLPEventClass *child = SCLP_EVENT_GET_CLASS(event);
+    const SCLPEventClass *child = SCLP_EVENT_GET_CLASS(event);
 
     if (child->init) {
         int rc = child->init(event);
@@ -411,7 +411,7 @@ static void event_realize(DeviceState *qdev, Error **errp)
 static void event_unrealize(DeviceState *qdev, Error **errp)
 {
     SCLPEvent *event = SCLP_EVENT(qdev);
-    SCLPEventClass *child = SCLP_EVENT_GET_CLASS(event);
+    const SCLPEventClass *child = SCLP_EVENT_GET_CLASS(event);
     if (child->exit) {
         int rc = child->exit(event);
         if (rc < 0) {
diff --git a/hw/s390x/s390-skeys-kvm.c b/hw/s390x/s390-skeys-kvm.c
index 131da56bbe..dac3440441 100644
--- a/hw/s390x/s390-skeys-kvm.c
+++ b/hw/s390x/s390-skeys-kvm.c
@@ -16,7 +16,7 @@
 
 static int kvm_s390_skeys_enabled(S390SKeysState *ss)
 {
-    S390SKeysClass *skeyclass = S390_SKEYS_GET_CLASS(ss);
+    const S390SKeysClass *skeyclass = S390_SKEYS_GET_CLASS(ss);
     uint8_t single_key;
     int r;
 
diff --git a/hw/s390x/s390-skeys.c b/hw/s390x/s390-skeys.c
index e2d4e1af79..207699212d 100644
--- a/hw/s390x/s390-skeys.c
+++ b/hw/s390x/s390-skeys.c
@@ -70,7 +70,7 @@ static void write_keys(FILE *f, uint8_t *keys, uint64_t startgfn,
 void hmp_info_skeys(Monitor *mon, const QDict *qdict)
 {
     S390SKeysState *ss = s390_get_skeys_device();
-    S390SKeysClass *skeyclass = S390_SKEYS_GET_CLASS(ss);
+    const S390SKeysClass *skeyclass = S390_SKEYS_GET_CLASS(ss);
     uint64_t addr = qdict_get_int(qdict, "addr");
     uint8_t key;
     int r;
@@ -104,7 +104,7 @@ void hmp_dump_skeys(Monitor *mon, const QDict *qdict)
 void qmp_dump_skeys(const char *filename, Error **errp)
 {
     S390SKeysState *ss = s390_get_skeys_device();
-    S390SKeysClass *skeyclass = S390_SKEYS_GET_CLASS(ss);
+    const S390SKeysClass *skeyclass = S390_SKEYS_GET_CLASS(ss);
     const uint64_t total_count = ram_size / TARGET_PAGE_SIZE;
     uint64_t handled_count = 0, cur_count;
     Error *lerr = NULL;
@@ -247,7 +247,7 @@ static const TypeInfo qemu_s390_skeys_info = {
 static void s390_storage_keys_save(QEMUFile *f, void *opaque)
 {
     S390SKeysState *ss = S390_SKEYS(opaque);
-    S390SKeysClass *skeyclass = S390_SKEYS_GET_CLASS(ss);
+    const S390SKeysClass *skeyclass = S390_SKEYS_GET_CLASS(ss);
     uint64_t pages_left = ram_size / TARGET_PAGE_SIZE;
     uint64_t read_count, eos = S390_SKEYS_SAVE_FLAG_EOS;
     vaddr cur_gfn = 0;
@@ -299,7 +299,7 @@ end_stream:
 static int s390_storage_keys_load(QEMUFile *f, void *opaque, int version_id)
 {
     S390SKeysState *ss = S390_SKEYS(opaque);
-    S390SKeysClass *skeyclass = S390_SKEYS_GET_CLASS(ss);
+    const S390SKeysClass *skeyclass = S390_SKEYS_GET_CLASS(ss);
     int ret = 0;
 
     while (!ret) {
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 40914fde6f..da82af6886 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -244,10 +244,10 @@ static inline void machine_set_dea_key_wrap(Object *obj, bool value,
 bool ri_allowed(void)
 {
     if (kvm_enabled()) {
-        MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
+        const MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
         if (object_class_dynamic_cast(OBJECT_CLASS(mc),
                                       TYPE_S390_CCW_MACHINE)) {
-            S390CcwMachineClass *s390mc = S390_MACHINE_CLASS(mc);
+            const S390CcwMachineClass *s390mc = S390_MACHINE_CLASS(mc);
 
             return s390mc->ri_allowed;
         }
@@ -262,10 +262,10 @@ bool ri_allowed(void)
 
 bool cpu_model_allowed(void)
 {
-    MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
+    const MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
     if (object_class_dynamic_cast(OBJECT_CLASS(mc),
                                   TYPE_S390_CCW_MACHINE)) {
-        S390CcwMachineClass *s390mc = S390_MACHINE_CLASS(mc);
+        const S390CcwMachineClass *s390mc = S390_MACHINE_CLASS(mc);
 
         return s390mc->cpu_model_allowed;
     }
diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
index e741da1141..42bf7d0fbf 100644
--- a/hw/s390x/sclp.c
+++ b/hw/s390x/sclp.c
@@ -348,9 +348,9 @@ static void sclp_read_cpu_info(SCLPDevice *sclp, SCCB *sccb)
 
 static void sclp_execute(SCLPDevice *sclp, SCCB *sccb, uint32_t code)
 {
-    SCLPDeviceClass *sclp_c = SCLP_GET_CLASS(sclp);
+    const SCLPDeviceClass *sclp_c = SCLP_GET_CLASS(sclp);
     SCLPEventFacility *ef = sclp->event_facility;
-    SCLPEventFacilityClass *efc = EVENT_FACILITY_GET_CLASS(ef);
+    const SCLPEventFacilityClass *efc = EVENT_FACILITY_GET_CLASS(ef);
 
     switch (code & SCLP_CMD_CODE_MASK) {
     case SCLP_CMDW_READ_SCP_INFO:
@@ -391,7 +391,7 @@ static void sclp_execute(SCLPDevice *sclp, SCCB *sccb, uint32_t code)
 int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code)
 {
     SCLPDevice *sclp = get_sclp_device();
-    SCLPDeviceClass *sclp_c = SCLP_GET_CLASS(sclp);
+    const SCLPDeviceClass *sclp_c = SCLP_GET_CLASS(sclp);
     int r = 0;
     SCCB work_sccb;
 
@@ -440,7 +440,7 @@ out:
 static void service_interrupt(SCLPDevice *sclp, uint32_t sccb)
 {
     SCLPEventFacility *ef = sclp->event_facility;
-    SCLPEventFacilityClass *efc = EVENT_FACILITY_GET_CLASS(ef);
+    const SCLPEventFacilityClass *efc = EVENT_FACILITY_GET_CLASS(ef);
 
     uint32_t param = sccb & ~3;
 
@@ -457,7 +457,7 @@ static void service_interrupt(SCLPDevice *sclp, uint32_t sccb)
 void sclp_service_interrupt(uint32_t sccb)
 {
     SCLPDevice *sclp = get_sclp_device();
-    SCLPDeviceClass *sclp_c = SCLP_GET_CLASS(sclp);
+    const SCLPDeviceClass *sclp_c = SCLP_GET_CLASS(sclp);
 
     sclp_c->service_interrupt(sclp, sccb);
 }
diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c
index 00b3bde4e9..f092c92c0a 100644
--- a/hw/s390x/virtio-ccw.c
+++ b/hw/s390x/virtio-ccw.c
@@ -314,7 +314,7 @@ static int virtio_ccw_cb(SubchDev *sch, CCW1 ccw)
         if (!ccw.cda) {
             ret = -EFAULT;
         } else {
-            VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev);
+            const VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev);
 
             features.index = address_space_ldub(&address_space_memory,
                                                 ccw.cda
@@ -678,7 +678,7 @@ static void virtio_sch_disable_cb(SubchDev *sch)
 
 static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp)
 {
-    VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_GET_CLASS(dev);
+    const VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_GET_CLASS(dev);
     CcwDevice *ccw_dev = CCW_DEVICE(dev);
     SubchDev *sch = css_create_virtual_sch(ccw_dev->bus_id, errp);
     Error *err = NULL;
@@ -1067,7 +1067,7 @@ static int virtio_ccw_setup_irqroutes(VirtioCcwDevice *dev, int nvqs)
     VirtIODevice *vdev = virtio_bus_get_device(&dev->bus);
     int ret;
     S390FLICState *fs = s390_get_flic();
-    S390FLICStateClass *fsc = S390_FLIC_COMMON_GET_CLASS(fs);
+    const S390FLICStateClass *fsc = S390_FLIC_COMMON_GET_CLASS(fs);
 
     ret = virtio_ccw_get_mappings(dev);
     if (ret) {
@@ -1085,7 +1085,7 @@ static int virtio_ccw_setup_irqroutes(VirtioCcwDevice *dev, int nvqs)
 static void virtio_ccw_release_irqroutes(VirtioCcwDevice *dev, int nvqs)
 {
     S390FLICState *fs = s390_get_flic();
-    S390FLICStateClass *fsc = S390_FLIC_COMMON_GET_CLASS(fs);
+    const S390FLICStateClass *fsc = S390_FLIC_COMMON_GET_CLASS(fs);
 
     fsc->release_adapter_routes(fs, &dev->routes);
 }
@@ -1118,7 +1118,7 @@ static int virtio_ccw_set_guest_notifier(VirtioCcwDevice *dev, int n,
     VirtIODevice *vdev = virtio_bus_get_device(&dev->bus);
     VirtQueue *vq = virtio_get_queue(vdev, n);
     EventNotifier *notifier = virtio_queue_get_guest_notifier(vq);
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
 
     if (assign) {
         int r = event_notifier_init(notifier, 0);
@@ -1619,7 +1619,7 @@ static void virtio_ccw_busdev_realize(DeviceState *dev, Error **errp)
 static int virtio_ccw_busdev_exit(DeviceState *dev)
 {
     VirtioCcwDevice *_dev = (VirtioCcwDevice *)dev;
-    VirtIOCCWDeviceClass *_info = VIRTIO_CCW_DEVICE_GET_CLASS(dev);
+    const VirtIOCCWDeviceClass *_info = VIRTIO_CCW_DEVICE_GET_CLASS(dev);
 
     return _info->exit(_dev);
 }
diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c
index 84b8caf901..01faf2cdec 100644
--- a/hw/scsi/megasas.c
+++ b/hw/scsi/megasas.c
@@ -711,8 +711,8 @@ static void megasas_finish_dcmd(MegasasCmd *cmd, uint32_t iov_size)
 static int megasas_ctrl_get_info(MegasasState *s, MegasasCmd *cmd)
 {
     PCIDevice *pci_dev = PCI_DEVICE(s);
-    PCIDeviceClass *pci_class = PCI_DEVICE_GET_CLASS(pci_dev);
-    MegasasBaseClass *base_class = MEGASAS_DEVICE_GET_CLASS(s);
+    const PCIDeviceClass *pci_class = PCI_DEVICE_GET_CLASS(pci_dev);
+    const MegasasBaseClass *base_class = MEGASAS_DEVICE_GET_CLASS(s);
     struct mfi_ctrl_info info;
     size_t dcmd_size = sizeof(info);
     BusChild *kid;
@@ -2003,7 +2003,7 @@ static uint64_t megasas_mmio_read(void *opaque, hwaddr addr,
 {
     MegasasState *s = opaque;
     PCIDevice *pci_dev = PCI_DEVICE(s);
-    MegasasBaseClass *base_class = MEGASAS_DEVICE_GET_CLASS(s);
+    const MegasasBaseClass *base_class = MEGASAS_DEVICE_GET_CLASS(s);
     uint32_t retval = 0;
 
     switch (addr) {
@@ -2326,7 +2326,7 @@ static const struct SCSIBusInfo megasas_scsi_info = {
 static void megasas_scsi_realize(PCIDevice *dev, Error **errp)
 {
     MegasasState *s = MEGASAS(dev);
-    MegasasBaseClass *b = MEGASAS_DEVICE_GET_CLASS(s);
+    const MegasasBaseClass *b = MEGASAS_DEVICE_GET_CLASS(s);
     uint8_t *pci_conf;
     int i, bar_type;
     Error *err = NULL;
diff --git a/hw/scsi/mptconfig.c b/hw/scsi/mptconfig.c
index 87a416a5cb..e5cd7dd6b8 100644
--- a/hw/scsi/mptconfig.c
+++ b/hw/scsi/mptconfig.c
@@ -209,7 +209,7 @@ size_t mptsas_config_manufacturing_1(MPTSASState *s, uint8_t **data, int address
 static
 size_t mptsas_config_manufacturing_2(MPTSASState *s, uint8_t **data, int address)
 {
-    PCIDeviceClass *pcic = PCI_DEVICE_GET_CLASS(s);
+    const PCIDeviceClass *pcic = PCI_DEVICE_GET_CLASS(s);
     return MPTSAS_CONFIG_PACK(2, MPI_CONFIG_PAGETYPE_MANUFACTURING, 0x00,
                               "wb*b*l",
                               pcic->device_id, pcic->revision);
@@ -218,7 +218,7 @@ size_t mptsas_config_manufacturing_2(MPTSASState *s, uint8_t **data, int address
 static
 size_t mptsas_config_manufacturing_3(MPTSASState *s, uint8_t **data, int address)
 {
-    PCIDeviceClass *pcic = PCI_DEVICE_GET_CLASS(s);
+    const PCIDeviceClass *pcic = PCI_DEVICE_GET_CLASS(s);
     return MPTSAS_CONFIG_PACK(3, MPI_CONFIG_PAGETYPE_MANUFACTURING, 0x00,
                               "wb*b*l",
                               pcic->device_id, pcic->revision);
@@ -323,7 +323,7 @@ size_t mptsas_config_io_unit_4(MPTSASState *s, uint8_t **data, int address)
 static
 size_t mptsas_config_ioc_0(MPTSASState *s, uint8_t **data, int address)
 {
-    PCIDeviceClass *pcic = PCI_DEVICE_GET_CLASS(s);
+    const PCIDeviceClass *pcic = PCI_DEVICE_GET_CLASS(s);
 
     return MPTSAS_CONFIG_PACK(0, MPI_CONFIG_PAGETYPE_IOC, 0x01,
                               "*l*lwwb*b*b*blww",
diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
index f5574469c8..3013a7caea 100644
--- a/hw/scsi/scsi-bus.c
+++ b/hw/scsi/scsi-bus.c
@@ -48,7 +48,7 @@ static int next_scsi_bus;
 
 static void scsi_device_realize(SCSIDevice *s, Error **errp)
 {
-    SCSIDeviceClass *sc = SCSI_DEVICE_GET_CLASS(s);
+    const SCSIDeviceClass *sc = SCSI_DEVICE_GET_CLASS(s);
     if (sc->realize) {
         sc->realize(s, errp);
     }
@@ -71,7 +71,7 @@ int scsi_bus_parse_cdb(SCSIDevice *dev, SCSICommand *cmd, uint8_t *buf,
 static SCSIRequest *scsi_device_alloc_req(SCSIDevice *s, uint32_t tag, uint32_t lun,
                                           uint8_t *buf, void *hba_private)
 {
-    SCSIDeviceClass *sc = SCSI_DEVICE_GET_CLASS(s);
+    const SCSIDeviceClass *sc = SCSI_DEVICE_GET_CLASS(s);
     if (sc->alloc_req) {
         return sc->alloc_req(s, tag, lun, buf, hba_private);
     }
@@ -81,7 +81,7 @@ static SCSIRequest *scsi_device_alloc_req(SCSIDevice *s, uint32_t tag, uint32_t
 
 void scsi_device_unit_attention_reported(SCSIDevice *s)
 {
-    SCSIDeviceClass *sc = SCSI_DEVICE_GET_CLASS(s);
+    const SCSIDeviceClass *sc = SCSI_DEVICE_GET_CLASS(s);
     if (sc->unit_attention_reported) {
         sc->unit_attention_reported(s);
     }
@@ -635,7 +635,7 @@ SCSIRequest *scsi_req_new(SCSIDevice *d, uint32_t tag, uint32_t lun,
 {
     SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, d->qdev.parent_bus);
     const SCSIReqOps *ops;
-    SCSIDeviceClass *sc = SCSI_DEVICE_GET_CLASS(d);
+    const SCSIDeviceClass *sc = SCSI_DEVICE_GET_CLASS(d);
     SCSIRequest *req;
     SCSICommand cmd = { .len = 0 };
     int ret;
diff --git a/hw/scsi/vhost-scsi.c b/hw/scsi/vhost-scsi.c
index c491ece1f2..dc47a33667 100644
--- a/hw/scsi/vhost-scsi.c
+++ b/hw/scsi/vhost-scsi.c
@@ -71,7 +71,7 @@ static int vhost_scsi_start(VHostSCSI *s)
     int ret, abi_version, i;
     VirtIODevice *vdev = VIRTIO_DEVICE(s);
     BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
     const VhostOps *vhost_ops = s->dev.vhost_ops;
 
     if (!k->set_guest_notifiers) {
@@ -138,7 +138,7 @@ static void vhost_scsi_stop(VHostSCSI *s)
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(s);
     BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
     int ret = 0;
 
     if (k->set_guest_notifiers) {
diff --git a/hw/scsi/virtio-scsi-dataplane.c b/hw/scsi/virtio-scsi-dataplane.c
index 944ea4eb53..9644dae780 100644
--- a/hw/scsi/virtio-scsi-dataplane.c
+++ b/hw/scsi/virtio-scsi-dataplane.c
@@ -27,7 +27,7 @@ void virtio_scsi_dataplane_setup(VirtIOSCSI *s, Error **errp)
     VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(s);
     VirtIODevice *vdev = VIRTIO_DEVICE(s);
     BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
 
     if (vs->conf.iothread) {
         if (!k->set_guest_notifiers || !k->ioeventfd_assign) {
@@ -126,7 +126,7 @@ int virtio_scsi_dataplane_start(VirtIODevice *vdev)
     int i;
     int rc;
     BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
     VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(vdev);
     VirtIOSCSI *s = VIRTIO_SCSI(vdev);
 
@@ -188,7 +188,7 @@ fail_guest_notifiers:
 void virtio_scsi_dataplane_stop(VirtIODevice *vdev)
 {
     BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
     VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(vdev);
     VirtIOSCSI *s = VIRTIO_SCSI(vdev);
     int i;
diff --git a/hw/scsi/vmw_pvscsi.c b/hw/scsi/vmw_pvscsi.c
index 75575461e2..a56712086f 100644
--- a/hw/scsi/vmw_pvscsi.c
+++ b/hw/scsi/vmw_pvscsi.c
@@ -1264,7 +1264,7 @@ static Property pvscsi_properties[] = {
 
 static void pvscsi_realize(DeviceState *qdev, Error **errp)
 {
-    PVSCSIClass *pvs_c = PVSCSI_DEVICE_GET_CLASS(qdev);
+    const PVSCSIClass *pvs_c = PVSCSI_DEVICE_GET_CLASS(qdev);
     PCIDevice *pci_dev = PCI_DEVICE(qdev);
     PVSCSIState *s = PVSCSI(qdev);
 
diff --git a/hw/sd/core.c b/hw/sd/core.c
index 295dc44ab7..2078c4ce5e 100644
--- a/hw/sd/core.c
+++ b/hw/sd/core.c
@@ -40,7 +40,7 @@ int sdbus_do_command(SDBus *sdbus, SDRequest *req, uint8_t *response)
     SDState *card = get_card(sdbus);
 
     if (card) {
-        SDCardClass *sc = SD_CARD_GET_CLASS(card);
+        const SDCardClass *sc = SD_CARD_GET_CLASS(card);
 
         return sc->do_command(card, req, response);
     }
@@ -53,7 +53,7 @@ void sdbus_write_data(SDBus *sdbus, uint8_t value)
     SDState *card = get_card(sdbus);
 
     if (card) {
-        SDCardClass *sc = SD_CARD_GET_CLASS(card);
+        const SDCardClass *sc = SD_CARD_GET_CLASS(card);
 
         sc->write_data(card, value);
     }
@@ -64,7 +64,7 @@ uint8_t sdbus_read_data(SDBus *sdbus)
     SDState *card = get_card(sdbus);
 
     if (card) {
-        SDCardClass *sc = SD_CARD_GET_CLASS(card);
+        const SDCardClass *sc = SD_CARD_GET_CLASS(card);
 
         return sc->read_data(card);
     }
@@ -77,7 +77,7 @@ bool sdbus_data_ready(SDBus *sdbus)
     SDState *card = get_card(sdbus);
 
     if (card) {
-        SDCardClass *sc = SD_CARD_GET_CLASS(card);
+        const SDCardClass *sc = SD_CARD_GET_CLASS(card);
 
         return sc->data_ready(card);
     }
@@ -90,7 +90,7 @@ bool sdbus_get_inserted(SDBus *sdbus)
     SDState *card = get_card(sdbus);
 
     if (card) {
-        SDCardClass *sc = SD_CARD_GET_CLASS(card);
+        const SDCardClass *sc = SD_CARD_GET_CLASS(card);
 
         return sc->get_inserted(card);
     }
@@ -103,7 +103,7 @@ bool sdbus_get_readonly(SDBus *sdbus)
     SDState *card = get_card(sdbus);
 
     if (card) {
-        SDCardClass *sc = SD_CARD_GET_CLASS(card);
+        const SDCardClass *sc = SD_CARD_GET_CLASS(card);
 
         return sc->get_readonly(card);
     }
@@ -113,7 +113,7 @@ bool sdbus_get_readonly(SDBus *sdbus)
 
 void sdbus_set_inserted(SDBus *sdbus, bool inserted)
 {
-    SDBusClass *sbc = SD_BUS_GET_CLASS(sdbus);
+    const SDBusClass *sbc = SD_BUS_GET_CLASS(sdbus);
     BusState *qbus = BUS(sdbus);
 
     if (sbc->set_inserted) {
@@ -123,7 +123,7 @@ void sdbus_set_inserted(SDBus *sdbus, bool inserted)
 
 void sdbus_set_readonly(SDBus *sdbus, bool readonly)
 {
-    SDBusClass *sbc = SD_BUS_GET_CLASS(sdbus);
+    const SDBusClass *sbc = SD_BUS_GET_CLASS(sdbus);
     BusState *qbus = BUS(sdbus);
 
     if (sbc->set_readonly) {
@@ -134,7 +134,7 @@ void sdbus_set_readonly(SDBus *sdbus, bool readonly)
 void sdbus_reparent_card(SDBus *from, SDBus *to)
 {
     SDState *card = get_card(from);
-    SDCardClass *sc;
+    const SDCardClass *sc;
     bool readonly;
 
     /* We directly reparent the card object rather than implementing this
diff --git a/hw/sh4/sh7750.c b/hw/sh4/sh7750.c
index 166e4bd947..1990afc92c 100644
--- a/hw/sh4/sh7750.c
+++ b/hw/sh4/sh7750.c
@@ -256,7 +256,7 @@ static uint32_t sh7750_mem_readw(void *opaque, hwaddr addr)
 static uint32_t sh7750_mem_readl(void *opaque, hwaddr addr)
 {
     SH7750State *s = opaque;
-    SuperHCPUClass *scc;
+    const SuperHCPUClass *scc;
 
     switch (addr) {
     case SH7750_BCR1_A7:
diff --git a/hw/smbios/smbios_type_38.c b/hw/smbios/smbios_type_38.c
index 56e8609c00..ae896ffe01 100644
--- a/hw/smbios/smbios_type_38.c
+++ b/hw/smbios/smbios_type_38.c
@@ -89,7 +89,7 @@ static void smbios_add_ipmi_devices(BusState *bus)
 
         if (obj) {
             IPMIInterface *ii;
-            IPMIInterfaceClass *iic;
+            const IPMIInterfaceClass *iic;
             IPMIFwInfo info;
 
             ii = IPMI_INTERFACE(obj);
diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index 873cd7df9a..19ec555fcd 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -120,7 +120,7 @@ static void nvram_init(Nvram *nvram, uint8_t *macaddr,
     unsigned int i;
     int sysp_end;
     uint8_t image[0x1ff0];
-    NvramClass *k = NVRAM_GET_CLASS(nvram);
+    const NvramClass *k = NVRAM_GET_CLASS(nvram);
 
     memset(image, '\0', sizeof(image));
 
diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index d347b6616d..c49f5798cc 100644
--- a/hw/sparc64/sun4u.c
+++ b/hw/sparc64/sun4u.c
@@ -108,7 +108,7 @@ static int sun4u_NVRAM_set_params(Nvram *nvram, uint16_t NVRAM_size,
     unsigned int i;
     int sysp_end;
     uint8_t image[0x1ff0];
-    NvramClass *k = NVRAM_GET_CLASS(nvram);
+    const NvramClass *k = NVRAM_GET_CLASS(nvram);
 
     memset(image, '\0', sizeof(image));
 
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
index cb515730c5..794136f99a 100644
--- a/hw/ssi/aspeed_smc.c
+++ b/hw/ssi/aspeed_smc.c
@@ -714,7 +714,7 @@ static void aspeed_smc_realize(DeviceState *dev, Error **errp)
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     AspeedSMCState *s = ASPEED_SMC(dev);
-    AspeedSMCClass *mc = ASPEED_SMC_GET_CLASS(s);
+    const AspeedSMCClass *mc = ASPEED_SMC_GET_CLASS(s);
     int i;
     char name[32];
     hwaddr offset = 0;
diff --git a/hw/ssi/ssi.c b/hw/ssi/ssi.c
index 7eaaf565fd..77b248a4e7 100644
--- a/hw/ssi/ssi.c
+++ b/hw/ssi/ssi.c
@@ -34,7 +34,7 @@ static void ssi_cs_default(void *opaque, int n, int level)
     bool cs = !!level;
     assert(n == 0);
     if (s->cs != cs) {
-        SSISlaveClass *ssc = SSI_SLAVE_GET_CLASS(s);
+        const SSISlaveClass *ssc = SSI_SLAVE_GET_CLASS(s);
         if (ssc->set_cs) {
             ssc->set_cs(s, cs);
         }
@@ -44,7 +44,7 @@ static void ssi_cs_default(void *opaque, int n, int level)
 
 static uint32_t ssi_transfer_raw_default(SSISlave *dev, uint32_t val)
 {
-    SSISlaveClass *ssc = SSI_SLAVE_GET_CLASS(dev);
+    const SSISlaveClass *ssc = SSI_SLAVE_GET_CLASS(dev);
 
     if ((dev->cs && ssc->cs_polarity == SSI_CS_HIGH) ||
             (!dev->cs && ssc->cs_polarity == SSI_CS_LOW) ||
@@ -57,7 +57,7 @@ static uint32_t ssi_transfer_raw_default(SSISlave *dev, uint32_t val)
 static void ssi_slave_realize(DeviceState *dev, Error **errp)
 {
     SSISlave *s = SSI_SLAVE(dev);
-    SSISlaveClass *ssc = SSI_SLAVE_GET_CLASS(s);
+    const SSISlaveClass *ssc = SSI_SLAVE_GET_CLASS(s);
 
     if (ssc->transfer_raw == ssi_transfer_raw_default &&
             ssc->cs_polarity != SSI_CS_NONE) {
@@ -111,7 +111,7 @@ uint32_t ssi_transfer(SSIBus *bus, uint32_t val)
 {
     BusState *b = BUS(bus);
     BusChild *kid;
-    SSISlaveClass *ssc;
+    const SSISlaveClass *ssc;
     uint32_t r = 0;
 
     QTAILQ_FOREACH(kid, &b->children, sibling) {
diff --git a/hw/ssi/xilinx_spips.c b/hw/ssi/xilinx_spips.c
index da8adfa443..23758fa251 100644
--- a/hw/ssi/xilinx_spips.c
+++ b/hw/ssi/xilinx_spips.c
@@ -606,7 +606,7 @@ static void xilinx_spips_realize(DeviceState *dev, Error **errp)
 {
     XilinxSPIPS *s = XILINX_SPIPS(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
-    XilinxSPIPSClass *xsc = XILINX_SPIPS_GET_CLASS(s);
+    const XilinxSPIPSClass *xsc = XILINX_SPIPS_GET_CLASS(s);
     qemu_irq *cs;
     int i;
 
diff --git a/hw/timer/i8254.c b/hw/timer/i8254.c
index 5e61ad50a8..b6f8188010 100644
--- a/hw/timer/i8254.c
+++ b/hw/timer/i8254.c
@@ -332,7 +332,7 @@ static void pit_post_load(PITCommonState *s)
 static void pit_realizefn(DeviceState *dev, Error **errp)
 {
     PITCommonState *pit = PIT_COMMON(dev);
-    PITClass *pc = PIT_GET_CLASS(dev);
+    const PITClass *pc = PIT_GET_CLASS(dev);
     PITChannelState *s;
 
     s = &pit->channels[0];
diff --git a/hw/timer/i8254_common.c b/hw/timer/i8254_common.c
index e18299a482..243f8bbb28 100644
--- a/hw/timer/i8254_common.c
+++ b/hw/timer/i8254_common.c
@@ -35,7 +35,7 @@ void pit_set_gate(ISADevice *dev, int channel, int val)
 {
     PITCommonState *pit = PIT_COMMON(dev);
     PITChannelState *s = &pit->channels[channel];
-    PITCommonClass *c = PIT_COMMON_GET_CLASS(pit);
+    const PITCommonClass *c = PIT_COMMON_GET_CLASS(pit);
 
     c->set_channel_gate(pit, s, val);
 }
@@ -144,7 +144,7 @@ void pit_get_channel_info(ISADevice *dev, int channel, PITChannelInfo *info)
 {
     PITCommonState *pit = PIT_COMMON(dev);
     PITChannelState *s = &pit->channels[channel];
-    PITCommonClass *c = PIT_COMMON_GET_CLASS(pit);
+    const PITCommonClass *c = PIT_COMMON_GET_CLASS(pit);
 
     c->get_channel_info(pit, s, info);
 }
@@ -203,7 +203,7 @@ static const VMStateDescription vmstate_pit_channel = {
 static int pit_load_old(QEMUFile *f, void *opaque, int version_id)
 {
     PITCommonState *pit = opaque;
-    PITCommonClass *c = PIT_COMMON_GET_CLASS(pit);
+    const PITCommonClass *c = PIT_COMMON_GET_CLASS(pit);
     PITChannelState *s;
     int i;
 
@@ -240,7 +240,7 @@ static int pit_load_old(QEMUFile *f, void *opaque, int version_id)
 static void pit_dispatch_pre_save(void *opaque)
 {
     PITCommonState *s = opaque;
-    PITCommonClass *c = PIT_COMMON_GET_CLASS(s);
+    const PITCommonClass *c = PIT_COMMON_GET_CLASS(s);
 
     if (c->pre_save) {
         c->pre_save(s);
@@ -250,7 +250,7 @@ static void pit_dispatch_pre_save(void *opaque)
 static int pit_dispatch_post_load(void *opaque, int version_id)
 {
     PITCommonState *s = opaque;
-    PITCommonClass *c = PIT_COMMON_GET_CLASS(s);
+    const PITCommonClass *c = PIT_COMMON_GET_CLASS(s);
 
     if (c->post_load) {
         c->post_load(s);
diff --git a/hw/timer/m48t59-isa.c b/hw/timer/m48t59-isa.c
index ea1ba703d7..baacf1311b 100644
--- a/hw/timer/m48t59-isa.c
+++ b/hw/timer/m48t59-isa.c
@@ -112,7 +112,7 @@ static void m48t59_reset_isa(DeviceState *d)
 
 static void m48t59_isa_realize(DeviceState *dev, Error **errp)
 {
-    M48txxISADeviceClass *u = M48TXX_ISA_GET_CLASS(dev);
+    const M48txxISADeviceClass *u = M48TXX_ISA_GET_CLASS(dev);
     ISADevice *isadev = ISA_DEVICE(dev);
     M48txxISAState *d = M48TXX_ISA(dev);
     M48t59State *s = &d->state;
diff --git a/hw/timer/m48t59.c b/hw/timer/m48t59.c
index 474981a6ac..89e9060b00 100644
--- a/hw/timer/m48t59.c
+++ b/hw/timer/m48t59.c
@@ -646,7 +646,7 @@ void m48t59_realize_common(M48t59State *s, Error **errp)
 
 static int m48t59_init1(SysBusDevice *dev)
 {
-    M48txxSysBusDeviceClass *u = M48TXX_SYS_BUS_GET_CLASS(dev);
+    const M48txxSysBusDeviceClass *u = M48TXX_SYS_BUS_GET_CLASS(dev);
     M48txxSysBusState *d = M48TXX_SYS_BUS(dev);
     Object *o = OBJECT(dev);
     M48t59State *s = &d->state;
diff --git a/hw/usb/bus.c b/hw/usb/bus.c
index 24f1608b4b..b85bc02433 100644
--- a/hw/usb/bus.c
+++ b/hw/usb/bus.c
@@ -119,7 +119,7 @@ USBBus *usb_bus_find(int busnr)
 
 static void usb_device_realize(USBDevice *dev, Error **errp)
 {
-    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
+    const USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
 
     if (klass->realize) {
         klass->realize(dev, errp);
@@ -128,7 +128,7 @@ static void usb_device_realize(USBDevice *dev, Error **errp)
 
 USBDevice *usb_device_find_device(USBDevice *dev, uint8_t addr)
 {
-    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
+    const USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
     if (klass->find_device) {
         return klass->find_device(dev, addr);
     }
@@ -137,7 +137,7 @@ USBDevice *usb_device_find_device(USBDevice *dev, uint8_t addr)
 
 static void usb_device_unrealize(USBDevice *dev, Error **errp)
 {
-    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
+    const USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
 
     if (klass->unrealize) {
         klass->unrealize(dev, errp);
@@ -146,7 +146,7 @@ static void usb_device_unrealize(USBDevice *dev, Error **errp)
 
 void usb_device_cancel_packet(USBDevice *dev, USBPacket *p)
 {
-    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
+    const USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
     if (klass->cancel_packet) {
         klass->cancel_packet(dev, p);
     }
@@ -154,7 +154,7 @@ void usb_device_cancel_packet(USBDevice *dev, USBPacket *p)
 
 void usb_device_handle_attach(USBDevice *dev)
 {
-    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
+    const USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
     if (klass->handle_attach) {
         klass->handle_attach(dev);
     }
@@ -162,7 +162,7 @@ void usb_device_handle_attach(USBDevice *dev)
 
 void usb_device_handle_reset(USBDevice *dev)
 {
-    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
+    const USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
     if (klass->handle_reset) {
         klass->handle_reset(dev);
     }
@@ -171,7 +171,7 @@ void usb_device_handle_reset(USBDevice *dev)
 void usb_device_handle_control(USBDevice *dev, USBPacket *p, int request,
                                int value, int index, int length, uint8_t *data)
 {
-    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
+    const USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
     if (klass->handle_control) {
         klass->handle_control(dev, p, request, value, index, length, data);
     }
@@ -179,7 +179,7 @@ void usb_device_handle_control(USBDevice *dev, USBPacket *p, int request,
 
 void usb_device_handle_data(USBDevice *dev, USBPacket *p)
 {
-    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
+    const USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
     if (klass->handle_data) {
         klass->handle_data(dev, p);
     }
@@ -187,13 +187,13 @@ void usb_device_handle_data(USBDevice *dev, USBPacket *p)
 
 const char *usb_device_get_product_desc(USBDevice *dev)
 {
-    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
+    const USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
     return klass->product_desc;
 }
 
 const USBDesc *usb_device_get_usb_desc(USBDevice *dev)
 {
-    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
+    const USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
     if (dev->usb_desc) {
         return dev->usb_desc;
     }
@@ -203,7 +203,7 @@ const USBDesc *usb_device_get_usb_desc(USBDevice *dev)
 void usb_device_set_interface(USBDevice *dev, int interface,
                               int alt_old, int alt_new)
 {
-    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
+    const USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
     if (klass->set_interface) {
         klass->set_interface(dev, interface, alt_old, alt_new);
     }
@@ -211,7 +211,7 @@ void usb_device_set_interface(USBDevice *dev, int interface,
 
 void usb_device_flush_ep_queue(USBDevice *dev, USBEndpoint *ep)
 {
-    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
+    const USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
     if (klass->flush_ep_queue) {
         klass->flush_ep_queue(dev, ep);
     }
@@ -219,7 +219,7 @@ void usb_device_flush_ep_queue(USBDevice *dev, USBEndpoint *ep)
 
 void usb_device_ep_stopped(USBDevice *dev, USBEndpoint *ep)
 {
-    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
+    const USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
     if (klass->ep_stopped) {
         klass->ep_stopped(dev, ep);
     }
@@ -228,7 +228,7 @@ void usb_device_ep_stopped(USBDevice *dev, USBEndpoint *ep)
 int usb_device_alloc_streams(USBDevice *dev, USBEndpoint **eps, int nr_eps,
                              int streams)
 {
-    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
+    const USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
     if (klass->alloc_streams) {
         return klass->alloc_streams(dev, eps, nr_eps, streams);
     }
@@ -237,7 +237,7 @@ int usb_device_alloc_streams(USBDevice *dev, USBEndpoint **eps, int nr_eps,
 
 void usb_device_free_streams(USBDevice *dev, USBEndpoint **eps, int nr_eps)
 {
-    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
+    const USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
     if (klass->free_streams) {
         klass->free_streams(dev, eps, nr_eps);
     }
@@ -773,7 +773,7 @@ static void usb_set_attached(Object *obj, bool value, Error **errp)
 static void usb_device_instance_init(Object *obj)
 {
     USBDevice *dev = USB_DEVICE(obj);
-    USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
+    const USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
 
     if (klass->attached_settable) {
         object_property_add_bool(obj, "attached",
diff --git a/hw/usb/dev-smartcard-reader.c b/hw/usb/dev-smartcard-reader.c
index 757b8b3f5a..df15e99946 100644
--- a/hw/usb/dev-smartcard-reader.c
+++ b/hw/usb/dev-smartcard-reader.c
@@ -489,7 +489,7 @@ static const USBDesc desc_ccid = {
 
 static const uint8_t *ccid_card_get_atr(CCIDCardState *card, uint32_t *len)
 {
-    CCIDCardClass *cc = CCID_CARD_GET_CLASS(card);
+    const CCIDCardClass *cc = CCID_CARD_GET_CLASS(card);
 
     if (cc->get_atr) {
         return cc->get_atr(card, len);
@@ -501,7 +501,7 @@ static void ccid_card_apdu_from_guest(CCIDCardState *card,
                                       const uint8_t *apdu,
                                       uint32_t len)
 {
-    CCIDCardClass *cc = CCID_CARD_GET_CLASS(card);
+    const CCIDCardClass *cc = CCID_CARD_GET_CLASS(card);
 
     if (cc->apdu_from_guest) {
         cc->apdu_from_guest(card, apdu, len);
@@ -510,7 +510,7 @@ static void ccid_card_apdu_from_guest(CCIDCardState *card,
 
 static void ccid_card_exitfn(CCIDCardState *card)
 {
-    CCIDCardClass *cc = CCID_CARD_GET_CLASS(card);
+    const CCIDCardClass *cc = CCID_CARD_GET_CLASS(card);
 
     if (cc->exitfn) {
         cc->exitfn(card);
@@ -520,7 +520,7 @@ static void ccid_card_exitfn(CCIDCardState *card)
 
 static int ccid_card_initfn(CCIDCardState *card)
 {
-    CCIDCardClass *cc = CCID_CARD_GET_CLASS(card);
+    const CCIDCardClass *cc = CCID_CARD_GET_CLASS(card);
 
     if (cc->initfn) {
         return cc->initfn(card);
diff --git a/hw/usb/hcd-ehci-pci.c b/hw/usb/hcd-ehci-pci.c
index 6dedcb8989..337ee330fc 100644
--- a/hw/usb/hcd-ehci-pci.c
+++ b/hw/usb/hcd-ehci-pci.c
@@ -71,7 +71,7 @@ static void usb_ehci_pci_realize(PCIDevice *dev, Error **errp)
 
 static void usb_ehci_pci_init(Object *obj)
 {
-    DeviceClass *dc = OBJECT_GET_CLASS(DeviceClass, obj, TYPE_DEVICE);
+    const DeviceClass *dc = OBJECT_GET_CLASS(DeviceClass, obj, TYPE_DEVICE);
     EHCIPCIState *i = PCI_EHCI(obj);
     EHCIState *s = &i->ehci;
 
diff --git a/hw/usb/hcd-ehci-sysbus.c b/hw/usb/hcd-ehci-sysbus.c
index 6c20604d07..1c890eb84f 100644
--- a/hw/usb/hcd-ehci-sysbus.c
+++ b/hw/usb/hcd-ehci-sysbus.c
@@ -56,7 +56,7 @@ static void ehci_sysbus_init(Object *obj)
 {
     SysBusDevice *d = SYS_BUS_DEVICE(obj);
     EHCISysBusState *i = SYS_BUS_EHCI(obj);
-    SysBusEHCIClass *sec = SYS_BUS_EHCI_GET_CLASS(obj);
+    const SysBusEHCIClass *sec = SYS_BUS_EHCI_GET_CLASS(obj);
     EHCIState *s = &i->ehci;
 
     s->capsbase = sec->capsbase;
diff --git a/hw/usb/hcd-uhci.c b/hw/usb/hcd-uhci.c
index ca72a80f27..a7e8295e1c 100644
--- a/hw/usb/hcd-uhci.c
+++ b/hw/usb/hcd-uhci.c
@@ -1209,7 +1209,7 @@ static USBBusOps uhci_bus_ops = {
 static void usb_uhci_common_realize(PCIDevice *dev, Error **errp)
 {
     Error *err = NULL;
-    PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
+    const PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
     UHCIPCIDeviceClass *u = container_of(pc, UHCIPCIDeviceClass, parent_class);
     UHCIState *s = UHCI(dev);
     uint8_t *pci_conf = s->dev.config;
diff --git a/hw/vfio/amd-xgbe.c b/hw/vfio/amd-xgbe.c
index 2c60310cf9..3c49fcc62e 100644
--- a/hw/vfio/amd-xgbe.c
+++ b/hw/vfio/amd-xgbe.c
@@ -17,7 +17,7 @@
 static void amd_xgbe_realize(DeviceState *dev, Error **errp)
 {
     VFIOPlatformDevice *vdev = VFIO_PLATFORM_DEVICE(dev);
-    VFIOAmdXgbeDeviceClass *k = VFIO_AMD_XGBE_DEVICE_GET_CLASS(dev);
+    const VFIOAmdXgbeDeviceClass *k = VFIO_AMD_XGBE_DEVICE_GET_CLASS(dev);
 
     vdev->compat = g_strdup("amd,xgbe-seattle-v1a");
 
diff --git a/hw/vfio/calxeda-xgmac.c b/hw/vfio/calxeda-xgmac.c
index bb15d588e5..f8cad99dc7 100644
--- a/hw/vfio/calxeda-xgmac.c
+++ b/hw/vfio/calxeda-xgmac.c
@@ -17,7 +17,7 @@
 static void calxeda_xgmac_realize(DeviceState *dev, Error **errp)
 {
     VFIOPlatformDevice *vdev = VFIO_PLATFORM_DEVICE(dev);
-    VFIOCalxedaXgmacDeviceClass *k = VFIO_CALXEDA_XGMAC_DEVICE_GET_CLASS(dev);
+    const VFIOCalxedaXgmacDeviceClass *k = VFIO_CALXEDA_XGMAC_DEVICE_GET_CLASS(dev);
 
     vdev->compat = g_strdup("calxeda,hb-xgmac");
 
diff --git a/hw/virtio/vhost-vsock.c b/hw/virtio/vhost-vsock.c
index b4815629e1..51636ef571 100644
--- a/hw/virtio/vhost-vsock.c
+++ b/hw/virtio/vhost-vsock.c
@@ -75,7 +75,7 @@ static void vhost_vsock_start(VirtIODevice *vdev)
 {
     VHostVSock *vsock = VHOST_VSOCK(vdev);
     BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
     int ret;
     int i;
 
@@ -131,7 +131,7 @@ static void vhost_vsock_stop(VirtIODevice *vdev)
 {
     VHostVSock *vsock = VHOST_VSOCK(vdev);
     BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
     int ret;
 
     if (!k->set_guest_notifiers) {
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
index febe519bbd..43ac6948b6 100644
--- a/hw/virtio/vhost.c
+++ b/hw/virtio/vhost.c
@@ -946,7 +946,7 @@ static int vhost_virtqueue_start(struct vhost_dev *dev,
 {
     BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
     VirtioBusState *vbus = VIRTIO_BUS(qbus);
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
     hwaddr s, l, a;
     int r;
     int vhost_vq_index = dev->vhost_ops->vhost_get_vq_index(dev, idx);
diff --git a/hw/virtio/virtio-bus.c b/hw/virtio/virtio-bus.c
index 3042232daf..ef1d49223b 100644
--- a/hw/virtio/virtio-bus.c
+++ b/hw/virtio/virtio-bus.c
@@ -46,8 +46,8 @@ void virtio_bus_device_plugged(VirtIODevice *vdev, Error **errp)
     DeviceState *qdev = DEVICE(vdev);
     BusState *qbus = BUS(qdev_get_parent_bus(qdev));
     VirtioBusState *bus = VIRTIO_BUS(qbus);
-    VirtioBusClass *klass = VIRTIO_BUS_GET_CLASS(bus);
-    VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioBusClass *klass = VIRTIO_BUS_GET_CLASS(bus);
+    const VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev);
     bool has_iommu = virtio_host_has_feature(vdev, VIRTIO_F_IOMMU_PLATFORM);
     Error *local_err = NULL;
 
@@ -102,7 +102,7 @@ void virtio_bus_device_unplugged(VirtIODevice *vdev)
 {
     DeviceState *qdev = DEVICE(vdev);
     BusState *qbus = BUS(qdev_get_parent_bus(qdev));
-    VirtioBusClass *klass = VIRTIO_BUS_GET_CLASS(qbus);
+    const VirtioBusClass *klass = VIRTIO_BUS_GET_CLASS(qbus);
 
     DPRINTF("%s: remove device.\n", qbus->name);
 
@@ -133,7 +133,7 @@ size_t virtio_bus_get_vdev_config_len(VirtioBusState *bus)
 uint32_t virtio_bus_get_vdev_bad_features(VirtioBusState *bus)
 {
     VirtIODevice *vdev = virtio_bus_get_device(bus);
-    VirtioDeviceClass *k;
+    const VirtioDeviceClass *k;
 
     assert(vdev != NULL);
     k = VIRTIO_DEVICE_GET_CLASS(vdev);
@@ -148,7 +148,7 @@ uint32_t virtio_bus_get_vdev_bad_features(VirtioBusState *bus)
 void virtio_bus_get_vdev_config(VirtioBusState *bus, uint8_t *config)
 {
     VirtIODevice *vdev = virtio_bus_get_device(bus);
-    VirtioDeviceClass *k;
+    const VirtioDeviceClass *k;
 
     assert(vdev != NULL);
     k = VIRTIO_DEVICE_GET_CLASS(vdev);
@@ -161,7 +161,7 @@ void virtio_bus_get_vdev_config(VirtioBusState *bus, uint8_t *config)
 void virtio_bus_set_vdev_config(VirtioBusState *bus, uint8_t *config)
 {
     VirtIODevice *vdev = virtio_bus_get_device(bus);
-    VirtioDeviceClass *k;
+    const VirtioDeviceClass *k;
 
     assert(vdev != NULL);
     k = VIRTIO_DEVICE_GET_CLASS(vdev);
@@ -173,7 +173,7 @@ void virtio_bus_set_vdev_config(VirtioBusState *bus, uint8_t *config)
 /* On success, ioeventfd ownership belongs to the caller.  */
 int virtio_bus_grab_ioeventfd(VirtioBusState *bus)
 {
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(bus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(bus);
 
     /* vhost can be used even if ioeventfd=off in the proxy device,
      * so do not check k->ioeventfd_enabled.
@@ -205,10 +205,10 @@ void virtio_bus_release_ioeventfd(VirtioBusState *bus)
 
 int virtio_bus_start_ioeventfd(VirtioBusState *bus)
 {
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(bus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(bus);
     DeviceState *proxy = DEVICE(BUS(bus)->parent);
     VirtIODevice *vdev = virtio_bus_get_device(bus);
-    VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev);
     int r;
 
     if (!k->ioeventfd_assign || !k->ioeventfd_enabled(proxy)) {
@@ -233,7 +233,7 @@ int virtio_bus_start_ioeventfd(VirtioBusState *bus)
 void virtio_bus_stop_ioeventfd(VirtioBusState *bus)
 {
     VirtIODevice *vdev;
-    VirtioDeviceClass *vdc;
+    const VirtioDeviceClass *vdc;
 
     if (!bus->ioeventfd_started) {
         return;
@@ -250,7 +250,7 @@ void virtio_bus_stop_ioeventfd(VirtioBusState *bus)
 
 bool virtio_bus_ioeventfd_enabled(VirtioBusState *bus)
 {
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(bus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(bus);
     DeviceState *proxy = DEVICE(BUS(bus)->parent);
 
     return k->ioeventfd_assign && k->ioeventfd_enabled(proxy);
@@ -263,7 +263,7 @@ bool virtio_bus_ioeventfd_enabled(VirtioBusState *bus)
 int virtio_bus_set_host_notifier(VirtioBusState *bus, int n, bool assign)
 {
     VirtIODevice *vdev = virtio_bus_get_device(bus);
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(bus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(bus);
     DeviceState *proxy = DEVICE(BUS(bus)->parent);
     VirtQueue *vq = virtio_get_queue(vdev, n);
     EventNotifier *notifier = virtio_queue_get_host_notifier(vq);
diff --git a/hw/virtio/virtio-mmio.c b/hw/virtio/virtio-mmio.c
index 5807aa87fe..e2a449f458 100644
--- a/hw/virtio/virtio-mmio.c
+++ b/hw/virtio/virtio-mmio.c
@@ -366,7 +366,7 @@ static int virtio_mmio_set_guest_notifier(DeviceState *d, int n, bool assign,
 {
     VirtIOMMIOProxy *proxy = VIRTIO_MMIO(d);
     VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
-    VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev);
     VirtQueue *vq = virtio_get_queue(vdev, n);
     EventNotifier *notifier = virtio_queue_get_guest_notifier(vq);
 
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index f9b7244808..75e2ae54b7 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -739,7 +739,7 @@ static int kvm_virtio_pci_vector_use(VirtIOPCIProxy *proxy, int nvqs)
 {
     PCIDevice *dev = &proxy->pci_dev;
     VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
     unsigned int vector;
     int ret, queue_no;
 
@@ -788,7 +788,7 @@ static void kvm_virtio_pci_vector_release(VirtIOPCIProxy *proxy, int nvqs)
     VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
     unsigned int vector;
     int queue_no;
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
 
     for (queue_no = 0; queue_no < nvqs; queue_no++) {
         if (!virtio_queue_get_num(vdev, queue_no)) {
@@ -814,7 +814,7 @@ static int virtio_pci_vq_vector_unmask(VirtIOPCIProxy *proxy,
                                        MSIMessage msg)
 {
     VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
     VirtQueue *vq = virtio_get_queue(vdev, queue_no);
     EventNotifier *n = virtio_queue_get_guest_notifier(vq);
     VirtIOIRQFD *irqfd;
@@ -853,7 +853,7 @@ static void virtio_pci_vq_vector_mask(VirtIOPCIProxy *proxy,
                                              unsigned int vector)
 {
     VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
 
     /* If guest supports masking, keep irqfd but mask it.
      * Otherwise, clean it up now.
@@ -928,7 +928,7 @@ static void virtio_pci_vector_poll(PCIDevice *dev,
 {
     VirtIOPCIProxy *proxy = container_of(dev, VirtIOPCIProxy, pci_dev);
     VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
     int queue_no;
     unsigned int vector;
     EventNotifier *notifier;
@@ -960,7 +960,7 @@ static int virtio_pci_set_guest_notifier(DeviceState *d, int n, bool assign,
 {
     VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
     VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
-    VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev);
     VirtQueue *vq = virtio_get_queue(vdev, n);
     EventNotifier *notifier = virtio_queue_get_guest_notifier(vq);
 
@@ -994,7 +994,7 @@ static int virtio_pci_set_guest_notifiers(DeviceState *d, int nvqs, bool assign)
 {
     VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
     VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
     int r, n;
     bool with_irqfd = msix_enabled(&proxy->pci_dev) &&
         kvm_msi_via_irqfd_enabled();
@@ -1186,7 +1186,7 @@ static uint64_t virtio_pci_common_read(void *opaque, hwaddr addr,
         break;
     case VIRTIO_PCI_COMMON_DF:
         if (proxy->dfselect <= 1) {
-            VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev);
+            const VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev);
 
             val = (vdev->host_features & ~vdc->legacy_features) >>
                 (32 * proxy->dfselect);
@@ -1736,7 +1736,7 @@ static void virtio_pci_device_unplugged(DeviceState *d)
 static void virtio_pci_realize(PCIDevice *pci_dev, Error **errp)
 {
     VirtIOPCIProxy *proxy = VIRTIO_PCI(pci_dev);
-    VirtioPCIClass *k = VIRTIO_PCI_GET_CLASS(pci_dev);
+    const VirtioPCIClass *k = VIRTIO_PCI_GET_CLASS(pci_dev);
     bool pcie_port = pci_bus_is_express(pci_dev->bus) &&
                      !pci_bus_is_root(pci_dev->bus);
 
@@ -1918,7 +1918,7 @@ static Property virtio_pci_properties[] = {
 
 static void virtio_pci_dc_realize(DeviceState *qdev, Error **errp)
 {
-    VirtioPCIClass *vpciklass = VIRTIO_PCI_GET_CLASS(qdev);
+    const VirtioPCIClass *vpciklass = VIRTIO_PCI_GET_CLASS(qdev);
     VirtIOPCIProxy *proxy = VIRTIO_PCI(qdev);
     PCIDevice *pci_dev = &proxy->pci_dev;
 
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index 03592c542a..3d0fd9cdd6 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -1095,7 +1095,7 @@ void qemu_put_virtqueue_element(QEMUFile *f, VirtQueueElement *elem)
 static void virtio_notify_vector(VirtIODevice *vdev, uint16_t vector)
 {
     BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
 
     if (unlikely(vdev->broken)) {
         return;
@@ -1113,7 +1113,7 @@ void virtio_update_irq(VirtIODevice *vdev)
 
 static int virtio_validate_features(VirtIODevice *vdev)
 {
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
 
     if (virtio_host_has_feature(vdev, VIRTIO_F_IOMMU_PLATFORM) &&
         !virtio_vdev_has_feature(vdev, VIRTIO_F_IOMMU_PLATFORM)) {
@@ -1129,7 +1129,7 @@ static int virtio_validate_features(VirtIODevice *vdev)
 
 int virtio_set_status(VirtIODevice *vdev, uint8_t val)
 {
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
     trace_virtio_set_status(vdev, val);
 
     if (virtio_vdev_has_feature(vdev, VIRTIO_F_VERSION_1)) {
@@ -1161,7 +1161,7 @@ static enum virtio_device_endian virtio_default_endian(void)
 
 static enum virtio_device_endian virtio_current_cpu_endian(void)
 {
-    CPUClass *cc = CPU_GET_CLASS(current_cpu);
+    const CPUClass *cc = CPU_GET_CLASS(current_cpu);
 
     if (cc->virtio_is_big_endian(current_cpu)) {
         return VIRTIO_DEVICE_ENDIAN_BIG;
@@ -1184,7 +1184,7 @@ static void virtio_virtqueue_reset_region_cache(struct VirtQueue *vq)
 void virtio_reset(void *opaque)
 {
     VirtIODevice *vdev = opaque;
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
     int i;
 
     virtio_set_status(vdev, 0);
@@ -1227,7 +1227,7 @@ void virtio_reset(void *opaque)
 
 uint32_t virtio_config_readb(VirtIODevice *vdev, uint32_t addr)
 {
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
     uint8_t val;
 
     if (addr + sizeof(val) > vdev->config_len) {
@@ -1242,7 +1242,7 @@ uint32_t virtio_config_readb(VirtIODevice *vdev, uint32_t addr)
 
 uint32_t virtio_config_readw(VirtIODevice *vdev, uint32_t addr)
 {
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
     uint16_t val;
 
     if (addr + sizeof(val) > vdev->config_len) {
@@ -1257,7 +1257,7 @@ uint32_t virtio_config_readw(VirtIODevice *vdev, uint32_t addr)
 
 uint32_t virtio_config_readl(VirtIODevice *vdev, uint32_t addr)
 {
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
     uint32_t val;
 
     if (addr + sizeof(val) > vdev->config_len) {
@@ -1272,7 +1272,7 @@ uint32_t virtio_config_readl(VirtIODevice *vdev, uint32_t addr)
 
 void virtio_config_writeb(VirtIODevice *vdev, uint32_t addr, uint32_t data)
 {
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
     uint8_t val = data;
 
     if (addr + sizeof(val) > vdev->config_len) {
@@ -1288,7 +1288,7 @@ void virtio_config_writeb(VirtIODevice *vdev, uint32_t addr, uint32_t data)
 
 void virtio_config_writew(VirtIODevice *vdev, uint32_t addr, uint32_t data)
 {
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
     uint16_t val = data;
 
     if (addr + sizeof(val) > vdev->config_len) {
@@ -1304,7 +1304,7 @@ void virtio_config_writew(VirtIODevice *vdev, uint32_t addr, uint32_t data)
 
 void virtio_config_writel(VirtIODevice *vdev, uint32_t addr, uint32_t data)
 {
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
     uint32_t val = data;
 
     if (addr + sizeof(val) > vdev->config_len) {
@@ -1320,7 +1320,7 @@ void virtio_config_writel(VirtIODevice *vdev, uint32_t addr, uint32_t data)
 
 uint32_t virtio_config_modern_readb(VirtIODevice *vdev, uint32_t addr)
 {
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
     uint8_t val;
 
     if (addr + sizeof(val) > vdev->config_len) {
@@ -1335,7 +1335,7 @@ uint32_t virtio_config_modern_readb(VirtIODevice *vdev, uint32_t addr)
 
 uint32_t virtio_config_modern_readw(VirtIODevice *vdev, uint32_t addr)
 {
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
     uint16_t val;
 
     if (addr + sizeof(val) > vdev->config_len) {
@@ -1350,7 +1350,7 @@ uint32_t virtio_config_modern_readw(VirtIODevice *vdev, uint32_t addr)
 
 uint32_t virtio_config_modern_readl(VirtIODevice *vdev, uint32_t addr)
 {
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
     uint32_t val;
 
     if (addr + sizeof(val) > vdev->config_len) {
@@ -1366,7 +1366,7 @@ uint32_t virtio_config_modern_readl(VirtIODevice *vdev, uint32_t addr)
 void virtio_config_modern_writeb(VirtIODevice *vdev,
                                  uint32_t addr, uint32_t data)
 {
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
     uint8_t val = data;
 
     if (addr + sizeof(val) > vdev->config_len) {
@@ -1383,7 +1383,7 @@ void virtio_config_modern_writeb(VirtIODevice *vdev,
 void virtio_config_modern_writew(VirtIODevice *vdev,
                                  uint32_t addr, uint32_t data)
 {
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
     uint16_t val = data;
 
     if (addr + sizeof(val) > vdev->config_len) {
@@ -1400,7 +1400,7 @@ void virtio_config_modern_writew(VirtIODevice *vdev,
 void virtio_config_modern_writel(VirtIODevice *vdev,
                                  uint32_t addr, uint32_t data)
 {
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
     uint32_t val = data;
 
     if (addr + sizeof(val) > vdev->config_len) {
@@ -1483,7 +1483,7 @@ int virtio_get_num_queues(VirtIODevice *vdev)
 void virtio_queue_set_align(VirtIODevice *vdev, int n, int align)
 {
     BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
 
     /* virtio-1 compliant devices cannot change the alignment */
     if (virtio_vdev_has_feature(vdev, VIRTIO_F_VERSION_1)) {
@@ -1739,7 +1739,7 @@ static bool virtio_extra_state_needed(void *opaque)
 {
     VirtIODevice *vdev = opaque;
     BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
 
     return k->has_extra_state &&
         k->has_extra_state(qbus->parent);
@@ -1802,7 +1802,7 @@ static int get_extra_state(QEMUFile *f, void *pv, size_t size,
 {
     VirtIODevice *vdev = pv;
     BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
 
     if (!k->load_extra_state) {
         return -1;
@@ -1816,7 +1816,7 @@ static int put_extra_state(QEMUFile *f, void *pv, size_t size,
 {
     VirtIODevice *vdev = pv;
     BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
 
     k->save_extra_state(qbus->parent, f);
     return 0;
@@ -1902,8 +1902,8 @@ static const VMStateDescription vmstate_virtio = {
 void virtio_save(VirtIODevice *vdev, QEMUFile *f)
 {
     BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
-    VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
+    const VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev);
     uint32_t guest_features_lo = (vdev->guest_features & 0xffffffff);
     int i;
 
@@ -1970,7 +1970,7 @@ static int virtio_device_get(QEMUFile *f, void *opaque, size_t size,
                              VMStateField *field)
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(opaque);
-    DeviceClass *dc = DEVICE_CLASS(VIRTIO_DEVICE_GET_CLASS(vdev));
+    const DeviceClass *dc = DEVICE_CLASS(VIRTIO_DEVICE_GET_CLASS(vdev));
 
     return virtio_load(vdev, f, dc->vmsd->version_id);
 }
@@ -1983,7 +1983,7 @@ const VMStateInfo  virtio_vmstate_info = {
 
 static int virtio_set_features_nocheck(VirtIODevice *vdev, uint64_t val)
 {
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
     bool bad = (val & ~(vdev->host_features)) != 0;
 
     val &= vdev->host_features;
@@ -2013,8 +2013,8 @@ int virtio_load(VirtIODevice *vdev, QEMUFile *f, int version_id)
     uint32_t num;
     uint32_t features;
     BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
-    VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
+    const VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev);
 
     /*
      * We poison the endianness to ensure it does not get used before
@@ -2200,7 +2200,7 @@ static void virtio_vmstate_change(void *opaque, int running, RunState state)
 {
     VirtIODevice *vdev = opaque;
     BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
     bool backend_run = running && (vdev->status & VIRTIO_CONFIG_S_DRIVER_OK);
     vdev->vm_running = running;
 
@@ -2232,7 +2232,7 @@ void virtio_init(VirtIODevice *vdev, const char *name,
                  uint16_t device_id, size_t config_size)
 {
     BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
+    const VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
     int i;
     int nvectors = k->query_nvectors ? k->query_nvectors(qbus->parent) : 0;
 
@@ -2475,7 +2475,7 @@ static void virtio_memory_listener_commit(MemoryListener *listener)
 static void virtio_device_realize(DeviceState *dev, Error **errp)
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
-    VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(dev);
+    const VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(dev);
     Error *err = NULL;
 
     /* Devices should either use vmsd or the load/save methods */
@@ -2502,7 +2502,7 @@ static void virtio_device_realize(DeviceState *dev, Error **errp)
 static void virtio_device_unrealize(DeviceState *dev, Error **errp)
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
-    VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(dev);
+    const VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(dev);
     Error *err = NULL;
 
     virtio_bus_device_unplugged(vdev);
diff --git a/io/channel.c b/io/channel.c
index cdf74540c1..1ced119375 100644
--- a/io/channel.c
+++ b/io/channel.c
@@ -52,7 +52,7 @@ ssize_t qio_channel_readv_full(QIOChannel *ioc,
                                size_t *nfds,
                                Error **errp)
 {
-    QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
+    const QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
 
     if ((fds || nfds) &&
         !qio_channel_has_feature(ioc, QIO_CHANNEL_FEATURE_FD_PASS)) {
@@ -72,7 +72,7 @@ ssize_t qio_channel_writev_full(QIOChannel *ioc,
                                 size_t nfds,
                                 Error **errp)
 {
-    QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
+    const QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
 
     if ((fds || nfds) &&
         !qio_channel_has_feature(ioc, QIO_CHANNEL_FEATURE_FD_PASS)) {
@@ -127,7 +127,7 @@ int qio_channel_set_blocking(QIOChannel *ioc,
                               bool enabled,
                               Error **errp)
 {
-    QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
+    const QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
     return klass->io_set_blocking(ioc, enabled, errp);
 }
 
@@ -135,7 +135,7 @@ int qio_channel_set_blocking(QIOChannel *ioc,
 int qio_channel_close(QIOChannel *ioc,
                       Error **errp)
 {
-    QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
+    const QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
     return klass->io_close(ioc, errp);
 }
 
@@ -143,7 +143,7 @@ int qio_channel_close(QIOChannel *ioc,
 GSource *qio_channel_create_watch(QIOChannel *ioc,
                                   GIOCondition condition)
 {
-    QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
+    const QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
     GSource *ret = klass->io_create_watch(ioc, condition);
 
     if (ioc->name) {
@@ -160,7 +160,7 @@ void qio_channel_set_aio_fd_handler(QIOChannel *ioc,
                                     IOHandler *io_write,
                                     void *opaque)
 {
-    QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
+    const QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
 
     klass->io_set_aio_fd_handler(ioc, ctx, io_read, io_write, opaque);
 }
@@ -189,7 +189,7 @@ int qio_channel_shutdown(QIOChannel *ioc,
                          QIOChannelShutdown how,
                          Error **errp)
 {
-    QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
+    const QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
 
     if (!klass->io_shutdown) {
         error_setg(errp, "Data path shutdown not supported");
@@ -203,7 +203,7 @@ int qio_channel_shutdown(QIOChannel *ioc,
 void qio_channel_set_delay(QIOChannel *ioc,
                            bool enabled)
 {
-    QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
+    const QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
 
     if (klass->io_set_delay) {
         klass->io_set_delay(ioc, enabled);
@@ -214,7 +214,7 @@ void qio_channel_set_delay(QIOChannel *ioc,
 void qio_channel_set_cork(QIOChannel *ioc,
                           bool enabled)
 {
-    QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
+    const QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
 
     if (klass->io_set_cork) {
         klass->io_set_cork(ioc, enabled);
@@ -227,7 +227,7 @@ off_t qio_channel_io_seek(QIOChannel *ioc,
                           int whence,
                           Error **errp)
 {
-    QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
+    const QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
 
     if (!klass->io_seek) {
         error_setg(errp, "Channel does not support random access");
diff --git a/kvm-all.c b/kvm-all.c
index 90b8573656..f80b0ddf26 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -1563,7 +1563,7 @@ bool kvm_vcpu_id_is_valid(int vcpu_id)
 
 static int kvm_init(MachineState *ms)
 {
-    MachineClass *mc = MACHINE_GET_CLASS(ms);
+    const MachineClass *mc = MACHINE_GET_CLASS(ms);
     static const char upgrade_note[] =
         "Please upgrade to at least kernel 2.6.29 or recent kvm-kmod\n"
         "(see http://sourceforge.net/projects/kvm).\n";
diff --git a/migration/migration.c b/migration/migration.c
index 54060f749a..84fdd5c0ac 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -1157,7 +1157,7 @@ void migrate_del_blocker(Error *reason)
 
 int check_migratable(Object *obj, Error **err)
 {
-    DeviceClass *dc = DEVICE_GET_CLASS(obj);
+    const DeviceClass *dc = DEVICE_GET_CLASS(obj);
     if (only_migratable && dc->vmsd) {
         if (dc->vmsd->unmigratable) {
             error_setg(err, "Device %s is not migratable, but "
diff --git a/migration/savevm.c b/migration/savevm.c
index 3b19a4a274..f8d00934ef 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -453,7 +453,7 @@ static void dump_vmstate_vmsd(FILE *out_file,
 
 static void dump_machine_type(FILE *out_file)
 {
-    MachineClass *mc;
+    const MachineClass *mc;
 
     mc = MACHINE_GET_CLASS(current_machine);
 
diff --git a/monitor.c b/monitor.c
index be282ecb80..5cc633c199 100644
--- a/monitor.c
+++ b/monitor.c
@@ -4132,7 +4132,7 @@ GICCapabilityList *qmp_query_gic_capabilities(Error **errp)
 HotpluggableCPUList *qmp_query_hotpluggable_cpus(Error **errp)
 {
     MachineState *ms = MACHINE(qdev_get_machine());
-    MachineClass *mc = MACHINE_GET_CLASS(ms);
+    const MachineClass *mc = MACHINE_GET_CLASS(ms);
 
     if (!mc->has_hotpluggable_cpus) {
         error_setg(errp, QERR_FEATURE_DISABLED, "query-hotpluggable-cpus");
diff --git a/net/filter.c b/net/filter.c
index 1dfd2caa23..121a5d7cfc 100644
--- a/net/filter.c
+++ b/net/filter.c
@@ -153,7 +153,7 @@ static char *netfilter_get_status(Object *obj, Error **errp)
 static void netfilter_set_status(Object *obj, const char *str, Error **errp)
 {
     NetFilterState *nf = NETFILTER(obj);
-    NetFilterClass *nfc = NETFILTER_GET_CLASS(obj);
+    const NetFilterClass *nfc = NETFILTER_GET_CLASS(obj);
 
     if (strcmp(str, "on") && strcmp(str, "off")) {
         error_setg(errp, "Invalid value for netfilter status, "
@@ -191,7 +191,7 @@ static void netfilter_complete(UserCreatable *uc, Error **errp)
 {
     NetFilterState *nf = NETFILTER(uc);
     NetClientState *ncs[MAX_QUEUE_NUM];
-    NetFilterClass *nfc = NETFILTER_GET_CLASS(uc);
+    const NetFilterClass *nfc = NETFILTER_GET_CLASS(uc);
     int queues;
     Error *local_err = NULL;
 
@@ -232,7 +232,7 @@ static void netfilter_complete(UserCreatable *uc, Error **errp)
 static void netfilter_finalize(Object *obj)
 {
     NetFilterState *nf = NETFILTER(obj);
-    NetFilterClass *nfc = NETFILTER_GET_CLASS(obj);
+    const NetFilterClass *nfc = NETFILTER_GET_CLASS(obj);
 
     if (nfc->cleanup) {
         nfc->cleanup(nf);
diff --git a/qdev-monitor.c b/qdev-monitor.c
index 339775e49d..f8091d6459 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -390,7 +390,7 @@ static DeviceState *qbus_find_dev(BusState *bus, char *elem)
     }
     QTAILQ_FOREACH(kid, &bus->children, sibling) {
         DeviceState *dev = kid->child;
-        DeviceClass *dc = DEVICE_GET_CLASS(dev);
+        const DeviceClass *dc = DEVICE_GET_CLASS(dev);
 
         if (qdev_class_has_alias(dc) &&
             strcmp(qdev_class_get_alias(dc), elem) == 0) {
@@ -402,7 +402,7 @@ static DeviceState *qbus_find_dev(BusState *bus, char *elem)
 
 static inline bool qbus_is_full(BusState *bus)
 {
-    BusClass *bus_class = BUS_GET_CLASS(bus);
+    const BusClass *bus_class = BUS_GET_CLASS(bus);
     return bus_class->max_dev && bus->max_index >= bus_class->max_dev;
 }
 
@@ -664,7 +664,7 @@ static void qdev_print_props(Monitor *mon, DeviceState *dev, Property *props,
 
 static void bus_print_dev(BusState *bus, Monitor *mon, DeviceState *dev, int indent)
 {
-    BusClass *bc = BUS_GET_CLASS(bus);
+    const BusClass *bc = BUS_GET_CLASS(bus);
 
     if (bc->print_dev) {
         bc->print_dev(mon, dev, indent);
@@ -673,7 +673,7 @@ static void bus_print_dev(BusState *bus, Monitor *mon, DeviceState *dev, int ind
 
 static void qdev_print(Monitor *mon, DeviceState *dev, int indent)
 {
-    ObjectClass *class;
+    const ObjectClass *class;
     BusState *child;
     NamedGPIOList *ngl;
 
diff --git a/qmp.c b/qmp.c
index fa82b598c6..eb8a1ae977 100644
--- a/qmp.c
+++ b/qmp.c
@@ -120,7 +120,7 @@ void qmp_cpu(int64_t index, Error **errp)
 
 void qmp_cpu_add(int64_t id, Error **errp)
 {
-    MachineClass *mc;
+    const MachineClass *mc;
 
     mc = MACHINE_GET_CLASS(current_machine);
     if (mc->hot_add_cpu) {
@@ -707,7 +707,7 @@ ACPIOSTInfoList *qmp_query_acpi_ospm_status(Error **errp)
     Object *obj = object_resolve_path_type("", TYPE_ACPI_DEVICE_IF, &ambig);
 
     if (obj) {
-        AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_GET_CLASS(obj);
+        const AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_GET_CLASS(obj);
         AcpiDeviceIf *adev = ACPI_DEVICE_IF(obj);
 
         adevc->ospm_status(adev, &prev);
diff --git a/qom/cpu.c b/qom/cpu.c
index f02e9c0fae..991f8cea64 100644
--- a/qom/cpu.c
+++ b/qom/cpu.c
@@ -36,7 +36,7 @@ bool cpu_exists(int64_t id)
     CPUState *cpu;
 
     CPU_FOREACH(cpu) {
-        CPUClass *cc = CPU_GET_CLASS(cpu);
+        const CPUClass *cc = CPU_GET_CLASS(cpu);
 
         if (cc->get_arch_id(cpu) == id) {
             return true;
@@ -88,7 +88,7 @@ out:
 
 bool cpu_paging_enabled(const CPUState *cpu)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
 
     return cc->get_paging_enabled(cpu);
 }
@@ -101,7 +101,7 @@ static bool cpu_common_get_paging_enabled(const CPUState *cpu)
 void cpu_get_memory_mapping(CPUState *cpu, MemoryMappingList *list,
                             Error **errp)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
 
     cc->get_memory_mapping(cpu, list, errp);
 }
@@ -139,7 +139,7 @@ void cpu_exit(CPUState *cpu)
 int cpu_write_elf32_qemunote(WriteCoreDumpFunction f, CPUState *cpu,
                              void *opaque)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
 
     return (*cc->write_elf32_qemunote)(f, cpu, opaque);
 }
@@ -153,7 +153,7 @@ static int cpu_common_write_elf32_qemunote(WriteCoreDumpFunction f,
 int cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cpu,
                          int cpuid, void *opaque)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
 
     return (*cc->write_elf32_note)(f, cpu, cpuid, opaque);
 }
@@ -168,7 +168,7 @@ static int cpu_common_write_elf32_note(WriteCoreDumpFunction f,
 int cpu_write_elf64_qemunote(WriteCoreDumpFunction f, CPUState *cpu,
                              void *opaque)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
 
     return (*cc->write_elf64_qemunote)(f, cpu, opaque);
 }
@@ -182,7 +182,7 @@ static int cpu_common_write_elf64_qemunote(WriteCoreDumpFunction f,
 int cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cpu,
                          int cpuid, void *opaque)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
 
     return (*cc->write_elf64_note)(f, cpu, cpuid, opaque);
 }
@@ -230,7 +230,7 @@ static bool cpu_common_exec_interrupt(CPUState *cpu, int int_req)
 
 GuestPanicInformation *cpu_get_crash_info(CPUState *cpu)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
     GuestPanicInformation *res = NULL;
 
     if (cc->get_crash_info) {
@@ -242,7 +242,7 @@ GuestPanicInformation *cpu_get_crash_info(CPUState *cpu)
 void cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf,
                     int flags)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
 
     if (cc->dump_state) {
         cpu_synchronize_state(cpu);
@@ -253,7 +253,7 @@ void cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf,
 void cpu_dump_statistics(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf,
                          int flags)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
 
     if (cc->dump_statistics) {
         cc->dump_statistics(cpu, f, cpu_fprintf, flags);
@@ -262,7 +262,7 @@ void cpu_dump_statistics(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf,
 
 void cpu_reset(CPUState *cpu)
 {
-    CPUClass *klass = CPU_GET_CLASS(cpu);
+    const CPUClass *klass = CPU_GET_CLASS(cpu);
 
     if (klass->reset != NULL) {
         (*klass->reset)(cpu);
@@ -273,7 +273,7 @@ void cpu_reset(CPUState *cpu)
 
 static void cpu_common_reset(CPUState *cpu)
 {
-    CPUClass *cc = CPU_GET_CLASS(cpu);
+    const CPUClass *cc = CPU_GET_CLASS(cpu);
     int i;
 
     if (qemu_loglevel_mask(CPU_LOG_RESET)) {
@@ -383,7 +383,7 @@ static void cpu_common_unrealizefn(DeviceState *dev, Error **errp)
 static void cpu_common_initfn(Object *obj)
 {
     CPUState *cpu = CPU(obj);
-    CPUClass *cc = CPU_GET_CLASS(obj);
+    const CPUClass *cc = CPU_GET_CLASS(obj);
 
     cpu->cpu_index = UNASSIGNED_CPU_INDEX;
     cpu->gdb_num_regs = cpu->gdb_num_g_regs = cc->gdb_num_core_regs;
diff --git a/qom/object.c b/qom/object.c
index a25b1fffad..41dae18420 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -993,7 +993,7 @@ ObjectProperty *object_property_find(Object *obj, const char *name,
                                      Error **errp)
 {
     ObjectProperty *prop;
-    ObjectClass *klass = object_get_class(obj);
+    const ObjectClass *klass = object_get_class(obj);
 
     prop = object_class_property_find(klass, name, NULL);
     if (prop) {
diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
index d4253a88de..c20c9043fa 100644
--- a/qom/object_interfaces.c
+++ b/qom/object_interfaces.c
@@ -8,7 +8,7 @@
 void user_creatable_complete(Object *obj, Error **errp)
 {
 
-    UserCreatableClass *ucc;
+    const UserCreatableClass *ucc;
     UserCreatable *uc =
         (UserCreatable *)object_dynamic_cast(obj, TYPE_USER_CREATABLE);
 
@@ -25,7 +25,7 @@ void user_creatable_complete(Object *obj, Error **errp)
 bool user_creatable_can_be_deleted(UserCreatable *uc, Error **errp)
 {
 
-    UserCreatableClass *ucc = USER_CREATABLE_GET_CLASS(uc);
+    const UserCreatableClass *ucc = USER_CREATABLE_GET_CLASS(uc);
 
     if (ucc->can_be_deleted) {
         return ucc->can_be_deleted(uc, errp);
diff --git a/target/alpha/cpu.c b/target/alpha/cpu.c
index b4f97983e5..15d1ab4b80 100644
--- a/target/alpha/cpu.c
+++ b/target/alpha/cpu.c
@@ -58,7 +58,7 @@ static void alpha_cpu_disas_set_info(CPUState *cpu, disassemble_info *info)
 static void alpha_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
-    AlphaCPUClass *acc = ALPHA_CPU_GET_CLASS(dev);
+    const AlphaCPUClass *acc = ALPHA_CPU_GET_CLASS(dev);
     Error *local_err = NULL;
 
     cpu_exec_realizefn(cs, &local_err);
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index 04b062cb7e..f943db7c73 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -117,7 +117,7 @@ static void cp_reg_check_reset(gpointer key, gpointer value,  gpointer opaque)
 static void arm_cpu_reset(CPUState *s)
 {
     ARMCPU *cpu = ARM_CPU(s);
-    ARMCPUClass *acc = ARM_CPU_GET_CLASS(cpu);
+    const ARMCPUClass *acc = ARM_CPU_GET_CLASS(cpu);
     CPUARMState *env = &cpu->env;
 
     acc->parent_reset(s);
@@ -251,7 +251,7 @@ static void arm_cpu_reset(CPUState *s)
 
 bool arm_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
 {
-    CPUClass *cc = CPU_GET_CLASS(cs);
+    const CPUClass *cc = CPU_GET_CLASS(cs);
     CPUARMState *env = cs->env_ptr;
     uint32_t cur_el = arm_current_el(env);
     bool secure = arm_is_secure(env);
@@ -333,7 +333,7 @@ static void arm_v7m_unassigned_access(CPUState *cpu, hwaddr addr,
 
 static bool arm_v7m_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
 {
-    CPUClass *cc = CPU_GET_CLASS(cs);
+    const CPUClass *cc = CPU_GET_CLASS(cs);
     ARMCPU *cpu = ARM_CPU(cs);
     CPUARMState *env = &cpu->env;
     bool ret = false;
@@ -648,7 +648,7 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
     ARMCPU *cpu = ARM_CPU(dev);
-    ARMCPUClass *acc = ARM_CPU_GET_CLASS(dev);
+    const ARMCPUClass *acc = ARM_CPU_GET_CLASS(dev);
     CPUARMState *env = &cpu->env;
     int pagebits;
     Error *local_err = NULL;
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
index 45554682f2..8a2a71877e 100644
--- a/target/arm/kvm.c
+++ b/target/arm/kvm.c
@@ -146,7 +146,7 @@ static void kvm_arm_host_cpu_class_init(ObjectClass *oc, void *data)
 
 static void kvm_arm_host_cpu_initfn(Object *obj)
 {
-    ARMHostCPUClass *ahcc = ARM_HOST_CPU_GET_CLASS(obj);
+    const ARMHostCPUClass *ahcc = ARM_HOST_CPU_GET_CLASS(obj);
     ARMCPU *cpu = ARM_CPU(obj);
     CPUARMState *env = &cpu->env;
 
diff --git a/target/cris/cpu.c b/target/cris/cpu.c
index 5f766f09d6..b4e67fec56 100644
--- a/target/cris/cpu.c
+++ b/target/cris/cpu.c
@@ -45,7 +45,7 @@ static bool cris_cpu_has_work(CPUState *cs)
 static void cris_cpu_reset(CPUState *s)
 {
     CRISCPU *cpu = CRIS_CPU(s);
-    CRISCPUClass *ccc = CRIS_CPU_GET_CLASS(cpu);
+    const CRISCPUClass *ccc = CRIS_CPU_GET_CLASS(cpu);
     CPUCRISState *env = &cpu->env;
     uint32_t vr;
 
@@ -97,8 +97,8 @@ CRISCPU *cpu_cris_init(const char *cpu_model)
 /* Sort alphabetically by VR. */
 static gint cris_cpu_list_compare(gconstpointer a, gconstpointer b)
 {
-    CRISCPUClass *ccc_a = CRIS_CPU_CLASS(a);
-    CRISCPUClass *ccc_b = CRIS_CPU_CLASS(b);
+    const CRISCPUClass *ccc_a = CRIS_CPU_CLASS(a);
+    const CRISCPUClass *ccc_b = CRIS_CPU_CLASS(b);
 
     /*  */
     if (ccc_a->vr > ccc_b->vr) {
@@ -140,7 +140,7 @@ void cris_cpu_list(FILE *f, fprintf_function cpu_fprintf)
 static void cris_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
-    CRISCPUClass *ccc = CRIS_CPU_GET_CLASS(dev);
+    const CRISCPUClass *ccc = CRIS_CPU_GET_CLASS(dev);
     Error *local_err = NULL;
 
     cpu_exec_realizefn(cs, &local_err);
@@ -188,7 +188,7 @@ static void cris_cpu_initfn(Object *obj)
 {
     CPUState *cs = CPU(obj);
     CRISCPU *cpu = CRIS_CPU(obj);
-    CRISCPUClass *ccc = CRIS_CPU_GET_CLASS(obj);
+    const CRISCPUClass *ccc = CRIS_CPU_GET_CLASS(obj);
     CPUCRISState *env = &cpu->env;
     static bool tcg_initialized;
 
diff --git a/target/cris/helper.c b/target/cris/helper.c
index af78cca8b9..3219063334 100644
--- a/target/cris/helper.c
+++ b/target/cris/helper.c
@@ -289,7 +289,7 @@ hwaddr cris_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
 
 bool cris_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
 {
-    CPUClass *cc = CPU_GET_CLASS(cs);
+    const CPUClass *cc = CPU_GET_CLASS(cs);
     CRISCPU *cpu = CRIS_CPU(cs);
     CPUCRISState *env = &cpu->env;
     bool ret = false;
diff --git a/target/hppa/cpu.c b/target/hppa/cpu.c
index 1d791d0f80..6b227095fa 100644
--- a/target/hppa/cpu.c
+++ b/target/hppa/cpu.c
@@ -52,7 +52,7 @@ static void hppa_cpu_disas_set_info(CPUState *cs, disassemble_info *info)
 static void hppa_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
-    HPPACPUClass *acc = HPPA_CPU_GET_CLASS(dev);
+    const HPPACPUClass *acc = HPPA_CPU_GET_CLASS(dev);
     Error *local_err = NULL;
 
     cpu_exec_realizefn(cs, &local_err);
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index b1d6252ae0..2234049de3 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -3021,7 +3021,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
 static void x86_cpu_reset(CPUState *s)
 {
     X86CPU *cpu = X86_CPU(s);
-    X86CPUClass *xcc = X86_CPU_GET_CLASS(cpu);
+    const X86CPUClass *xcc = X86_CPU_GET_CLASS(cpu);
     CPUX86State *env = &cpu->env;
     target_ulong cr4;
     uint64_t xcr0;
@@ -3479,7 +3479,7 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
     X86CPU *cpu = X86_CPU(dev);
-    X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
+    const X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
     CPUX86State *env = &cpu->env;
     Error *local_err = NULL;
     static bool ht_warned;
@@ -3671,7 +3671,7 @@ out:
 static void x86_cpu_unrealizefn(DeviceState *dev, Error **errp)
 {
     X86CPU *cpu = X86_CPU(dev);
-    X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
+    const X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
     Error *local_err = NULL;
 
 #ifndef CONFIG_USER_ONLY
@@ -3838,7 +3838,7 @@ static void x86_cpu_initfn(Object *obj)
 {
     CPUState *cs = CPU(obj);
     X86CPU *cpu = X86_CPU(obj);
-    X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
+    const X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
     CPUX86State *env = &cpu->env;
     FeatureWord w;
 
diff --git a/target/i386/kvm.c b/target/i386/kvm.c
index 55865dbee0..7584d65dfe 100644
--- a/target/i386/kvm.c
+++ b/target/i386/kvm.c
@@ -3468,7 +3468,7 @@ int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route,
     if (iommu) {
         int ret;
         MSIMessage src, dst;
-        X86IOMMUClass *class = X86_IOMMU_GET_CLASS(iommu);
+        const X86IOMMUClass *class = X86_IOMMU_GET_CLASS(iommu);
 
         src.address = route->u.msi.address_hi;
         src.address <<= VTD_MSI_ADDR_HI_SHIFT;
diff --git a/target/i386/machine.c b/target/i386/machine.c
index 5b9eb3a2f6..5eae5949b5 100644
--- a/target/i386/machine.c
+++ b/target/i386/machine.c
@@ -893,7 +893,7 @@ static bool tsc_khz_needed(void *opaque)
 {
     X86CPU *cpu = opaque;
     CPUX86State *env = &cpu->env;
-    PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(qdev_get_machine());
+    const PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(qdev_get_machine());
     return env->tsc_khz && pcmc->save_tsc_khz;
 }
 
diff --git a/target/lm32/cpu.c b/target/lm32/cpu.c
index 2b8c36b6d0..0ad15f5ac5 100644
--- a/target/lm32/cpu.c
+++ b/target/lm32/cpu.c
@@ -122,7 +122,7 @@ static bool lm32_cpu_has_work(CPUState *cs)
 static void lm32_cpu_reset(CPUState *s)
 {
     LM32CPU *cpu = LM32_CPU(s);
-    LM32CPUClass *lcc = LM32_CPU_GET_CLASS(cpu);
+    const LM32CPUClass *lcc = LM32_CPU_GET_CLASS(cpu);
     CPULM32State *env = &cpu->env;
 
     lcc->parent_reset(s);
@@ -142,7 +142,7 @@ static void lm32_cpu_disas_set_info(CPUState *cpu, disassemble_info *info)
 static void lm32_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
-    LM32CPUClass *lcc = LM32_CPU_GET_CLASS(dev);
+    const LM32CPUClass *lcc = LM32_CPU_GET_CLASS(dev);
     Error *local_err = NULL;
 
     cpu_exec_realizefn(cs, &local_err);
diff --git a/target/lm32/gdbstub.c b/target/lm32/gdbstub.c
index cf929dd392..066c96fb04 100644
--- a/target/lm32/gdbstub.c
+++ b/target/lm32/gdbstub.c
@@ -55,7 +55,7 @@ int lm32_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
 int lm32_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
 {
     LM32CPU *cpu = LM32_CPU(cs);
-    CPUClass *cc = CPU_GET_CLASS(cs);
+    const CPUClass *cc = CPU_GET_CLASS(cs);
     CPULM32State *env = &cpu->env;
     uint32_t tmp;
 
diff --git a/target/m68k/cpu.c b/target/m68k/cpu.c
index fa10b6e4cd..94c57a6d4c 100644
--- a/target/m68k/cpu.c
+++ b/target/m68k/cpu.c
@@ -47,7 +47,7 @@ static void m68k_set_feature(CPUM68KState *env, int feature)
 static void m68k_cpu_reset(CPUState *s)
 {
     M68kCPU *cpu = M68K_CPU(s);
-    M68kCPUClass *mcc = M68K_CPU_GET_CLASS(cpu);
+    const M68kCPUClass *mcc = M68K_CPU_GET_CLASS(cpu);
     CPUM68KState *env = &cpu->env;
 
     mcc->parent_reset(s);
@@ -218,7 +218,7 @@ static void m68k_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
     M68kCPU *cpu = M68K_CPU(dev);
-    M68kCPUClass *mcc = M68K_CPU_GET_CLASS(dev);
+    const M68kCPUClass *mcc = M68K_CPU_GET_CLASS(dev);
     Error *local_err = NULL;
 
     cpu_exec_realizefn(cs, &local_err);
diff --git a/target/microblaze/cpu.c b/target/microblaze/cpu.c
index 3d58869716..1782713c91 100644
--- a/target/microblaze/cpu.c
+++ b/target/microblaze/cpu.c
@@ -98,7 +98,7 @@ static void microblaze_cpu_set_irq(void *opaque, int irq, int level)
 static void mb_cpu_reset(CPUState *s)
 {
     MicroBlazeCPU *cpu = MICROBLAZE_CPU(s);
-    MicroBlazeCPUClass *mcc = MICROBLAZE_CPU_GET_CLASS(cpu);
+    const MicroBlazeCPUClass *mcc = MICROBLAZE_CPU_GET_CLASS(cpu);
     CPUMBState *env = &cpu->env;
 
     mcc->parent_reset(s);
@@ -132,7 +132,7 @@ static void mb_disas_set_info(CPUState *cpu, disassemble_info *info)
 static void mb_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
-    MicroBlazeCPUClass *mcc = MICROBLAZE_CPU_GET_CLASS(dev);
+    const MicroBlazeCPUClass *mcc = MICROBLAZE_CPU_GET_CLASS(dev);
     MicroBlazeCPU *cpu = MICROBLAZE_CPU(cs);
     CPUMBState *env = &cpu->env;
     uint8_t version_code = 0;
diff --git a/target/microblaze/gdbstub.c b/target/microblaze/gdbstub.c
index 7fb076c2e9..e59bd6aaa7 100644
--- a/target/microblaze/gdbstub.c
+++ b/target/microblaze/gdbstub.c
@@ -38,7 +38,7 @@ int mb_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
 int mb_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
 {
     MicroBlazeCPU *cpu = MICROBLAZE_CPU(cs);
-    CPUClass *cc = CPU_GET_CLASS(cs);
+    const CPUClass *cc = CPU_GET_CLASS(cs);
     CPUMBState *env = &cpu->env;
     uint32_t tmp;
 
diff --git a/target/mips/cpu.c b/target/mips/cpu.c
index 1bb66b7a5a..5554632a45 100644
--- a/target/mips/cpu.c
+++ b/target/mips/cpu.c
@@ -95,7 +95,7 @@ static bool mips_cpu_has_work(CPUState *cs)
 static void mips_cpu_reset(CPUState *s)
 {
     MIPSCPU *cpu = MIPS_CPU(s);
-    MIPSCPUClass *mcc = MIPS_CPU_GET_CLASS(cpu);
+    const MIPSCPUClass *mcc = MIPS_CPU_GET_CLASS(cpu);
     CPUMIPSState *env = &cpu->env;
 
     mcc->parent_reset(s);
@@ -122,7 +122,7 @@ static void mips_cpu_disas_set_info(CPUState *s, disassemble_info *info) {
 static void mips_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
-    MIPSCPUClass *mcc = MIPS_CPU_GET_CLASS(dev);
+    const MIPSCPUClass *mcc = MIPS_CPU_GET_CLASS(dev);
     Error *local_err = NULL;
 
     cpu_exec_realizefn(cs, &local_err);
diff --git a/target/moxie/cpu.c b/target/moxie/cpu.c
index 927b1a1e44..281714e8bc 100644
--- a/target/moxie/cpu.c
+++ b/target/moxie/cpu.c
@@ -40,7 +40,7 @@ static bool moxie_cpu_has_work(CPUState *cs)
 static void moxie_cpu_reset(CPUState *s)
 {
     MoxieCPU *cpu = MOXIE_CPU(s);
-    MoxieCPUClass *mcc = MOXIE_CPU_GET_CLASS(cpu);
+    const MoxieCPUClass *mcc = MOXIE_CPU_GET_CLASS(cpu);
     CPUMoxieState *env = &cpu->env;
 
     mcc->parent_reset(s);
@@ -58,7 +58,7 @@ static void moxie_cpu_disas_set_info(CPUState *cpu, disassemble_info *info)
 static void moxie_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
-    MoxieCPUClass *mcc = MOXIE_CPU_GET_CLASS(dev);
+    const MoxieCPUClass *mcc = MOXIE_CPU_GET_CLASS(dev);
     Error *local_err = NULL;
 
     cpu_exec_realizefn(cs, &local_err);
diff --git a/target/nios2/cpu.c b/target/nios2/cpu.c
index d56bb7245a..331758eada 100644
--- a/target/nios2/cpu.c
+++ b/target/nios2/cpu.c
@@ -43,7 +43,7 @@ static bool nios2_cpu_has_work(CPUState *cs)
 static void nios2_cpu_reset(CPUState *cs)
 {
     Nios2CPU *cpu = NIOS2_CPU(cs);
-    Nios2CPUClass *ncc = NIOS2_CPU_GET_CLASS(cpu);
+    const Nios2CPUClass *ncc = NIOS2_CPU_GET_CLASS(cpu);
     CPUNios2State *env = &cpu->env;
 
     if (qemu_loglevel_mask(CPU_LOG_RESET)) {
@@ -95,7 +95,7 @@ Nios2CPU *cpu_nios2_init(const char *cpu_model)
 static void nios2_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
-    Nios2CPUClass *ncc = NIOS2_CPU_GET_CLASS(dev);
+    const Nios2CPUClass *ncc = NIOS2_CPU_GET_CLASS(dev);
     Error *local_err = NULL;
 
     cpu_exec_realizefn(cs, &local_err);
@@ -139,7 +139,7 @@ static void nios2_cpu_disas_set_info(CPUState *cpu, disassemble_info *info)
 static int nios2_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
 {
     Nios2CPU *cpu = NIOS2_CPU(cs);
-    CPUClass *cc = CPU_GET_CLASS(cs);
+    const CPUClass *cc = CPU_GET_CLASS(cs);
     CPUNios2State *env = &cpu->env;
 
     if (n > cc->gdb_num_core_regs) {
@@ -161,7 +161,7 @@ static int nios2_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
 static int nios2_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
 {
     Nios2CPU *cpu = NIOS2_CPU(cs);
-    CPUClass *cc = CPU_GET_CLASS(cs);
+    const CPUClass *cc = CPU_GET_CLASS(cs);
     CPUNios2State *env = &cpu->env;
 
     if (n > cc->gdb_num_core_regs) {
diff --git a/target/openrisc/cpu.c b/target/openrisc/cpu.c
index 7fd2b9a216..b0e545d572 100644
--- a/target/openrisc/cpu.c
+++ b/target/openrisc/cpu.c
@@ -40,7 +40,7 @@ static bool openrisc_cpu_has_work(CPUState *cs)
 static void openrisc_cpu_reset(CPUState *s)
 {
     OpenRISCCPU *cpu = OPENRISC_CPU(s);
-    OpenRISCCPUClass *occ = OPENRISC_CPU_GET_CLASS(cpu);
+    const OpenRISCCPUClass *occ = OPENRISC_CPU_GET_CLASS(cpu);
 
     occ->parent_reset(s);
 
@@ -74,7 +74,7 @@ static inline void set_feature(OpenRISCCPU *cpu, int feature)
 static void openrisc_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
-    OpenRISCCPUClass *occ = OPENRISC_CPU_GET_CLASS(dev);
+    const OpenRISCCPUClass *occ = OPENRISC_CPU_GET_CLASS(dev);
     Error *local_err = NULL;
 
     cpu_exec_realizefn(cs, &local_err);
diff --git a/target/openrisc/gdbstub.c b/target/openrisc/gdbstub.c
index b18c7e9f05..a78a8e61e4 100644
--- a/target/openrisc/gdbstub.c
+++ b/target/openrisc/gdbstub.c
@@ -50,7 +50,7 @@ int openrisc_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
 int openrisc_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
 {
     OpenRISCCPU *cpu = OPENRISC_CPU(cs);
-    CPUClass *cc = CPU_GET_CLASS(cs);
+    const CPUClass *cc = CPU_GET_CLASS(cs);
     CPUOpenRISCState *env = &cpu->env;
     uint32_t tmp;
 
diff --git a/target/ppc/arch_dump.c b/target/ppc/arch_dump.c
index 28d9cc7d79..9d2d226dd9 100644
--- a/target/ppc/arch_dump.c
+++ b/target/ppc/arch_dump.c
@@ -225,7 +225,7 @@ int cpu_get_dump_info(ArchDumpInfo *info,
                       const struct GuestPhysBlockList *guest_phys_blocks)
 {
     PowerPCCPU *cpu = POWERPC_CPU(first_cpu);
-    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
+    const PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
 
     info->d_machine = PPC_ELF_MACHINE;
     info->d_class = ELFCLASS;
diff --git a/target/ppc/compat.c b/target/ppc/compat.c
index e8ec1e19e7..e43d58f325 100644
--- a/target/ppc/compat.c
+++ b/target/ppc/compat.c
@@ -85,7 +85,7 @@ static const CompatInfo *compat_by_pvr(uint32_t pvr)
 bool ppc_check_compat(PowerPCCPU *cpu, uint32_t compat_pvr,
                       uint32_t min_compat_pvr, uint32_t max_compat_pvr)
 {
-    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
+    const PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
     const CompatInfo *compat = compat_by_pvr(compat_pvr);
     const CompatInfo *min = compat_by_pvr(min_compat_pvr);
     const CompatInfo *max = compat_by_pvr(max_compat_pvr);
@@ -115,7 +115,7 @@ void ppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr, Error **errp)
 {
     const CompatInfo *compat = compat_by_pvr(compat_pvr);
     CPUPPCState *env = &cpu->env;
-    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
+    const PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
     uint64_t pcr;
 
     if (!compat_pvr) {
diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c
index f4ee7aacd2..b51dc2da45 100644
--- a/target/ppc/excp_helper.c
+++ b/target/ppc/excp_helper.c
@@ -314,7 +314,7 @@ static inline void powerpc_excp(PowerPCCPU *cpu, int excp_model, int excp)
 
         /* "PAPR mode" built-in hypercall emulation */
         if ((lev == 1) && cpu->vhyp) {
-            PPCVirtualHypervisorClass *vhc =
+            const PPCVirtualHypervisorClass *vhc =
                 PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp);
             vhc->hypercall(cpu->vhyp, cpu);
             return;
diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
index 14d34e512f..c895543fbd 100644
--- a/target/ppc/mmu-hash64.c
+++ b/target/ppc/mmu-hash64.c
@@ -422,7 +422,7 @@ const ppc_hash_pte64_t *ppc_hash64_map_hptes(PowerPCCPU *cpu,
     const ppc_hash_pte64_t *hptes;
 
     if (cpu->vhyp) {
-        PPCVirtualHypervisorClass *vhc =
+        const PPCVirtualHypervisorClass *vhc =
             PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp);
         return vhc->map_hptes(cpu->vhyp, ptex, n);
     }
@@ -442,7 +442,7 @@ void ppc_hash64_unmap_hptes(PowerPCCPU *cpu, const ppc_hash_pte64_t *hptes,
                             hwaddr ptex, int n)
 {
     if (cpu->vhyp) {
-        PPCVirtualHypervisorClass *vhc =
+        const PPCVirtualHypervisorClass *vhc =
             PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp);
         vhc->unmap_hptes(cpu->vhyp, hptes, ptex, n);
         return;
@@ -922,7 +922,7 @@ void ppc_hash64_store_hpte(PowerPCCPU *cpu, hwaddr ptex,
     hwaddr offset = ptex * HASH_PTE_SIZE_64;
 
     if (cpu->vhyp) {
-        PPCVirtualHypervisorClass *vhc =
+        const PPCVirtualHypervisorClass *vhc =
             PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp);
         vhc->store_hpte(cpu->vhyp, ptex, pte0, pte1);
         return;
diff --git a/target/ppc/mmu_helper.c b/target/ppc/mmu_helper.c
index 65d1c8692d..64f12db168 100644
--- a/target/ppc/mmu_helper.c
+++ b/target/ppc/mmu_helper.c
@@ -2902,7 +2902,7 @@ void tlb_fill(CPUState *cs, target_ulong addr, MMUAccessType access_type,
               int mmu_idx, uintptr_t retaddr)
 {
     PowerPCCPU *cpu = POWERPC_CPU(cs);
-    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cs);
+    const PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cs);
     CPUPPCState *env = &cpu->env;
     int ret;
 
diff --git a/target/ppc/translate_init.c b/target/ppc/translate_init.c
index ee8ff04fd2..de6f7e0be8 100644
--- a/target/ppc/translate_init.c
+++ b/target/ppc/translate_init.c
@@ -9049,7 +9049,7 @@ void cpu_ppc_set_papr(PowerPCCPU *cpu, PPCVirtualHypervisor *vhyp)
 /* Generic CPU instantiation routine                                         */
 static void init_ppc_proc(PowerPCCPU *cpu)
 {
-    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
+    const PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
     CPUPPCState *env = &cpu->env;
 #if !defined(CONFIG_USER_ONLY)
     int i;
@@ -9471,7 +9471,7 @@ static void fix_opcode_tables (opc_handler_t **ppc_opcodes)
 /*****************************************************************************/
 static void create_ppc_opcodes(PowerPCCPU *cpu, Error **errp)
 {
-    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
+    const PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
     CPUPPCState *env = &cpu->env;
     opcode_t *opc;
 
@@ -9788,7 +9788,7 @@ static void ppc_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
     PowerPCCPU *cpu = POWERPC_CPU(dev);
-    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
+    const PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
     Error *local_err = NULL;
 #if !defined(CONFIG_USER_ONLY)
     int max_smt = kvmppc_smt_threads();
@@ -10036,7 +10036,7 @@ static void ppc_cpu_realizefn(DeviceState *dev, Error **errp)
 static void ppc_cpu_unrealizefn(DeviceState *dev, Error **errp)
 {
     PowerPCCPU *cpu = POWERPC_CPU(dev);
-    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
+    const PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
     CPUPPCState *env = &cpu->env;
     Error *local_err = NULL;
     opc_handler_t **table, **table_2;
@@ -10412,7 +10412,7 @@ static void ppc_cpu_exec_enter(CPUState *cs)
 static void ppc_cpu_reset(CPUState *s)
 {
     PowerPCCPU *cpu = POWERPC_CPU(s);
-    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
+    const PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
     CPUPPCState *env = &cpu->env;
     target_ulong msr;
     int i;
@@ -10503,7 +10503,7 @@ static void ppc_cpu_initfn(Object *obj)
 {
     CPUState *cs = CPU(obj);
     PowerPCCPU *cpu = POWERPC_CPU(obj);
-    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
+    const PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
     CPUPPCState *env = &cpu->env;
 
     cs->env_ptr = env;
diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
index 07eb8b745f..b862c914af 100644
--- a/target/s390x/cpu.c
+++ b/target/s390x/cpu.c
@@ -75,7 +75,7 @@ static void s390_cpu_load_normal(CPUState *s)
 static void s390_cpu_reset(CPUState *s)
 {
     S390CPU *cpu = S390_CPU(s);
-    S390CPUClass *scc = S390_CPU_GET_CLASS(cpu);
+    const S390CPUClass *scc = S390_CPU_GET_CLASS(cpu);
     CPUS390XState *env = &cpu->env;
 
     env->pfault_token = -1UL;
@@ -123,7 +123,7 @@ static void s390_cpu_initial_reset(CPUState *s)
 static void s390_cpu_full_reset(CPUState *s)
 {
     S390CPU *cpu = S390_CPU(s);
-    S390CPUClass *scc = S390_CPU_GET_CLASS(cpu);
+    const S390CPUClass *scc = S390_CPU_GET_CLASS(cpu);
     CPUS390XState *env = &cpu->env;
     int i;
 
diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
index 1434d15315..b904083871 100644
--- a/target/s390x/cpu_models.c
+++ b/target/s390x/cpu_models.c
@@ -716,7 +716,7 @@ static inline void apply_cpu_model(const S390CPUModel *model, Error **errp)
 
 void s390_realize_cpu_model(CPUState *cs, Error **errp)
 {
-    S390CPUClass *xcc = S390_CPU_GET_CLASS(cs);
+    const S390CPUClass *xcc = S390_CPU_GET_CLASS(cs);
     S390CPU *cpu = S390_CPU(cs);
     const S390CPUModel *max_model;
 
@@ -886,7 +886,7 @@ void s390_cpu_model_register_props(Object *obj)
 static void s390_cpu_model_initfn(Object *obj)
 {
     S390CPU *cpu = S390_CPU(obj);
-    S390CPUClass *xcc = S390_CPU_GET_CLASS(cpu);
+    const S390CPUClass *xcc = S390_CPU_GET_CLASS(cpu);
 
     cpu->model = g_malloc0(sizeof(*cpu->model));
     /* copy the model, so we can modify it */
diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
index ac47154b83..cb9f368099 100644
--- a/target/s390x/kvm.c
+++ b/target/s390x/kvm.c
@@ -1620,7 +1620,7 @@ int kvm_s390_cpu_restart(S390CPU *cpu)
 static void sigp_initial_cpu_reset(CPUState *cs, run_on_cpu_data arg)
 {
     S390CPU *cpu = S390_CPU(cs);
-    S390CPUClass *scc = S390_CPU_GET_CLASS(cpu);
+    const S390CPUClass *scc = S390_CPU_GET_CLASS(cpu);
     SigpInfo *si = arg.host_ptr;
 
     cpu_synchronize_state(cs);
@@ -1632,7 +1632,7 @@ static void sigp_initial_cpu_reset(CPUState *cs, run_on_cpu_data arg)
 static void sigp_cpu_reset(CPUState *cs, run_on_cpu_data arg)
 {
     S390CPU *cpu = S390_CPU(cs);
-    S390CPUClass *scc = S390_CPU_GET_CLASS(cpu);
+    const S390CPUClass *scc = S390_CPU_GET_CLASS(cpu);
     SigpInfo *si = arg.host_ptr;
 
     cpu_synchronize_state(cs);
diff --git a/target/s390x/mem_helper.c b/target/s390x/mem_helper.c
index 675aba2e44..16782c9ae1 100644
--- a/target/s390x/mem_helper.c
+++ b/target/s390x/mem_helper.c
@@ -944,7 +944,7 @@ uint32_t HELPER(tprot)(uint64_t a1, uint64_t a2)
 uint64_t HELPER(iske)(CPUS390XState *env, uint64_t r2)
 {
     static S390SKeysState *ss;
-    static S390SKeysClass *skeyclass;
+    static const S390SKeysClass *skeyclass;
     uint64_t addr = get_address(env, 0, 0, r2);
     uint8_t key;
 
@@ -967,7 +967,7 @@ uint64_t HELPER(iske)(CPUS390XState *env, uint64_t r2)
 void HELPER(sske)(CPUS390XState *env, uint64_t r1, uint64_t r2)
 {
     static S390SKeysState *ss;
-    static S390SKeysClass *skeyclass;
+    static const S390SKeysClass *skeyclass;
     uint64_t addr = get_address(env, 0, 0, r2);
     uint8_t key;
 
@@ -988,7 +988,7 @@ void HELPER(sske)(CPUS390XState *env, uint64_t r1, uint64_t r2)
 uint32_t HELPER(rrbe)(CPUS390XState *env, uint64_t r2)
 {
     static S390SKeysState *ss;
-    static S390SKeysClass *skeyclass;
+    static const S390SKeysClass *skeyclass;
     uint8_t re, key;
 
     if (r2 > ram_size) {
diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c
index 93b0e61366..cbbd16eac5 100644
--- a/target/s390x/misc_helper.c
+++ b/target/s390x/misc_helper.c
@@ -124,7 +124,7 @@ uint32_t HELPER(servc)(CPUS390XState *env, uint64_t r1, uint64_t r2)
 #ifndef CONFIG_USER_ONLY
 static int modified_clear_reset(S390CPU *cpu)
 {
-    S390CPUClass *scc = S390_CPU_GET_CLASS(cpu);
+    const S390CPUClass *scc = S390_CPU_GET_CLASS(cpu);
     CPUState *t;
 
     pause_all_vcpus();
@@ -143,7 +143,7 @@ static int modified_clear_reset(S390CPU *cpu)
 
 static int load_normal_reset(S390CPU *cpu)
 {
-    S390CPUClass *scc = S390_CPU_GET_CLASS(cpu);
+    const S390CPUClass *scc = S390_CPU_GET_CLASS(cpu);
     CPUState *t;
 
     pause_all_vcpus();
@@ -167,7 +167,7 @@ int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3)
     uint64_t action = env->regs[r3];
     Object *obj;
     DIAG288State *diag288;
-    DIAG288Class *diag288_class;
+    const DIAG288Class *diag288_class;
 
     if (r1 % 2 || action != 0) {
         return -1;
diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c
index b11a02706c..56570a6879 100644
--- a/target/s390x/mmu_helper.c
+++ b/target/s390x/mmu_helper.c
@@ -313,7 +313,7 @@ int mmu_translate(CPUS390XState *env, target_ulong vaddr, int rw, uint64_t asc,
                   target_ulong *raddr, int *flags, bool exc)
 {
     static S390SKeysState *ss;
-    static S390SKeysClass *skeyclass;
+    static const S390SKeysClass *skeyclass;
     int r = -1;
     uint8_t key;
 
diff --git a/target/sh4/cpu.c b/target/sh4/cpu.c
index 9a481c35dc..11da19d62f 100644
--- a/target/sh4/cpu.c
+++ b/target/sh4/cpu.c
@@ -51,7 +51,7 @@ static bool superh_cpu_has_work(CPUState *cs)
 static void superh_cpu_reset(CPUState *s)
 {
     SuperHCPU *cpu = SUPERH_CPU(s);
-    SuperHCPUClass *scc = SUPERH_CPU_GET_CLASS(cpu);
+    const SuperHCPUClass *scc = SUPERH_CPU_GET_CLASS(cpu);
     CPUSH4State *env = &cpu->env;
 
     scc->parent_reset(s);
@@ -242,7 +242,7 @@ static const TypeInfo sh7785_type_info = {
 static void superh_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
-    SuperHCPUClass *scc = SUPERH_CPU_GET_CLASS(dev);
+    const SuperHCPUClass *scc = SUPERH_CPU_GET_CLASS(dev);
     Error *local_err = NULL;
 
     cpu_exec_realizefn(cs, &local_err);
diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
index d606eb53f4..188f544290 100644
--- a/target/sparc/cpu.c
+++ b/target/sparc/cpu.c
@@ -31,7 +31,7 @@ static int cpu_sparc_find_by_name(sparc_def_t *cpu_def, const char *cpu_model);
 static void sparc_cpu_reset(CPUState *s)
 {
     SPARCCPU *cpu = SPARC_CPU(s);
-    SPARCCPUClass *scc = SPARC_CPU_GET_CLASS(cpu);
+    const SPARCCPUClass *scc = SPARC_CPU_GET_CLASS(cpu);
     CPUSPARCState *env = &cpu->env;
 
     scc->parent_reset(s);
@@ -799,7 +799,7 @@ static bool sparc_cpu_has_work(CPUState *cs)
 static void sparc_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
-    SPARCCPUClass *scc = SPARC_CPU_GET_CLASS(dev);
+    const SPARCCPUClass *scc = SPARC_CPU_GET_CLASS(dev);
     Error *local_err = NULL;
 #if defined(CONFIG_USER_ONLY)
     SPARCCPU *cpu = SPARC_CPU(dev);
diff --git a/target/tilegx/cpu.c b/target/tilegx/cpu.c
index d90e38e88c..71d9c23e03 100644
--- a/target/tilegx/cpu.c
+++ b/target/tilegx/cpu.c
@@ -79,7 +79,7 @@ static bool tilegx_cpu_has_work(CPUState *cs)
 static void tilegx_cpu_reset(CPUState *s)
 {
     TileGXCPU *cpu = TILEGX_CPU(s);
-    TileGXCPUClass *tcc = TILEGX_CPU_GET_CLASS(cpu);
+    const TileGXCPUClass *tcc = TILEGX_CPU_GET_CLASS(cpu);
     CPUTLGState *env = &cpu->env;
 
     tcc->parent_reset(s);
@@ -90,7 +90,7 @@ static void tilegx_cpu_reset(CPUState *s)
 static void tilegx_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
-    TileGXCPUClass *tcc = TILEGX_CPU_GET_CLASS(dev);
+    const TileGXCPUClass *tcc = TILEGX_CPU_GET_CLASS(dev);
     Error *local_err = NULL;
 
     cpu_exec_realizefn(cs, &local_err);
diff --git a/target/tricore/cpu.c b/target/tricore/cpu.c
index 08f50e2ba7..73a3dd436d 100644
--- a/target/tricore/cpu.c
+++ b/target/tricore/cpu.c
@@ -48,7 +48,7 @@ static void tricore_cpu_synchronize_from_tb(CPUState *cs,
 static void tricore_cpu_reset(CPUState *s)
 {
     TriCoreCPU *cpu = TRICORE_CPU(s);
-    TriCoreCPUClass *tcc = TRICORE_CPU_GET_CLASS(cpu);
+    const TriCoreCPUClass *tcc = TRICORE_CPU_GET_CLASS(cpu);
     CPUTriCoreState *env = &cpu->env;
 
     tcc->parent_reset(s);
@@ -65,7 +65,7 @@ static void tricore_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
     TriCoreCPU *cpu = TRICORE_CPU(dev);
-    TriCoreCPUClass *tcc = TRICORE_CPU_GET_CLASS(dev);
+    const TriCoreCPUClass *tcc = TRICORE_CPU_GET_CLASS(dev);
     CPUTriCoreState *env = &cpu->env;
     Error *local_err = NULL;
 
diff --git a/target/unicore32/cpu.c b/target/unicore32/cpu.c
index c9b78ce68e..a10881be88 100644
--- a/target/unicore32/cpu.c
+++ b/target/unicore32/cpu.c
@@ -102,7 +102,7 @@ static const UniCore32CPUInfo uc32_cpus[] = {
 static void uc32_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
-    UniCore32CPUClass *ucc = UNICORE32_CPU_GET_CLASS(dev);
+    const UniCore32CPUClass *ucc = UNICORE32_CPU_GET_CLASS(dev);
     Error *local_err = NULL;
 
     cpu_exec_realizefn(cs, &local_err);
diff --git a/target/xtensa/cpu.c b/target/xtensa/cpu.c
index cd7f95823f..4500f7f556 100644
--- a/target/xtensa/cpu.c
+++ b/target/xtensa/cpu.c
@@ -54,7 +54,7 @@ static bool xtensa_cpu_has_work(CPUState *cs)
 static void xtensa_cpu_reset(CPUState *s)
 {
     XtensaCPU *cpu = XTENSA_CPU(s);
-    XtensaCPUClass *xcc = XTENSA_CPU_GET_CLASS(cpu);
+    const XtensaCPUClass *xcc = XTENSA_CPU_GET_CLASS(cpu);
     CPUXtensaState *env = &cpu->env;
 
     xcc->parent_reset(s);
@@ -100,7 +100,7 @@ static ObjectClass *xtensa_cpu_class_by_name(const char *cpu_model)
 static void xtensa_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
-    XtensaCPUClass *xcc = XTENSA_CPU_GET_CLASS(dev);
+    const XtensaCPUClass *xcc = XTENSA_CPU_GET_CLASS(dev);
     Error *local_err = NULL;
 
     cpu_exec_realizefn(cs, &local_err);
@@ -120,7 +120,7 @@ static void xtensa_cpu_initfn(Object *obj)
 {
     CPUState *cs = CPU(obj);
     XtensaCPU *cpu = XTENSA_CPU(obj);
-    XtensaCPUClass *xcc = XTENSA_CPU_GET_CLASS(obj);
+    const XtensaCPUClass *xcc = XTENSA_CPU_GET_CLASS(obj);
     CPUXtensaState *env = &cpu->env;
     static bool tcg_inited;
 
diff --git a/tests/check-qom-interface.c b/tests/check-qom-interface.c
index f87c9aaa8a..42ff3aa5a7 100644
--- a/tests/check-qom-interface.c
+++ b/tests/check-qom-interface.c
@@ -72,7 +72,7 @@ static void test_interface_impl(const char *type)
 {
     Object *obj = object_new(type);
     TestIf *iobj = TEST_IF(obj);
-    TestIfClass *ioc = TEST_IF_GET_CLASS(iobj);
+    const TestIfClass *ioc = TEST_IF_GET_CLASS(iobj);
 
     g_assert(iobj);
     g_assert(ioc->test == PATTERN);
diff --git a/user-exec.c b/user-exec.c
index a8f95fa1e1..177c764385 100644
--- a/user-exec.c
+++ b/user-exec.c
@@ -58,7 +58,7 @@ static inline int handle_cpu_signal(uintptr_t pc, unsigned long address,
                                     int is_write, sigset_t *old_set)
 {
     CPUState *cpu = current_cpu;
-    CPUClass *cc;
+    const CPUClass *cc;
     int ret;
 
     /* For synchronous signals we expect to be coming from the vCPU
diff --git a/vl.c b/vl.c
index 0b4ed5241c..fba5a16aad 100644
--- a/vl.c
+++ b/vl.c
@@ -1687,7 +1687,7 @@ static int qemu_debug_requested(void)
 
 void qemu_system_reset(bool report)
 {
-    MachineClass *mc;
+    const MachineClass *mc;
 
     mc = current_machine ? MACHINE_GET_CLASS(current_machine) : NULL;
 
-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC v2 8/9] qom: Make class cast macros/functions const-aware
  2017-03-29 19:41 [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers Eduardo Habkost
                   ` (6 preceding siblings ...)
  2017-03-29 19:41 ` [Qemu-devel] [RFC v2 7/9] Use const variables for *_GET_CLASS values Eduardo Habkost
@ 2017-03-29 19:41 ` Eduardo Habkost
  2017-03-29 19:41 ` [Qemu-devel] [RFC v2 9/9] qom: Make object_get_class() return const pointer Eduardo Habkost
                   ` (3 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: Eduardo Habkost @ 2017-03-29 19:41 UTC (permalink / raw)
  To: qemu-devel

Use the QUALIFIED_CAST macro to make OBJECT_CLASS,
OBJECT_CLASS_CHECK, object_class_dynamic_cast(), and
object_class_dynamic_cast_assert() return a const pointer if the
class argument is already a const pointer.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 include/qom/object.h | 31 +++++++++++++++++++++----------
 qom/object.c         | 15 ++++++++-------
 2 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index 4af3c8e232..2b1513d2f2 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -527,7 +527,7 @@ struct TypeInfo
  * this function will always succeed.
  */
 #define OBJECT_CLASS(class) \
-    ((ObjectClass *)(class))
+    (QUALIFIED_CAST(typeof(class), ObjectClass *)(class))
 
 /**
  * OBJECT_CHECK:
@@ -556,9 +556,10 @@ struct TypeInfo
  * typically wrapped by each type to perform type safe casts of a class to a
  * specific class type.
  */
-#define OBJECT_CLASS_CHECK(class_type, class, name) \
-    ((class_type *)object_class_dynamic_cast_assert(OBJECT_CLASS(class), (name), \
-                                               __FILE__, __LINE__, __func__))
+#define OBJECT_CLASS_CHECK(class_type, class, name)                \
+    (QUALIFIED_CAST(typeof(class), class_type *)                   \
+     object_class_dynamic_cast_assert(OBJECT_CLASS(class), (name), \
+                                      __FILE__, __LINE__, __func__))
 
 /**
  * OBJECT_GET_CLASS:
@@ -845,10 +846,16 @@ Type type_register(const TypeInfo *info);
  * enabled.  This function is not meant to be called directly, but only through
  * the wrapper macros OBJECT_CLASS_CHECK and INTERFACE_CHECK.
  */
-ObjectClass *object_class_dynamic_cast_assert(ObjectClass *klass,
-                                              const char *typename,
-                                              const char *file, int line,
-                                              const char *func);
+#define object_class_dynamic_cast_assert(klass, typename, file, line, func) \
+    (QUALIFIED_CAST(typeof(klass), ObjectClass *)                           \
+     object_class_dynamic_cast_assert_const((ObjectClass *)klass, typename, \
+                                            file, line, func))
+
+const ObjectClass *object_class_dynamic_cast_assert_const(ObjectClass *klass,
+                                                          const char *typename,
+                                                          const char *file,
+                                                          int line,
+                                                          const char *func);
 
 /**
  * object_class_dynamic_cast:
@@ -864,8 +871,12 @@ ObjectClass *object_class_dynamic_cast_assert(ObjectClass *klass,
  * classes or interfaces on the hierarchy leading to @klass implement
  * it.  (FIXME: perhaps this can be detected at type definition time?)
  */
-ObjectClass *object_class_dynamic_cast(ObjectClass *klass,
-                                       const char *typename);
+#define object_class_dynamic_cast(klass, typename) \
+    (QUALIFIED_CAST(typeof(klass), ObjectClass *)  \
+     object_class_dynamic_cast_const(klass, typename))
+
+const ObjectClass *object_class_dynamic_cast_const(const ObjectClass *klass,
+                                                   const char *typename);
 
 /**
  * object_class_get_parent:
diff --git a/qom/object.c b/qom/object.c
index 41dae18420..9b6c990ac5 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -648,10 +648,10 @@ out:
     return obj;
 }
 
-ObjectClass *object_class_dynamic_cast(ObjectClass *class,
-                                       const char *typename)
+const ObjectClass *object_class_dynamic_cast_const(const ObjectClass *class,
+                                                   const char *typename)
 {
-    ObjectClass *ret = NULL;
+    const ObjectClass *ret = NULL;
     TypeImpl *target_type;
     TypeImpl *type;
 
@@ -696,10 +696,11 @@ ObjectClass *object_class_dynamic_cast(ObjectClass *class,
     return ret;
 }
 
-ObjectClass *object_class_dynamic_cast_assert(ObjectClass *class,
-                                              const char *typename,
-                                              const char *file, int line,
-                                              const char *func)
+const ObjectClass *object_class_dynamic_cast_assert_const(ObjectClass *class,
+                                                          const char *typename,
+                                                          const char *file,
+                                                          int line,
+                                                          const char *func)
 {
     ObjectClass *ret;
 
-- 
2.11.0.259.g40922b1

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

* [Qemu-devel] [RFC v2 9/9] qom: Make object_get_class() return const pointer
  2017-03-29 19:41 [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers Eduardo Habkost
                   ` (7 preceding siblings ...)
  2017-03-29 19:41 ` [Qemu-devel] [RFC v2 8/9] qom: Make class cast macros/functions const-aware Eduardo Habkost
@ 2017-03-29 19:41 ` Eduardo Habkost
  2017-03-29 19:56 ` [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers Laszlo Ersek
                   ` (2 subsequent siblings)
  11 siblings, 0 replies; 17+ messages in thread
From: Eduardo Habkost @ 2017-03-29 19:41 UTC (permalink / raw)
  To: qemu-devel

To avoid having code accidentaly changing class structs outside
class_init, make object_get_class() return a const pointer.

This will automatically affect OBJECT_GET_CLASS,
OBJECT_CLASS_CHECK, and the macros defined using them, because
OBJECT_CLASS_CHECK is already const-aware.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 include/qom/object.h | 2 +-
 qom/object.c         | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index 2b1513d2f2..de8ab70d13 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -803,7 +803,7 @@ Object *object_dynamic_cast_assert(Object *obj, const char *typename,
  *
  * Returns: The #ObjectClass of the type associated with @obj.
  */
-ObjectClass *object_get_class(Object *obj);
+const ObjectClass *object_get_class(Object *obj);
 
 /**
  * object_get_typename:
diff --git a/qom/object.c b/qom/object.c
index 9b6c990ac5..297cce8fc2 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -747,7 +747,7 @@ const char *object_get_typename(Object *obj)
     return obj->class->type->name;
 }
 
-ObjectClass *object_get_class(Object *obj)
+const ObjectClass *object_get_class(Object *obj)
 {
     return obj->class;
 }
-- 
2.11.0.259.g40922b1

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

* Re: [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers
  2017-03-29 19:41 [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers Eduardo Habkost
                   ` (8 preceding siblings ...)
  2017-03-29 19:41 ` [Qemu-devel] [RFC v2 9/9] qom: Make object_get_class() return const pointer Eduardo Habkost
@ 2017-03-29 19:56 ` Laszlo Ersek
  2017-03-29 20:11   ` Eduardo Habkost
  2017-03-29 20:16 ` Eduardo Habkost
  2017-03-30  8:59 ` Paolo Bonzini
  11 siblings, 1 reply; 17+ messages in thread
From: Laszlo Ersek @ 2017-03-29 19:56 UTC (permalink / raw)
  To: Eduardo Habkost, qemu-devel
  Cc: Juergen Gross, Matthew Rosato, Alexander Graf,
	Dr. David Alan Gilbert, Hervé Poussineau, Igor Mammedov,
	Paolo Bonzini, Andreas Färber

On 03/29/17 21:41, Eduardo Habkost wrote:
> The problem
> -----------
> 
> QOM has a data model where class struct data is static: class
> structs are initialized at class_init, and never changed again.
> 
> ...except for a few rare cases where class data is changed
> outside class_init. Those cases are:
> 
>   qbus_realize(), code added by:
>   commit 61de36761b565a4138d8ad7ec75489ab28fe84b6
>   Date:   Thu Feb 6 16:08:15 2014 +0100
>       qdev: Keep global allocation counter per bus
> 
>   mips_jazz_init(), code added by:
>   commit 54e755588cf1e90f0b1460c4e8e6b6a54b6d3a32
>   Date:   Mon Nov 4 23:26:17 2013 +0100
>       mips jazz: do not raise data bus exception when accessing invalid addresses
> 
>   xen_set_dynamic_sysbus(), code added by:
>   commit 3a6c9172ac5951e6dac2b3f6cbce3cfccdec5894
>   Date:   Tue Nov 22 07:10:58 2016 +0100
>       xen: create qdev for each backend device
> 
>   s390_cpu_realizefn(), code added by:
>   commit c6644fc88bed1176f67b4b7a9df691bcf25c0c5b
>   Date:   Fri Mar 4 12:34:31 2016 -0500
>       s390x/cpu: Get rid of side effects when creating a vcpu
> 
> I want to prevent that from happening again.
> 
> Proposal
> --------
> 
> I propose we make object_get_class() and *_GET_CLASS macros
> return const pointers. This way, anybody willing to change class
> structs outside class_init will (hopefully) be aware that they
> are doing something unexpected.
> 
> This would be very simple and trivial, except that:
> * OBJECT_CLASS_CHECK cast its return value to a different
>   (non-const) pointer type.
> * OBJECT_CLASS_CHECK-based macros are used everywhere to
>   cast class pointers to different class types.
> 
> I have addressed this problem using C11's _Generic keyword.
> _Generic allows us to make OBJECT_CLASS_CHECK and other macros
> return a const pointer if its argument is a const pointer, and a
> non-const pointer otherwise.
> 
> This series changes OBJECT_CLASS, OBJECT_CLASS_CHECK,
> object_class_dynamic_cast_assert(), object_class_dynamic_cast(),
> and object_class_get_parent() to exhibit this const-aware
> behavior.
> 
> If the compiler doesn't support _Generic, we keep the old
> behavior, and the cast macros will keep returning non-const
> pointers.
> 
> ---
> Cc: Alexander Graf <agraf@suse.de>
> Cc: Hervé Poussineau <hpoussin@reactos.org>
> Cc: Juergen Gross <jgross@suse.com>
> Cc: Matthew Rosato <mjrosato@linux.vnet.ibm.com>
> Cc: Laszlo Ersek <lersek@redhat.com>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Cc: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
> Cc: Igor Mammedov <imammedo@redhat.com>
> Cc: Andreas Färber <afaerber@suse.de>
> 
> Eduardo Habkost (9):
>   configure: test if _Generic works as expected
>   Simplify code using *MACHINE_GET_CLASS
>   qom: QUALIFIED_CAST helper macro
>   qom: Make object_class_get_parent() const-aware
>   Make class parameter const at some functions
>   Explicitly cast the *_GET_CLASS() value when we break the rules
>   Use const variables for *_GET_CLASS values
>   qom: Make class cast macros/functions const-aware
>   qom: Make object_get_class() return const pointer

Only superficial comments:

(1) HACKING has some notes on C99 and C11 usage; I think you should
update them as well.

(2) Can you CC the maintainers of the code being modified on each patch?

(3) (Corollary of the former -- I'm not seeing patch 7 yet, which I
assume is the big one, from the cumulative diffstat) -- is it possible
to split up patch 7 more fine-grained? To help reviewers. (I don't
maintain anything in QEMU, so this is just a generic suggestion;
everyone feel free to disagree.)

Thanks
Laszlo

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

* Re: [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers
  2017-03-29 19:56 ` [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers Laszlo Ersek
@ 2017-03-29 20:11   ` Eduardo Habkost
  0 siblings, 0 replies; 17+ messages in thread
From: Eduardo Habkost @ 2017-03-29 20:11 UTC (permalink / raw)
  To: Laszlo Ersek
  Cc: qemu-devel, Juergen Gross, Matthew Rosato, Alexander Graf,
	Dr. David Alan Gilbert, Hervé Poussineau, Igor Mammedov,
	Paolo Bonzini, Andreas Färber

On Wed, Mar 29, 2017 at 09:56:54PM +0200, Laszlo Ersek wrote:
> On 03/29/17 21:41, Eduardo Habkost wrote:
> > The problem
> > -----------
> > 
> > QOM has a data model where class struct data is static: class
> > structs are initialized at class_init, and never changed again.
> > 
> > ...except for a few rare cases where class data is changed
> > outside class_init. Those cases are:
> > 
> >   qbus_realize(), code added by:
> >   commit 61de36761b565a4138d8ad7ec75489ab28fe84b6
> >   Date:   Thu Feb 6 16:08:15 2014 +0100
> >       qdev: Keep global allocation counter per bus
> > 
> >   mips_jazz_init(), code added by:
> >   commit 54e755588cf1e90f0b1460c4e8e6b6a54b6d3a32
> >   Date:   Mon Nov 4 23:26:17 2013 +0100
> >       mips jazz: do not raise data bus exception when accessing invalid addresses
> > 
> >   xen_set_dynamic_sysbus(), code added by:
> >   commit 3a6c9172ac5951e6dac2b3f6cbce3cfccdec5894
> >   Date:   Tue Nov 22 07:10:58 2016 +0100
> >       xen: create qdev for each backend device
> > 
> >   s390_cpu_realizefn(), code added by:
> >   commit c6644fc88bed1176f67b4b7a9df691bcf25c0c5b
> >   Date:   Fri Mar 4 12:34:31 2016 -0500
> >       s390x/cpu: Get rid of side effects when creating a vcpu
> > 
> > I want to prevent that from happening again.
> > 
> > Proposal
> > --------
> > 
> > I propose we make object_get_class() and *_GET_CLASS macros
> > return const pointers. This way, anybody willing to change class
> > structs outside class_init will (hopefully) be aware that they
> > are doing something unexpected.
> > 
> > This would be very simple and trivial, except that:
> > * OBJECT_CLASS_CHECK cast its return value to a different
> >   (non-const) pointer type.
> > * OBJECT_CLASS_CHECK-based macros are used everywhere to
> >   cast class pointers to different class types.
> > 
> > I have addressed this problem using C11's _Generic keyword.
> > _Generic allows us to make OBJECT_CLASS_CHECK and other macros
> > return a const pointer if its argument is a const pointer, and a
> > non-const pointer otherwise.
> > 
> > This series changes OBJECT_CLASS, OBJECT_CLASS_CHECK,
> > object_class_dynamic_cast_assert(), object_class_dynamic_cast(),
> > and object_class_get_parent() to exhibit this const-aware
> > behavior.
> > 
> > If the compiler doesn't support _Generic, we keep the old
> > behavior, and the cast macros will keep returning non-const
> > pointers.
> > 
> > ---
> > Cc: Alexander Graf <agraf@suse.de>
> > Cc: Hervé Poussineau <hpoussin@reactos.org>
> > Cc: Juergen Gross <jgross@suse.com>
> > Cc: Matthew Rosato <mjrosato@linux.vnet.ibm.com>
> > Cc: Laszlo Ersek <lersek@redhat.com>
> > Cc: Paolo Bonzini <pbonzini@redhat.com>
> > Cc: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
> > Cc: Igor Mammedov <imammedo@redhat.com>
> > Cc: Andreas Färber <afaerber@suse.de>
> > 
> > Eduardo Habkost (9):
> >   configure: test if _Generic works as expected
> >   Simplify code using *MACHINE_GET_CLASS
> >   qom: QUALIFIED_CAST helper macro
> >   qom: Make object_class_get_parent() const-aware
> >   Make class parameter const at some functions
> >   Explicitly cast the *_GET_CLASS() value when we break the rules
> >   Use const variables for *_GET_CLASS values
> >   qom: Make class cast macros/functions const-aware
> >   qom: Make object_get_class() return const pointer
> 
> Only superficial comments:
> 
> (1) HACKING has some notes on C99 and C11 usage; I think you should
> update them as well.

I will take a look, thanks!

> 
> (2) Can you CC the maintainers of the code being modified on each patch?

I can, on the shorter ones, but this will be difficult on patch
7, which is composed mostly of mechanical changes generated using
Coccinelle. I didn't want to generate a huge CC list just because
of those mechanical changes.

> 
> (3) (Corollary of the former -- I'm not seeing patch 7 yet, which I
> assume is the big one, from the cumulative diffstat) -- is it possible
> to split up patch 7 more fine-grained? To help reviewers. (I don't
> maintain anything in QEMU, so this is just a generic suggestion;
> everyone feel free to disagree.)

The coccinelle-generated parts of patch 7 will be hard to split,
but I can try to split the rest of the changes later.

I tried to keep the patch count smaller on purpose on the RFC,
because first I want to hear what people think of this proposal.
If people like it, I will split a few patches, especially:

* [RFC v2 2/9] Simplify code using *MACHINE_GET_CLASS
  (split the pc, machine core, and pci changes into separate patches)
* [RFC v2 5/9] Make class parameter const at some functions
  (split into one patch for each subsystem being changed)
* [RFC v2 6/9] Explicitly cast the *_GET_CLASS() value when we break the rules
  (not sure if I I will split it, but I will surely CC the
  maintainers for each subsystem)
* [RFC v2 7/9] Use const variables for *_GET_CLASS values
  (probably I will separate the coccinelle-generated changes from the others,
  and split the manual changes per subsystem)

-- 
Eduardo

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

* Re: [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers
  2017-03-29 19:41 [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers Eduardo Habkost
                   ` (9 preceding siblings ...)
  2017-03-29 19:56 ` [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers Laszlo Ersek
@ 2017-03-29 20:16 ` Eduardo Habkost
  2017-03-30  8:59 ` Paolo Bonzini
  11 siblings, 0 replies; 17+ messages in thread
From: Eduardo Habkost @ 2017-03-29 20:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: Alexander Graf, Hervé Poussineau, Juergen Gross,
	Matthew Rosato, Laszlo Ersek, Paolo Bonzini,
	Dr. David Alan Gilbert, Igor Mammedov, Andreas Färber

On Wed, Mar 29, 2017 at 04:41:39PM -0300, Eduardo Habkost wrote:
[...]
> Eduardo Habkost (9):
>   configure: test if _Generic works as expected
>   Simplify code using *MACHINE_GET_CLASS
>   qom: QUALIFIED_CAST helper macro
>   qom: Make object_class_get_parent() const-aware
>   Make class parameter const at some functions
>   Explicitly cast the *_GET_CLASS() value when we break the rules
>   Use const variables for *_GET_CLASS values

In case patch 7/9 never gets delivered to the list because of its
size, below is the commit message, containing a Coccinelle
script.

Git tree is available at:
  git://github.com/ehabkost/qemu-hacks.git work/const-classes


"""
Use const variables for the return value of *_GET_CLASS and
object_get_class(). This will allow us to make *_GET_CLASS and
object_get_class() return const pointers later.

Most of the changes were generated using the following Coccinelle
script, but some additional cases had to be udpated by hand after
running the script.

  @@
  type XClass;
  identifier oc;
  identifier X_GET_CLASS =~ ".*_GET_CLASS|object_get_class";
  @@
  -XClass *oc;
  +const XClass *oc;
   <+...
   oc = X_GET_CLASS(...);
   ...+>

  @@
  type XClass;
  identifier oc;
  identifier X_GET_CLASS =~ ".*_GET_CLASS|object_get_class";
  @@
  +const
   XClass *oc = X_GET_CLASS(...);
"""

>   qom: Make class cast macros/functions const-aware
>   qom: Make object_get_class() return const pointer
> 
>  configure                       | 20 +++++++++
>  include/qom/cpu.h               | 12 +++---
>  include/qom/object.h            | 94 ++++++++++++++++++++++++++++++++++-------
>  target/ppc/mmu-book3s-v3.h      |  2 +-
>  target/ppc/mmu-hash64.h         |  2 +-
>  target/s390x/cpu.h              |  2 +-
>  backends/cryptodev.c            | 10 ++---
>  backends/hostmem.c              |  2 +-
>  backends/rng.c                  |  4 +-
>  backends/tpm.c                  | 28 ++++++------
>  chardev/char-mux.c              |  2 +-
>  chardev/char.c                  | 10 ++---
>  cpu-exec.c                      | 14 +++---
>  device-hotplug.c                |  2 +-
>  disas.c                         |  4 +-
>  exec.c                          |  6 +--
>  gdbstub.c                       | 12 +++---
>  hmp.c                           |  4 +-
>  hw/acpi/acpi_interface.c        |  2 +-
>  hw/acpi/cpu.c                   |  8 ++--
>  hw/acpi/cpu_hotplug.c           |  4 +-
>  hw/acpi/ipmi.c                  |  2 +-
>  hw/acpi/memory_hotplug.c        |  2 +-
>  hw/acpi/nvdimm.c                |  4 +-
>  hw/acpi/pcihp.c                 |  4 +-
>  hw/arm/aspeed.c                 |  2 +-
>  hw/arm/aspeed_soc.c             |  4 +-
>  hw/arm/boot.c                   |  2 +-
>  hw/arm/exynos4_boards.c         |  2 +-
>  hw/arm/vexpress.c               |  2 +-
>  hw/arm/virt-acpi-build.c        |  6 +--
>  hw/arm/virt.c                   |  6 +--
>  hw/audio/cs4231a.c              | 10 ++---
>  hw/audio/gus.c                  |  6 +--
>  hw/audio/intel-hda.c            |  8 ++--
>  hw/audio/sb16.c                 |  6 +--
>  hw/block/dataplane/virtio-blk.c |  6 +--
>  hw/block/fdc.c                  |  8 ++--
>  hw/block/m25p80.c               |  2 +-
>  hw/char/serial-pci.c            |  2 +-
>  hw/char/virtio-console.c        |  6 +--
>  hw/char/virtio-serial-bus.c     | 18 ++++----
>  hw/core/bus.c                   |  4 +-
>  hw/core/fw-path-provider.c      |  2 +-
>  hw/core/generic-loader.c        |  2 +-
>  hw/core/hotplug.c               |  8 ++--
>  hw/core/loader.c                |  4 +-
>  hw/core/machine.c               |  5 +--
>  hw/core/nmi.c                   |  2 +-
>  hw/core/qdev-properties.c       |  4 +-
>  hw/core/qdev.c                  | 32 +++++++-------
>  hw/core/stream.c                |  4 +-
>  hw/core/sysbus.c                |  6 +--
>  hw/display/cirrus_vga.c         |  2 +-
>  hw/i2c/core.c                   | 10 ++---
>  hw/i2c/smbus.c                  |  8 ++--
>  hw/i386/acpi-build.c            | 16 +++----
>  hw/i386/kvm/i8254.c             |  2 +-
>  hw/i386/kvm/i8259.c             |  2 +-
>  hw/i386/pc.c                    | 32 +++++++-------
>  hw/i386/pc_piix.c               |  4 +-
>  hw/i386/pc_q35.c                |  4 +-
>  hw/i386/x86-iommu.c             |  2 +-
>  hw/ide/microdrive.c             |  4 +-
>  hw/ide/qdev.c                   |  2 +-
>  hw/input/adb.c                  |  6 +--
>  hw/input/virtio-input.c         | 12 +++---
>  hw/intc/apic_common.c           | 26 ++++++------
>  hw/intc/arm_gic.c               |  2 +-
>  hw/intc/arm_gic_common.c        |  4 +-
>  hw/intc/arm_gic_kvm.c           |  4 +-
>  hw/intc/arm_gicv3.c             |  2 +-
>  hw/intc/arm_gicv3_common.c      |  4 +-
>  hw/intc/arm_gicv3_its_common.c  |  6 +--
>  hw/intc/arm_gicv3_kvm.c         |  4 +-
>  hw/intc/i8259.c                 |  2 +-
>  hw/intc/i8259_common.c          |  4 +-
>  hw/intc/ioapic_common.c         |  6 +--
>  hw/intc/xics.c                  | 26 ++++++------
>  hw/ipack/ipack.c                |  4 +-
>  hw/ipack/tpci200.c              | 12 +++---
>  hw/ipmi/ipmi_bmc_extern.c       | 12 +++---
>  hw/ipmi/ipmi_bmc_sim.c          | 24 +++++------
>  hw/ipmi/isa_ipmi_bt.c           | 22 +++++-----
>  hw/ipmi/isa_ipmi_kcs.c          | 20 ++++-----
>  hw/mem/pc-dimm.c                | 10 ++---
>  hw/mips/mips_jazz.c             |  2 +-
>  hw/misc/imx_ccm.c               |  2 +-
>  hw/net/e1000.c                  |  2 +-
>  hw/net/vhost_net.c              |  4 +-
>  hw/net/vmxnet3.c                |  2 +-
>  hw/nvram/fw_cfg.c               |  2 +-
>  hw/pci-bridge/pcie_root_port.c  |  8 ++--
>  hw/pci/pci.c                    | 17 ++++----
>  hw/pcmcia/pxa2xx.c              | 16 +++----
>  hw/ppc/pnv.c                    | 14 +++---
>  hw/ppc/pnv_core.c               |  2 +-
>  hw/ppc/pnv_xscom.c              |  6 +--
>  hw/ppc/prep.c                   |  8 ++--
>  hw/ppc/spapr.c                  | 50 +++++++++++-----------
>  hw/ppc/spapr_cpu_core.c         |  4 +-
>  hw/ppc/spapr_drc.c              | 20 ++++-----
>  hw/ppc/spapr_events.c           |  6 +--
>  hw/ppc/spapr_hcall.c            |  2 +-
>  hw/ppc/spapr_pci.c              | 14 +++---
>  hw/ppc/spapr_rtas.c             |  8 ++--
>  hw/ppc/spapr_vio.c              | 12 +++---
>  hw/s390x/css-bridge.c           |  2 +-
>  hw/s390x/css.c                  |  6 +--
>  hw/s390x/event-facility.c       | 14 +++---
>  hw/s390x/s390-skeys-kvm.c       |  2 +-
>  hw/s390x/s390-skeys.c           |  8 ++--
>  hw/s390x/s390-virtio-ccw.c      |  8 ++--
>  hw/s390x/sclp.c                 | 10 ++---
>  hw/s390x/virtio-ccw.c           | 12 +++---
>  hw/scsi/megasas.c               |  8 ++--
>  hw/scsi/mptconfig.c             |  6 +--
>  hw/scsi/scsi-bus.c              |  8 ++--
>  hw/scsi/vhost-scsi.c            |  4 +-
>  hw/scsi/virtio-scsi-dataplane.c |  6 +--
>  hw/scsi/vmw_pvscsi.c            |  2 +-
>  hw/sd/core.c                    | 18 ++++----
>  hw/sh4/sh7750.c                 |  2 +-
>  hw/smbios/smbios_type_38.c      |  2 +-
>  hw/sparc/sun4m.c                |  2 +-
>  hw/sparc64/sun4u.c              |  2 +-
>  hw/ssi/aspeed_smc.c             |  2 +-
>  hw/ssi/ssi.c                    |  8 ++--
>  hw/ssi/xilinx_spips.c           |  2 +-
>  hw/timer/i8254.c                |  2 +-
>  hw/timer/i8254_common.c         | 10 ++---
>  hw/timer/m48t59-isa.c           |  2 +-
>  hw/timer/m48t59.c               |  2 +-
>  hw/usb/bus.c                    | 32 +++++++-------
>  hw/usb/dev-smartcard-reader.c   |  8 ++--
>  hw/usb/hcd-ehci-pci.c           |  2 +-
>  hw/usb/hcd-ehci-sysbus.c        |  2 +-
>  hw/usb/hcd-uhci.c               |  2 +-
>  hw/vfio/amd-xgbe.c              |  2 +-
>  hw/vfio/calxeda-xgmac.c         |  2 +-
>  hw/virtio/vhost-vsock.c         |  4 +-
>  hw/virtio/vhost.c               |  2 +-
>  hw/virtio/virtio-bus.c          | 24 +++++------
>  hw/virtio/virtio-mmio.c         |  2 +-
>  hw/virtio/virtio-pci.c          | 20 ++++-----
>  hw/virtio/virtio.c              | 62 +++++++++++++--------------
>  hw/xen/xen_backend.c            |  3 +-
>  io/channel.c                    | 20 ++++-----
>  kvm-all.c                       |  2 +-
>  migration/migration.c           |  2 +-
>  migration/savevm.c              |  2 +-
>  monitor.c                       |  2 +-
>  net/filter.c                    |  6 +--
>  qdev-monitor.c                  | 12 +++---
>  qmp.c                           |  4 +-
>  qom/cpu.c                       | 26 ++++++------
>  qom/object.c                    | 31 +++++++-------
>  qom/object_interfaces.c         |  4 +-
>  target/alpha/cpu.c              |  2 +-
>  target/arm/cpu.c                |  8 ++--
>  target/arm/kvm.c                |  2 +-
>  target/cris/cpu.c               | 10 ++---
>  target/cris/helper.c            |  2 +-
>  target/hppa/cpu.c               |  2 +-
>  target/i386/cpu.c               | 10 ++---
>  target/i386/kvm.c               |  2 +-
>  target/i386/machine.c           |  3 +-
>  target/lm32/cpu.c               |  4 +-
>  target/lm32/gdbstub.c           |  2 +-
>  target/m68k/cpu.c               |  4 +-
>  target/microblaze/cpu.c         |  4 +-
>  target/microblaze/gdbstub.c     |  2 +-
>  target/mips/cpu.c               |  4 +-
>  target/moxie/cpu.c              |  4 +-
>  target/nios2/cpu.c              |  8 ++--
>  target/openrisc/cpu.c           |  4 +-
>  target/openrisc/gdbstub.c       |  2 +-
>  target/ppc/arch_dump.c          |  2 +-
>  target/ppc/compat.c             |  4 +-
>  target/ppc/excp_helper.c        |  2 +-
>  target/ppc/mmu-hash64.c         |  6 +--
>  target/ppc/mmu_helper.c         |  2 +-
>  target/ppc/translate_init.c     | 14 +++---
>  target/s390x/cpu.c              |  6 +--
>  target/s390x/cpu_models.c       |  4 +-
>  target/s390x/kvm.c              |  4 +-
>  target/s390x/mem_helper.c       |  6 +--
>  target/s390x/misc_helper.c      |  6 +--
>  target/s390x/mmu_helper.c       |  2 +-
>  target/sh4/cpu.c                |  4 +-
>  target/sparc/cpu.c              |  4 +-
>  target/tilegx/cpu.c             |  4 +-
>  target/tricore/cpu.c            |  4 +-
>  target/unicore32/cpu.c          |  2 +-
>  target/xtensa/cpu.c             |  6 +--
>  tests/check-qom-interface.c     |  2 +-
>  user-exec.c                     |  2 +-
>  vl.c                            |  2 +-
>  198 files changed, 800 insertions(+), 721 deletions(-)
> 
> -- 
> 2.11.0.259.g40922b1
> 

-- 
Eduardo

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

* Re: [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers
  2017-03-29 19:41 [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers Eduardo Habkost
                   ` (10 preceding siblings ...)
  2017-03-29 20:16 ` Eduardo Habkost
@ 2017-03-30  8:59 ` Paolo Bonzini
  2017-03-30 13:32   ` Eduardo Habkost
  2017-04-02 13:31   ` Eduardo Habkost
  11 siblings, 2 replies; 17+ messages in thread
From: Paolo Bonzini @ 2017-03-30  8:59 UTC (permalink / raw)
  To: Eduardo Habkost, qemu-devel
  Cc: Alexander Graf, Hervé Poussineau, Juergen Gross,
	Matthew Rosato, Laszlo Ersek, Dr. David Alan Gilbert,
	Igor Mammedov, Andreas Färber



On 29/03/2017 21:41, Eduardo Habkost wrote:
> QOM has a data model where class struct data is static: class
> structs are initialized at class_init, and never changed again.

Isn't that just the way class data is being used?  There's no reason for
class data to be static.  It happens to be that way because our
hierarchies are pretty shallow and global static variables are used
instead of class data.  But it doesn't _have_ to be like that.

That said, the QUALIFIED_CAST concept is very interesting and I'd even
extend it to OBJECT_CHECK, object_dynamic_cast and
object_dynamic_cast_assert.  I'm just not sure about returning const
from object_get_class()/*_GET_CLASS, which ironically is the thing that
prompted you to write the series. :)

Paolo

> ...except for a few rare cases where class data is changed
> outside class_init. Those cases are:
> 
>   qbus_realize(), code added by:
>   commit 61de36761b565a4138d8ad7ec75489ab28fe84b6
>   Date:   Thu Feb 6 16:08:15 2014 +0100
>       qdev: Keep global allocation counter per bus
> 
>   mips_jazz_init(), code added by:
>   commit 54e755588cf1e90f0b1460c4e8e6b6a54b6d3a32
>   Date:   Mon Nov 4 23:26:17 2013 +0100
>       mips jazz: do not raise data bus exception when accessing invalid addresses
> 
>   xen_set_dynamic_sysbus(), code added by:
>   commit 3a6c9172ac5951e6dac2b3f6cbce3cfccdec5894
>   Date:   Tue Nov 22 07:10:58 2016 +0100
>       xen: create qdev for each backend device
> 
>   s390_cpu_realizefn(), code added by:
>   commit c6644fc88bed1176f67b4b7a9df691bcf25c0c5b
>   Date:   Fri Mar 4 12:34:31 2016 -0500
>       s390x/cpu: Get rid of side effects when creating a vcpu

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

* Re: [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers
  2017-03-30  8:59 ` Paolo Bonzini
@ 2017-03-30 13:32   ` Eduardo Habkost
  2017-04-02 13:31   ` Eduardo Habkost
  1 sibling, 0 replies; 17+ messages in thread
From: Eduardo Habkost @ 2017-03-30 13:32 UTC (permalink / raw)
  To: Paolo Bonzini
  Cc: qemu-devel, Alexander Graf, Hervé Poussineau, Juergen Gross,
	Matthew Rosato, Laszlo Ersek, Dr. David Alan Gilbert,
	Igor Mammedov, Andreas Färber

On Thu, Mar 30, 2017 at 10:59:10AM +0200, Paolo Bonzini wrote:
> 
> 
> On 29/03/2017 21:41, Eduardo Habkost wrote:
> > QOM has a data model where class struct data is static: class
> > structs are initialized at class_init, and never changed again.
> 
> Isn't that just the way class data is being used?  There's no reason for
> class data to be static.  It happens to be that way because our
> hierarchies are pretty shallow and global static variables are used
> instead of class data.  But it doesn't _have_ to be like that.

I disagree. I believe this is how class data is meant to be used.
if we change per-class data at runtime outside class_init, we
have a hard time providing querying and introspection mechanisms
for types. If something really needs to be changed at runtime
outside class_init, it belongs to object instance fields, not
class data fields.

e.g. the main benefit we got from eliminating the compat_* global
variables in machine/pc code wasn't simply the global variable
elimination: it was making the compat data static and available
at the MachineClass structs, instead of burying it inside
machine_init functions. If we kept the old model where
class-specific data was initialized at machine_init-time,
extending query-machines with that info, and writing new machine
data queries would still be impossible.


For reference, this is how I think we could have dealt with the
existing cases of non-const class variables:

> >   qbus_realize(), code added by:
> >   commit 61de36761b565a4138d8ad7ec75489ab28fe84b6
> >   Date:   Thu Feb 6 16:08:15 2014 +0100
> >       qdev: Keep global allocation counter per bus

This one might make sense: it's easier to keep data in a BusClass
field than a automatic_id[bus_type] dictionary somewhere else.

But I would still prefer to have a automatic_id[bus_type]
dictionary inside MachineState instead of this.

> > 
> >   mips_jazz_init(), code added by:
> >   commit 54e755588cf1e90f0b1460c4e8e6b6a54b6d3a32
> >   Date:   Mon Nov 4 23:26:17 2013 +0100
> >       mips jazz: do not raise data bus exception when accessing invalid addresses

IMO, a simple MIPSCPU::ignore_invalid_exec_access boolean flag
would be better than hijacking TYPE_MIPS_CPU's
do_unassigned_access() method on the fly.

> > 
> >   xen_set_dynamic_sysbus(), code added by:
> >   commit 3a6c9172ac5951e6dac2b3f6cbce3cfccdec5894
> >   Date:   Tue Nov 22 07:10:58 2016 +0100
> >       xen: create qdev for each backend device

Here, setting has_dynamic_sysbus for all PC classes would be
better, so a future supported-device-types/device-slot querying
mechanism wouldn't incorrectly report xen-backend as unsupported.
But there are additional problems I want to sove regarding sysbus
before doing that.

BTW, this is the case that prompted me to write this series in
the first place. I believe changing
MachineClass::has_dynamic_sysbus at runtime was a mistake, and a
const object_get_class() would have helped us catch that.

> > 
> >   s390_cpu_realizefn(), code added by:
> >   commit c6644fc88bed1176f67b4b7a9df691bcf25c0c5b
> >   Date:   Fri Mar 4 12:34:31 2016 -0500
> >       s390x/cpu: Get rid of side effects when creating a vcpu

Here, I see no reason for a per-cpu-class field at all. Even a
static next_cpu_id variable wouldn't hurt.

Also, this is the only remaining code still using cpu_exists(),
and the same logic probably can be implemented using
MachineClass::possible_cpu_arch_ids() instead.

> 
> That said, the QUALIFIED_CAST concept is very interesting and I'd even
> extend it to OBJECT_CHECK, object_dynamic_cast and
> object_dynamic_cast_assert.  I'm just not sure about returning const
> from object_get_class()/*_GET_CLASS, which ironically is the thing that
> prompted you to write the series. :)

Makes sense. I will send extra patches to change the object cast
macros, too.

> 
> Paolo
> 

-- 
Eduardo

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

* Re: [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers
  2017-03-30  8:59 ` Paolo Bonzini
  2017-03-30 13:32   ` Eduardo Habkost
@ 2017-04-02 13:31   ` Eduardo Habkost
  2017-04-03  9:44     ` Paolo Bonzini
  1 sibling, 1 reply; 17+ messages in thread
From: Eduardo Habkost @ 2017-04-02 13:31 UTC (permalink / raw)
  To: Paolo Bonzini
  Cc: qemu-devel, Alexander Graf, Hervé Poussineau, Juergen Gross,
	Matthew Rosato, Laszlo Ersek, Dr. David Alan Gilbert,
	Igor Mammedov, Andreas Färber

On Thu, Mar 30, 2017 at 10:59:10AM +0200, Paolo Bonzini wrote:
[...]
> That said, the QUALIFIED_CAST concept is very interesting and I'd even
> extend it to OBJECT_CHECK, object_dynamic_cast and
> object_dynamic_cast_assert.  I'm just not sure about returning const
> from object_get_class()/*_GET_CLASS, which ironically is the thing that
> prompted you to write the series. :)

When trying to change OBJECT and OBJECT_CHECK, I've found a
problem: gcc 6.2.1 can't evaluate typeof(*a) if *a has an
incomplete type, even inside the (const typeof(*(t)0) *)
expression used in QUALIFIED_CAST. It works on clang, though.

I'm not sure we want to introduce something that would report
errors only on clang only[1]. Especially when the error messages
look like this:
  hw/mem/pc-dimm.c:248:23: error: passing 'typeof (_Generic((const typeof (*((typeof ((a)))0)) *)0, typeof ((a)): (const Object *)(0), default: (Object *)(0)))' (aka 'const struct Object *') to parameter of type 'Object *' (aka 'struct Object *') discards qualifiers [-Werror,-Wincompatible-pointer-types-discards-qualifiers]
      PCDIMMDevice *x = PC_DIMM(a);

Lucikly all the OBJECT_CLASS usage I've found never involved
incomplete types, but they are more common when dealing with
object pointers.

We could also require all users of OBJECT(x) to include the
header that defines the struct type of x. But I'm not sure it's
worth the effort.

-- 
Eduardo

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

* Re: [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers
  2017-04-02 13:31   ` Eduardo Habkost
@ 2017-04-03  9:44     ` Paolo Bonzini
  0 siblings, 0 replies; 17+ messages in thread
From: Paolo Bonzini @ 2017-04-03  9:44 UTC (permalink / raw)
  To: Eduardo Habkost
  Cc: qemu-devel, Alexander Graf, Hervé Poussineau, Juergen Gross,
	Matthew Rosato, Laszlo Ersek, Dr. David Alan Gilbert,
	Igor Mammedov, Andreas Färber



On 02/04/2017 15:31, Eduardo Habkost wrote:
> When trying to change OBJECT and OBJECT_CHECK, I've found a
> problem: gcc 6.2.1 can't evaluate typeof(*a) if *a has an
> incomplete type, even inside the (const typeof(*(t)0) *)
> expression used in QUALIFIED_CAST. It works on clang, though.
> 
> I'm not sure we want to introduce something that would report
> errors only on clang only[1]. Especially when the error messages
> look like this:
>   hw/mem/pc-dimm.c:248:23: error: passing 'typeof (_Generic((const typeof (*((typeof ((a)))0)) *)0, typeof ((a)): (const Object *)(0), default: (Object *)(0)))' (aka 'const struct Object *') to parameter of type 'Object *' (aka 'struct Object *') discards qualifiers [-Werror,-Wincompatible-pointer-types-discards-qualifiers]
>       PCDIMMDevice *x = PC_DIMM(a);
> 
> Lucikly all the OBJECT_CLASS usage I've found never involved
> incomplete types, but they are more common when dealing with
> object pointers.
> 
> We could also require all users of OBJECT(x) to include the
> header that defines the struct type of x. But I'm not sure it's
> worth the effort.

Fair enough!  Thanks for trying.

Paolo

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

end of thread, other threads:[~2017-04-03  9:44 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-29 19:41 [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers Eduardo Habkost
2017-03-29 19:41 ` [Qemu-devel] [RFC v2 1/9] configure: test if _Generic works as expected Eduardo Habkost
2017-03-29 19:41 ` [Qemu-devel] [RFC v2 2/9] Simplify code using *MACHINE_GET_CLASS Eduardo Habkost
2017-03-29 19:41 ` [Qemu-devel] [RFC v2 3/9] qom: QUALIFIED_CAST helper macro Eduardo Habkost
2017-03-29 19:41 ` [Qemu-devel] [RFC v2 4/9] qom: Make object_class_get_parent() const-aware Eduardo Habkost
2017-03-29 19:41 ` [Qemu-devel] [RFC v2 5/9] Make class parameter const at some functions Eduardo Habkost
2017-03-29 19:41 ` [Qemu-devel] [RFC v2 6/9] Explicitly cast the *_GET_CLASS() value when we break the rules Eduardo Habkost
2017-03-29 19:41 ` [Qemu-devel] [RFC v2 7/9] Use const variables for *_GET_CLASS values Eduardo Habkost
2017-03-29 19:41 ` [Qemu-devel] [RFC v2 8/9] qom: Make class cast macros/functions const-aware Eduardo Habkost
2017-03-29 19:41 ` [Qemu-devel] [RFC v2 9/9] qom: Make object_get_class() return const pointer Eduardo Habkost
2017-03-29 19:56 ` [Qemu-devel] [RFC v2 0/9] qom: Make object_get_class()/*_GET_CLASS return const pointers Laszlo Ersek
2017-03-29 20:11   ` Eduardo Habkost
2017-03-29 20:16 ` Eduardo Habkost
2017-03-30  8:59 ` Paolo Bonzini
2017-03-30 13:32   ` Eduardo Habkost
2017-04-02 13:31   ` Eduardo Habkost
2017-04-03  9:44     ` Paolo Bonzini

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